1000m タイムトライアルサイト 構築(2)

マイクロソフトのサンプル)

 マイクロソフトのサイトに説明とbluetooth関連のサンプルプログラムが載っているgithubへのリンクがある。

Bluetooth 低エネルギー - UWP applications | Microsoft Docs

 サンプルプログラムを漁ってみても、C#のものしかないようだ。Cで苦手意識があるせいか、C#はどうもとっつきにくい。c#はUWPという仕組みを使ってbluetoothとやり取りをしていて、VBもUWPを扱えるのでbluetoothを扱えるはずである。しかしながら、サンプルがないと私レベルではさっぱり手が出ない。c#を勉強して理解して、VBに翻訳するのと、C#をあやつれるようになるのとどちらが速いかな、などと考えているうちに1週間くらい過ぎた。

 BluetoothAdvertisementというフォルダにはVBのサンプルがある。Advertisementという概念がよくわからないが、色々調べてみると、Bluetooth機器は「自分が何者(たとえば、スピードセンサ)だよ」という情報を発信しているらしくて、それをAdvertisementと呼ぶようだ。機器との接続までのプロセスで、どんな接続可能な機器があるのか調べなければいけないが、それをやるためのものであるようだ。だから、Advertisementだけでは、データを取得できないが、VBで扱えること、VBでの扱い方のお作法みたいなものはわかる。研究すれば何とかアプリができるかも、というレベルには達した。

C# .NET Frameworkを使ったBluetoothLEデバイスの検出 | TomoSoft

C# と Bluetooth Low Energy(BLE)の連携 - TES Blog

なんかは大変勉強になった。

 

(BLE(bluetooth low energy)の仕組み)

 並行してbluetooth low energyの仕組みを勉強。

 [C#/WinRT]Bluetooth v4(BLE)機器と通信する(BLE基礎メモ) - Qiita

も良いサイトで、C#だけでなく、BLEの説明も詳しいし、リンクが充実している。プログラムのコードを理解しても、それがどういう意味を持っているのかわからないと話にならない。

「SIGの公式プロファイルは、よく4桁で描かれている。
https://www.bluetooth.com/specifications/gatt/services/
例)Alert Notification Service であれば0x1811

これは、下記のようなUUID(これを「ベースUUID」という)の「XXXX]の部分に、その4桁の短縮UUIDを入れたもの。

0000XXXX-0000-1000-8000-00805f9b34fb

という記述は大いに助かった。ブルーツースの本家本元のhttps://www.bluetooth.comにいかなければいけないこともわかっていなかったので。色々なメーカーが、BLE対応のスピードセンサを作っているが、ほとんどのサイクルコンピュータはどのセンサーにも対応している。共通フォーマットとか決まっていないとそういうことは出来ない筈、と思っていたら、本家本元にちゃんと文書がありました。

 Bluetooth Profile Specification (windows.net)に16-bit UUID Numbers
Documentが載っていて、表の中に、"GATT Characteristic and Object Type 0x2A5B CSC Measurement"や"GATT Service 0x1816 Cycling Speed and Cadence "という記述があり、これを使って、スピードセンサを扱えることがわかる。

 フォーマットとかについては、Specifications | Bluetooth® Technology WebsiteCycling Speed and Cadence Profile 1.0Cycling Speed and Cadence Service 1.0があって説明が書かれている。BLE対応のどのメーカーのどのスピードセンサーも、この文書に基づいているので共通に使えるという訳だ。

 センサからのデータは、nortificationというやり方。要するに決まった時間間隔(たとえば、1秒間隔※)で送られてくる。

※ "In typical applications, the CSC Measurement characteristic is notified approximately once per second."

 8bitが一つの単位で、データの最初の部分がセンサーの種類等をあらわす。00000001(=1)ならスピードセンサー、00000010(=2)ならケイデンスセンサー、00000011(=3)なら、スピード・ケイデンスセンサーといった具合。下から3ビット目がsensor locationという項目だが、なんだかよくわからない。センサーの位置については、スピードセンサーならホイールに、ケイデンスセンサーならクランクについているに決まっているのに??

 (スピードセンサーであれば)次に来るデータが、累積ホイール回転数とその時の時間。注意しなければいけないのが、

"1.7 Byte Transmission Order
All characteristics used with this service shall be transmitted with the least significant octet first (i.e., little endian)."

というところ。普通の数字の記述方法と違って、小さい桁の数字から先に書くというところ。"Cumulative Wheel Revolutions value is a UINT32"なので、4バイトのデータになるけれど、データがabcdであれば、10進法では、この数字は(a+256*b+256**2*c+256**3*d)となるわけだ。あと気を付けなければいけないのは、数字がロールオーバー(1周回って元の数字になる)すること。ホイール回転数はほとんど心配ないが、時間の方は64秒でロールオーバーしてしまう。なお、時間の単位は"The ‘wheel event time’ is a free-running-count of 1/1024 second units"。

 これでデータを取り出せれば、速度と走行距離が計算できる。

 "Speed = (Difference in two successive Cumulative Wheel Revolution values * Wheel Circumference) / (Difference in two successive Last Wheel Event Time values)"