概要
micro:bitで動き、デバッグ用の出力をBluetoothで吐き出すソフトをC++で開発しようとしたところ、Bluetooth通信(特にペアリング不要の通信の場合)の疎通がなかなかできず結構ハマりました。
そこで、備忘録かねてやり方を書きます。
(microbit v2.2を使用していますが、たぶんv2でも同様にできるはずです)
できたこと
- micro:bitからbluetoothを使ってメッセージを出力し、ペアリング操作をせずスマホで受信するようにする
環境
以下の環境を使用しました。
・Windows 11
・micro:bit v2.2
・スマホ(Xperia 10 III lite)
なお、今回はスマホからbluetooth接続・シリアルメッセージ送受信を行うので、以下のアプリをスマホにインストールしてください
https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=en&gl=US
※Android向けアプリです。iPhoneも同様のものがあると思いますが確認していません
開発環境構築
意外と書くことがあったので、別の記事として書きました
Windows上にC++でのmicro:bit v2.2開発環境を作る
Bluetooth通信
プログラム準備
サンプルのリポジトリでBLEのサンプルアプリが提供されているのでこれを利用します。
[cloneしたリポジトリのルート]/source/main.cppを以下のように編集します。
#include "MicroBit.h"
#include "Tests.h"       //追加
MicroBit uBit;
int 
main()
{
    uBit.init();
    ble_test();          //追加
    // 以下はコメントアウト
    //while(1)
    //    uBit.display.scroll("HELLO WORLD!");
}
codal.json編集
- cloneしたリポジトリのルートにあるcodal.jsonを削除もしくはリネームします
- 同じ階層にあるcodal.ble.jsonをコピーし、codal.jsonにリネームします
- 
codal.jsonを以下のように編集します
{
    "target": {
      "name": "codal-microbit-v2",
      "url": "https://github.com/lancaster-university/codal-microbit-v2",
      "branch": "master",
      "type": "git",
      "test_ignore": true,
      "dev": true
    },
    "config": {
      "SOFTDEVICE_PRESENT": 1,
      "DEVICE_BLE": 1,
      "MICROBIT_BLE_ENABLED": 1,
      "MICROBIT_BLE_PAIRING_MODE": 0,
      "MICROBIT_BLE_DFU_SERVICE": 1,
      "MICROBIT_BLE_WHITELIST": 0,
      "MICROBIT_BLE_DEVICE_INFORMATION_SERVICE": 1,
      "MICROBIT_BLE_EVENT_SERVICE": 1,
      "MICROBIT_BLE_PARTIAL_FLASHING": 0,
      "MICROBIT_BLE_SECURITY_LEVEL": "SECURITY_MODE_ENCRYPTION_OPEN_LINK"
    }
}
元のcodal.ble.jsonからの変更点は以下の通りです。
- 
MICROBIT_BLE_PAIRING_MODEを1から0に変更します
- 
MICROBIT_BLE_SECURITY_LEVELを"SECURITY_MODE_ENCRYPTION_NO_MITM"から"SECURITY_MODE_ENCRYPTION_OPEN_LINK"に変更します
- 
"MICROBIT_BLE_WHITELIST": 0,を追加します
 おそらくキモは三番目で、これを設定しないと接続できない+サンプルプログラムに説明が記載されていない状態のようです。
ここまでできたら、あとはビルドしてバイナリを書き込めば、micro:bit側の準備は完了です
携帯から接続
- micro:bitの電源を入れます
- スマホのbluetooth機能を有効にし、Serial Bluetooth Terminalアプリを立ち上げます
- 左上の≡メニュー >Devices>Bluetooth LE>SCAN(右上にあります)で表示されるBBC micro:bitを押して接続します
- 正常に接続が行われたら、スマホ側にはConnectedのメッセージが、micro:bitにはCの文字が表示されるはずです
- スマホからメッセージを送信すると、以下の画像のようにmicro:bitがエコーバックします。正しくエコーバックされていたら、正常にmicro:bitースマホ間のbluetooth シリアル通信ができている状態です。  
