现在物联网流行的就是MQTT

其实MQTT就是在TCP的基础上建立了一套协议

可以看这个,本来我自己想用Wireshark监听一下,不过百度一搜索一大把,我就不测试了

https://blog.csdn.net/libaineu2004/article/details/78773610

所以说只要可以TCP连接了,然后只要知道了MQTT的协议,,,,直接就可以用TCP来当做MQTT来使用了

不过要写一些配合MQTT通信的协议,然后发送和接收数据都通过协议处理之后,通过TCP发送和接收,

其实有现成的写好的协议

可以看这两篇

http://sun2y.me/2017/05/12/MQTT协议在STM32上的移植/

https://blog.csdn.net/kh766200466/article/details/79694119

我也打算先移植(应用)到stm32上,不过我不打算用网络模块W5500,虽然用的挺熟,感觉没有新鲜感

我感觉应该用ESP8266实现

其实思路很简单,8266建TCP客户端(用AT指令),因为现在没有AT指令版的MQTT,所以用AT指令配置8266

然后连接的服务器的地址是我的云端的MQTT,当然TCP是透传的,然后发数据的时候都通过MQTT协议封装部分的程序,然后

发给WIFI模块,然后WIFI模块再发给MQTT服务器,,,接收也一样......然后....就没然后了,,可以用了再说

不过刚刚好像看透了一样.......

其实呢...只要用网络监控的软件看见了数据,然后再看下面的MQTT协议.....就可以自己写了

https://mcxiaoke.gitbooks.io/mqtt-cn/content/

咱试一试自己写,我呢只是看着协议和传回来的数据,,,然后咱自己试一试写个在TCP连接之后,发个数据(就是MQTT规定的协议)连接MQTT

首先第一个字节是

0x10

算啦还是直接一张图搞定

用TCP连接上以后,然后用TCP发上面的指令,,,就连接上MQTT了 .....

然后测试一下把........................................

然后就不说了,也不想说了,大家自己看协议把,,,,因为让自己感觉MQTT在我心中的地位大大的受到了..........唉,,,,感觉自己讲出来的东西确实感觉竟然的如此的简单......

只要弄透了,自己写协议就好啦,.....我自己去写协议去,估计写的变量少一点,51单片机就可以....

最后说一下如果是4版本的MQTT

然后今天写好了单片机程序,用自己写的MQTT封装的协议,在8266作为TCP客户端的基础上,连接了我的云端的MQTT服务器,然后用调试助手测试了远程通信,代码很少,力求可以直接移植到51单片机上

