现在物联网流行的就是MQTT

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

视频教程

https://www.bilibili.com/video/av59673217

https://www.bilibili.com/video/av55614464

https://www.bilibili.com/video/av55616834

可以看这个,本来我自己想用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[7]={}; /**
* @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

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

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

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

  2. ip(点分十进制 <==> 二进制整数)之间的转换

    linux的套接字部分比较容易混乱,在这里稍微总结一下. 地址转换函数在地址的文本表达式和它们存放在套接字地址结构中的二进制值进行转换. 地址转换函数有四个:其中inet_addr 和 inet_nt ...

  3. JSON字符串和JS对象之间的转换

    JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象  JSON字符串 str JSON.parse(str) eval(str) eva ...

  4. C# Stream 和 byte[] 之间的转换

    一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...

  5. Java基础——基本类型和包装类、基本类型和字符串之间的转换

    基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...

  6. String类型和基本数据类型之间的转换

    Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...

  7. Json与javaBean之间的转换工具类

    /**  * Json与javaBean之间的转换工具类  *  * {@code 现使用json-lib组件实现  *    需要  *     json-lib-2.4-jdk15.jar  * ...

  8. Stream 和 byte[] 之间的转换

    Stream 和 byte[] 之间的转换 一. 二进制转换成图片 ? 1 2 3 4 5 MemoryStream ms = new MemoryStream(bytes); ms.Position ...

  9. 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)

    /** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ //定义一些常量 ...

随机推荐

  1. 方差variance, 协方差covariance, 协方差矩阵covariance matrix

    https://www.jianshu.com/p/e1c8270477bc?utm_campaign=maleskine&utm_content=note&utm_medium=se ...

  2. 安卓APP应用在各大应用市场上架方法整理

    想要把APP上架到应用市场都要先注册开发者账号才可以.这里的方法包括注册帐号和后期上架及一些需要注意的问题.注意:首次提交应用绝对不能随便删除,否则后面再提交会显示应用APP冲突,会要求走应用认领流程 ...

  3. LeetCode题解之 Subtree of Another Tree

    1.题目描述 2.问题分析 判断一个节点,然后判断子树. 3.代码 bool isSubtree(TreeNode* s, TreeNode* t) { if (s == NULL) return f ...

  4. Python中DataFrame去重

    # 去除重复行数据 keep:'first':保留重复行的第一行,'last':保留重复行的最后一行,False:删除所有重复行df = df.drop_duplicates( subset=['YJ ...

  5. python第三天 变量 作业

    作业1,模拟登陆:1. 用户输入帐号密码进行登陆2. 用户信息保存在文件内3. 用户密码输入错误三次后锁定用户 使用文件:user_file.txt  用户列表文件.     格式:{'张三':'12 ...

  6. Android 发送自定义广播(标准和本地)

    1.首先自定义一个广播接收器:MyBroadcastReceiver package example.com.mybroadcastreceiver; import android.content.B ...

  7. The Art of Unit Testing With Examples in .NET

    The Art of Unit Testing With Examples in .NET

  8. 4.2Python数据类型(2)之布尔类型

    返回总目录 目录: 1.布尔类型的概念和分类: 2.布尔类型的本质 3.布尔类型的应用 (一)布尔类型的概念和分类: (1)概念: 布尔类型(bool)就是用于判断真假的数据类型 (2)分类: Pyt ...

  9. Class doesn't contain any JAX-RS annotated method

    项目中使用了Jersey RESTful风格的注解 , 根据错误提示就知道了 , 在类中没有带注解的方法 ,所以只要在方法上添加 @path() 注解就行了,至少要有一个方法带有Jersey注解

  10. 个人技术博客——linux服务器配置以及flask框架

    本次的软件工程实践,我负责我们组后台服务的搭建,我选用了bandwagon的服务器,安装的是Debian GNU/Linux,全程在root用户下操作,后端服务是用python的flask框架,数据库 ...