博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于TCP和MQTT之间的转换(转载)
阅读量:4554 次
发布时间:2019-06-08

本文共 5861 字,大约阅读时间需要 19 分钟。

现在物联网流行的就是MQTT

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

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

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

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

其实有现成的写好的协议

可以看这两篇

我也打算先移植(应用)到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[70]={
0};/*** @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 = 0; int Index = 2; int i = 0; DataLen = 12 + 2+2+ClientIDLen+UsernameLen+PasswordLen; MqttSendData[0] = 0x10; //MQTT Message Type CONNECT MqttSendData[1] = DataLen; //剩余长度(不包括固定头部) MqttSendData[Index++] = 0; // Protocol Name Length MSB MqttSendData[Index++] = 4; // 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++] = 4; // MQTT Protocol version = 4 MqttSendData[Index++] = 0xc2; // conn flags MqttSendData[Index++] = 0; // Keep-alive Time Length MSB MqttSendData[Index++] = 60; // Keep-alive Time Length LSB 60S心跳包 MqttSendData[Index++] = (0xff00&ClientIDLen)>>8;// Client ID length MSB MqttSendData[Index++] = 0xff&ClientIDLen; // Client ID length LSB for(i = 0; i < ClientIDLen; i++) { MqttSendData[Index + i] = ClientID[i]; } Index = Index + ClientIDLen; if(UsernameLen > 0) { MqttSendData[Index++] = (0xff00&UsernameLen)>>8;//username length MSB MqttSendData[Index++] = 0xff&UsernameLen; //username length LSB for(i = 0; i < UsernameLen ; i++) { MqttSendData[Index + i] = Username[i]; } Index = Index + UsernameLen; } if(PasswordLen > 0) { MqttSendData[Index++] = (0xff00&PasswordLen)>>8;//password length MSB MqttSendData[Index++] = 0xff&PasswordLen; //password length LSB for(i = 0; 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=0,index = 0; if(whether) MqttSendData[index++] = 0x82; //0x82 //消息类型和标志 SUBSCRIBE 订阅 else MqttSendData[index++] = 0xA2; //0xA2 取消订阅 MqttSendData[index++] = topiclen + 5; //剩余长度(不包括固定头部) MqttSendData[index++] = 0; //消息标识符,高位 MqttSendData[index++] = 0x01; //消息标识符,低位 MqttSendData[index++] = (0xff00&topiclen)>>8; //主题长度(高位在前,低位在后) MqttSendData[index++] = 0xff&topiclen; //主题长度 for (i = 0;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=0; static u16 id=0; MqttSendData[index++] = 0x30; // MQTT Message Type PUBLISH if(qos) MqttSendData[index++] = 2 + topic_length + 2 + message_length;//数据长度 else MqttSendData[index++] = 2 + topic_length + message_length; // Remaining length MqttSendData[index++] = (0xff00&topic_length)>>8;//主题长度 MqttSendData[index++] = 0xff&topic_length; for(i = 0; i < topic_length; i++) { MqttSendData[index + i] = topic[i];//拷贝主题 } index += topic_length; if(qos) { MqttSendData[index++] = (0xff00&id)>>8; MqttSendData[index++] = 0xff&id; id++; } for(i = 0; i < message_length; i++) { MqttSendData[index + i] = message[i];//拷贝数据 } index += message_length; return index;}
#ifndef MQTTCONFIG_H_#define MQTTCONFIG_H_#include 
#ifndef MQTTCONFIG_C_//如果没有定义 _TIME_C_#define MQTTCONFIG_C_ extern#else#define MQTTCONFIG_C_#endifMQTTCONFIG_C_ unsigned char MqttSendData[200];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,如有侵权请联系我删除

 

转载于:https://www.cnblogs.com/qiyecao/p/9881608.html

你可能感兴趣的文章
【leetcode 简单】第三十九题 Excel表列名称
查看>>
【leetcode 简单】 第七十一题 二叉树的所有路径
查看>>
css的背景和边框
查看>>
javaweb之--html/CSS基础小结
查看>>
开发常用工具类-持续更新中
查看>>
实例:网站首页导航栏
查看>>
css3内处理
查看>>
ubuntu12.04 lts 安装gcc 4.8
查看>>
检查字符串结尾 判断一个字符串(str)是否以指定的字符串(target)结尾。
查看>>
JavaSE学习笔记(五)—— 数组
查看>>
通过java.util.concurrent写多线程程序
查看>>
linux apt-get 源配置
查看>>
排序中文POJ 1696/hrbustoj 1318 几何 蛋疼的蚂蚁
查看>>
序数序列hdu 1394
查看>>
could not initialize proxy - no Session 问题分析
查看>>
Python数据类型Day02
查看>>
.NET Core WebAPI IIS 部署问题
查看>>
SystemTap 静态探针安装包
查看>>
minGW cygwin gnuwin32
查看>>
韩国 DBA 博客
查看>>