#define MQTTCONFIG_C_
#include "include.h" unsigned char MqttSendData[]={}; /**
* @brief 连接服务器的打包函数
* @param
* @retval
* @example
**/
int ConnectMqtt(char *ClientID,char *Username,char *Password)
{
int ClientIDLen = strlen(ClientID);
int UsernameLen = strlen(Username);
int PasswordLen = strlen(Password);
int DataLen = ;
int Index = ;
int i = ;
DataLen = + ++ClientIDLen+UsernameLen+PasswordLen;
MqttSendData[] = 0x10; //MQTT Message Type CONNECT
MqttSendData[] = DataLen; //剩余长度(不包括固定头部)
MqttSendData[Index++] = ; // Protocol Name Length MSB
MqttSendData[Index++] = ; // Protocol Name Length LSB
MqttSendData[Index++] = 'M'; // ASCII Code for M
MqttSendData[Index++] = 'Q'; // ASCII Code for Q
MqttSendData[Index++] = 'T'; // ASCII Code for T
MqttSendData[Index++] = 'T'; // ASCII Code for T
MqttSendData[Index++] = ; // MQTT Protocol version = 4
MqttSendData[Index++] = 0xc2; // conn flags
MqttSendData[Index++] = ; // Keep-alive Time Length MSB
MqttSendData[Index++] = ; // Keep-alive Time Length LSB 60S心跳包
MqttSendData[Index++] = (0xff00&ClientIDLen)>>;// Client ID length MSB
MqttSendData[Index++] = 0xff&ClientIDLen; // Client ID length LSB for(i = ; i < ClientIDLen; i++)
{
MqttSendData[Index + i] = ClientID[i];
}
Index = Index + ClientIDLen; if(UsernameLen > )
{
MqttSendData[Index++] = (0xff00&UsernameLen)>>;//username length MSB
MqttSendData[Index++] = 0xff&UsernameLen; //username length LSB
for(i = ; i < UsernameLen ; i++)
{
MqttSendData[Index + i] = Username[i];
}
Index = Index + UsernameLen;
} if(PasswordLen > )
{
MqttSendData[Index++] = (0xff00&PasswordLen)>>;//password length MSB
MqttSendData[Index++] = 0xff&PasswordLen; //password length LSB
for(i = ; i < PasswordLen ; i++)
{
MqttSendData[Index + i] = Password[i];
}
Index = Index + PasswordLen;
}
return Index;
} /**
* @brief MQTT订阅/取消订阅数据打包函数
* @param SendData
* @param topic 主题
* @param qos 消息等级
* @param whether 订阅/取消订阅请求包
* @retval
* @example
**/
int MqttSubscribeTopic(char *topic,u8 qos,u8 whether)
{
int topiclen = strlen(topic);
int i=,index = ; if(whether)
MqttSendData[index++] = 0x82; //0x82 //消息类型和标志 SUBSCRIBE 订阅
else
MqttSendData[index++] = 0xA2; //0xA2 取消订阅
MqttSendData[index++] = topiclen + ; //剩余长度(不包括固定头部)
MqttSendData[index++] = ; //消息标识符,高位
MqttSendData[index++] = 0x01; //消息标识符,低位
MqttSendData[index++] = (0xff00&topiclen)>>; //主题长度(高位在前,低位在后)
MqttSendData[index++] = 0xff&topiclen; //主题长度 for (i = ;i < topiclen; i++)
{
MqttSendData[index + i] = topic[i];
}
index = index + topiclen; if(whether)
{
MqttSendData[index] = qos;//QoS级别
index++;
}
return index;
} /**
* @brief MQTT发布数据打包函数
* @param mqtt_message
* @param topic 主题
* @param qos 消息等级
* @retval
* @example
**/
int MqttPublishData(char * topic, char * message, u8 qos)
{
int topic_length = strlen(topic);
int message_length = strlen(message);
int i,index=;
static u16 id=; MqttSendData[index++] = 0x30; // MQTT Message Type PUBLISH if(qos)
MqttSendData[index++] = + topic_length + + message_length;//数据长度
else
MqttSendData[index++] = + topic_length + message_length; // Remaining length MqttSendData[index++] = (0xff00&topic_length)>>;//主题长度
MqttSendData[index++] = 0xff&topic_length; for(i = ; i < topic_length; i++)
{
MqttSendData[index + i] = topic[i];//拷贝主题
}
index += topic_length; if(qos)
{
MqttSendData[index++] = (0xff00&id)>>;
MqttSendData[index++] = 0xff&id;
id++;
} for(i = ; i < message_length; i++)
{
MqttSendData[index + i] = message[i];//拷贝数据
}
index += message_length; return index;
}
#ifndef MQTTCONFIG_H_
#define MQTTCONFIG_H_
#include <stm32f10x.h>
#ifndef MQTTCONFIG_C_//如果没有定义 _TIME_C_
#define MQTTCONFIG_C_ extern
#else
#define MQTTCONFIG_C_
#endif MQTTCONFIG_C_ unsigned char MqttSendData[]; int ConnectMqtt(char *ClientID,char *Username,char *Password);
int MqttSubscribeTopic(char *topic,u8 qos,u8 whether);
int MqttPublishData(char * topic, char * message, u8 qos); #endif

文章转载自https://www.cnblogs.com/yangfengwu/p/9124299.html,如有侵权请联系我删除

