W6100+树莓派RP2040快速入门之MQTT篇(十二)

本文介绍了如何使用W6100-EVB-PICO开发板作为MQTT客户端连接服务器,涵盖了MQTT协议原理、交互流程、测试准备、代码示例和应用场景,展示了如何在物联网设备间实现远程连接和通信。

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

目录

1. 前言

2. MQTT

2.1 相关简介

2.2 协议特点

2.3 协议原理

2.4 交互流程

2.5 应用

 3. 简单测试

3.1 测试准备

3.2 连接方式

3.3 程序流程图

3.4 相关代码

3.5 测试现象

4. 总结

5. 相关链接

本章相关例程链接https://gitee.com/wiznet-hk/example-of-w6100-evb-pico.git


1. 前言

        上一章我们用W6100-EVB-PICO开发板进行UDP组播回环测试,本章用我们的开发板作为MQTT客户端连接MQTT服务器进行简单测试。

        注意这里我们用的MQTT版本为3.1.1

2. MQTT

2.1 相关简介

        随着物联网技术的快速发展,MQTT(Message Queuing Telemetry Transport)协议已成为一种广泛使用的通讯协议,它适用于设备间低带宽、高延迟、不可靠的网络通信。W6100是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。在以太网应用中使用 W6100 + MQTT应用协议让用户可以更加方便地在设备之间实现远程连接和通信。本教程将介绍W6100以太网MQTT应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2.2 协议特点

        MQTT协议具有以下特点:

  • 轻量级:MQTT协议设计简单,协议头部开销小,适用于资源受限的设备和网络。
  • 低带宽消耗:很小的传输消耗和协议数据交换,最大限度减少网络流量,有效利用网络带宽。
  • 异步通信:客户端可以随时发布和订阅消息,无需等待对方的响应。
  • 发布-订阅模式:消息发布者将消息发布到特定的主题,而订阅者则订阅感兴趣的主题。这种模式支持松耦合的通信和灵活的消息传递。

2.3 协议原理

        在MQTT有三种角色,发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe);其中,消息的发布者和订阅者都是客户端消息代理是服务器消息发布者可以同时是订阅者

        套入具体的场景就是设备采集温湿度并发布在对应主题上,服务器会将其发布的消息发送给订阅了该主题的其他客户端(如果发布消息的客户端也订阅了该主题,那它自己也会收到)。采集温度和湿度的设备分别将数据发送到主题“temperature”和“humidity”,订阅了这两个主题的设备便会收到对应主题上的数据,如下图所示:

2.4 交互流程

        以一个客户端为例,交互流程是客户端向服务器发送连接请求,服务器回复确认连接后,连接建立;客户端发送订阅主题的请求,服务器回复确认后,订阅主题完成;客户端发布消息后,服务器回复发布确认,则消息发布完成,没有操作后会根据设定的时间,每到一次发送一次心跳请求,服务器返回心跳响应,以维持连接。过程如下图所示(注:图示例子为QOS=1的情况):

        值得一提的是,在订阅请求和发布消息中都有服务质量等级,等级有0,、1、2三种,分别代表最多分发一次(QOS=0)、至少分发一次(QOS=1)、仅分发一次(QOS=2);订阅请求中的服务质量等级(服务质量要求)是订阅者与服务器之间的交互规则,发布消息中的服务质量等级是发布者与服务器之间的交互规则。只是指代对象不同,相同等级对应的交互规则是相同的。

        下边分别简单说下每个服务质量等级的交互过程:

        QOS = 0:发送者最多发送一次,且接受者没有回复。

        QOS = 1:发送者最少发送一次,接收者收到后回复确认。

        QOS = 2:发送者只发送一次,接受者收到后回复收到,然后发送者再发送释放请求,接受者回复释放完成。

        这里发送者——接收者可以是发布者——服务器(发布消息的服务质量等级),也可以是服务器——订阅者(订阅请求的服务质量要求)。

        如下图所示:

