找回密码
 立即注册
首页 业界区 业界 MQTT协议

MQTT协议

哎禹供 9 小时前
  1. //请求连接
  2. void mqtt_connect(char *clientid,char *username,char *passwd)
  3. {
  4.         uint32_t clientid_len = strlen(clientid);
  5.         uint32_t username_len = strlen(username);
  6.         uint32_t passwd_len = strlen(passwd);
  7.         //用于存储剩余长度 = 可变包头+有效载荷(客户端id+2+用户名+2+密码+2);
  8.         uint32_t remain_len = 10 + (clientid_len+2)+ (username_len+2)+ (passwd_len+2);
  9.         //1 对发送缓冲区进行初始化
  10.         memset((char *)sendbuf,0,512);
  11.         sendcnt = 0;
  12.         //2 固定包头
  13.         sendbuf[sendcnt++] = 0x10;//connect
  14.         //3 对剩余长度进行编码
  15.         do
  16.         {
  17.                 uint8_t encodeByte = remain_len %128;
  18.                 remain_len = remain_len /128;
  19.                 if(remain_len >0)
  20.                 {
  21.                         encodeByte = encodeByte |128;
  22.                 }
  23.                 sendbuf[sendcnt++] = encodeByte;
  24.         }
  25.         while(remain_len >0);
  26.         //4 可变包头
  27.         sendbuf[sendcnt++] = 0;
  28.         sendbuf[sendcnt++] = 4;
  29.         sendbuf[sendcnt++] = 'M';//协议名称
  30.         sendbuf[sendcnt++] = 'Q';
  31.         sendbuf[sendcnt++] = 'T';
  32.         sendbuf[sendcnt++] = 'T';
  33.         sendbuf[sendcnt++] = 4;//协议版本
  34.         sendbuf[sendcnt++] = 0xc2 ;//连接标志
  35.         sendbuf[sendcnt++] = 0 ;//保持连接
  36.         sendbuf[sendcnt++] = 120 ;//2分钟
  37.         //5 有效载荷 客户端id 用户名 密码
  38.         sendbuf[sendcnt++] = BYTE1(clientid_len); //msb
  39.         sendbuf[sendcnt++] = BYTE0(clientid_len);        //lsb
  40.        
  41.         memcpy(&sendbuf[sendcnt] ,clientid,clientid_len);
  42.         sendcnt +=clientid_len;
  43.        
  44.         sendbuf[sendcnt++] = BYTE1(username_len); //msb
  45.         sendbuf[sendcnt++] = BYTE0(username_len);        //lsb
  46.        
  47.         memcpy(&sendbuf[sendcnt] ,username,username_len);
  48.         sendcnt +=username_len;
  49.        
  50.         sendbuf[sendcnt++] = BYTE1(passwd_len); //msb
  51.         sendbuf[sendcnt++] = BYTE0(passwd_len);        //lsb
  52.        
  53.         memcpy(&sendbuf[sendcnt] ,passwd,passwd_len);
  54.         sendcnt +=passwd_len;
  55.         //6 把connect报文发送出去
  56.         Serial_Sendstring(sendbuf,sendcnt);
  57. }
复制代码
  1. //发布消息
  2. void mqtt_publish(char *topic,uint8_t Qos,char *databuf)
  3. {
  4.         uint32_t remain_len;
  5.         uint32_t topic_len = strlen(topic);
  6.         uint32_t databuf_len = strlen(databuf);//有效载荷
  7.         //用于存储剩余长度 = 可变包头+有效载荷(客户端id+2+用户名+2+密码+2);
  8.         if(Qos == 0)
  9.         {
  10.                 remain_len = (topic_len+2)+(databuf_len);
  11.         }
  12.         else
  13.         {
  14.                 remain_len = (topic_len+2)+(databuf_len) + 2;
  15.         }
  16.        
  17.         //1 对发送缓冲区进行初始化
  18.         memset((char *)sendbuf,0,512);
  19.         sendcnt = 0;
  20.         //2 固定包头
  21.         sendbuf[sendcnt++] = 0x30;//connect
  22.         //3 对剩余长度进行编码
  23.         do
  24.         {
  25.                 uint8_t encodeByte = remain_len %128;
  26.                 remain_len = remain_len /128;
  27.                 if(remain_len >0)
  28.                 {
  29.                         encodeByte = encodeByte |128;
  30.                 }
  31.                 sendbuf[sendcnt++] = encodeByte;
  32.         }
  33.         while(remain_len >0);
  34.         //可变包头
  35.         sendbuf[sendcnt++] = BYTE1(topic_len); //msb
  36.         sendbuf[sendcnt++] = BYTE0(topic_len);        //lsb
  37.        
  38.         memcpy(&sendbuf[sendcnt] ,topic,topic_len);
  39.         sendcnt +=topic_len;
  40.         //有效载荷
  41. //        sendbuf[sendcnt++] = BYTE1(databuf_len); //msb
  42. //        sendbuf[sendcnt++] = BYTE0(databuf_len);        //lsb
  43.        
  44.         memcpy(&sendbuf[sendcnt] ,databuf,databuf_len);
  45.         sendcnt +=databuf_len;
  46.        
  47.         //6 把connect报文发送出去
  48.         Serial_Sendstring(sendbuf,sendcnt);
  49. }
复制代码
  1. //订阅消息
  2. void mqtt_subscribe(const char *Filter, uint16_t msg_id, uint8_t qos)
  3. {
  4. char data[256] = {0};
  5.     int cnt = 0;
  6.     uint32_t remain;
  7.     // 固定包头
  8.     data[cnt++] = 0x82; // 订阅消息类型
  9.     // 计算剩余字节长度
  10.     uint32_t Filter_len = strlen(Filter);
  11.     remain = 2 + Filter_len + 2 + 1; // 消息 ID (2 字节) + 主题长度 (2 字节) + 主题 (Filter_len 字节) + QoS (1 字节)
  12.     // 编码剩余字节
  13.     do
  14.     {
  15.         uint8_t encodeByte = remain % 128;
  16.         remain = remain / 128;
  17.         if (remain > 0)
  18.         {
  19.             encodeByte |= 128;
  20.         }
  21.         data[cnt++] = encodeByte;
  22.     }
  23.     while (remain > 0);
  24.     // 可变包头
  25.     data[cnt++] = BYTE1(msg_id); // 消息 ID 高字节
  26.     data[cnt++] = BYTE0(msg_id); // 消息 ID 低字节
  27.     // 有效载荷
  28.     data[cnt++] = BYTE1(Filter_len); // 主题长度高字节
  29.     data[cnt++] = BYTE0(Filter_len); // 主题长度低字节
  30.     memcpy(&data[cnt], Filter, Filter_len); // 主题
  31.     cnt += Filter_len;
  32.     data[cnt++] = qos; // QoS 级别
  33.     // 发送构建的 MQTT 消息
  34.     Serial_Sendstring(data, cnt);
  35. }
复制代码
  1. //保持心跳请求
  2. void mqtt_keepalive()
  3. {
  4.         uint8_t buf[2] = {0xc0,0x00};
  5.        
  6. }
复制代码
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册