今回はpyblenoを使ってraspberryPIからアドバタイズ発信をし、それを別の機器で確認してみます。
pyblenoをインストールする
まずはpyblenoをインストールします。
インストールにはpipを利用します。
ちなみにpyblenoのサンプルコードなどはこちらにあります。
$ # pip3 install pybleno
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting pybleno
Downloading https://www.piwheels.org/simple/pybleno/pybleno-0.11-py3-none-any.whl
Installing collected packages: pybleno
Successfully installed pybleno-0.11
サンプルコードでアドバタイズ発信する
examplesディレクトリの中に3つのサンプルコードがありますが、今回はその中のechoを使ってみます。echoにはmain.pyとEchoCharacteristic.pyの2つのファイルが格納されています。
(1)main.py
from pybleno import *
import sys
import signal
from EchoCharacteristic import *
print('bleno - echo');
bleno = Bleno()
def onStateChange(state):
print('on -> stateChange: ' + state);
if (state == 'poweredOn'):
bleno.startAdvertising('echo', ['ec00'])
else:
bleno.stopAdvertising();
bleno.on('stateChange', onStateChange)
def onAdvertisingStart(error):
print('on -> advertisingStart: ' + ('error ' + error if error else 'success'));
if not error:
bleno.setServices([
BlenoPrimaryService({
'uuid': 'ec00',
'characteristics': [
EchoCharacteristic('ec0F')
]
})
])
bleno.on('advertisingStart', onAdvertisingStart)
bleno.start()
print ('Hit <ENTER> to disconnect')
if (sys.version_info > (3, 0)):
input()
else:
raw_input()
bleno.stopAdvertising()
bleno.disconnect()
print ('terminated.')
sys.exit(1)
(2)EchoCharacteristic.py
from pybleno import Characteristic
import array
import struct
import sys
import traceback
class EchoCharacteristic(Characteristic):
def __init__(self, uuid):
Characteristic.__init__(self, {
'uuid': uuid,
'properties': ['read', 'write', 'notify'],
'value': None
})
self._value = array.array('B', [0] * 0)
self._updateValueCallback = None
def onReadRequest(self, offset, callback):
print('EchoCharacteristic - %s - onReadRequest: value = %s' % (self['uuid'], [hex(c) for c in self._value]))
callback(Characteristic.RESULT_SUCCESS, self._value[offset:])
def onWriteRequest(self, data, offset, withoutResponse, callback):
self._value = data
print('EchoCharacteristic - %s - onWriteRequest: value = %s' % (self['uuid'], [hex(c) for c in self._value]))
if self._updateValueCallback:
print('EchoCharacteristic - onWriteRequest: notifying');
self._updateValueCallback(self._value)
callback(Characteristic.RESULT_SUCCESS)
def onSubscribe(self, maxValueSize, updateValueCallback):
print('EchoCharacteristic - onSubscribe')
self._updateValueCallback = updateValueCallback
def onUnsubscribe(self):
print('EchoCharacteristic - onUnsubscribe');
self._updateValueCallback = None
以下の操作でサンプルコードを実行します。 これでraspberryPIからアドバイス発信がされます。
$ python3 main.py
bleno - echo
Hit <ENTER> to disconnect
on -> stateChange: poweredOn
on -> advertisingStart: success
アドバタイズの確認をする
今回はMac BookでBLEの確認をしていきます。
App StoreからBlueSee BLE Debuggerをインストールします。
※AndroidスマホなどではBLEスキャナーやnRF Connect for Mobileなどで確認できると思いますので試してみてください。
それではBlueSeeを起動します。
左上のScanを押すと周辺のBLEをスキャンします。
Nameにechoを表示されているのがraspberryPIです。 これでraspberryPIからBLEアドバタイズ発信ができてきることが確認できました。
BLE通信をしてみる
サンプルコードのechoはデータの読み書きが可能です。
そこで、試しにデータの送受信をやってみます。
(1)データの送信
FFというデータを送信してみます。
入力フォームにFFを入力してWriteを押します。
raspberryPIのコンソール画面にMacから受信したWriteデータ(FF)が表示されます。
EchoCharacteristic - 180F - onWriteRequest: value = ['0xff']
(2)データの受信
BlueSeeの入力フォームを一旦クリアし、今度はReadを押してみます。
入力フォームにffが表示されました。
先ほどraspberryPIに送ったFFというデータが送り返されていることがわかります。
raspberryPIのコンソール画面にはReadの要求がきて、先ほど 受信したFFを送信したことを示す内容が表示されています。
これでraspberryPIとデータの送受信ができることを確認できました。
EchoCharacteristic - 180F - onReadRequest: value = ['0xff']