使用機材
Raspberry PI B+
raspbian: raspberrypi 3.18.7+ #755 PREEMPT Thu Feb 12 17:14:31 GMT 2015
Garmin GLO: Bluetooth GPSレシーバ
Bluetoothドングル: Elecom-Logitec LBT-UAN04C1 (Linuxだと定評あるCSR社チップセット)
準備
モジュール類を導入しましょう
apt-get install bluez bluez-utils
python ver.2でのコーディングをする向きには apt-get install python-bluez も忘れずに
コマンドラインでのGarmin GLO接続テスト
(1) hcitool scan
Garmin GLO をスキャンします。12:34:56:78:90:AB みたいなアドレスが表示されるはず。
(2) ポート接続
sudo rfcomm bind /dev/rfcomm1 12:34:56:78:90:AB 1
これで、Garmin GLO のVirtual COMポートが、/dev/rfcomm1として作成されます。ですが、GLOのbluetooth状態LEDは、ゆっくりとした点滅のままです。(ペアリングされた状態ではありません)
(3) ポートからのデータ吸出し
お手軽は方法としては
cat < /dev/rfcomm1
です。これを実行すると遅れてGLOのbluetooth状態LEDが点灯した状態(すなわちペアリング状態)となり、コンソールにNMEA出力が表示されます。終了時はctrl-cで抜けてください。
もしくは、
dd if=/dev/rfcomm1 of= ...
もOKです。
Python (ver.2)
python ver.2では、PyBluezを使用します。
sudo apt-get install python-bluez
で導入しましょう。
import bluetooth
bd_addr = "12:34:56:78:90:AB"
port = 1
sock=bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr, port))
data=sock.recv(1024)
sock.close()
print data
この場合、sock.recv()の返す data は、str型となります。
Python3
python3では、標準のsocketモジュールを使用します。
import socket
bd_addr = "12:34:56:78:90:AB"
port = 1
sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
sock.connect((bd_addr, port))
data = sock.recv(1024)
sock.close()
dataReadable = data.decode('utf-8')
print(dataReadable)
この場合、sock.recv()の返す data は、bytes型となります。ですので、decode()にてstrへ変換しましょう。