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

ライブラリ

blog.kakakikikeke.com

あと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取得とかわかったら追記するかもしれない