今回は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']
![[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。] [商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]](https://hbb.afl.rakuten.co.jp/hgb/43ea7ce0.4dbbc683.43ea7ce1.c3463d9a/?me_id=1278256&item_id=23930786&pc=https%3A%2F%2Fthumbnail.image.rakuten.co.jp%2F%400_mall%2Frakutenkobo-ebooks%2Fcabinet%2F7277%2F2000016107277.jpg%3F_ex%3D240x240&s=240x240&t=picttext)