まえおき
ひとり開発 Advent Calendar 2019の18日目!エントリの空きを突然頂戴して無理やり当日凸してます!
余談ですが作業ミスエントリ流行ってるんですかね。Advent Calender以外でも色々書かれてる気がします。
当方もまさにこの実装をギブアップしたのでドシドシ書いていこうと思います。笑
11月末から作り始めたのに途中から全く目途が立たなくなったのでどこぞのAdvent Calenderにエントリできなかったっていうのを諦めてたのに強引に滑り込ませたという経緯ですね・・
前回の続き
バズった割にあんまキてない技術の一つとしてiBeaconがありますが、その理由の一つにBluetooth使ってないのにバッテリー勿体ないからオフってる人が多いからというのがありましたが、この実験から見るに2019年現在ではバッテリーの大容量化によってデフォでオンな人が多いと思いました。
ハイプサイクル水面下で密かにBLEがデファクトになっているような気がした実験でした。BLEありきで他のアプリも作れそうな気がしたので仮説をば。
仮説
スマホで様々なアプリが出てきたおかげで便利になった反面、現在のイノベーションがマッチングビジネスといわれるように点と点を結びつける機能しかない。欲しいサービスは唐突に発生するものであり、ラストワンマイル(㍍?)を柔軟に埋めるのは人手しかない。
- とあるデパートのとある場所に行きたいが建物の案内図がシャレオツデザインでよくわからない
- 109のようなビルなので回りに女性しかいない。僕のようなおじさんが手短に訪ねると事案発生
- 勇気をもって尋ねる。「XX階のXXの隣ですよ」と回答を得て一安心
- が、それを傍目から見ていた人が激写。「XXでおじさんがナンパしてる!」とSNSに勝手にアップ
- SNS内で「勝手に他人をアップしてる案件」と炎上して論点と無関係なのに全力で晒されてしまう。
というようなSNSがあるが故にイデオロギー構想に巻き込まれたりするんですよ。怖いですね。~~~いや、それ完全におじさん視点の妄想だし~~~
普段、人間対面でのsocialな意見交換は居酒屋や職場での雑談の中で匿名(に近い低いアイデンティティレベル)かつ、狭い範囲で行われいますがネットを介在した瞬間に同じ活動は許容されなかったりする。
匿名であってもログは残る。暗号化しても某国みたいな圧力で開示されてしまうかもしれないし、Threemaとかみたく相手確認を厳密にすればするほどsocialな繋がりは絶たれてしまう。Sarahah、Crypviserも。
勇気をもって尋ねる。「XX階のXXの隣ですよ」と回答を得て一安心
→一部の人しか知らない and 後に何も残らないエンド
これをアプリで実装できないものだろうか?
で実装
BLEを残虐に酷使してます。SIGの人が見たら激怒しそう・・
送信したい文字列を分割してservice uuidに収まる3個の数字ずつにします。先頭にメッセージの順番の数字を付与します。
送信側はオフ→オン(酷いwwww)を繰り返しservice uuidを載せてadvertisingします。受診側はMAC毎にメッセージを順番に並べます。最終メッセージである0000が来たらdecodeして文字列にします。
デモ
メッセージを送信しています。実装の通りBluetoothのアイコンがぺかぺかしているのが右上で見れます。
送信されたメッセージが一個ずつ受信されデコードされています。
よくあるメッセンジャーサービスのようで実装に書いた通り、この送受信の間にbleのコネクションを張るような処理はありません。
ただ、スキャンしたいデバイス名のservice uuidを並べていって文字にデコードしているという処理なので、
"匿名"で"狭い範囲"で声を出して問いかけているというような条件になっていることがわかるでしょうか。
〆
これをSMS広告メッセージの代わりにすることもできると思います。BLE Advertisingが見れれば受信できるのでiBeaconより手間にならないし。
愚痴に書く通り安定したcallbackが期待できないので地獄のビジーウェイト実装してたりしてますが、動作した証拠として載せます。
愚痴
「android ble 辛い」で検索すると色々出てくる訳ですが、この程度なら!と無視したクロスカウンター喰らったわけです。
まずスマホ実装前にドライバ/スタブが要りそうなのでGolangで実装
ここまで二日間弱。あれ?あと2、3日で全部出来るかな??と思いきやぎっちょん!
currantlabs/bleがWindows未対応(Goのライブラリなのに・・)で使えないのでひたすらWindows環境で作ってくことになった。
まあロジック書けたからいいやーと割り切ったもののそこからcordovaのプラグインに振り回される泥沼に・・
そもそもstartがあるのにstopが無いとかサンプルが無いとかカオスっぷりが凄まじく何度も諦めそうになった。あとerror時にcallbackこねー。どこがおかしいのか切り分けし辛い。。
- cordova-plugin-ble-central
こいつからAPI呼ばないとアプリ初回起動時の位置情報許可の画面が出てこない。毎度アプリの設定を手動でするはめになります。ble enableでも位置許可無しだと動きません。
- cordova-plugin-ble-peripheral
こいつからしかAdvertisingできない。うえにissue上は128bit対応しているぽいのに16bitしか動かないようです。ネット上では128bit実装ばかりでまず気づけない。
- cordova-plugin-bluetoothle
central、peripheralなんでもAPI揃っているようで動作しない実装がある。bleのオンオフは動くのでそれだけ使いたいので入ってる
本来ならそれぞれの修正願いのissue書くべきなんだけどなんで動かないか分からないので書きようがない。。それともgolangの動作が良すぎるのか。
(bluetoothオフオン無しでservice id速攻で切り替わる&検出する)
Android SutdioのSimulatorがBluetoothエミュレーション無いとのことでデバッグもどえらく辛かった。
途中で現行環境捨てて、React NativeとかKotlinに移住した方が良かったんだよな。。
なんで動かないか分からないので、かろうじて動作する、なんで動くかわからないコードで実装するハメになるのはどうなのよ?と喚きたい。(という言い訳)
Androidが悪いのか、Cordovaが悪いのか(新しめの機種に対応できてない??)、端末依存なのかとかlogcatからは切り分けもできない・・
引き続きジャイロとか使ってみたいけどハード側を触るのはこれ以上Cordovaでは辛い気がする。最初HTML+Javascriptで書いておいてスマホ用に少しずつ実装していくスタイルはめちゃ軽くて好きなんだけどなあ・・残念。
ていう、誰にも聞きこめない、ひとり開発的な悶々でオトシます。
読んで頂いた方に多謝!