mqtt协议c语言实现,C语言实现MQTT剩余长度的解析

本文说一边RX的时候解析别人的包

int iotx_mc_decode_packet(iotx_mc_client_t *c, int *value, int timeout)

{

char i;

int multiplier = 1;

int len = 0;

const int MAX_NO_OF_REMAINING_LENGTH_BYTES = 4;

if (!c || !value) {

return FAIL_RETURN;

}

*value = 0;

do {

int rc = MQTTPACKET_READ_ERROR;

if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES) {

return MQTTPACKET_READ_ERROR; /* bad data */

}

rc = c->ipstack.read(&c->ipstack, &i, 1, timeout == 0 ? 1 : timeout);

if (rc == 0) {

return FAIL_RETURN;

} else if (rc != 1) {

return MQTT_NETWORK_ERROR;

}

printf("【我】在次去读1个数据(每次读一个).它就是&i,它代表头部第二部分-长度,现在i=%02X,看看(i & 0X80)=%02X \r\n ",i,(i & 0X80) );

*value += (i & 0X7F) * multiplier;

multiplier *= 0X80;//0X80就是128!也就是128进制 第一个*1  第二个*128 第三个*128*128

printf("【我】分析一下--长度value=%02X\r\n",*value);

if(i==0)return 0;

} while ((i & 0X80) != 0);

printf("【我】分析结论value=%02X ",*value);

return len;

}

他就是去读!一个一个的读!!条件是:while ((i & 0X80) != 0);

也即是最高位BIT7只要是1 就继续读!!!标识后面还是剩余长度!

读出的数据

*value += (i & 0X7F) * multiplier;

multiplier *= 128;

即可!!!!!!

最后value就是报文长度

原文链接:https://blog.csdn.net/weixin_42381351/article/details/89679952

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT协议在物联网领域中非常常见,特别是在公有云平台中。下面是一个使用C语言实现MQTT协议连接的示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #define MQTT_PORT 1883 #define MQTT_KEEPALIVE 60 // MQTT协议连接函数 int mqtt_connect(const char* broker_ip, const char* client_id) { int sockfd; struct sockaddr_in broker_addr; // 创建socket sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) { perror("socket"); return -1; } // 设置broker地址 memset(&broker_addr, 0, sizeof(broker_addr)); broker_addr.sin_family = AF_INET; broker_addr.sin_port = htons(MQTT_PORT); if (inet_pton(AF_INET, broker_ip, &(broker_addr.sin_addr)) <= 0) { perror("inet_pton"); close(sockfd); return -1; } // 连接broker if (connect(sockfd, (struct sockaddr*)&broker_addr, sizeof(broker_addr)) == -1) { perror("connect"); close(sockfd); return -1; } // 发送连接请求 char connect_msg[1024]; sprintf(connect_msg, "CONNECT\nclient_id:%s\nkeepalive:%d\n\n", client_id, MQTT_KEEPALIVE); if (send(sockfd, connect_msg, strlen(connect_msg), 0) == -1) { perror("send"); close(sockfd); return -1; } // 接收连接响应 char response[1024]; if (recv(sockfd, response, sizeof(response), 0) == -1) { perror("recv"); close(sockfd); return -1; } // 检查连接响应 if (strstr(response, "CONNACK") == NULL) { printf("Failed to connect to broker\n"); close(sockfd); return -1; } printf("Connected to broker\n"); // 关闭socket close(sockfd); return 0; } int main() { const char* broker_ip = "192.168.0.1"; const char* client_id = "mqtt_client"; // 连接MQTT broker if (mqtt_connect(broker_ip, client_id) == -1) { printf("Failed to connect to MQTT broker\n"); return -1; } return 0; } ``` 这个示例代码使用C语言实现了一个简单的MQTT连接函数`mqtt_connect`,它通过socket连接到指定的MQTT broker,并发送连接请求。在连接成功后,会收到连接响应。请注意,这只是一个简单的示例,实际使用中可能需要更多的功能和错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值