概述
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协议详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复