关于TCP和MQTT之间的转换(转载)的更多相关文章

  1. 关于TCP和MQTT之间的转换

    现在物联网流行的就是MQTT 其实MQTT就是在TCP的基础上建立了一套协议 可以看这个,本来我自己想用Wireshark监听一下,不过百度一搜索一大把,我就不测试了 https://blog.csd ...

  2. Visual Studio各版本工程文件之间的转换 [转载]

    原网址:http://www.cnblogs.com/jmliao/p/5594179.html Visual Studio各版本工程文件之间的转换   由于VS版本比较多,低版本无法直接打开高版本的 ...

  3. DataSet和List<T> 泛型之间互相转换 (转载, 作者写的很好)

    /DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属性 ...

  4. DataSet和List 泛型之间互相转换 (转载)

    //DataSet与泛型集合间的互相转换 //利用反射机制将DataTable的字段与自定义类型的公开属性互相赋值. //注意:从DataSet到IList<T>的转换,自定义类型的公开属 ...

  5. 编码与乱码(05)---GBK与UTF-8之间的转换--转载

    原文地址:http://www.blogjava.net/pengpenglin/archive/2010/02/22/313669.html [GBK转UTF-8] 在很多论坛.网上经常有网友问“  ...

  6. C# 16进制与字符串、字节数组之间的转换 (转载)

    1.请问c#中如何将十进制数的字符串转化成十六进制数的字符串 //十进制转二进制 Console.WriteLine(, )); //十进制转八进制 Console.WriteLine(, )); / ...

  7. 【转载】CString,string,char*之间的转换

    本文转自 <> 这三种类型各有各的优点,比如CString比较灵活,是基于MFC常用的类型,安全性也最高,但可移植性最差.string是使用STL时必不可少的类型,所以是做工程时必须熟练掌 ...

  8. 37.Activity之间的转换以及数据的传递(Intent)学习

      Intent简介:                                                                                在一个Androi ...

  9. ArcGIS中的坐标系定义与转换 (转载)

    原文:ArcGIS中的坐标系定义与转换 (转载) 1.基准面概念:  GIS中的坐标系定义由基准面和地图投影两组参数确定,而基准面的定义则由特定椭球体及其对应的转换参数确定,因此欲正确定义GIS系统坐 ...

随机推荐

  1. 『链接』Microsoft Visual C Redistributable/VC 再发行库 下载哪家强?

    http://www.standaloneofflineinstallers.com/2015/12/Microsoft-Visual-C-Redistributable-2015-2013-2012 ...

  2. 常用算法和Demo(Java实现)(持续更新)

    源码地址:https://github.com/zwxbest/Demo 1.顺序存储和单向链表,双向链表,循环链表的增删查改 https://github.com/zwxbest/Demo/tree ...

  3. linux 常用指令

    w 指令可以看到目前接入到服务器的用户(终端)history xx 可以查看本用户(本终端)最后执行的xx条指令last 指令可以查看登录的日志grep "str" filName ...

  4. Redhat 6.3上安装OpenSSL

    需求是:在Redhat 6.3上安装OpenSSL 1.1.0b. 一开始试图去搜索rpm,没有对应版本.https://pkgs.org/http://rpmfind.net/放弃! 只能通过编译源 ...

  5. 【Angular 5】数据绑定、事件绑定和双向绑定

    本文为Angular5的学习笔记,IDE使用Visual Studio Code,内容是关于数据绑定,包括Property Binding.Class Binding.Style Binding. 在 ...

  6. 学号 20175212 《Java程序设计》第3周学习总结

    学号 20175212 <Java程序设计>第3周学习总结 教材学习内容总结 一. Java--面向对象语言 核心内容为对象,一切围绕着对象.以下为三个重要性质: 封装性:将数据和对数据的 ...

  7. JS-圣杯模式

    var inherit = (function(){ var F = function(){}; return function(Target,Origin){ F.prototype = Origi ...

  8. 算法面试题(python)——如何找出数组中出现一次的数

    题目描述: 一个数组里,除了三个数是唯一出现的,其余的数都出现了偶数次,找出这三个数中任意一个.比如数组序列为[1,2,4,5,6,4,2],只有1.5.6这三个数字是唯一出现的,数字2.4均出现了偶 ...

  9. 【webpack学习笔记】a08-缓存

    一般要优化网站的加载速度可以从缓存入手,利用缓存可以降低网络流量,减少访问请求,从而可以达到加快访问速度的目的. 但是,如果一旦将文件缓存,那么有更新的时候就不能及时更新,若要看到最新内容,那么就需要 ...

  10. Mad libs

    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32 Type &q ...