2.5 应用

        我们本章的原理那节描述的只是在传感器网络中的应用,它还可以应用在实时数据传输场合中的如股票市场数据、实时天气信息、即时更新的新闻、监测博客的文章浏览量或粉丝量等,以及工农业控制中的远程下发控制等。

 3. 简单测试

3.1 测试准备

硬件:            

  • W6100-EVB-Pico开发板(主控:树莓派RP2040,以太网芯片:W6100)
  • micro usb接口的数据线、网线
  • 交换机或路由器(可上网)

软件:

  • Visual Studio Code(有对应的开发环境和配置工具)
  • MQTTX(MQTT调试工具)
  • wireshark(抓包工具)

3.2 连接方式

        开发板和PC都通过网线接在交换机或路由器LAN口,然后通过micro usb数据线连接开发板和电脑以供电和串口输出,如下图所示:

3.3 程序流程图

3.4 相关代码

        主函数中,我们先配置好网络信息,然后初始化定时器、mqtt信息等,即系统初始化,然后死循环里执行保活函数即可,如下所示:

int main()
{
    struct repeating_timer timer;
    stdio_init_all();   // PR2040 initialization
    sleep_ms(2000);
    network_init();     //Network information initialization

    add_repeating_timer_ms(1, repeating_timer_callback, NULL, &timer);//Initialization timer
    mqtt_init();  //MQTT initialization
    while (true)
    {
        keep_alive(); // mqtt keep-alive
    }
}

        快速上手使用的话,主要看这几个参数,pubtest[]是我们测试发送的字符串,接着连接参数用一个结构体来存放,其中有mqtt服务器ip和端口、连接的客户端ID、用户名和密码、订阅的主题和发布消息的主题、以及订阅请求的服务质量等级;其中客户端ID在同一平台下(服务器)是唯一的,不可重复,否则会出现后连接的把已经连接的设备挤掉的情况;用户名和密码用以我们不同用户的区别信息,不同平台如阿里云和腾讯云鉴权方式不同,这个以具体平台为准,这里调试工具的平台我们随便填就好,仅用于调试;订阅主题就是我们订阅的主题名;发布消息的主题就是我们选择在哪个主题发布消息。

        同样的,发布消息相关参数包括发布消息质量服务等级、发布消息保留标志、重复分发标志、消息ID;发布消息的质量服务等级即QOS,发布消息的保留标志(RETAIN),设为1的话,服务器会保留最近一次发布消息,并发给订阅了该主题的设备,如果设备已经收了但是掉线后重连也仍然会收到;重复分发标志就是在QOS=1或2时,如果发送消息后接收方未回复,则该位被置1,发送方会重复发送;如下所示:

uint8_t pubtest[] = "hello mqtt";

typedef struct MQTTCONNECTION
{
    char mqttHostUrl[1024];
    int port;
    char clientid[1024];
    char username[1024];
    char passwd[1024];
    uint8_t server_ip[4];
    char pubtopic[255];
    char subtopic[255];
    int QOS;
} mqttconn;

/* Connection and subscription parameters are related */
mqttconn mqtt_params = {
    .server_ip = {54, 244, 173, 190}, // MQTT Server IP
    .port = 1883,                     // MQTT Server Port
    .clientid = "W6100",              // Client ID. Client ids of different devices on the platform must be unique and unique
    .username = "W6100",              // username
    .passwd = "123456",               // password
    .pubtopic = "W6100",              // The selected publish message topic
    .subtopic = "W6100",              // Subscribe to topics
    .QOS = 0,                         // Service level requirements for subscription requests
};

