【发布时间】:2022-11-02 15:58:17
【问题描述】:
I'm working on a project where I get device data from ibeacon bluetooth devices. Normally I can have all Mac addresses and device local_names. But when I want to change the code a little bit I can't get the Mac addresses
执行代码
导入异步
从黯淡进口 BleakScanner
异步定义主(): print("扫描5秒,请稍等...")
devices = await BleakScanner.discover(return_adv=True)
for d, a in devices.values():
print()
print(d) # beacon names are POI
print("-" * len(str(d)))
print(a)
如果姓名== "主要的“: asyncio.run(main())
FF:CC:DD:KK:8A:01: POI
----------------------
AdvertisementData(local_name='POI', manufacturer_data={76: b'\x02\x15\x85x\xd2\x85\xfd\x1fO{6\xf2\x1b2\x97\xd6\xf0\xe3\x00\x01\x00$\xbd'}, service_data={'0000180a-0000-1000-8000-00805f9b555': b'\x05\x01\xc2c'}, rssi=-88)
在这里我们可以获取mac地址
但没有
导入异步 从 uuid 导入 UUID
从构造导入 Array、Byte、Const、Int8sl、Int16ub、Struct 从construct.core导入ConstError
从黯淡进口 BleakScanner 从 bleak.backends.device 导入 BLEDevice 从 bleak.backends.scanner 导入广告数据
ibeacon_format = 结构( "type_length" / 常量(b"\x02\x15"), “uuid”/数组(16,字节), “主要”/ Int16ub, “次要” / Int16ub, “电源”/ Int8sl, )
def device_found( 设备:BLEDevice,广告数据:广告数据 ): """解码 iBeacon。""" 尝试: macadress = BleakScanner.discover(return_adv=True) // => 问题行 名称 = 广告数据.本地名称 apple_data = 广告数据.manufacturer_data[0x004C] ibeacon = ibeacon_format.parse(apple_data) uuid = UUID(字节=字节(ibeacon.uuid))
print(f"Mac Adress : {macadress[0]}")// => problem line
print(f"Local Name : {name}")
print(f"UUID : {uuid}")
print(f"Major : {ibeacon.major}")
print(f"Minor : {ibeacon.minor}")
print(f"TX power : {ibeacon.power} dBm")
print(f"RSSI : {device.rssi} dBm")
print(47 * "-")
except KeyError:
# Apple company ID (0x004c) not found
pass
except ConstError:
# No iBeacon (type 0x02 and length 0x15)
pass
异步定义主(): """扫描设备。""" 扫描仪 = BleakScanner() scanner.register_detection_callback(device_found)
while True:
await scanner.start()
await asyncio.sleep(1.0)
await scanner.stop()
asyncio.run(main())
result = TypeError: 'coroutine' object is not subscriptable
什么是协程对象?如何使用这些方法获取 MAC 地址信息?
Executing Code
import asyncio
from bleak import BleakScanner
async def main():
print("scanning for 5 seconds, please wait...")
devices = await BleakScanner.discover(return_adv=True)
for d, a in devices.values():
print()
print(d) # beacon names are POI
print("-" * len(str(d)))
print(a)
if __name__ == "__main__":
asyncio.run(main())
FF:CC:DD:KK:8A:01: POI
广告数据(local_name='POI',manufacturer_data={76: b'\x02\x15\x85x\xd2\x85\xfd\x1fO{6\xf2\x1b2\x97\xd6\xf0\xe3\x00\x01\x00$ \xbd'}, service_data={'0000180a-0000-1000-8000-00805f9b555': b'\x05\x01\xc2c'}, rssi=-88)
Here we can get mac addresses
but there isnt
import asyncio
from uuid import UUID
from construct import Array, Byte, Const, Int8sl, Int16ub, Struct
from construct.core import ConstError
from bleak import BleakScanner
from bleak.backends.device import BLEDevice
from bleak.backends.scanner import AdvertisementData
ibeacon_format = Struct(
"type_length" / Const(b"\x02\x15"),
"uuid" / Array(16, Byte),
"major" / Int16ub,
"minor" / Int16ub,
"power" / Int8sl,
)
def device_found(
device: BLEDevice, advertisement_data: AdvertisementData
):
"""Decode iBeacon."""
try:
macadress = BleakScanner.discover(return_adv=True) // => problem line
name = advertisement_data.local_name
apple_data = advertisement_data.manufacturer_data[0x004C]
ibeacon = ibeacon_format.parse(apple_data)
uuid = UUID(bytes=bytes(ibeacon.uuid))
print(f"Mac Adress : {macadress[0]}")// => problem line
print(f"Local Name : {name}")
print(f"UUID : {uuid}")
print(f"Major : {ibeacon.major}")
print(f"Minor : {ibeacon.minor}")
print(f"TX power : {ibeacon.power} dBm")
print(f"RSSI : {device.rssi} dBm")
print(47 * "-")
except KeyError:
# Apple company ID (0x004c) not found
pass
except ConstError:
# No iBeacon (type 0x02 and length 0x15)
pass
async def main():
"""Scan for devices."""
scanner = BleakScanner()
scanner.register_detection_callback(device_found)
while True:
await scanner.start()
await asyncio.sleep(1.0)
await scanner.stop()
asyncio.run(main())
结果 = TypeError:“协程”对象不可下标
【问题讨论】: