ESP-NOWでマルチホップで通信する方法

# はじめに
ESP32でESP-NOWでマルチホップで通信を行います．実装はMicroPython1.22.1で行いました．以下のように3つのESP32に3つのコードを実装します．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562112/68a0a462-8f6a-edd2-4cd2-f0ec336a60c7.png)

# 実装
MicroPythonの公式ドキュメントを参考に実装を行いました．
send.pyが送信を行うプログラム，relay.pyが受信したデータを転送するプログラム，receive.pyがデータを受信するプログラムです．
~~~micropython:send.py
import network
import espnow
import time

try:
    # A WLAN interface must be active to send()/recv()
    sta = network.WLAN(network.STA_IF)  # Or network.AP_IF
    sta.active(True)
    sta.disconnect()      # For ESP8266

    e = espnow.ESPNow()
    e.active(True)
    peer = b'0\xae\xa4\xd4}\x04'   # MAC address of peer's wifi interface
    e.add_peer(peer)      # Must add_peer() before send()

    e.send(peer, "Starting...")

    for i in range(60):
        e.send(peer, str(i), True)
        print(i)
        time.sleep(1)

    e.send(peer, b'end')
    e.active(False)
    sta.active(False)
    
    time.sleep(60)
	
except Exception as e:
    f = open("error.log", "a")
    f.write(str(e))
    f.write("\n")
    f.close()
    e.active(False)
    sta.active(False)
~~~
peerには送信先のmacアドレスを入力してください．
送信内容を変更するにはe.send()の2番目の引数を変更してください．
e.sendのすぐ下のprint部分では送信した内容を出力してます．
printする内容も送信内容に応じて変更してください．
~~~micropython:relay.py
import network
import espnow
import time
    
try:
    # A WLAN interface must be active to send()/recv()
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    sta.disconnect()   # Because ESP8266 auto-connects to last Access Point

    e = espnow.ESPNow()
    e.active(True)
    peer = b'\x10R\x1ch\x88D'
    e.add_peer(peer)

    while True:
        host, msg = e.recv()
        if msg:             # msg == None if timeout in recv()
            print(host, msg)
            e.send(msg)
            time.sleep(1)
            if msg == b'end':
                break

    e.active(False)
    sta.active(False)
    
    time.sleep(60)
    
except Exception as e:
    f = open("error.log", "a")
    f.write(str(e))
    f.write("\n")
    f.close()
    e.active(False)
    sta.active(False)
~~~
peerには送信先のmacアドレスを入力してください．
~~~micropython:receive.py
import network
import espnow
import time


try:
    # A WLAN interface must be active to send()/recv()
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    sta.disconnect()   # Because ESP8266 auto-connects to last Access Point

    e = espnow.ESPNow()
    e.active(True)

    while True:
        host, msg = e.recv()
        if msg:             # msg == None if timeout in recv()
            print(host, msg)
            if msg == b'end':
                break
        
    e.active(False)
    sta.active(False)

    time.sleep(60)

except Exception as e:
    f = open("error.log", "a")
    f.write(str(e))
    f.write("\n")
    f.close()
    e.active(False)
    sta.active(False)
~~~
送信側のコードを実行すると以下のように送信したデータが出力されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562112/7df045f9-e6a9-e802-da4a-32aaef391cd7.png)
受信したデータを転送するコードを実行すると以下のように出力されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562112/801ca3bf-ec46-371b-58a6-21fc666b69af.png)
左側の部分が送信元のmacアドレス，右側の部分が受信したデータの内容です．
データを受信するコードを実行すると以下のように出力されます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3562112/111faffc-b4fd-04bf-e739-0fcfab14f9fe.png)
左側の部分が送信元のmacアドレス，右側の部分が受信したデータの内容です．
転送するコードと受信するコードで出力されるmacアドレスが違うものになっていればマルチホップで通信できています．
# 最後に
拙いですが見た方の助けになれば幸いです．
# 参考にしたサイト
https://micropython-docs-ja.readthedocs.io/ja/latest/library/espnow.html