我是靠谱客的博主 美丽茉莉,最近开发中收集的这篇文章主要介绍mqttnet 详解_MQTT协议详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1 介绍:根据介绍文档重写MQTT有效载荷部分,再通过标准的MQTT协议进行上传到OneNET。主要介绍两种上传类型Json和二进制。并使用两种计算机语言Java和C。应用在Android和STM32上。1. Java重写MQTT有效载荷

1.上传类型1:Json格式数据

图片1.png (0 Bytes, 下载次数: 66)

2018-11-29 09:44 上传

public static void publishTypeJson(String jsonData){

byte[] content = jsonData.getBytes();

int contentLength = content.length;

byte[] payload = new byte[contentLength+3];

byte type = (byte) 0x01;                           //上传类型1 json格式

byte lengthHigh = (byte) ((contentLength >> 8) & 0xFF);     //数据长度 高八位

byte lengthLow = (byte) (contentLength & 0xFF);        //数据长度 低八位

payload[0] = type;

payload[1] = lengthHigh;

payload[2] = lengthLow;

System.arraycopy(content,0,payload,3,contentLength);

MQTTService.publish(SYSTEMS_PUBLISH_TOPIC,payload);

}

2.上传类型2:二进制格式数据

类型2.png (0 Bytes, 下载次数: 68)

2018-11-29 09:47 上传

public static void publishTypeBytes(String streamID, byte[] hexData) {

byte[] idBytes = streamID.getBytes();

int idLength = idBytes.length;

int hexLength = hexData.length;

int payloadLength = idLength+hexLength+7;

byte[] payload = new byte[payloadLength];

byte type = (byte) 0x02;               // 上传类型2 json格式

byte[] idLengthBytes = new byte[]{       // 数据流ID的长度

(byte) ((idLength >> 8) & 0xFF),   // 高八位

(byte) (idLength & 0xFF)           // 低八位

};

byte[] binLengthBytes = new byte[]{              // 十六进制数据的长度

(byte) ((hexLength >> 24) & 0xFF),      // 占用四个字节

(byte) ((hexLength >> 16) & 0xFF),

(byte) ((hexLength >> 8) & 0xFF),

(byte) (hexLength & 0xFF)

};

payload[0] = type;

payload[1] = idLengthBytes[0];

payload[2] = idLengthBytes[1];

System.arraycopy(idBytes,0,payload,3,idLength);//将数组idBytes拷贝到plyload数组中

payload[idLength+3] = binLengthBytes[0];

payload[idLength+3+1] = binLengthBytes[1];

payload[idLength+3+2] = binLengthBytes[2];

payload[idLength+3+3] = binLengthBytes[3];

System.arraycopy(hexData,0,payload,(idLength+3+4),hexLength);

MQTTService.publish(SYSTEMS_PUBLISH_TOPIC,payload);

}2.STM32上使用C重写MQTT有效载荷

1.上传类型1:Json格式数据

1.上传类型1:Json格式数据

void my_mqttPublishJson(char *topic,char *str)

{

u32 link =0;                        //数据拼接

u32 botyLength = 0;                //数据长度

u8 payloadBuf[BUFMAX-3] = {0};        //存放拼接后的数组,因为OneNET需要添加三位标识所以减去3

u8 buf[BUFMAX];                                        //存放序列化后的数据

u32 buflen = sizeof(buf);                                        //序列化数组长度

u32 payloadlen,len;                                                        //有效负载的长度,MQTT包的总长度

u8 *payload;                                                                //有效负载数据

MQTTString topicString = MQTTString_initializer;

botyLength = strlen(str);

payloadlen = botyLength+3;

payloadBuf[0] = 0x01;                                                //上传类型1 json格式

payloadBuf[1] = (botyLength>>8)&0xff;                //上传数据长度  高八位

payloadBuf[2] = (botyLength)&0xff;                        //上传数据长度  低八位

for(;link

{

payloadBuf[3+link] = str[link];                        //拼接字符

}

payload=(u8 *)payloadBuf;                                        //

topicString.cstring = topic;                                //上传的主题

len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, payload, payloadlen);                //序列化数据。返回数据包的总长度

delay_ms(50);//等待50毫秒,防止串口上一条数据数据还未清除

USART3_Send_Data_length(buf,len);

return ;

}

2.上传类型2:二进制格式数据

void my_mqttPublishHex(char *topic,char *id, unsigned char *data ,u32 datalen)

{

u32 link =0;                        //数据拼接标识

u32 linkdata = 0;

u32 idLength = 0;                //数据id长度

u8 payloadBuf[BUFMAX-3] = {0};        //存放拼接后的数组,因为OneNET需要添加三位标识所以减去3

u8 buf[BUFMAX];                                        //存放序列化后的数据

u32 buflen = sizeof(buf);                                        //序列化数组长度

u32 payloadlen,len;                                                        //有效负载的长度,MQTT包的总长度

u8 *payload;                                                                //有效负载数据

MQTTString topicString = MQTTString_initializer;

idLength = strlen(id);

payloadlen = idLength+datalen+3+4;

payloadBuf[0] = 0x02;                                                //上传类型2二进制格式

payloadBuf[1] = (idLength>>8)&0xff;                        //上传数据长度  高八位

payloadBuf[2] = idLength & 0xff;                        //上传数据长度  低八位

for(;link

{

payloadBuf[3+link] = id[link];                        //拼接字符

}

payloadBuf[3+link] = (datalen>>24) & 0xff;

payloadBuf[4+link] = (datalen>>16) & 0xff;

payloadBuf[5+link] = (datalen>>8) & 0xff;

payloadBuf[6+link] = datalen & 0xff;

for(;linkdata

{

payloadBuf[7+link+linkdata] = data[linkdata];                        //拼接字符

}

payload=(u8 *)payloadBuf;                                        //

topicString.cstring = topic;                                //上传的主题

len = MQTTSerialize_publish(buf, buflen, 0, 0, 0, 0, topicString, payload, payloadlen);                //序列化数据。返回数据包的总长度

delay_ms(50);//等待50毫秒,防止串口上一条数据数据还未清除

USART3_Send_Data_length(buf,len);

return ;

}

po.png (0 Bytes, 下载次数: 70)

数据格式分析

2018-12-3 10:51 上传

最后

以上就是美丽茉莉为你收集整理的mqttnet 详解_MQTT协议详解的全部内容,希望文章能够帮你解决mqttnet 详解_MQTT协议详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部