esp-idf BLE сканирование

Я работаю с ESP-idf, чтобы запрограммировать мою плату ESP32. Моя цель - заставить его сканировать конкретное устройство BLE (Bluetooth Low Energy). Я понял, как заставить его сканировать, используя один из примеров, которые предоставляет «Espressif» под названием «ibeacon_demo.c». Дело в том, что я не знаю, как извлечь адрес любого найденного устройства и получить его в виде строки, поэтому Я могу сравнить его с адресом моего устройства BLE.

ibeacon_demo.c: https://github.com/pycom/pycom-esp-idf/blob/master/examples/bluetooth/ble_ibeacon/main/ibeacon_demo.c

Я почти уверен, что в этом заявлении нужно что-то сделать:

 if (esp_ble_is_ibeacon_packet(scan_result->scan_rst.ble_adv, scan_result->scan_rst.adv_data_len)){
            esp_ble_ibeacon_t *ibeacon_data = (esp_ble_ibeacon_t*)(scan_result->scan_rst.ble_adv);
            ESP_LOGI(DEMO_TAG, "----------iBeacon Found----------");
            esp_log_buffer_hex("IBEACON_DEMO: Device address:", scan_result->scan_rst.bda, BD_ADDR_LEN );
            esp_log_buffer_hex("IBEACON_DEMO: Proximity UUID:", ibeacon_data->ibeacon_vendor.proximity_uuid, ESP_UUID_LEN_128);

            uint16_t major = ENDIAN_CHANGE_U16(ibeacon_data->ibeacon_vendor.major);
            uint16_t minor = ENDIAN_CHANGE_U16(ibeacon_data->ibeacon_vendor.minor);
            ESP_LOGI(DEMO_TAG, "Major: 0x%04x (%d)", major, major);
            ESP_LOGI(DEMO_TAG, "Minor: 0x%04x (%d)", minor, minor);
            ESP_LOGI(DEMO_TAG, "Measured power (RSSI at a 1m distance):%d dbm", ibeacon_data->ibeacon_vendor.measured_power);
            ESP_LOGI(DEMO_TAG, "RSSI of packet:%d dbm", scan_result->scan_rst.rssi);
        }

вот ссылка на API для примера, который я использовал "ibeacon_demo.c" [ https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/bluetooth/esp_gap_ble.html#_CPPv428esp_ble_gap_update_whitelistb13esp_bd_addr_t22esp_ble_wl_addr_type_t] [1] < / а>


person yrsAlk    schedule 29.10.2019    source источник


Ответы (1)


Ваш вопрос состоит из двух частей: как извлечь адрес и как сравнить его с тем, который вы ищете.

На первый вам уже дан ответ, так как этот пример извлекает адрес и помещает его в журнал:

esp_log_buffer_hex("IBEACON_DEMO: Device address:", scan_result->scan_rst.bda, BD_ADDR_LEN );

Но ваш второй вопрос требует более глубокого понимания того, как сравнивать байтовые массивы. Я могу попытаться помочь вам понять вторую часть, сказав вам, что адрес является байтовым массивом и что он имеет длину 6 байтов, о чем вам сообщает константа BD_ADDR_LEN.

Теперь вы должны сравнить двухбайтовые массивы.

После того, как вы это выясните, вы можете попасть в публичные и случайные адреса. Но пока этого достаточно.

person axa    schedule 06.11.2019