【问题标题】:TypeError: 'coroutine' object is not subscriptable?TypeError: \'coroutine\' 对象不可下标?
【发布时间】: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:“协程”对象不可下标

【问题讨论】:

    标签: python bluetooth ibeacon


    【解决方案1】:

    device.adress 解决了我的问题。每个人都可以使用这个。

    【讨论】:

      猜你喜欢
      • 2020-11-26
      • 2016-07-20
      • 1970-01-01
      • 2017-07-15
      • 2021-10-01
      • 2019-12-07
      • 2012-01-09
      • 2021-11-23
      • 2012-02-21
      相关资源
      最近更新 更多