ナビタイムのカーナビリモコンの解析

3 min read

BLEカーナビリモコン

ジャンクとして入手したカーナビリモコン、今回入手したものは本来はナビタイムで使うもののようです。CNR-01Bという製品名が裏の電池ボックスの蓋に書いてあります。

準備

まずあれこれやった末にpybluez[ble]とgattlibをインストールしました。
環境はpython3.6、xubuntu18.04です。
BLE対応版のpybluez[ble]をインストールする場合は必要なパッケージいくつかあるようなのでそれを先にインストールします。
必要なパッケージのリストについてはgithub(pybluez/pybluez)のREADME.mdに書いてありました。

sudo apt install pkg-config
sudo apt install libboost-python-dev
sudo apt install libboost-thread-dev
sudo apt install libbluetooth-dev
sudo apt install libglib2.0-dev
sudo apt install python-dev

そして、gattlibとpybluez[ble]のインストールを行います。

sudo pip3 install gattlib
sudo pip3 install pybluez[ble]

gattlibのインストールでエラーが出る

gattlibをインストールしようとしたときにエラーが出ましたがこれはgattlibのビルドの際になぜかlibboostのpython3.4のライブラリを使おうとしていたことが原因でした。

###この問題の対処法(暫定的)

sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python-py36.so /usr/lib/x86_64-linux-gnu/libboost_python-py34.so

おそらくコードが古いままで更新されてないことが原因だと思いましたのでとりあえず暫定的にシンボリックリンクで対応しました。今のところ問題なくインストールできて動いています。
**/usr/lib/x86_64-linux-gnu/**の部分は環境によって違うと思います。

通信データを見てみる

hcidumpのインストール

sudo apt install bluez-hcidump

まず&をつけてバックグラウンドでhcidumpを動かします。(別のターミナルで実行してもOK)

sudo hcidump -R &

そしてhcitoolでlescanを実行します。

sudo hcitool lescan

すると通信データが出てきました。

EB:01:10:18:D1:2A (unknown)
04 3E 1B 02 01 03 01 2A D1 18 10 01 EB 0F 02 01 04 0B FF 59
00 E3 00 01 01 00 00 00 00 B5

ボタンをいろいろ押しながら見てみると変化がある数値は次の通りでした。
太文字のところが変化します。

04 3E 1B 02 01 03 01 2A D1 18 10 01 EB 0F 02 01 04 0B FF 59
00 E3 00 01 01 00 00 00 00 B5

太字の部分だけで9Byteのデータがあることがわかります。
この部分だけ抜き出してみると

E3 00 01 01 00 00 00 00 B5
となります。

太字の部分の先頭から2Byte分E3 00は押すたびに数値が1つずつ進みます。
E3 00のつぎは E4 00という感じで、FF 00までいくと00 01となりましたので
これは2byteのカウンターのようです。

先頭から3Byte目の01は押したシングルクリックだと01となり
ダブルクリックをすると02に変化します。

先頭から4byte目はシングルクリックだと01となり、長押しすると02になります。

それ以降5Byteから8Byte目はクリックの回数となっています。
1回だと
00 00 00 00
2回クリックだと
01 00 00 00
4回クリックだと
01 01 01 00
5回クリックだと
01 01 01 01

となり全部で指定した時間内で5回クリックまで表現できるようです。

9Byte目はパリティでしょうか?
不明ですが押すたびに変わったり変わらなかったりします。

これで挙動が判明しました。