Raspberry Pi 3 ModelB+(Zero W)でBluetooth Low Energyのデータ利用
背景
BLE Nano v2→ATMEGA328p(Arduinoとして使ってる)→sakura.io で作ってたBLEレシーバが、横通り過ぎるだけだと1m以内でも検出に難があったので緊急的にラズパイをレシーバとして使う
目標
ラズパイ3B+でBLE機器のBDアドレスを取得する。 GPIOでArduino+sakura.ioにUART送信 できればZero Wでの実装を目指す。
方法
Python2.7
ライブラリ
あとpyserial
設定
GPIOとBluetoothで同時にシリアル使う Raspberry Pi 3で Bluetoothを生かしつつシリアル通信を有効にする方法(コンソール通信でログイン可能) (ラズパイ3で Bluetoothと UART通信の両方を使える様にする設定方法のまとめ。)
コード
scan.py pybluez/scan.py at master · pybluez/pybluez · GitHub
を元にBDアドレス取得、シリアル送信をできるようにした。やっつけなのでBDアドレスの合計値で照合してるけど、本来はUUIDを取得して照合して9600で送信した方が良いと思う。
from bluetooth.ble import DiscoveryService import re import serial import time import struct tags={取得したいBDアドレスの合計値}; def split_n(text, n): return [ text[i*n:i*n+n] for i in xrange(len(text)/n) ] ser = serial.Serial('/dev/ttyS0',38400,timeout=10) print(ser.portstr) while True: i=0 postList = [] service = DiscoveryService() devices = service.discover(2) for address, name in devices.items(): address = split_n(address.replace(':', '') ,2) sum = 0 for bd in address: sum += int(bd, 16) for t in tags: if t==sum: postList.append(struct.pack("B", (sum>>8))) postList.append(struct.pack("B", (sum&0x00FF))) if postList[0] != '\x00': ser.write(postList)
結果
問題だった検出距離は20m以上でも問題なく検出できた。 シリアル通信も成功
UUID取得とかわかったら追記するかもしれない