/* Parameters related to publishing a message */
MQTTMessage pubmessage = {
    .qos = QOS0,   // Publishes message service quality levels
    .retained = 0, // Reserved flag of the advertised packet
    .dup = 0,      // Duplicate distribution flag
};

        除了发布-订阅模式,还有一个重要的遗嘱模式,遗嘱模式的相关参数有遗嘱主题、遗嘱消息、服务质量等级、保留标志;服务质量等级和保留标志跟发布消息一样,不再过多说,遗嘱主题和遗嘱消息主要是设备因为一些原因导致断开连接后,订阅了遗嘱主题的设备,便会收到掉线设备的遗嘱消息;即掉线设备在连接服务器时发布的遗嘱消息,服务器会保存下来,在检测到设备掉线后会发布该消息给订阅了遗嘱主题的其他在线的设备;参数如下所示:

/* Will message related parameters */
MQTTPacket_willOptions will_info = {
    .topicName = "device_status", // Testamentary subject
    .message = "offline",         // Testamentary message
    .qos = 0,                     // Service quality level
    .retained = 0,                // Reserved mark
};

        了解了以上几种不同的参数后,我们就可以根据需要自行修改了,而不必过于关注底层,是不是非常容易上手呢。 

3.5 测试现象

        我们编译烧录下载到开发板后,打开wireshark输入mqtt过滤,打开MQTTX,填写相关参数,注意Client ID不要相同,否则后连接的会把先连接的挤掉;其他信息可任意填写,因为我们不是连接特定平台如阿里云、腾讯云等需要根据平台规则连接,我们是用MQTTX这个工具的服务器平台,这与程序中设置服务器ip一致,配置完后点击连接,添加订阅主题为“W6100”和“device_status”,其余默认即可;然后打开vscode自带的串口监视器,复位我们的开发板。

        在串口打印的信息中我们可以看到开发板在配置完网络信息后成功连接了MQTT服务器,并成功订阅了主题“W6100”,发布了消息“hello mqtt”;在MQTTX调试工具这边我们可以看到也收到了来自主题W6100的消息,即正是开发板在该主题发布的信息,同样的我们可以在MQTTX这边发布消息,在串口那边显示收到,如下图所示:

        然后我们点击“device_status”这个(遗嘱)主题,我们把网线拔了,模拟实际场景中的设备意外掉线的情形,等待一会可以看到,我们调试工具这边收到了遗嘱消息,左边是用抓包工具抓包验证的,如下图所示:

        我们看wireshark这边抓包的情况,由于没连接抓包交换机,这里只能抓到跟我们PC交互的数据,首先看到我们用MQTTX工具连接并订阅后的数据交互情况,然后开发板连接订阅并发布了一条消息,MQTTX直接收到了该消息,接着通过MQTTX在该主题发布消息,开发板和MQTTX也都收到了,也即订阅了该主题的设备都可以收到,其他设备在该主题发布的消息,如下图所示:

        当然了抓包这个环节主要用于查找数据交互过程中的问题,不了解的可以跳过,直接看测试现象也可以直观的知道是否正常,我们这里是为了在现象正常的基础上进一步验证过程和结果。

4. 总结

        从以太网接入方式来看,不同于以往的的MCU(无MII/RMII接口)+MAC+PHY或MCU(有MII/RMII接口)+PHY,然后运行软件协议栈的接入方式,我们通过MCU+W6100(MAC+PHY和TCP/IP 硬件协议栈)直接从硬件层面实现了从链路层到传输层的协议栈,那么应用层如我们本章节所涉及的MQTT协议,可以通过软件组包解包实现,而且提供丰富的库非常方便我们进行开发。

         这里我们的开发板W6100-EVB-PICO就是用的WIZnet以太网方案,即树莓派RP2040+W6100,树莓派RP2040搭载了双核M0架构处理器,频率最高可达133MHz,还拥有264KB高速SRAM和2MB的板载闪存以及丰富的外设资源;作为树莓派在微控制领域的代表作,无论从性能还是成本上都是很赞的,可谓是性能优秀、价格美丽,但是它没有MII/RMII接口,因此通过与W6100以太网芯片结合,那么接入以太网不仅硬件连接简单,软件开发快,软硬件成本都大大降低了许多,相对来说可谓是以太网方案最优解!

        W6100作为集成了全硬件TCP/IP协议栈的以太网芯片,拥有32KB收发缓存,独立8路socket,通信互不干扰,能够满足绝大多数场合的要求;更为突出的是它不仅支持IPv4,还支持IPv6,就问你强不强?!

        我们的开发板W6100-EVB-PICO引脚功能图,如下图所示:

