2016/09/13 ■ Pokémon GO Plus (ポケモンGOプラス)自作チャレンジ! Xでつぶやくこのエントリーをブックマークに追加このエントリーを含むはてなブックマーク

2016-07-27 20.46.13

ポケモンGoと接続するデバイス「ポケモンGOプラス」の発売日が9月16日と決まり、いよいよポケモンGo本体にもアップデートでPlusと接続する機能が搭載されました。

となるとなんというか、小型ガジェット+自作クラスタとしては自然と「自分でつくってみたい!」ないしは「ポケモンGOプラスを自分のアプリ/デバイスから制御してみたい」という欲求に繋がるわけです。このblogを読んでいるようなみなさんも当然そうですよね?

うち「自分のアプリから制御する」ほうは発売日後のおたのしみとして、とりあえず「ポケモンGOプラス相当のデバイスを自作できるか」チャレンジしてみることにしました。

今回使用したのはBLE Nano。ポケモンGOプラスはBluetooth Low Energy(BLE)規格でスマートフォンと接続し、ボタンやLED・バイブレータの制御をします。じつは私はBLEあんまりちゃんと触ったことがなかったので、今回勉強がてら「簡単に使えそうなもの」をベースに触ってみることにしました。

2016-07-27 20.29.41

すごくちっちゃいのに、USBでPCに繋ぐとmbedで開発できるすぐれもの。なんと開発環境をインストールする必要すらなく、ブラウザ上でソースコードを書きブラウザ上でコンパイルすることができます。そして、マイコンへの書き込みはファイルをコピーするだけ。(USBメモリのように見えているので、ブラウザでコンパイルすると生成されるファイルをまるっとコピーすれば書き込み完了)

BLEのサンプルプロジェクトをビルド・書き込んだらびっくりするほどすんなり動きました。かんたーん!

2016-09-13 11.18.22-2

というわけで、BLEのお勉強をしながら、そしてアップデートされたポケモンGOをぽちぽちしながら、ネットの情報をたゆたいながら…

2016-09-13 02.21.15

「使用可能なデバイス」の一覧に自作GOプラスが表示はされることを確認しました。ただし、ここから接続しようとするとまだちゃんと繋がらないです。

…というわけで、いくつかわかったことを書き留めておきます。

・まず、基礎知識として「Bluetooth Low Energy」規格では、「サービス」という枠組みと、そのサービスの中の「キャラクタリスティック」という変数(のようなもの)で制御します。

・たとえば、ポケモンGOプラスでは「Device Control Service」の中に「LED Vibrate Ctrl」キャラクタリスティックと「Button Notif」キャラクタリスティックがあり、どうやらこれでLED・バイブレータ・ボタンのやりとりをしているみたいです。

・ポケモンGOプラスには

Device Control Service
LED Vibrate Ctrl Characteristic
Button Notif Characteristic
Battery Service
Battery Level Characteristic
FW Update Service
FW Update Request Characteristic
FW Version Characteristic
Certificate Service
SFIDA Commands Characteristic
Central to SFIDA Characteristic
SFIDA to Central Characteristic

があります。

・「Device Control Service」はわかりやすいです。先ほども説明したとおり、LED・バイブレータ・ボタンのやりとりに使われています

・「Battery Service」もそのまま、電池の状態を返します。

・「FW Update Service」は、ファームウェアのバージョンチェックとアップデート用のServiceと思われますが、詳細は現在わかりません。

・問題は最後の「Certificate Service」。どうやら、ポケモンGOプラスが正規品であるかどうか、チャレンジ&レスポンス認証的なやりとりで確認するプロセスのためのサービス…のように見えます。まだ詳細はわかりません。

・なお、ここに出てくる「SFIDA」はポケモンGOプラスのコードネーム(?)のようです。

いまわかっている実際の挙動は…

・BLEのデバイス名に「Pokemon GO Plus」が含まれる(含まれていればよい)デバイスがポケモンGoの「使用可能なデバイス」一覧に表示される

・選択すると、対象デバイスにBonding(Pairing)しようとする。できなければ失敗。

・Bonding(Pairing)に成功すると、ポケモンGO側からCertificate ServiceのSFIDA Commands CharacteristicにNotifyを設定してくる

・この時点で、SFIDA Commands Characteristicでなんらかの値を返す必要がある。この時点で返す値によって、すぐに接続が切られたりする。チェックしているようだ。

image

このへんとかこのへんとか見ると0x30, 0x00の固定値でも返してやればよさそうなんだけれども、それでは動かない。該当部分のコードは現在の最新バージョンでは見えるところに無いみたい。

image

こういったレスポンスの内容も「ForDebug」ってなってるし、このあたりの(解析されている)該当コードまわりはどうやらバージョン「SfidaVersion.BETA4」らしいので、製品版は違うんだろうなあ…というところ。

2016-09-13 02.29.06

というわけで、いまだ道半ば。

やっぱり本物手に入れて眺めてみるか、もっとがっつりとポケモンGO本体を解析でもしないとなんともはや、という感じでした。



追記:実機みました。うわー厳しそう!