MQTT 单片机端讲解
有空了和大家分享一下,如何从头架构一个高效mqtt并行客户端,基于传统GPRS等较差网络环境和网关等网络环境好的情景(当然仔细讲解mqtt的基本函数使很有必要的)。---这会正忙着搬砖

MQTt协议 第一个字节用来表示报表类型



接下来第二个字节开始是剩余长度

表示长度,最多用4个字节,变长,每个字节的高位表示后面是否还有表示长度的字节,也就是说每个字节可以表示128个字节的长度


本篇标注 标识符适用于qos大于0的情况。
其他细节
https://mcxiaoke.gitbooks.io/mqtt-cn/content/mqtt/02-ControlPacketFormat.html
本文要点
/**
* Decodes the message length according to the MQTT algorithm
* @param getcharfn pointer to function to read the next character from the data source
* @param value the decoded length returned
* @return the number of bytes read from the socket
*/
int MQTTPacket_decode(int (*getcharfn)(unsigned char*, int), int* value)
{
unsigned char c;
int multiplier = ;
int len = ;
#define MAX_NO_OF_REMAINING_LENGTH_BYTES 4 //读取更多数据 FUNC_ENTRY;
*value = ;
do
{
int rc = MQTTPACKET_READ_ERROR; if (++len > MAX_NO_OF_REMAINING_LENGTH_BYTES)
{
rc = MQTTPACKET_READ_ERROR; /* bad data */
goto exit;
}
// rc = (*getcharfn)(&c, 1);
// if (rc != 1)
// goto exit;
*value += (c & ) * multiplier;
multiplier *= ;
} while ((c & ) != );
exit:
FUNC_EXIT_RC(len);
return len;
}
该代码作用提取报文可变字节长度 ,最多提取4个字节
/**
* Encodes the message length according to the MQTT algorithm
* @param buf the buffer into which the encoded data is written
* @param length the length to be encoded
* @return the number of bytes written to buffer
*/
int MQTTPacket_encode(unsigned char* buf, int length)
{
int rc = ; FUNC_ENTRY;
do
{
char d = length % ;
length /= ;
/* if there are more digits to encode, set the top bit of this digit */
if (length > )
d |= 0x80;
buf[rc++] = d;
} while (length > );
FUNC_EXIT_RC(rc);
return rc;
}
该代码作用,重新编码长度信息到数组内,返回的就是长度的字节数

按照长度读取字节数。将需要的字节读取到目标数组,如果数组不够就要重新处理
如果发现你的代码有时候工作不正常,很可能你的mqtt源代码是被人更改过得。

第一个buf是用户提供给 该函数的一个空间,数据将按照mqtt格式化,buflen用户告诉该函数 这个buff只有这么大。DUP重复分发标志,首次发送为0,重复发送为1,qos为0必须为0.
packedid 本次通讯包标识,对于qos为1和2的情况为了解决tcp传输产生的重复问题,使用该id区分不同的包,一次通讯 比如 订阅 发送等,通讯过程只用一个相通的标识,占用的时候别人不可以使用该标识
通讯结束,释放。该标示最大0xffff。
topicfilter 主题过滤通配符组,也就是可以多个主题一次性发送,相应的节省一定的流量,但是订阅一般不是频繁的使用,所以可以酌情使用。另一个就是qos组。
MQTT 单片机端讲解的更多相关文章
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- C# MQTT 服务端客户端通讯
关于MQTT 在这里我就不做过多的介绍了 , 超时空连接点我 MQTT示例 注: 该示例演示统一使用WPF, 简单MVVM模式演示, 复制代码需注意引用 NuGet包 GalaSoft MQTT服务 ...
- 使用tomcat方式实现websocket即时通讯服务端讲解
使用tomcat方式实现websocket即时通讯服务端讲解 第一种方案:使用Tomcat的方式实现 tomcat版本要求:tomcat7.0+.需要支持Javaee7 导入javeee-api的ja ...
- MQTT主题Topic讲解
文章转载于https://www.cnblogs.com/hayasi/p/7792191.html 我们已经把相关的连接报文搞定了.笔者想来想去还是决定先讲解一下订阅报文(SUBSCRIBE ).如 ...
- MQTT 嵌入式端通讯协议解析(转)
MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet.百度的云平台也都支持MQTT的接入.虽然MQTT很火,但是目前对 ...
- MQTT协议通俗讲解
参考 Reference v3.1.1 英文原版 中文翻译版 其他资源 网站 MQTT官方主页 Eclipse Paho 项目主页 测试工具 MQTT Spy(基于JDK) Chrome插件 MQTT ...
- MQTT Android端对比
根据收集到的信息,MQTT的Android端项目有这些 后面打算分别研究下
- 动手实现一个较为简单的MQTT服务端和客户端
项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发) 平均估计每个每秒60个包 使用mqtt协 ...
- 【长期更新】--神犇的BLOGS(各种高端讲解)
KMP字符串匹配算法: http://kb.cnblogs.com/page/176818/ http://blog.csdn.net/yutianzuijin/article/details/119 ...
随机推荐
- nginx https 配置样例
站点nginx https 配置模板 第一章 nginx 支持https 配置样例 其他 相关链接地址 第一章 nginx 支持https 配置样例 说明:https 段配置参数说明 Server 段 ...
- Linux 命令 及 简单操作 学习
众所周知,linux命令很多很多,但是,请不用担心,相信你自己不断的积累,终有一天你和你和小伙伴都会为你惊呆的...... 废话不多说,那,什么时候动手????---------现在,马上..... ...
- Kriging插值法
克里金法是通过一组具有 z 值的分散点生成估计表面的高级地统计过程.与插值工具集中的其他插值方法不同,选择用于生成输出表面的最佳估算方法之前,有效使用克里金法工具涉及 z 值表示的现象的空间行为的交互 ...
- C#字符串转换为float
1.解决不同计算机上,区域和时间不同而引起的转换问题(如:“123.456”报“字符串格式不正确”问题) //解决区域.语言变更引起的“识别不出小数点问题”如:转换时“123.456”转换时不认识&q ...
- sed 简明教程 (转)
sed 简明教程 2013年2月20日 awk于1977年出生,今年36岁本命年,sed比awk大2-3岁,awk就像林妹妹,sed就是宝玉哥哥了.所以 林妹妹跳了个Topless,他的哥哥sed ...
- 浅谈.net中事务
.net中的事务 关键几点 概念:1:什么是事务 2:什么时候用事务 3:基本的语法 (1): 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常 ...
- django template if return false
如果if的参数不存在于context中就会返回false 参考:http://stackoverflow.com/questions/11107028/django-template-if-true- ...
- 319. Bulb Switcher
题目: There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ev ...
- javascript and jquery 代码块
1.5秒隐藏 (setTimeout ) setTimeout( function(){ $('.ad_midd').slideUp(); } , 5000 )
- (原)java 向上转型中,任何域的访问操作都是由编译器解析,不是多态
最近在向java发力,学习学习了下.看到了多态这一节,书中有个比较好的例子,所以就准备写下来,记录下来: package dynamic_binding01; public class dynamic ...