BLEサービスのUUIDをアドバタイジングする拡張機能 (MakeCode for micro:bit)

# MakeCode for micro:bitのbluetooth

MakeCode for micro:bitには、bluetooth拡張機能が標準で備わっていますし、自身でBLEサービスを追加実装することも可能です。
しかし、困ったことがあります・・・

## 困りごと

一般的なアプリケーションにおいてBLE接続する際、micro:bitがデバイス一覧に表示されず、ユーザーは選択することができません。

## 原因

標準のbluetooth拡張機能では、`Complete list of 16-bit Service UUIDs`という情報をアドバタイジングできない為です。

## 解決策

ユーザー定義の拡張機能である[BLADV(pxt-ubit-bladv)](https://github.com/jp-rad/pxt-ubit-bladv)を使い、`Complete list of 16-bit Service UUIDs`情報とその値（UUID）をアドバタイジングします。

## 背景

一般的なアプリケーション（セントラル）は、BLEデバイス（ペリフェラル）をユーザーが選択するために、検索機能で一覧表示しますが、通信可能なBLEデバイスをすべて表示しているわけではありません。対応しているBLEデバイスだけをユーザーに選択させたい為です。
その検索条件の一つが、アドバタイジング情報の`Complete list of 16-bit Service UUIDs`です。

MakeCode for micro:bitでは、bluetooth拡張機能のサービスを追加したり、自身でBLEサービスを実装したりすることができますが、このアドバタイジング情報で、アプリケーション側にサービスの存在（UUID）を伝えられなければ、ユーザーはそのBLEデバイスを選択することができません。

ただし、**nRF Connect for Mobile**（[android版](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp)/[iPhone版](https://apps.apple.com/jp/app/nrf-connect-for-mobile/id1054362403)）のような開発ツールを使えば、周辺でアドバタイジングしている全てのBLEデバイスを検索できますし、この`Complete list of 16-bit Service UUIDs`の有無やその値も表示することができます。

# BLADV(pxt-ubit-bladv)の使い方

[BLADV(pxt-ubit-bladv)](https://github.com/jp-rad/pxt-ubit-bladv)は、MakeCode for micro:bitに対応したユーザー定義の拡張機能として、GitHubで公開されています。

https://github.com/jp-rad/pxt-ubit-bladv/blob/master/README.md

## 準備

BLADV拡張機能を次の手順でプロジェクトに追加します。

1. MakeCode for micro:bit を開きます
   [https://makecode.microbit.org/](https://makecode.microbit.org/)
1. **[新しいプロジェクト]** を作成します
1. **[＋拡張機能]** で拡張機能のインポート画面を表示ます
1. 検索欄にBLADVのURLを入力し、検索します
`https://github.com/jp-rad/pxt-ubit-bladv`
1. 検索表示された `ubit-bladv` 拡張機能をクリックし、インポートします
1. **[一部の拡張機能を削除してpxt-ubit-bladvを追加する]** ボタンをクリックします
1. **[BLADV]** のグループが追加されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/32aefd75-799a-b3b4-0ba3-edb1c21a274f.png)

## UUIDの設定

BLADV拡張機能には、`BLADV Complete list of 16-bit Service ID:`ブロックが含まれていますが、これを`最初だけ`に配置します。
設定するUUIDの値は、1(0x0001)から65535(0xFFFF)までの10進数の数値です。

:::note alert
**ブロックは１つだけ**
`BLADV Complete list of 16-bit Service ID:`ブロックは、１つだけ配置してください。
:::

**Bluetooth Special Interest Group (“Bluetooth SIG”)** という団体が **Bluetooth(R)** を管理しており、このUUIDも `GATT Services` として定義されています。

https://www.bluetooth.com/specifications/assigned-numbers/

定義されているUUIDの例を一覧に抜粋しました。

|サービス名|Service Name|UUID|UUID(10進数)|
|----------|------------|----|-----------:|
|デバイス情報|Device Information service|0x180A|6154|
|心拍数|Heart Rate service|0x180D|6157|
|アラート通知|Alert Notification service|0x1811|6161|
|サイクリング速度|Cycling Speed and Cadence service|0x1816|6166|
|ボリューム調整|Volume Control service|0x1844|6212|

尚、BLEサービスを実装する際は、次の仕様書（プロファイル）を参照します。

https://www.bluetooth.com/ja-jp/specifications/specs/

:::note alert
このブロックでUUIDを設定したからといって、そのサービスが実行され、機能するわけではありません。
各サービスの仕様書（プロファイル）と接続元のアプリケーションの仕様に則り、BLEサービスを実装する必要があります。
:::

### プロジェクトの設定

MakeCode for micro:bitで、bluetooth機能を有効化する為に、**[プロジェクトの設定]** が必要です。
例えば、図のように設定します。

![settings.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/e511578b-e47e-0d35-103e-6594da0eef33.png)


:::note warn
**プロジェクト設定のコツ**

プロジェクトの設定で、bluetoothの構成情報を変更します。
しかし、一部、その設定を有効化するために、コツが必要です。
（2022/11/18現在）

1. MakeCodeエディタで、右上の **[その他]** ボタンから **[プロジェクトの設定]** を選択します。
1. **`[Enable Bluetooth]`以外** をオンにし、**[保存]** ボタンで保存し、**[← 戻る]** ボタンで戻ります
1. 再度、**[プロジェクトの設定]** を開きます
1. **`[Enable Bluetooth]`** を **オフ から オン** にし、 **[設定をテキストで編集する]** ボタンをクリックします
1. 編集ファイル(*pxt.json*)に、**`"enabled": 1`** が記述されていることを確認します
1. MakeCodeの **[保存]** ボタンでコンパイルします(１分以上かかる場合があります)
1. MakeCodeの **[ブロック]** ボタンをクリックして、編集画面に戻ります
1. 作成されたHEX形式ファイルや、その後、ダウンロードするHEX形式ファイルをmicro:bitへ転送してください

:::

## アプリケーションからの見え方

MakeCode for micro:bit でプログラミングし、コンパイルしたHEX形式ファイルをmicro:bitへ転送すると、アプリケーションからは、micro:bitがBLEデバイスとしてアドバタイジングしている様子を確認することができ、ブロックで設定したUUIDが表示されることを確認できます。

図は、**nRF Connect for Mobile**（[android版](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp)/[iPhone版](https://apps.apple.com/jp/app/nrf-connect-for-mobile/id1054362403)）で、確認した内容です。

![devices.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/0614731a-fd47-4100-93f2-38d3463300c7.png)


# まとめ

MakeCode for micro:bit では、bluetooth拡張機能が標準で用意されていますが、`Complete list of 16-bit Service UUIDs`情報をアドバタイジングする機能がありません。
そこで、ユーザー定義の[BLADV拡張機能](https://github.com/jp-rad/pxt-ubit-bladv)を用いて、BLEサービスのUUID(16ビット)がアドバタイジングできることを確認しました。
この拡張機能を使用すれば、一般的なアプリケーションに対応したBLEデバイスをmicro:bitで開発することができます。

## おまけ

MakeCode for micro:bitで、BLEサービスを実装する際は、次の記事を参考にしてください。

https://qiita.com/jp-96/items/73e6fc42e6592b78c43e