スキップしてメイン コンテンツに移動

えるいーだーのBLEライブラリをNimBLEに移行開始(基板はESP32だよ)

何故NimBLEに移行するのか

・・そこにBLEがあるから

いや、そんな理由じゃなくてファームのネットワークアップデート(OTA)を実装するのにそろそろストレージがヤバくなってきたから

#include <nimBledevice.h>
#include <nimBleutils.h>
#include <nimBleserver.h>

// #include <BLEDevice.h>
// #include <BLEUtils.h>
// #include <BLEServer.h>

なのでこんなふうにまずは各BLEのヘッダをすげ替えてみました

マクロで定義されていた

他の人のページを見ているとBLEXXXというクラスやメソッドをNimBLEXXXに書き換える必要があると書いてあったのだけど 

NimBLEDevice.hというヘッダに

#define BLEDevice                       NimBLEDevice
#define BLEClient                       NimBLEClient
#define BLERemoteService                NimBLERemoteService
#define BLERemoteCharacteristic         NimBLERemoteCharacteristic
#define BLERemoteDescriptor             NimBLERemoteDescriptor
#define BLEAdvertisedDevice             NimBLEAdvertisedDevice
#define BLEScan                         NimBLEScan
#define BLEUUID                         NimBLEUUID
#define BLESecurity                     NimBLESecurity
#define BLESecurityCallbacks            NimBLESecurityCallbacks
#define BLEAddress                      NimBLEAddress
#define BLEUtils                        NimBLEUtils
#define BLEClientCallbacks              NimBLEClientCallbacks
#define BLEAdvertisedDeviceCallbacks    NimBLEAdvertisedDeviceCallbacks
#define BLEScanResults                  NimBLEScanResults
#define BLEServer                       NimBLEServer
#define BLEService                      NimBLEService
#define BLECharacteristic               NimBLECharacteristic
#define BLEAdvertising                  NimBLEAdvertising
#define BLEServerCallbacks              NimBLEServerCallbacks
#define BLECharacteristicCallbacks      NimBLECharacteristicCallbacks
#define BLEAdvertisementData            NimBLEAdvertisementData
#define BLEDescriptor                   NimBLEDescriptor
#define BLE2902                         NimBLE2902
#define BLE2904                         NimBLE2904
#define BLEDescriptorCallbacks          NimBLEDescriptorCallbacks
#define BLEBeacon                       NimBLEBeacon
#define BLEEddystoneTLM                 NimBLEEddystoneTLM
#define BLEEddystoneURL                 NimBLEEddystoneURL

ちなみにこんなふうに、変換マクロが定義されていた
最近親切な人が取り込んでくれたのかね
多分昔は無かったんだろう

早速問題発生

参ったね
データを受信したところが早速ビルドが通らなかった

void BleCtrlCallback::onWrite(BLECharacteristic *pCharacteristic)
{
    uint8_t *data = pCharacteristic->getData();  //受信したデータの先頭アドレス
    size_t  size = pCharacteristic->getLength();    //受信したデータサイズ

getData,getLengthが早速「そんなメソッドはない」とエラー

明日以降直そ・・・・

眠い

修正

修正しました

まずはデータ取得部

NimBLEは単純なuint8_tの配列取得は出来なくなっていて、必ずstd:stringやvector<uint8_t>のようなサイズのわかる型で取るようになっていました

まあ、不明なサイズで取るとバグの原因になるからね

    uint8_t *data = pCharacteristic->getData();  //受信したデータの先頭アドレス
    size_t  size = pCharacteristic->getLength();    //受信したデータサイズ

これを、↓のように変更

    std::vector<uint8_t> data = pCharacteristic->getValue();     //受信したデータの先頭アドレス
    size_t  size = data.size(); //受信したデータサイズ

vectorで取得したらsizeが不要じゃないか・・・

getValueはヘッダの中で

   NimBLEAttValue    getValue(time_t *timestamp = nullptr);

こんな定義をされてる
何じゃこりゃ・・・・

この中を覗いてみたら、あれ?
単純なuint8_tのポインタOKだった

それどころかuint16_tの ポインタまであるじゃん

使いどころは難しそうだけど文字列でも撮れるようにしてるのか・・・と思ったらけどstd::stringでも取得出来るしねぇ

まあ、今回はせっかくなのでvectorにしてプログラムをすっきりさせよう

createCharacteristicの引数

今まではリード、ライト、通知の権限のプロパティはBLEcharacteristicの各プロパティ変数を使っていたのですが

    pCharacteristic = pService->createCharacteristic(  
        characteristicUUID,                            
        BLECharacteristic::PROPERTY_READ                
            | BLECharacteristic::PROPERTY_WRITE        
            | BLECharacteristic::PROPERTY_NOTIFY    

専用の列挙型が用意されているので、そちらを使うようになりました

    pCharacteristic = pService->createCharacteristic(  
        characteristicUUID,                            
        NIMBLE_PROPERTY::READ            
            | NIMBLE_PROPERTY::WRITE      
            | NIMBLE_PROPERTY::NOTIFY    

これだけやってビルドして見たらビルドが通りました
ホントか?

実際にバイナリをボードに転送してスマホからコマンドを送っても問題無さそうです

11000000バイトを超えていたバイナリが、629408 bytesまで小さくなりました

ホントかこれ?

なんか騙されてるような

けど、上手く行ってるから 全てOK!

これだけバイナリが小さくなれば、Wifiのライブラリを組み込んでもなんともないぜ

おしまい

コメント