关于TCP和MQTT之间的转换
现在物联网流行的就是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之间的转换的更多相关文章
- 关于TCP和MQTT之间的转换(转载)
现在物联网流行的就是MQTT 其实MQTT就是在TCP的基础上建立了一套协议 可以看这个,本来我自己想用Wireshark监听一下,不过百度一搜索一大把,我就不测试了 https://blog.csd ...
- ip(点分十进制 <==> 二进制整数)之间的转换
linux的套接字部分比较容易混乱,在这里稍微总结一下. 地址转换函数在地址的文本表达式和它们存放在套接字地址结构中的二进制值进行转换. 地址转换函数有四个:其中inet_addr 和 inet_nt ...
- JSON字符串和JS对象之间的转换
JSON字符串和JS对象之间的转换 1 json字符串转换为js对象 1.1 标准json格式字符串转换为Js对象 JSON字符串 str JSON.parse(str) eval(str) eva ...
- C# Stream 和 byte[] 之间的转换
一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = ; Image img = Image.FromStream( ...
- Java基础——基本类型和包装类、基本类型和字符串之间的转换
基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...
- String类型和基本数据类型之间的转换
Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...
- Json与javaBean之间的转换工具类
/** * Json与javaBean之间的转换工具类 * * {@code 现使用json-lib组件实现 * 需要 * json-lib-2.4-jdk15.jar * ...
- Stream 和 byte[] 之间的转换
Stream 和 byte[] 之间的转换 一. 二进制转换成图片 ? 1 2 3 4 5 MemoryStream ms = new MemoryStream(bytes); ms.Position ...
- 百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)
/** * Created by Wandergis on 2015/7/8. * 提供了百度坐标(BD09).国测局坐标(火星坐标,GCJ02).和WGS84坐标系之间的转换 */ //定义一些常量 ...
随机推荐
- js实现的玫瑰花
<html> <head> <meta charset="utf-8"> <title>开心快乐每一天</title> ...
- 2017-10-10 都市传说: "部分"中文出现乱码
知乎原链, 作者亦本人 事情起源于项目另一开发者在中文Windows下构建时遇到的部分中文出现乱码问题. 当时很不解的是, 为什么会只有部分出现乱码. 第一感觉是, 如果编码转换不正确, 要么全乱码, ...
- github上值得关注的前端项目【转】
今天突然看到了这些资源,所以就转载过来了,虽然是2015年的,但是可以看一下 综合/资源 frontend-dev-bookmarks 一个巨大的前端开发资源清单.star:15000 front-e ...
- Salesforce的基础用户界面定制
Salesforce的用户界面 Salesforce的用户界面易于定制.本文将讲述如何定制: 主菜单和选项卡 自定义按钮和链接 视图列表 页面布局 定制主菜单和选项卡 Salesforce的主菜单默认 ...
- 程序员Web面试之前端框架等知识
基于前面2篇博客: 程序员Web面试之jQuery 程序员Web面试之JSON 您已经可以顺利进入Web开发的大门. 但是要动手干,还需要了解一些已有的前端框架.UI套件,即要站在巨人肩膀上而不是从轮 ...
- [iOS] WSHorizontalPickerView 图片水平滚动封装
之前这篇文章传送门本来是记录自己练手的demo的,后来很多人来问我要代码.今天就抽时间封装了一下,没有考虑太多情况,等我有空再去仔细考虑吧. 代码在:Github 用法很简单,创建对象,设置数据源,记 ...
- Ubuntu切换root身份,命令行以中文显示
很多VPS商给的默认用户名并不是root,用以下命令处理即可: 1.修改root密码 sudo passwd root 输入密码,回车,再确认一次即可 2.更改密码后切换root身份 su root ...
- macos 下安装brew
1.终端执行 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master ...
- Hbase-2.0.0_03_Hbase数据模型
1. hbase数据模型 1.1. HBase数据模型术语 Table HBase表由多行组成. Row HBase中的一行由一个行键和一个或多个列组成,列的值与这些列相关联.存储行时,按行键按字母顺 ...
- Vs .Net Framework 灵活配置
背景:我们开发和部署项目时都是通过注释某些配置项 比如: 在调试时就注释掉生产的配置项,在生产时又要改回来,只有一个还好,如果多的话就会非常容易出错. 问题1:在发布时容易出错,需要控制发布时根据配置 ...