BLE scan () не возвращает полную полезную нагрузку объявления

Резюме: Micropython Bluetooth BLE scan () не возвращает полную полезную нагрузку объявления, в частности, отсутствует полное локальное имя.

Настраивать:

Я пытаюсь отсканировать и обнаружить температурное устройство Xiaomi с помощью Micropython. Использование приложения Nordic Semiconductor nRF Connect на моем телефоне отображает следующие объявленные необработанные данные:

020106111695FE30585B05015646D238C1A42801000B094C5957534430334D4D43

В разорванном виде это расшифровывается следующим образом:

len==2,  0x01==FLAGS:           0201 06 
len==17, 0x16==SERVICE_DATA:    1116 95FE30585B05015646D238C1A4280100
len==11, 0x09==NAME:            0B09 4C5957534430334D4D43

Последним элементом является 0x09 (полное локальное имя), но проблема в том, что Micropython ble.scan () не возвращает полное объявление. полезная нагрузка. При сканировании в Micropython отсутствует последний элемент (имя). Необработанные данные, возвращаемые в adv_data:

020106111695fe30585b05015646d238c1a4280100

Я только что немного изменил _irq(...) ble_simple_central.py, чтобы просто отобразить все обнаруженные устройства и проиллюстрировать проблему:

    def _irq(self, event, data):
        if event == _IRQ_SCAN_RESULT:
            addr_type, addr, adv_type, rssi, adv_data = data
            addr_h = binascii.hexlify(bytes(addr)).decode('utf-8')
            adv_data_h = binascii.hexlify(bytes(adv_data)).decode('utf-8')
            print('addr_type: {}, addr: {}, adv_type: {}, rssi: {}, adv_data: {}'.format(addr_type, addr_h, adv_type, rssi, adv_data_h))

Вывод (для устройства Xiaomi):

addr_type: 0, addr: a4c138d24656, adv_type: 0, rssi: -68, adv_data: 020106111695fe30585b05015646d238c1a4280100

Я что-то забываю? Xiaomi плохо себя ведет? Требует ли Micropython или спецификация Bluetooth, чтобы рекламные данные были отформатированы по-другому?


person Blip    schedule 21.02.2021    source источник
comment
Может быть, ваш микропайтон не включает полезную нагрузку ответа на сканирование, а только полезную нагрузку рекламных данных?   -  person Emil    schedule 22.02.2021
comment
Ну конечно; естественно! Большое спасибо за совет. Я понял, что Micropython ble.scan (...) может указывать, следует ли включать SCAN_RESULT или нет.   -  person Blip    schedule 22.02.2021
comment
Я проголосовал за комментарий, но случайно отменил его, и теперь я не могу проголосовать повторно. Извини, Эмиль.   -  person Blip    schedule 22.02.2021


Ответы (1)


Основываясь на комментарии и отличном совете от Эмиля, решение заключалось в том, чтобы установить параметр active в BLE.gap_scan (... , active = True), чтобы в результатах получать ответы на сканирование.

Это заставляет обратный вызов irq получать 2 отдельных сообщения с разными adv_types:

  • 0x00 - ADV_IND - содержит рекламные данные
  • 0x04 - SCAN_RSP - содержащий имя

Ссылка на документ: Роль наблюдателя (сканер)

person Blip    schedule 21.02.2021