はじめに
ESP-NOWで一対多の通信を行う方法を紹介します.
環境
複数のESP32を使用します.
実装はMicroPython1.22.1で行いました.
ブロードキャスト
受信可能な全ての機器に対してデータを送信します.
図に表すと以下のようになります.
送信側は以下のプログラムです.
import network
import espnow
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
e = espnow.ESPNow()
e.active(True)
peer = b'\xbb\xbb\xbb\xbb\xbb\xbb' #送信先設定
e.add_peer(peer) #送信先追加
e.send(peer, "Hello World") #データ送信
e.send(peer, b'end') #通信終了
送信先をb'\xbb\xbb\xbb\xbb\xbb\xbb'にすることで受信可能な全ての機器に対してデータを送信することができます.
実行すると送信側に以下のように出力されます.
受信側は以下のプログラムです.
受信側のプログラムはブロードキャストでもマルチキャストでも同様です.
import network
import espnow
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
e = espnow.ESPNow()
e.active(True)
while True:
host, msg = e.recv() #データ受信
if msg:
print(host, msg) #受信データ出力
if msg == b'end': #通信終了
break
マルチキャスト
指定した複数の機器に対してデータを送信します.
図に表すと以下のようになります.
この図では赤丸で囲んだESP32を送信先として示しています.
赤丸で囲んでいない機器は送信先ではないので送信されません.
送信側は以下のプログラムです.
import network
import espnow
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
e = espnow.ESPNow()
e.active(True)
peer1 = mac1 #送信先設定
e.add_peer(peer1) #送信先追加
peer2 = mac2 #送信先設定
e.add_peer(peer2) #送信先追加
e.send(None, "Hello World") #データ送信
e.send(None, b'end') #通信終了
mac1,mac2の部分を送信先のmacアドレスに変えてください.
e.send()の第一引数をNoneにするとe.add_peerで追加した全ての対象にデータを送信することができます.
実行すると送信側に以下のように出力されます
受信側は以下のプログラムです.
受信側のプログラムはブロードキャストでもマルチキャストでも同様です.
import network
import espnow
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect()
e = espnow.ESPNow()
e.active(True)
while True:
host, msg = e.recv() #データ受信
if msg:
print(host, msg) #受信データ出力
if msg == b'end': #通信終了
break
送信対象でないデバイスはreceive.pyを実行しても以下のように何も受信しません.
最後に
拙いですが助けになれば幸いです.
参考