今回はGPSモジュールではなく、別体のGPSロガー(BlueTooth対応)から位置情報を取得する方法を書きます。
遮蔽物があってGPS衛星がつかめないけれどロガーを外に設置してBlueToothで接続することはできる、という超限定的な環境で意味があるかもしれない記事です。
まずBlueTooth関連の設定をしていきます。
必要なソフトのインストール。
$ sudo apt-get install bluez
$ sudo apt-get install bluetooth blueman bluez-tool
2行に分ける必要があるかわかりませんが、参照したサイトがそうなっていたのでそれに倣って書いています。
下記のコマンドでbluetoothctlのプロンプト(#)に入ります。以下コマンドの後の#表記はroot権限ではありませんのでご注意下さい。
$ sudo bluetoothctl -a
ペアリング対象のアドレスを確認します。
# scan on
確認したらscanを終了します。
# scan off
ペアリングします。
# pair <ペアリング対象のアドレス>
ペアリング対象の自動接続に登録します。(任意)
# trust <ペアリング対象のアドレス>
bluetoothctlから出ます。
# exit
/etc/systemd/system/dbus-org.bluez.service
の以下の部分を変更します。
ExecStartは既にあると思うので書き換え。ExecStartPostを追記します。
ExecStart=/usr/lib/bluetooth/bluetotthd --compat
ExecStartPost=/usr/bin/sdptool add SP
リブートします。デーモンの再起動では設定が反映されないようです。
# reboot
たぶん「var/run/sdp」ができているので、権限を変更します。
できていなかったらmkdirすればok?
とりあえず777で動きますが、セキュリティ的なことは考えていないので、そのへんが重要な時は適宜対策して下さい。
$ sudo chmod 777 /var/run/sdp
状態確認。
$ sdptool browse local
Serial Port serviceがないので追加。channelは任意で。listen側にする時以外関係なさそう?
$ sudo sdptool add --channel=22 SP
GPSロガーに接続します。
$ sudo rfcomm connect hci0 <ペアリング対象のアドレス> &
あとは
$ cat /dev/rfcomm0
でGPSデータが流れるはずです。
コマンドを流す時はいつもどおり、
$ echo -e "\$PMTK220,100*2F\r\n" > /dev/rfcomm0
$ echo -e "\$PMTK300,100,0,0,0,0*2C\r\n" > /dev/rfcomm0
などとすれば良いハズです。
10Hz化について詳しくはこちらをご覧ください。
BlueTooth接続の場合は通信速度の変更は不要かもしれません。(詳細未調査。PMTK、sttyコマンドで変更できるのかも未調査。必要になったら調べます…。)
ここで新たに発見した注意点。
PMTK220コマンドとPMTK314コマンドは、両方共に報告周期をパラメータに持ちます。
それ故にどちらかのコマンドを入力すると、どちらかが反映されない事があるようです。
両方のコマンドを入力していて、後から入れたコマンドが反映されない時はこの辺を疑うと良いかもしれません。
これがチップ依存なのかロガー依存なのか仕様なのか判っていませんが、現状そのような動きになっているようです。
もしかしたら正式な仕様は決まっていないのかもしれません。
また、チップやロガーメーカーの資料も限定的であることが多いので、試してみるしか無いのかもしれませんね。