pyblenoを使ってraspberryPI Zero WHでBLE通信する方法

投稿者: | 2022年8月19日
今回は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']

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です