最近LINEの中の人から「LINE Things Developer Board」をいただきました。
LINEさんから開発ボードがとどいた!
— K.Miura (@k_miura_io) 2019年3月30日
よーし、今日はこれで遊ぶぞー! pic.twitter.com/7tE8E6Vzhv
この開発ボードにはnRF52832が使われてあり、ボードには最初からいろんなセンサが実装されています。
というわけでLINE Thingsでセンサーをつなげてみたり、LIFFをアレンジしてみたりしていたときに通信で詰まったことを項目ごとに備忘録としてまとめてみようと思います。(勢いで書いたので間違いがあったら指摘お願いします)
Arduino編
データの送信がうまくいかない
このプログラムを参考にセンサーの値を送信しようとしましたがうまくできずかなり悩んでいたときに、setupServices
を眺めていたときのことです。
notifyCharacteristic.setFixedLen(1);
これはデバイスから送信する最大のデータ量を示しているようです(構造体を定義するような感じでしょうか)。starterプログラムでは一つのボタンの値を送信することを想定しているので送信するデータ量は1になってますけど、複数のデータを送信したいときには、この部分の数値を大きくすればいいようです。あとは、もともと開発ボードに書き込まれていたコードを参考にしながら複数のデータを送信できるようにStarterのアプリのアレンジをしやすくなります。
JavaScript編
通信エラー
送信をする部分を書けたし、今度はJavaScriptのコードをいじっていたら、ペアリングをしたときにLIFF上にこんなエラーが出ました。
BLUETOOTH_SERVICE_NOT_FOUND
接続は出来ても、デバイスの認証ができてないせいで起こるエラーっぽいですね。なので、もう一度コードを戻して行ったときに、原因の記述を見つけました。
device.gatt.getPrimaryService(USER_SERVICE_UUID).then(service => {
liffGetUserService(service);
}).catch(error => {
uiStatusError(makeErrorMsg(error), false);
});
device.gatt.getPrimaryService(PSDI_SERVICE_UUID).then(service => {
liffGetPSDIService(service);
}).catch(error => {
uiStatusError(makeErrorMsg(error), false);
});
ここを消してしまっていたために、デバイスと接続出来ても認証が出来なくて、通信が確立されないからセンサーの値が取れなかったみたいです。逆を言えばここさえしっかりやれば、あとはデバイスのデータを受け取るだけになるはずです。それでもうまくいかないときは、ペアリングのときに問題が起こっているのかもしれません。次のペアリング編の解決方法を見てください。
ペアリング編
同じボードを使って別のLIFFをつなぐためにファームウェアを書き直したときに、ペアリングをすると、接続エラーになってしまい、そもそもLIFFが出現しない問題が起こります。これは、Bluetoothのキャッシュが残っていることで起こる問題であることが多いです。そういうときは、一旦ファームウェアを書き直したデバイスの電源を落としてから、iPhoneの場合は設定アプリのBluetoothのペアリングデバイスの項目にある該当のデバイスの連携を削除して、更にLINE Thingsの連携画面からもデバイスの連携解除をしたあとに、再度デバイスの電源を入れ直せば、また新しいLIFFアプリを立ち上げてデバイスを操作できるはずです。また、micro:bitの場合は追加でmicro:bitのキャッシュをクリアにする必要があります。