5. 相关链接

想了解更多,评论留言哦。

本章相关例程链接icon-default.png?t=N7T8https://gitee.com/wiznet-hk/example-of-w6100-evb-pico.git

开发板资料链接icon-default.png?t=N7T8http://docs.wiznet.io/Product/iEthernet/W6100/w6100-evb-pico
MQTT V3.1.1官方文档链接icon-default.png?t=N7T8http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/os/mqtt-v3.1.1-os.pdf

WIZnet 官方库链接icon-default.png?t=N7T8https://github.com/Wiznet/ioLibrary_Driver/tree/ce4a7b6d07541bf0ba9f91e369276b38faa619bd

<think>好的,用户之前已经询问过关于驱动和操作系统的理解,现在他们又转向嵌入式系统的理解。我需要先回顾之前的对话,确保内容连贯,不重复,同时补充新的信息。 用户可能对嵌入式系统的基础概念、应用场景、开发特点等感兴趣。他们可能是学生、刚入行的开发者,或者想扩展知识面的技术人员。需要从基础讲起,逐步深入。 首先,用户需要了解嵌入式系统的定义和核心特点。比如专用性、资源受限、实时性、低功耗等。这些都是区别于通用计算系统的关键点。需要举例说明,比如智能手表、工业控制器等,让用户更容易理解。 接下来是技术架构部分,可能需要分硬件和软件层面讲解。硬件部分包括微控制器、SoC、传感器等,软件部分包括RTOS、中间件、应用层等。需要提到常见的处理器架构,比如ARM、RISC-V,以及实时操作系统如FreeRTOS、Zephyr。 开发流程与挑战方面,用户可能关心嵌入式开发的具体步骤和遇到的难点。比如交叉编译环境、硬件调试、低功耗设计、实时性保证等。可以结合开发工具如Keil、IAR,以及调试手段如JTAG、SWD来具体说明。 应用场景部分需要覆盖消费电子、工业控制、汽车电子、医疗设备等不同领域,让用户了解嵌入式系统的广泛应用。同时,新兴趋势如AIoT、边缘计算、RISC-V架构、功能安全等也是当前的热点,需要提及。 还要考虑用户可能的深层需求。比如,他们可能想了解如何入门嵌入式开发,或者嵌入式系统与其他领域的结合。因此,在总结时可以强调软硬件协同设计的重要性,以及持续学习新技术的重要性。 需要确保语言通俗易懂,结构清晰,分点阐述,避免过于技术化的术语,必要时举例说明。同时,保持回答的实用性和指导性,帮助用户建立系统的认识,并可能引导他们进一步探索特定方向。</think>### 对嵌入式的理解(专用计算系统的设计与实现) --- #### 一、核心定义与特点 1. **本质定义** - **专用计算机系统**:为特定功能设计的软硬件综合体,区别于通用PC/服务器 - **典型特征**: - **资源受限**:有限的计算能力(如ARM Cortex-M3主频72MHz)、内存(KB级RAM)、存储空间 - **强实时性**:工业控制要求响应延迟<$1ms$(如PLC的扫描周期) - **低功耗设计**:智能手表待机功耗<$100μA$,采用动态电压频率调节(DVFS) - **环境适应性**:宽温(-40℃~85℃)、抗电磁干扰(EMC认证) 2. **典型应用拓扑** ```mermaid graph LR A[传感器] --> B[MCU] C[执行器] --> B B --> D[通信模块] D --> E[云端/上位机] ``` --- #### 二、技术架构层次 1. **硬件层** - **核心器件**: - **微控制器(MCU)**:STM32系列(Cortex-M内核)、ESP32(WiFi/BLE双模) - **SoC**:树莓派RP2040(双核Cortex-M0+)、NVIDIA Jetson(AI加速) - **FPGA**:Xilinx Zynq(PS+PL架构)实现硬件加速 - **外设接口**: - 数字接口:GPIO、PWM、I2C(标准速率100kbps)、SPI(可达50MHz) - 模拟接口:ADC(12位精度常见)、DAC - 通信接口:CAN总线(汽车电子)、RS-485(工业现场) 2. **软件层** - **实时操作系统(RTOS)**: ```c // FreeRTOS任务创建示例 xTaskCreate(vTaskLED, "LED_Task", 128, NULL, 1, NULL); vTaskStartScheduler(); ``` - 任务调度策略:优先级抢占(uC/OS-II)、时间片轮转(FreeRTOS) - **中间件**: - 协议栈:LwIP(TCP/IP)、MQTT(物联网通信) - 文件系统:FATFS(SD卡存储) - **应用层**: - 状态机设计模式(如电梯控制逻辑) - 事件驱动架构(使用消息队列) --- #### 三、开发流程与挑战 1. **典型开发流程** ```mermaid graph TB A[需求分析] --> B[硬件选型] B --> C[电路设计] C --> D[PCB制板] D --> E[固件开发] E --> F[系统联调] F --> G[量产测试] ``` 2. **关键技术挑战** - **资源优化**: - 内存管理:静态分配替代动态内存(避免碎片) - 代码精简:使用-Os优化等级,裁剪未使用库函数 - **实时性保障**: - 中断嵌套管理(NVIC优先级分组) - 关键代码段禁用中断(`__disable_irq()`) - **低功耗设计**: - 休眠模式切换(如STM32的Stop模式电流<$10μA$) - 外设时钟门控(通过RCC寄存器控制) - **可靠性设计**: - Watchdog定时器(硬件/软件看门狗) - ECC内存校验(防止宇宙射线导致的位翻转) --- #### 四、典型应用场景 1. **消费电子** - 智能手表:STM32L4系列MCU + 心率传感器(MAX30102) - 无人机:Pixhawk飞控(基于Cortex-M7) 2. **工业控制** - PLC:支持IEC 61131-3标准,循环扫描周期<$1ms$ - 伺服驱动器:FOC(磁场定向控制)算法实现 3. **汽车电子** - ECU(发动机控制单元):符合AUTOSAR标准 - 车载信息娱乐系统:QNX实时系统 4. **医疗设备** - 胰岛素泵:安全关键系统(IEC 62304 Class C认证) - 心电监护仪:信号滤波算法(IIR/FIR数字滤波器) --- #### 五、新兴技术趋势 1. **AIoT融合** - TinyML技术:TensorFlow Lite Micro在Cortex-M4上运行CNN - 端侧推理:NVIDIA Jetson Nano部署YOLOv3目标检测 2. **RISC-V架构崛起** - 开源指令集:GD32VF103系列MCU(平头哥玄铁内核) - 定制化扩展:添加专用指令加速AI运算 3. **边缘计算演进** - 本地决策:Modbus TCP转OPC UA协议网关 - 时间敏感网络(TSN):IEEE 802.1Qbv标准支持精确时钟同步 4. **功能安全认证** - ISO 26262(汽车)ASIL-D等级要求 - IEC 61508(工业)SIL3认证解决方案 --- ### 总结认知 1. **系统工程思维**:需同时考虑硬件电路特性(如信号完整性)、软件实时性、机械结构约束 2. **权衡艺术**:在性能、功耗、成本之间寻找最优解(如选择QFN封装节省PCB面积) 3. **持续演进**:从8位MCU到多核异构SoC,从裸机开发到RTOS+容器化部署 4. **开发范式转变**:借助PlatformIO、VS Code插件等工具提升效率,利用CI/CD实现自动化测试 (注:以上技术参数及代码示例均基于实际工程实践,可结合具体芯片手册验证)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值