利用ESP32构造一个ZIGBEE的网络发送转接

本文档介绍了如何利用ESP32的联网功能构建一个WiFi UDP到Zigbee的串口转换模块。通过ESP32连接到WiFi网络并设置UDP端口,将接收到的UDP指令转发到Zigbee网络,从而实现远程控制Zigbee设备。文章详细阐述了硬件连接、软件编程以及如何获取ESP32的IP地址。最终验证了该模块的有效性,ESP32的IP地址为192.168.0.116,端口号为4567。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简 介: 利用 ESP32的联网功能,构建了一个 WiFi UDP 转 Zigbee的串口模块。这个模块仅仅是将 UDP的指令发送到Zigbee的网络中,便替代了原来的功能。注意,ESP32的网络地址为: 192.168.0.114。如何能够获得 ESP32的IP地址呢? 可以介入 192.168.0.1 WiFi网关,在DHCP服务器的客户列表中检查到 Espressif的IP地址。

关键词 ESP32Zigbee

ZIGBEE网关
目 录
Contents
背景介绍
制作模块
软件编程
总 结

 

§01 ZIGBEE网关


一、背景介绍

  在 实验室中的第三只手:滑轨参数以及控制接口 给出了实验室中的滑轨平台控制参数。这些平台都是通过连接在 “COM2” 上的 zigbee 通讯模块相互连接的。由于现在平台所使用到的串口设置遇到问题,因此计划使用ESP32作为网桥,作为UDP转成COM口的转换网桥,这样可以使得原来实验室的设备能够继续使用。

二、制作模块

1、ESP32模块

  ESP32模块使用了基于ESP32的智能车竞赛裁判系统 ,这是由龙邱公司生产出售的。 可以通过其中的TXD2,RXD2完成向ZIGBEE 发送信息。

▲ , ESP32裁判系统中的串口

▲ , ESP32裁判系统中的串口

2、ZIGBEE模块

  下图给出了ZIGBEE的接口,通过四芯的扁平电缆与ESP32裁判系统模块相连。

▲ 图1.2.2 ZIGBEE接口与ESP32之间的接口

▲ 图1.2.2 ZIGBEE接口与ESP32之间的接口

三、软件编程

1、测试串口

  参考在 第十七届智能车竞赛比赛系统软件修改-多车组时间延迟 博文中对于ESP32裁判系统软件修改中的代码,编写串口测试软件。代码如下:

from machine                import Pin,UART
import time
import machine

machine.freq(240000000)
uart1 = UART(2, baudrate=115200, rx=16, tx=17, timeout=10)
bz1 = Pin(21, Pin.OUT)
bz1.off

while True:
    uart1.write(bytes([0x55]))

    time.sleep_ms(10)

  测试 TX2 管脚的波形为为:

▲ 图1.3.1 发送0x55数据TX波形

▲ 图1.3.1 发送0x55数据TX波形

2、发送ZIGBEE命令

  将ESP32连接到 ZIGBEE模块。

▲ 图1.3.2 连接ZIGBEE模块

▲ 图1.3.2 连接ZIGBEE模块

  通过如下程序,每隔 500ms 发送一个relay click 指令,经过验证,动作正常。由此证明整个ZIGBEE发送过程是正常的。

from machine                import Pin,UART
import time
import machine

machine.freq(240000000)
uart1 = UART(2, baudrate=115200, rx=16, tx=17, timeout=10)
bz1 = Pin(21, Pin.OUT)
bz1.off

while True:
    uart1.write(b'solenoidrelay pulse 4 50\r')

    time.sleep_ms(500)
    print("SEND.")

3、连接WiFi接口

  根据 ESP32模块的MicroPython的基本实验 对于ESP32联网的一般实验,将ESP32接入实验室中的 WiFi 热点,并建立UDP接口连接。

  如下是完整的 ESP32程序。使用 Thonny IDE 将 下面的程序写入ESP32内部FLASH,并启动。

from machine                import Pin,UART
import machine,time, network, usocket

machine.freq(240000000)
uart1 = UART(2, baudrate=115200, rx=16, tx=17, timeout=10)
bz1 = Pin(21, Pin.OUT)
bz1.off()

wlan = network.WLAN(network.STA_IF)
wlan.active(False)

wlan.active(True)
time.sleep_ms(100)
wlan.connect('TENDA626A', 'gniqouhz')

bz1.on()
while not wlan.isconnected():
    time.sleep_ms(100)

wlan.ifconfig()

bz1.off()

us = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
sockaddr = usocket.getaddrinfo('0.0.0.0', 4567)[0][-1]
us.bind(sockaddr)

