有空了和大家分享一下,如何从头架构一个高效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 单片机端讲解的更多相关文章

  1. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  2. C# MQTT 服务端客户端通讯

    关于MQTT 在这里我就不做过多的介绍了 , 超时空连接点我 MQTT示例 注: 该示例演示统一使用WPF, 简单MVVM模式演示, 复制代码需注意引用 NuGet包  GalaSoft MQTT服务 ...

  3. 使用tomcat方式实现websocket即时通讯服务端讲解

    使用tomcat方式实现websocket即时通讯服务端讲解 第一种方案:使用Tomcat的方式实现 tomcat版本要求:tomcat7.0+.需要支持Javaee7 导入javeee-api的ja ...

  4. MQTT主题Topic讲解

    文章转载于https://www.cnblogs.com/hayasi/p/7792191.html 我们已经把相关的连接报文搞定了.笔者想来想去还是决定先讲解一下订阅报文(SUBSCRIBE ).如 ...

  5. MQTT 嵌入式端通讯协议解析(转)

    MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet.百度的云平台也都支持MQTT的接入.虽然MQTT很火,但是目前对 ...

  6. MQTT协议通俗讲解

    参考 Reference v3.1.1 英文原版 中文翻译版 其他资源 网站 MQTT官方主页 Eclipse Paho 项目主页 测试工具 MQTT Spy(基于JDK) Chrome插件 MQTT ...

  7. MQTT Android端对比

    根据收集到的信息,MQTT的Android端项目有这些 后面打算分别研究下

  8. 动手实现一个较为简单的MQTT服务端和客户端

    项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发)  平均估计每个每秒60个包  使用mqtt协 ...

  9. 【长期更新】--神犇的BLOGS(各种高端讲解)

    KMP字符串匹配算法: http://kb.cnblogs.com/page/176818/ http://blog.csdn.net/yutianzuijin/article/details/119 ...

随机推荐

  1. Jexus 网站服务器和 ASP.NET 跨平台开发

    微软的跨平台战略 微软在过去的一年多中时间中发生了令整个 IT 行业感到惊叹的变化.这一切始于 Ballmer 的退位和 Nadella 的决心,更始于早已在微软各个基层部门蠢蠢欲动的二次创业. 以开 ...

  2. 深入理解JS执行细节(写的很精辟)

    来源于:http://www.cnblogs.com/onepixel/p/5090799.html javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之 ...

  3. Python 贝叶斯分类

    很久的时间没有更新了,一是因为每天加班到比较晚的时间,另外,公司不能上网,回家后就又懒得整理,最近在看机器学习实战的书籍,因此才又决定重新拾起原先的博客! 今天讲的是第三章的贝叶斯分类方法,我们从一个 ...

  4. Mac下必备快捷键的符号所对应的按键

    Mac下快捷键的符号所对应的按键 ⌥—> option|alt ⇧—>shift ⌃—>control ⌘—>command ⎋—>esc 注: 与F6/F7/F12等F ...

  5. 在Asp.Net MVC中使用Repeater控件

    使用Repeater控件在视图中展示图表信息,Repeater控件的使用概述: <asp:Repeater ID="Repeater1" runat="server ...

  6. 关于tcp中time_wait状态的4个问题

    time_wait是个常问的问题.tcp网络编程中最不easy理解的也是它的time_wait状态,这也说明了tcp/ip四次挥手中time_wait状态的重要性. 以下通过4个问题来描写叙述它 问题 ...

  7. 《CLR via C#》读书笔记 之 计算限制的异步操作

    <CLR via C#>读书笔记 之 计算限制的异步操作 2014-07-06 26.1 CLR线程池基础 返回 如25章所述,创建和销毁线程是一个比较昂贵的操作: 太多的线程也会浪费内存 ...

  8. 【Spring源码分析】Bean加载流程概览(转)

    转载自:https://www.cnblogs.com/xrq730/p/6285358.html 代码入口 之前写文章都会啰啰嗦嗦一大堆再开始,进入[Spring源码分析]这个板块就直接切入正题了. ...

  9. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-9底层驱动之USART

    视频简介:该视频介绍iCore3应用开发平台中RTC的基本配置方法以及在应用开发平台中RS-232, RS-485,RS-232的硬件实现方法. 源视频包下载地址:链接:http://pan.baid ...

  10. <以交易为生>读书笔记

    为了确保操作成功,就要练习进行防御性资金管理. 长期来看,没有哪位大师能让你发财,你必须自己努力 要坚持写操作日记—记下每次买卖的理由,从中总结出那些反复成功和反复失败的操作模式 大多数交易者无法忍受 ...