0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在Micropython下使用ESPNow功能进行数据传输呢?

冬至子 来源:醉里挑灯舞剑 作者:Franze 2023-11-08 11:27 次阅读

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
收藏 人收藏

    评论

    相关推荐

    ADS1299与STM32f407通过SPI进行数据传输的时候,可以直接使用HAL库中的HAL_SPI_Receive函数进行数据传输吗?

    在与STM32f407通过SPI进行数据传输的时候,可以在使能SPI之后,直接使用HAL库中的HAL_SPI_Receive函数进行数据传输吗?还是需要判断DRDY,在DRDY置低之后再使用HAL_SPI_Receive函数?
    发表于 11-13 08:29

    怎么用LABVIEW和FPGA控制W5300进行数据传输

    用FPGA 控制W5300(采用的是TCP/IP协议)进行数据传输,上位机软件用LABVIEW做!怎么才能进行数据传输。W5300怎么与LABVIEW进行数据传输!!各位大仙能不能给指明方向!谢谢
    发表于 12-30 19:29

    请问问手机与电脑之间在没有网络的情况如何进行数据传输

    请问问手机与电脑之间在没有网络的情况如何进行数据传输
    发表于 05-31 21:15

    TCP通信,完成了使用WiFi模块,进行数据传输功能:包括接收数据,发送数据,发送文件。

    完成了使用WiFi模块,进行数据传输功能:包括接收数据,发送数据,发送文件。
    发表于 01-21 20:16

    关于EDMA PingPong传输和并行传输,请问对于PingPong模式的数据传输,是否只是用一个channel进行数据传输

    的channel可看做是一个传输事件,用于触发一个EDMA通道进行数据传输。记得Andy在一个帖子中曾说过,“IPR寄存器是用来记录产生中断的EDMA channel源,从低到高每一个bit依次对应相应
    发表于 06-20 06:05

    用E90-DTU进行数据传输,怎么将数据传到后台转化

    用E90-DTU进行数据传输,怎么将数据传到后台转化
    发表于 04-02 16:28

    怎样利用ESP8266和Stm32F4单片机进行数据传输

    怎样利用ESP8266和Stm32F4单片机进行数据传输?有哪些操作?
    发表于 10-21 08:55

    如何通过单一数据线进行数据传输

    如何通过单一数据线进行数据传输
    发表于 12-02 07:14

    VEML6040颜色传感器是如何利用I2C总线进行数据传输

    VEML6040是什么?VEML6040颜色传感器的外围电路是怎样的?VEML6040颜色传感器是如何利用I2C总线进行数据传输
    发表于 02-14 06:35

    DMA进行数据传输和CPU进行数据传输的疑问

    原先的总线矩阵+仲裁器结构中的数据总线进行数据传输的? 接上一个问题,如果是的话,那么当进行DMA数据传输时,必定是需要占用数据总线的,那么
    发表于 05-25 17:18

    HT56R678使用I2C进行数据传输的方法

    HT56R678使用I2C进行数据传输的方法 HT56R678 内建有SIM 功能,其中包括了SPI 和I2C 两种通信接口,本文以HT56R678 为母体,介绍使用I2C 进行数据传输的方法和注意
    发表于 03-27 09:25 16次下载

    HT56R678使用I2C进行数据传输的方法

    HT56R678使用I2C进行数据传输的方法HT56R678 内建有SIM 功能,其中包括了SPI 和I2C 两种通信接口,本文以HT56R678 为母体,介绍使用I2C 进行数据传输的方法和注意事项。
    发表于 03-28 22:39 7次下载

    无线数据传输模块的功能特点

    无线数据传输模块主要采用RS485通讯方式,将有线采集端的数据传送到模块中,再以无线方式进行数据传输,实现有线设备和无线设备之间的数据传输
    发表于 07-20 10:21 1622次阅读

    如何实现Typec手机在充电的同时又能进行OTG数据传输方案

    ? Type-C接口的转接器帮你忙,轻松的实现在快充的过程中,又能实现数据传输(OTG)的功能 帮你实现Type-c手机充电的同时又能进行数据传输(OTG)功能 深圳市禾川兴科技  O
    发表于 12-22 14:03 7132次阅读
    如何实现Typec手机在充电的同时又<b class='flag-5'>能进行</b>OTG<b class='flag-5'>数据传输</b>方案

    STM32CubeMX-串口开启DMA进行数据传输

    STM32CubeMX笔记-串口开启DMA进行数据传输
    发表于 12-27 18:40 7次下载
    STM32CubeMX-串口开启DMA<b class='flag-5'>进行数据传输</b>