前面文章说了一边TX的时候自己组包
本文说一边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就是报文长度