Python
RaspberryPi
bluetooth
Garmin

【Raspberry PI & Garmin GLO】ラズパイに Bluetooth GPSを接続するまで

More than 3 years have passed since last update.

使用機材

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へ変換しましょう。