当前位置: 首页 > news >正文

MQTT协议

//请求连接
void mqtt_connect(char *clientid,char *username,char *passwd)
{uint32_t clientid_len = strlen(clientid);uint32_t username_len = strlen(username);uint32_t passwd_len = strlen(passwd);//用于存储剩余长度 = 可变包头+有效载荷(客户端id+2+用户名+2+密码+2);uint32_t remain_len = 10 + (clientid_len+2)+ (username_len+2)+ (passwd_len+2);//1 对发送缓冲区进行初始化memset((char *)sendbuf,0,512);sendcnt = 0;//2 固定包头sendbuf[sendcnt++] = 0x10;//connect//3 对剩余长度进行编码do{uint8_t encodeByte = remain_len %128;remain_len = remain_len /128;if(remain_len >0){encodeByte = encodeByte |128;}sendbuf[sendcnt++] = encodeByte;}while(remain_len >0);//4 可变包头sendbuf[sendcnt++] = 0;sendbuf[sendcnt++] = 4;sendbuf[sendcnt++] = 'M';//协议名称sendbuf[sendcnt++] = 'Q';sendbuf[sendcnt++] = 'T';sendbuf[sendcnt++] = 'T';sendbuf[sendcnt++] = 4;//协议版本sendbuf[sendcnt++] = 0xc2 ;//连接标志sendbuf[sendcnt++] = 0 ;//保持连接sendbuf[sendcnt++] = 120 ;//2分钟//5 有效载荷 客户端id 用户名 密码sendbuf[sendcnt++] = BYTE1(clientid_len); //msbsendbuf[sendcnt++] = BYTE0(clientid_len);	//lsbmemcpy(&sendbuf[sendcnt] ,clientid,clientid_len);sendcnt +=clientid_len;sendbuf[sendcnt++] = BYTE1(username_len); //msbsendbuf[sendcnt++] = BYTE0(username_len);	//lsbmemcpy(&sendbuf[sendcnt] ,username,username_len);sendcnt +=username_len;sendbuf[sendcnt++] = BYTE1(passwd_len); //msbsendbuf[sendcnt++] = BYTE0(passwd_len);	//lsbmemcpy(&sendbuf[sendcnt] ,passwd,passwd_len);sendcnt +=passwd_len;//6 把connect报文发送出去Serial_Sendstring(sendbuf,sendcnt);
}
//发布消息
void mqtt_publish(char *topic,uint8_t Qos,char *databuf)
{uint32_t remain_len;uint32_t topic_len = strlen(topic);uint32_t databuf_len = strlen(databuf);//有效载荷//用于存储剩余长度 = 可变包头+有效载荷(客户端id+2+用户名+2+密码+2);if(Qos == 0){remain_len = (topic_len+2)+(databuf_len);}else{remain_len = (topic_len+2)+(databuf_len) + 2;}//1 对发送缓冲区进行初始化memset((char *)sendbuf,0,512);sendcnt = 0;//2 固定包头sendbuf[sendcnt++] = 0x30;//connect//3 对剩余长度进行编码do{uint8_t encodeByte = remain_len %128;remain_len = remain_len /128;if(remain_len >0){encodeByte = encodeByte |128;}sendbuf[sendcnt++] = encodeByte;}while(remain_len >0);//可变包头sendbuf[sendcnt++] = BYTE1(topic_len); //msbsendbuf[sendcnt++] = BYTE0(topic_len);	//lsbmemcpy(&sendbuf[sendcnt] ,topic,topic_len);sendcnt +=topic_len;//有效载荷
//	sendbuf[sendcnt++] = BYTE1(databuf_len); //msb
//	sendbuf[sendcnt++] = BYTE0(databuf_len);	//lsbmemcpy(&sendbuf[sendcnt] ,databuf,databuf_len);sendcnt +=databuf_len;//6 把connect报文发送出去Serial_Sendstring(sendbuf,sendcnt);
}
//订阅消息
void mqtt_subscribe(const char *Filter, uint16_t msg_id, uint8_t qos)
{char data[256] = {0};int cnt = 0;uint32_t remain;// 固定包头data[cnt++] = 0x82; // 订阅消息类型// 计算剩余字节长度uint32_t Filter_len = strlen(Filter);remain = 2 + Filter_len + 2 + 1; // 消息 ID (2 字节) + 主题长度 (2 字节) + 主题 (Filter_len 字节) + QoS (1 字节)// 编码剩余字节do{uint8_t encodeByte = remain % 128;remain = remain / 128;if (remain > 0){encodeByte |= 128;}data[cnt++] = encodeByte;}while (remain > 0);// 可变包头data[cnt++] = BYTE1(msg_id); // 消息 ID 高字节data[cnt++] = BYTE0(msg_id); // 消息 ID 低字节// 有效载荷data[cnt++] = BYTE1(Filter_len); // 主题长度高字节data[cnt++] = BYTE0(Filter_len); // 主题长度低字节memcpy(&data[cnt], Filter, Filter_len); // 主题cnt += Filter_len;data[cnt++] = qos; // QoS 级别// 发送构建的 MQTT 消息Serial_Sendstring(data, cnt);
}
//保持心跳请求
void mqtt_keepalive()
{uint8_t buf[2] = {0xc0,0x00};}
http://www.hskmm.com/?act=detail&tid=19747

相关文章:

  • 完整教程:带你了解STM32:TIM定时器(第四部分)
  • 邮件怎么发送超大附件的实用解决方案
  • 告别无效对话:五个让AI输出质量提升10倍的提示词框架
  • 题解:CF2006E Iriss Full Binary Tree
  • CMakeLists.txt用法参考
  • 分布式ID生成算法——雪花算法的实现 - 浪矢
  • 5. Prompt 提示词 - Rainbow
  • 国产文件传输软件有哪些?今日份精选与实用推荐
  • 内外网文件摆渡系统:科研院所数据安全传输的关键支撑
  • 硬盘突然坏掉,我花了半个月才把数据救回来…(附数据恢复工具)
  • MCU的闪存(FLASH)按机制结构划分区域
  • T2
  • 题解:CF1930I Counting Is Fun
  • AI百炼大模型接入钉钉,实现在群中免@交互式新闻推送
  • K8S-Service 学习
  • docker常用命令
  • 纸浆2511
  • electron38-admin桌面端后台|Electron38+Vue3+ElementPlus管理系统
  • 长江中游干流河道崩岸特征与机理研究综述
  • 基于 Python Keras 建立 猫狗图像的精准分类
  • 《ESP32-S3使用指南—IDF版 V1.6》第四十章 图片显示实验
  • 调度算法II
  • 鸿蒙应用开发从入门到实战(十六):线性布局案例
  • SQL注入流程
  • 完整的GLFW应用程序示例
  • 物理笔记
  • 基于Python+Vue开发的商城管理系统源码+运行步骤
  • HTML5-和-CSS3-迁移即时入门-全-
  • HTML5-多人游戏开发-全-
  • HTML5-地理位置即时操作指南-全-