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

えるいーだーの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のライブラリを組み込んでもなんともないぜ

おしまい

コメント

このブログの人気の投稿

RAM DISKを使ってみた(使ったのはImDisk)

GWだし、まあちょっとラムディスクを入れてみました うちのPCはWindows11 使ったのはImDiskというRAM Disk。 まあ、この辺のインストールとかはあちこちで解説してる人がいるので適当にぐぐってくださいな で、とりあえずベンチマーク なかなかいいスピードだ で、大抵の人はブラウザのキャッシュをRAMディスクにするといいよ・・・と言うけど そもそもメインドライブがNVMeのSSDを使っている状態で、体感速度なんか上がらない(使い終わったキャッシュを再起動したら綺麗さっぱり捨て去ってくれるという利点はある)  うちで一番効果があるのは Adobe Audition というアプリ これが結構高速化する(キャッシュをちゃんとRAMディスクにしたら・・・だけど) ハイレゾ音源だと、1時間の音源が何かする度に4GBのファイルを作られてしまう なので、RAM DISKにすると、結構編集時間を短縮できる Premiere Rushも出力先をRam Diskにしておいて終わったら、SSDにコピーすると言う事をやるとかなりスピードアップになる 実はうちのPCは普段は99%のパワーで動作していて、CPUのターボブーストが掛からないようになっている 大体3.6GHz当たりで安定してるのだけど、これを100%にするとターボブースト機能がONになって一部のコアが4.5とか4.8GHzまで上がる まあ、毎回電源オプションをいじる事になるのだけどさ・・・ そうしてベンチを取ると こんな感じ とは言え、ブーストしてるからと行ってRam Diskのスピードの差を体感する事はさすがに無理 ・・・と言うかフォトショでもRAM DISKにしてよかった・・・と言うほど変わらない SSDの性能が上がってきたしもし次にPCを買い換えたらRAM DISKよりSSDの方が速いかもね  

.NET MAUI BLE(Bluetooth Low Energy)も上手く行った

2023/10/11更新 ↓こちらの記事で更新しれました。 .NET MAUI PLUGIN BLEがWindows(10/11)に対応してた Windows対応 イヤッッホォォォオオォオウ Bluetooth LE plugin for Xamarin &amp; MAUI がWindowsに対応してた~ nugetでver3.00をみんな早速ゲットだ。   ちなみにこちらはAndroid版のサンプルアプリ   GitHub...   [ブログカード風リンクタグ作成] ------------------------------------------------------------------------------ 昔、スマホとESP32の接続確認用に作ったプログラムをXamarinからMAUIに移植したら動いちゃった   まあ、ESP32からスマホへの一方通行なアプリなんだけど 面倒くさいので github に公開した 下手くそなコード書きやがってとか思われそう 「間違ってるぞこのやろう」というのを見つけたら教えてくれると嬉しいです 要素技術の調査はこれで完了かな

.NET MAUIでスプラッシュスクリーン Android12で地獄を見る

まずは起動するところから・・・・  スプラッシュスクリーンだぬ マイクロソフトのサイト 見てると簡単そう(実際簡単で細かい事を気にしなければsvgファイルを用意して1行だけ書き換えておしまい)   なんかプロジェクトファイルに自動で記述されるらしい よし、プロジェクト作った                     つーか、もうスプラッシュがあるんだけど・・・・ そして自作のsvgファイル くうっ・・・デザインセンスない・・・・   それはともかく、このSVGファイルを Resources\Images にドラッグ&ドラッグ プロジェクトを右クリックして「プロジェクトファイルの編集」 して、編集できるようになったプロジェクトファイルを 自分のプロジェクトファイルに書き換える <MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="168,168" /> ↓ <MauiSplashScreen Include="Resources\Splash\ splashtestmaui .svg" Color="#512BD4" BaseSize="168,168" />   とりあえずAndroidで実行 お、おう・・・・ まあ最初はこんなもんよね 最初に紹介したマイクロソフトのサイトでもBaseSizeを書き換えてくださいって言ってるし 言われたとおりに <MauiSplashScreen Include="Resources\Splash\splashtestmaui.svg" Color="#512BD4" BaseSize=" 320,600 " /> 書き換えてみると いい感じじゃーん じゃあアンドロイドのバージョン毎に試してみよう   Android 7 Android 11 Android 12 Android 13