概要
BLEデバイスを使用し、BLEタグをハックする
想定読者
Arduinoなどを使用しBLEデバイスを作った後、実際にBLEデバイス量産を踏まえた開発を行ってみたい方
はじめに
こんにちは。ハードエンジニアの川越です。
IoTデバイス等でBLEデバイスの開発をしたい!となると、実際の商品化を前提に開発を進める事が出てくると思います。
今回は、量産化を踏まえた開発が可能な開発キットを使って、市販のBLEタグをハックし、Lチカするまでを紹介したいと思います。(2017/1月に書いてからずっと放置していた記事なのでちょっと古い情報です)
開発デバイス&環境
BLEモジュール
低消費電力ながら処理能力の高いCortex-M4を搭載した、SiliconLabs「BGM113」開発キットを使用します。
BGM113
BGM113 開発キット
BLEタグ
Amazonで販売していた「Logitec Bluetooth 4.0対応 BLEタグ」を使用します
BLEタグ
開発環境
BlueGeckoシリーズ用の開発言語、BGScriptを使用します
(BLE開発が初めてという方にお勧めの開発言語との事ですが…言語としての制限が多すぎるので、Cでの開発がおすすめです)
タグの解析
BLEタグを外部から制御する為に、タグの解析を行います。
BLE接続が可能なアプリを使用し、内部でLED点灯に関係していそうな値を探します
今回は、Alert Levelに0x01 or 0x02を書き込んだところ、LEDの点灯が出来ました
コンパイルの実行まで
- 開発環境ダウンロード先
- インストーラ選択
- コマンドラインより[bgbuild.exeのパス bgプロジェクトのパス -f]を実行
例 : 「C:\SiliconLabs\bgm-1.0.4-1073\bin\bgbuild.exe XXX.bgproj -f」
タグに接続し、LEDを点灯させる
- BGScript(.bgs)
# le_gap_scan_response dim lg_i # overall ad data position index dim lg_j # individual ad field position index dim ad_field_length dim ad_field_type event system_boot(major, minor, patch, build, bootloader, hw) # configure scanning (100ms interval, 100ms window, passive) call le_gap_set_scan_parameters(160, 160, 0) # start scanning call le_gap_discover(le_gap_discover_generic) end event le_gap_scan_response(rssi, packet_type, sender, address_type, bonding, data_len, data_data) lg_i = 0 while lg_i < data_len ad_field_length = data_data(lg_i:1) ad_field_type = data_data(lg_i + 1:1) if sender(0:3) = $02E2C7 && sender(3:3)=$441319 then if ad_field_type = $02 || ad_field_type = $03 then # partial ($02) or complete ($03) list of 16-bit UUIDs lg_j = 0 while lg_j < ad_field_length if data_data(lg_i + lg_j + 2:1) = $1802 && data_data(lg_i + lg_j + 3:1) = $2A06 then call le_gap_end_procedure() call le_gap_open(sender(0:6),address_type) # set loop counters to 100 so we'll stop looking # (there is no "break" function in BGScript) lg_i = 100 lg_j = 100 end if lg_j = lg_j + 2 end while end if end if lg_i = lg_i + ad_field_length + 1 end while end event le_connection_opened(address,address_type,master,connection,bonding) # connection established call gatt_write_characteristic_value_without_response(connection, address(:), 1, $01) end
まとめ
実際の開発に当たっては、Simplicity Studioを使用して開発する事になるかと思いますが、IoTデバイス開発に必須の電源測定機能など、開発に必要な機能が各種ありますのでおすすめです。が、BGScriptでの開発は…マジでやめておきましょう。配列使えないとかあるので。
補足
本デバイスをそもそも使用したのは
1. 外部ネットワークからWifi経由でBLEデバイスを制御したい
2. 外部ネットワーク操作からデバイスがレスポンスするまで1s程度
3. BLEデバイスをボタン電池2個で1年持たせる
という要件があり、それの検証時に使用したものです。
IoTデバイス開発でお困りの方がみえましたら、ご相談頂けますと幸いです。