有空了和大家分享一下,如何从头架构一个高效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. <转>详解C++的模板中typename关键字的用法

    用处1, 用在模板定义里, 标明其后的模板参数是类型参数. 例如: template<typename T, typename Y> T foo(const T& t, const ...

  2. 【RS】Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model - 当因式分解遇上邻域:多层面协同过滤模型

    [论文标题]Factorization Meets the Neighborhood: a Multifaceted Collaborative Filtering Model   (35th-ICM ...

  3. php 实现发送微信模板消息(转)

    <?php namespace Org\Weixin; /** * Created by PhpStorm. * User: StandOpen * Date: 15-1-7 * Time: 9 ...

  4. URI参数签名算法

    简介 应用基于HTTP POST或HTTP GET请求发送Open API调用请求时,为了确保应用与百度REST服务器之间的安全通信,防止Secret Key盗用.数据篡改等恶意攻击行为,百度REST ...

  5. SQL数据类型和C#数据类型间的转换

    今天看到SQL数据类型和C#数据类型间的转换,前人留下的. <?xml version="1.0" encoding="utf-8" ?> < ...

  6. [k8s]kube-dns/dashboard排错历险记(含sa加载用法/集群搭建)

    kube-dns原理 参考: 组件架构看这个就够了 http://cizixs.com/2017/04/11/kubernetes-intro-kube-dns 设置细节看这个就够了 http://b ...

  7. 1. RNN神经网络模型原理

    1. RNN神经网络模型原理 2. RNN神经网络模型的不同结构 3. RNN神经网络-LSTM模型结构 1. 前言 循环神经网络(recurrent neural network)源自于1982年由 ...

  8. cbow与skip-gram

    场景:上次回答word2vec相关的问题,回答的是先验概率和后验概率,没有回答到关键点. 词袋模型(Bag of Words, BOW)与词向量(Word Embedding)模型 词袋模型就是将句子 ...

  9. 和我一起学《HTTP权威指南》——安全HTTP与HTTPS

    安全HTTP HTTPS是最流行的HTTP安全形式. HTTPS方案的URL以https://开头 使用HTTPS时,所有的HTTP请求和响应数据在发送到网络之前,都要进行加密.HTTPS在HTTP传 ...

  10. java代码执行字符串中的逻辑运算方法

    转载:https://www.jb51.net/article/143967.htm 方法一:Java调用js方法执行: /** * * @author: Longjun * @Description ...