1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ESP32でBLEの実装作業【スキャン】

Last updated at Posted at 2021-02-19

はじめに

今回は前回ESP32でBLEの実装作業【ブロードキャスト】の話の続き、ESP32同士にBLEで通信を構築する際にどのような方法でブロードキャストされたパケットを発見することについて紹介します。

環境

  • IoTデバイス(ESP-WROOM-32)
  • ファームウェア(MicroPython1.13)

この記事の作業を始める前にmicropythonのバージョンが1.13であることを確認してください。確認手順は下にある図を参考してください。
image.png
※バージョンがずっと更新しているので, 異なるバージョンで機能しない可能性があります.

ソースコード及び結果(ESP32)

今回はBLEをオフにするプログラムble_stop.pyとスキャンするプログラムble_scanner.pyを分けて説明していきます。

ble_stop.py

前回も軽く言ったと思いますが、BLEを長時間使うと、ブロードキャスターであれオブザーバーであれ、ESP32に膨大な負荷がかかってしまいます。APIとの反応が遅くなるのはともかく、プログラムが機能しないケースも時々起こります。したがって、使用しないときはBLEをオフにすることをお勧めします。

コード

BLEを稼働するままでオフにする時に下記のコードを使用します。

ble_stop.py
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アドレスを表示することにします。
image.png

スキャンのプログラム

今回は簡単なBLE電波をキャッチして中身の情報を表示するプログラムble_scanner.pyを紹介します。他にも電波をキャッチすることができるデバイスBluetooth LE(BLE)のcapture用のTI CC2540 dongleをとりあえずここで貼っておきます(必要であれば)。

コード

irqはイベントを喚起する関数です。BLEがスキャンする際に二つEVENTが発生し、それぞれは_IRQ_SCAN_RESULT、_IRQ_SCAN_DONEです。意味はmicropythonのオフィシャルサイトを参考する方がよいでしょう。

ble_scanner.py
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)


結果

結果は下図のような成功にスキャンしたパケットの中身を表示します。
image.png

最後に

今回はBLEをオフにするプログラムble_stop.pyと前回のブロードキャストされたパケットを発見するスキャンプログラムble_scanner.pyを紹介しました。次回は本格的にESP32同士のBLE通信を構築する内容を紹介します。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?