はじめに
今回は前回ESP32でBLEの実装作業【ブロードキャスト】の話の続き、ESP32同士にBLEで通信を構築する際にどのような方法でブロードキャストされたパケットを発見することについて紹介します。
環境
- IoTデバイス(ESP-WROOM-32)
- ファームウェア(MicroPython1.13)
この記事の作業を始める前にmicropythonのバージョンが1.13であることを確認してください。確認手順は下にある図を参考してください。
※バージョンがずっと更新しているので, 異なるバージョンで機能しない可能性があります.
ソースコード及び結果(ESP32)
今回はBLEをオフにするプログラムble_stop.py
とスキャンするプログラムble_scanner.py
を分けて説明していきます。
ble_stop.py
前回も軽く言ったと思いますが、BLEを長時間使うと、ブロードキャスターであれオブザーバーであれ、ESP32に膨大な負荷がかかってしまいます。APIとの反応が遅くなるのはともかく、プログラムが機能しないケースも時々起こります。したがって、使用しないときはBLEをオフにすることをお勧めします。
コード
BLEを稼働するままでオフにする時に下記のコードを使用します。
import ubluetooth
import utime
ble=ubluetooth.BLE()
# macアドレスを十六進数で表示
def form_mac_address(addr: bytes) -> str:
return ":".join('{:02x}'.format(b) for b in addr)
if ble.active()== True:
ble.active(False)#BLEをオフ
print(ble.active())
#macアドレスを表示する
print("BLE current mac address: {}".format(form_mac_address(ble.config("mac"))))
結果
結果は下図の通りでまず今のBLE状態を出力して、次に現在のmacアドレスを表示することにします。
スキャンのプログラム
今回は簡単なBLE電波をキャッチして中身の情報を表示するプログラムble_scanner.py
を紹介します。他にも電波をキャッチすることができるデバイスBluetooth LE(BLE)のcapture用のTI CC2540 dongleをとりあえずここで貼っておきます(必要であれば)。
コード
irqはイベントを喚起する関数です。BLEがスキャンする際に二つEVENTが発生し、それぞれは_IRQ_SCAN_RESULT、_IRQ_SCAN_DONEです。意味はmicropythonのオフィシャルサイトを参考する方がよいでしょう。
import ubluetooth
import utime
import ubinascii
from micropython import const
_IRQ_SCAN_RESULT = const(5)
_IRQ_SCAN_DONE = const(6)
ble=ubluetooth.BLE()
if ble.active()== False:
ble.active(True)#BLEを起動する
# イベント喚起関数irq
def bt_irq(event, data):
if event == _IRQ_SCAN_RESULT:
# A single scan result.
addr_type, addr, connectable, rssi, adv_data = data
print('type:{} addr:{} rssi:{} data:{}'.format(addr_type, ubinascii.hexlify(addr), rssi, ubinascii.hexlify(adv_data)))
elif event == _IRQ_SCAN_DONE:
# Scan duration finished or manually stopped.
print('Scan compelete')
pass
ble.irq(bt_irq)
# スキャン!!
ble.gap_scan(10000, 30000, 30000)
結果
結果は下図のような成功にスキャンしたパケットの中身を表示します。
最後に
今回はBLEをオフにするプログラムble_stop.py
と前回のブロードキャストされたパケットを発見するスキャンプログラムble_scanner.py
を紹介しました。次回は本格的にESP32同士のBLE通信を構築する内容を紹介します。