四、使用单片机环境编程接收MQTT服务器上特定主题的信息
以下是使用STM32F103单片机链接W5500芯片链接到网络上,利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息,并发送给串口的C语言代码示例,包括完整的代码注释和编程说明:
#include "stm32f10x.h"
#include "w5500.h"
#include "mqtt.h"
#include "usart.h"
// 定义W5500的IP、端口等详细信息
#define W5500_IP "192.168.1.100" // W5500的IP地址
#define W5500_GW "192.168.1.1" // 网关的IP地址
#define W5500_SUBNET "255.255.255.0" // 子网掩码
#define W5500_DNS "8.8.8.8" // DNS服务器的IP地址
#define W5500_MAC {0x00, 0x08, 0xDC, 0x01, 0x02, 0x03} // W5500的MAC地址
#define W5500_PORT 5000 // W5500的端口号
// 定义MQTT服务器的详细信息
#define MQTT_SERVER "mqtt.laobai.net" // MQTT服务器地址
#define MQTT_PORT 1883 // MQTT服务器端口号
// 定义要接收的主题
#define MQTT_TOPIC "laobai_topic001" // MQTT主题
// 初始化W5500芯片
void W5500_Init(void) {
uint8_t mac[6] = W5500_MAC;
uint8_t ip[4] = {0};
uint8_t gw[4] = W5500_GW;
uint8_t sn[4] = W5500_SUBNET;
uint8_t dns[4] = W5500_DNS;
// 初始化W5500芯片
W5500_InitSPI(); // 初始化SPI接口
W5500_InitGPIO(); // 初始化GPIO
W5500_InitPHY(); // 初始化PHY
W5500_InitCommonReg(mac, ip, gw, sn, dns); // 初始化W5500的常规寄存器
}
// 处理接收到的MQTT消息
void MQTT_HandleReceivedMessage(MqttMessageReceivedEventArgs* args) {
// 将消息发送到串口
USART_Puts(args->topic);
USART_Puts(": ");
USART_Puts(args->message);
USART_Putc('\n');
}
int main(void) {
// 初始化W5500芯片
W5500_Init();
// 初始化串口
USART_Init();
// 创建MQTT客户端
MqttClient mqttClient;
// 配置MQTT客户端选项
MqttClientOptions options;
options.clientId = "client1"; // 设置MQTT客户端ID
options.serverIp = MQTT_SERVER; // 设置MQTT服务器地址
options.serverPort = MQTT_PORT; // 设置MQTT服务器端口号
options.username = "username"; // 设置MQTT服务器的用户名(如果需要)
options.password = "password"; // 设置MQTT服务器的密码(如果需要)
options.keepAliveInterval = 60; // 设置心跳间隔时间(单位:秒)
options.cleanSession = true; // 设置是否清除会话状态
// 连接到MQTT服务器
MqttError connectResult = MQTT_Connect(&mqttClient, &options);
if (connectResult == MQTT_ERROR_NONE) {
// 订阅主题
MqttError subscribeResult = MQTT_Subscribe(&mqttClient, MQTT_TOPIC);
if (subscribeResult == MQTT_ERROR_NONE) {
// 设置消息接收的回调函数
MQTT_SetMessageReceivedCallback(&mqttClient, MQTT_HandleReceivedMessage);
while(1) {
// 处理MQTT消息的接收和发送
MQTT_Process(&mqttClient);
}
}
}
while(1);
}
上述代码中,使用了名为"W5500"的库来操作W5500芯片,"mqtt"库来实现MQTT协议。
首先,在W5500_Init
函数中,根据具体的网络设置,初始化了W5500芯片的IP、MAC地址、网关、子网掩码和DNS服务器等参数。
然后,在主函数中,先初始化W5500芯片,然后通过调用USART_Init
函数初始化串口。
接下来,创建了一个MQTT客户端实例,并配置了MQTT客户端选项,包括设置MQTT服务器的地址、端口、用户名和密码(如果需要),以及客户端ID等。
然后,通过调用MQTT_Connect
函数连接到MQTT服务器,并进行订阅主题的操作。如果连接和订阅成功,就设置消息接收的回调函数,并进入一个无限循环中,通过调用MQTT_Process
函数来处理MQTT消息的接收和发送。
在MQTT_HandleReceivedMessage
函数中,将接收到的MQTT消息发送到串口。
请注意,上述代码仅为示例,具体的实现可能需要根据实际情况进行调整和修改。此外,还需要根据具体的硬件平台和开发环境,包括使用的开发板、编译器等进行适配和配置。在代码中,需要根据实际情况实现W5500_InitSPI
、W5500_InitGPIO
、W5500_InitPHY
、W5500_InitCommonReg
、USART_Init
、USART_Puts
和USART_Putc
等函数,以便初始化W5500芯片和串口,并进行数据的发送和接收。同时,还需要在项目中添加对"W5500"库和"mqtt"库的引用,以便使用相应的函数和数据结构。