Чтение данных с неподключаемого (?) Устройства Bluetooth на ESP32 - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу, чтобы мое устройство ESP32 всегда ожидало прослушивания данных от моих весов BT для ванной комнаты.

Когда я смотрю на устройство в приложении Android, оно отображает его как «неподключаемый» , Так что, думаю, это вещь. Но весь пример кода, который я видел, имеет своего рода «соединение». И когда я пытаюсь подключиться, он просто висит там в моем коде.

Могу ли я получить данные от характеристики c или чего-либо еще без первого подключения?

Или какие-либо мысли о том, что я ' я делаю неправильно? Я с радостью поделюсь своим кодом или снимками экрана с моим телефонным приложением или чем-то еще, что может быть полезным. Спасибо

1 Ответ

0 голосов
/ 06 февраля 2020

В случае, если другие имеют такую ​​же проблему. Я нашел ответ.

Данные передаются в последних нескольких байтах поля «Данные производителя».

Этот код может их прочитать.

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks
{
    /**
        Called for each advertising BLE server.
    */
    void onResult(BLEAdvertisedDevice advertisedDevice)
    {
        if ( strcmp( "ed:67:37:5e:9c:e3", advertisedDevice.getAddress().toString().c_str() ) == 0 ) {
            int slen = 11;
            int dg =
                advertisedDevice.getManufacturerData().c_str()[slen - 1] << 8 |
                advertisedDevice.getManufacturerData().c_str()[slen - 2];
            int stability = (advertisedDevice.getManufacturerData().c_str()[slen - 3] & 0x01);

            dbgprintf("Scale: %.1f lbs  %s\n", (float) dg / 100.0 * 2.205, (stability) ? "(stable)" : "" );
            advertisedDevice.getScan()->stop();

            foundMeasurement = true;
        }


    } // onResult
};


void startScanning()
{
    // Retrieve a Scanner and set the callback we want to use to be informed when we
    // have detected a new device.  Specify that we want active scanning and start the
    // scan to run for 30 seconds.
    BLEScan* pBLEScan = BLEDevice::getScan();
    pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
    pBLEScan->setActiveScan(true);
    pBLEScan->start(30);
}

Надеюсь, это поможет кому-то еще встать на правильный путь.

...