it编程 > 硬件开发 > stm32

利用 STM32 实现多协议物联网网关:Modbus/Zigbee 到以太网/Wi-Fi 的数据桥接

83人参与 2024-08-06 stm32

摘要: 随着物联网技术的飞速发展,不同通信协议之间的互联互通成为了构建智能化系统的一大挑战。本文将以实战项目为例,详细介绍如何利用 stm32 微控制器实现 modbus/zigbee 与以太网/wi-fi 之间的协议转换,从而打通传感器数据上传至服务器的“最后一公里”。

关键词: stm32,协议转换,modbus,zigbee,以太网,wi-fi,物联网

一、 引言

在物联网时代,各种传感器和设备如同百花齐放,但同时也带来了“语言不通”的难题——它们往往采用不同的通信协议,例如工业现场常用的 modbus、无线传感网络常用的 zigbee,以及连接互联网的以太网和 wi-fi 等。为了实现数据的互联互通,我们需要一个“翻译官”来进行协议转换。

本文将介绍如何使用 stm32 微控制器搭建一个协议转换网关,实现 modbus/zigbee 设备与以太网/wi-fi 网络之间的无缝连接,并将传感器数据最终传输到服务器,为构建智能化系统提供可靠的数据桥梁。

二、 系统架构

本项目采用分层架构设计,主要包括以下几个部分:

  1. 感知层: 负责采集数据的传感器,例如温度、湿度、光照度传感器等,它们可能采用 modbus 或 zigbee 协议进行通信。
  2. 协议转换层: 核心模块,使用 stm32 微控制器作为主控芯片,通过不同的通信接口和协议栈实现 modbus/zigbee 与以太网/wi-fi 之间的协议转换。
  3. 网络层: 提供网络连接,例如以太网、wi-fi 等,将数据传输到服务器。
  4. 应用层: 运行在服务器上的应用程序,负责接收、处理、存储和展示传感器数据。

三、 硬件设计

本项目的硬件平台以 stm32f103 为例,该芯片拥有丰富的片上资源,包括多个 uart、spi 接口以及可扩展的以太网和 wi-fi 模块。

硬件连接示意图如下:

四、 软件设计

软件设计是本项目的核心,主要包括以下几个模块:

  1. modbus 协议栈: 实现 modbus rtu/tcp 协议的解析和封装,负责与 modbus 传感器进行数据交互。
  2. zigbee 协议栈: 实现 zigbee 协议的解析和封装,负责与 zigbee 传感器进行数据交互。
  3. 网络协议栈: 实现 tcp/ip 协议栈,负责与服务器建立连接并进行数据传输。
  4. 数据处理模块: 负责对传感器数据进行解析、格式转换和打包,以便上传至服务器。

4.1 modbus 协议栈

modbus 协议栈负责解析从 modbus 传感器接收到的数据帧,并将其转换为系统内部可以理解的格式。同时,它也需要将系统发出的指令封装成 modbus 协议数据帧,发送给 modbus 传感器。

以下代码展示了使用 freemodbus 库实现 modbus rtu 主站读取数据的示例:

// 初始化 modbus 主站
embmasterinit(mb_rtu, 1, 115200, mb_par_none);
embmasterstart();

// 读取保持寄存器
usreginputbuf[0] = 1; // 从站地址
usreginputbuf[1] = 0x03; // 功能码
usreginputbuf[2] = 0x00; // 起始地址高字节
usreginputbuf[3] = 0x00; // 起始地址低字节
usreginputbuf[4] = 0x00; // 寄存器数量高字节
usreginputbuf[5] = 0x02; // 寄存器数量低字节

embmasterrequest(1, mb_func_read_holding_register, usreginputbuf, 8, &ucmastersend);

// 处理接收到的数据
if (embmastergetstate() == state_valid_data) {
    // 读取数据
    int16_t value1 = (int16_t)(usregholdbuf[0] << 8 | usregholdbuf[1]);
    int16_t value2 = (int16_t)(usregholdbuf[2] << 8 | usregholdbuf[3]);
    // ...
}
4.2 zigbee 协议栈

zigbee 协议栈负责处理与 zigbee 传感器之间的通信,包括网络建立、节点加入、数据收发等功能。可以选择使用 z-stack、zigbee2mqtt 等开源协议栈,也可以根据实际需求开发专用的协议栈。

以下代码展示了使用 z-stack 发送数据的示例:

uint8 data[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a};
afaddrtype_t dstaddr;

dstaddr.addrmode = (afaddrmode_t)addr16bit;
dstaddr.endpoint = 1;
dstaddr.addr.shortaddr = 0x0001; 

af_datarequest(
    &dstaddr,
    &sampleapp_epdesc,
    sampleapp_clusterid,
    10,
    data,
    &sampleapp_transid,
    af_discv_route,
    af_default_radius
);
4.3 网络协议栈

网络协议栈负责将数据通过以太网或 wi-fi 发送到服务器,可以使用 lwip、uip 等轻量级 tcp/ip 协议栈。

以下代码展示了使用 lwip 建立 tcp 连接并发送数据的示例:

struct netconn *conn;
struct ip_addr dest_ip;
err_t err;

// 解析服务器 ip 地址
ip4_addr(&dest_ip, 192, 168, 1, 100); 

// 创建 tcp 连接
conn = netconn_new(netconn_tcp);
netconn_connect(conn, &dest_ip, 8080);

// 发送数据
netconn_write(conn, data, strlen(data), netconn_copy);

// 关闭连接
netconn_close(conn);
netconn_delete(conn);

4.4 数据处理模块

数据处理模块是 stm32 协议转换网关的“大脑”,它负责对从传感器获取的原始数据进行一系列操作,使其能够被服务器理解和使用。

以下代码展示了将温度和湿度数据打包成 json 格式的示例:

#include <cjson/cjson.h>

// 假设已经获取到温度和湿度数据
float temperature = 25.5;
float humidity = 60.2;

// 创建 json 对象
cjson *root = cjson_createobject();

// 添加温度和湿度数据
cjson_addnumbertoobject(root, "temperature", temperature);
cjson_addnumbertoobject(root, "humidity", humidity);

// 将 json 对象转换为字符串
char *json_str = cjson_print(root);

// 发送数据
// ...

// 释放 json 对象
cjson_delete(root);

五、 系统实现与测试

完成硬件和软件设计后,就可以进行系统实现和测试了。

  1. 硬件搭建: 按照硬件设计方案,连接好 stm32 开发板、传感器模块、网络模块等硬件设备。
  2. 软件烧录: 将编写好的程序代码编译链接后,烧录到 stm32 开发板中。
  3. 功能测试: 使用 modbus/zigbee 调试工具模拟传感器发送数据,并使用网络调试助手或服务器程序接收数据,验证协议转换功能是否正常。
  4. 性能测试: 测试系统的稳定性、数据传输速率、并发连接数等性能指标,以评估系统是否满足实际应用需求。
(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

STM32HAL库常用库函数说明

08-06

STLINK CONNECTION ERROR 问题的解决

08-06

FT2232作为JTAG烧录器的使用步骤详解

08-06

STM32 OLED屏幕SSD1306显示浮点 负数

08-06

完整的手把手带你创建STM32工程(HAL库)

08-06

循迹小车基本原理和代码实现

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论