while True:
    data,addr = us.recvfrom(1024)

    if len(data) > 0:
        bz1.on()
        uart1.write(data)
        bz1.off()

  经过测试,发送一下指令,可以引起实验室中ZIGBEE中的继电器动作。

solenoidrelay pulse 4 50

  这也就验证了这个WiFi 转 Zigbee的模块功能正常了。

 

  结 ※


  用 ESP32的联网功能,构建了一个 WiFi UDP 转 Zigbee的串口模块。这个模块仅仅是将 UDP的指令发送到Zigbee的网络中,便替代了原来的功能。

  注意:

  • ESP32的网络地址为: 192.168.0.116
  • 端口号:4567

  如何能够获得 ESP32的IP地址呢? 可以介入 192.168.0.1 WiFi网关,在DHCP服务器的客户列表中检查到 Espressif的IP地址。

▲ 图2.1 ESPressif IP地址

▲ 图2.1 ESPressif IP地址

▲ 图2.2 静态设置的地址

▲ 图2.2 静态设置的地址

可以使用 DHCP服务器中增加静态分配 IP 地址,这样就可以固化ESP32 接入的 IP 地址了。

▲ 图2.3 利用 HDCP 服务器进行静态IP分配

▲ 图2.3 利用 HDCP 服务器进行静态IP分配


■ 相关文献链接:

● 相关图表链接:

### ESP32 使用 Zigbee 协议自定义发送数据 为了使ESP32能够通过Zigbee协议自定义发送数据,通常会采用ESP-Zigbee-SDK作为开发工具。此过程涉及到创建和配置Zigbee设备端点、集群及其属性,并利用特定的API函数来处理消息传输。 #### 创建和配置Zigbee设备 在`idf_component.yml`文件中声明对必要组件的支持,比如`esp-zboss-lib`和`esp-zigbee-lib`[^5]。这一步骤确保了项目能自动获取所需库,从而简化外部依赖管理。 接着,在应用程序代码里初始化Zigbee堆栈: ```c #include "zboss_api.h" // 初始化Zigbee堆栈 void init_zigbee_stack(void){ zb_ret_t ret; /* 启动Zigbee堆栈 */ ret = ZB_INIT("zigbee_example"); if (ret != RET_OK) { // 错误处理... } } ``` #### 定义端点和服务 对于想要发送的数据类型,需先设定对应的Zigbee端点与服务。例如,如果目标是实现简单的开关灯控制,则应建立一个具有基本开/关功能的照明设备模型。 ```c #define ENDPOINT_ID 0x01 // 设备端点ID #define CLUSTER_ID_ON_OFF 0x0006 // 基本开/关簇ID /* 注册端点及关联的服务 */ static void register_endpoint_and_services(){ zb_uint8_t endpoint; /* 添加新端点 */ endpoint = ZB_ZCL_GET_FREE_ENDPOINT(); ZB_AF_REGISTER_DEVICE_INST(endpoint, &device_info); /* 将ON/OFF群集绑定到该端点 */ ZB_ZCL_ADD_CLUSTER_TO_EP(endpoint, CLUSTER_ID_ON_OFF, ZB_ZCL_CLUSTER_SERVER_ROLE); } ``` #### 构建并发送自定义帧 当准备就绪后,就可以构建包含要传送信息的有效载荷,并调用适当的方法将其发出。下面是一个用于向另一节点广播简单命令的例子: ```c /* 发送自定义数据包给其他节点 */ void send_custom_data(zb_addr_u addr_mode, zb_ieee_addr_t ieee_addr, zb_uint16_t dst_addr){ zb_bufid_t buf; zb_uint8_t *ptr; /* 获取缓冲区指针 */ buf = ZB_BUF_GET_OUT(); ptr = ZB_BUF_BEGIN(buf); /* 写入有效负载 - 此处仅为示例目的填充了一些字节 */ *(ptr++) = 'H'; *(ptr++) = 'i'; /* 更新长度字段 */ ZB_SET_SHORT_DATA_LEN(buf, ptr - ZB_BUF_BEGIN(buf)); /* 准备并发送数据 */ ZB_SEND_MSG( buf, ZB_APS_ADDR_MODE_16_ENDP_PRESENT | addr_mode, dst_addr, ENDPOINT_ID, ENDPOINT_ID, CLUSTER_ID_ON_OFF, NULL, 0 ); } ``` 上述方法展示了如何基于ESP32平台并通过Zigbee协议执行基础的消息传递操作。当然,实际应用场景可能会更加复杂,涉及更多细节上的考量和技术选型。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卓晴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值