ESPNow是一种轻量级的无线通信协议,适用于ESP32芯片,它可以实现低功耗、高效率的设备间通讯,不需要路由器,也不需要wifi,同时,在使用ESPNow的时候不影响wifi 和蓝牙。
在文章中,我们将学习如何在Micropython环境下使用ESP32的ESPNow功能进行数据传输。ESPNOW支持一对一,一对多,多对多的各种通讯方式,在这里不做更多的说明。
准备工作
在开始之前,确保你已经做好了以下准备工作:
1.安装Micropython固件到ESP32模块上(1.20.0 以后的版本)。
2.确保你有两个或更多的ESP32模块,它们将用于数据通讯(我用的两块ESP32-S3进行的测试,实际ESP8266也是支持的,但是某些函数略有差异)。
获取ESP32的MAC地址
ESPNOW发送数据需要知道目标ESP32的MAC地址。有两种简单的方法获取MAC地址,一种是在烧录完成后可以看到,另一个是通过程序来获得
在上图中烧录完成后可以看到AP和STA状态下的MAC地址
下面是通过代码获取MAC地址的方法:
获取到MAC地址后,一切都简单了,当然,还有一种不获取MAC地址的方法就是广播0xFF*6的方式,废话不多说,直接上代码
发送端
import network
import espnow
import time
sta = network.WLAN(network.STA_IF) # Enable station mode for ESP
sta.active(True)
sta.disconnect() # Disconnect from last connected WiFi SSID
e = espnow.ESPNow() # Enable ESP-NOW
e.active(True)
peer1 = b'x34x85x18x90x86x38' # MAC address of peer1's wifi interface
e.add_peer(peer1) # add peer1 (receiver1)
#如果有多个接收都就在这下面接着增加peer2...
print("Starting...") # Send to all peers
def main():
while True:
e.send(peer1, "这是Slave发送过来的数据", True) # send commands to pear 1
time.sleep(2)
if __name__ == "__main__":
main()
代码很简单,直接官方代码小改,注意使用时改MAC地址即可。
#### 接收端的代码
import network
import espnow
# A WLAN interface must be active to send()/recv()
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.disconnect() # Disconnect from last connected WiFi SSID
e = espnow.ESPNow() # Enable ESP-NOW
e.active(True)
peer = b'x34x85x18x46x3dx28' # MAC address of peer's wifi interface
#这个MAC地址是发送端的
e.add_peer(peer) # Sender's MAC registration
def espnow_rx():
while True:
host, msg = e.recv()
if msg: # wait for message
print(msg)
if __name__ == "__main__":
espnow_rx()
代码简单,不多赘述,注册完设备后就收发信息即可。
通过以上步骤,你就可以在Micropython环境下使用ESPNow进行简单而高效的数据通讯了。记得根据你的实际需求调整代码和配置信息。
几个说明
在Micropython控制硬件主要就分几步走,首先导入相关的库,然后构建对象,接下来定义相关的函数,最后调用定义好的函数。
1.在这里,导入espnow之后,先实例化一个对象并激活。
2.在使用espnow收发数据之前必须先启用Network.STA_IF或者Network.AP_IF,如果不需要wifi转发那就不需要连接或者配置
3.ESPNow.send(mac,msg)注意消息发送消息长度不大于250bytes,如是长度大于250bytes时切包再合包。
4.ESPNow.recv([timeout_ms])接收数据
5.ESPNow.any()检查数据是否可用
6.其它函数简说:
ESPNow.set_pmk(pmk) 设置用于加密本地主密钥的主密钥 (PMK) 用于加密消息的密钥 (LMK)。如果未设置,则默认 PMK 为 由底层乐鑫 ESP-NOW 软件堆栈使用
ESPNow.add_peer(mac[, lmk][, channel][, ifidx][, encrypt])
ESPNow.add_peer(mac, param=value, …)
添加/注册提供的 mac 地址作为对等方。其他参数可以 也被指定为位置或关键字参数(任何设置为 的参数都将设置为其默认值)
ESPNow.del_peer(mac) 取消注册与提供的 mac 地址关联的对等方
ESPNow.get_peer(mac) (ESP32 only) 已注册的对等体上转换信息
ESPNow.get_peers() (ESP32 only) 返回所有已注册对等方的“对等信息”参数(作为元组 元组)。
ESPNow.peer_count() (ESP32 only) 查看已注册对等方的数量
ESPNow.mod_peer(mac, lmk, [channel], [ifidx], [encrypt]) (ESP32 only) ESPNow.mod_peer(mac, ‘param’=value, …) (ESP32 only)
修改与提供的 mac 地址关联的对等方的参数。参数可以作为位置或关键字参数提供 (请参阅)。任何未设置(或设置为 )的参数都将保留该参数的现有值。
ESPNow.irq(callback) (ESP32 only)
设置回调函数,在消息有消息后尽快调用 从另一个 ESPNow 设备接收。将调用回调函数 以实例对象作为参数。
为了更可靠的运行, 建议在以下情况下读出尽可能多的可用消息 调用回调并将读取超时设置为零,例如:
def recv_cb(e):
while True: # Read out all messages waiting in the buffer
mac, msg = e.irecv(0) # Don't wait if no messages left
if mac is None:
return
print(mac, msg)
e.irq(recv_cb)
广播消息的方法:
bcast = b'xff' * 6
e.add_peer(bcast)
e.send(bcast, "Hello World!")
-
无线通信
+关注
关注
58文章
4505浏览量
143379 -
路由器
+关注
关注
22文章
3699浏览量
113462 -
回调函数
+关注
关注
0文章
87浏览量
11537 -
ESP32
+关注
关注
17文章
953浏览量
17023 -
Micropython
+关注
关注
0文章
68浏览量
4707
发布评论请先 登录
相关推荐
评论