本文主要是介绍站在单片机码农的角度对物联网、MQTT、SOCKET、TCP的另类理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
物联网这个词已经火了一阵子(觉得炒作的成分大一些),现在到像是过气的网红,今天咱就说说基于TCP的MQTT到底是个啥,当初听到MQTT觉得很高大上的样子,各种专业名词,发布订阅代理甩一脸,虽然有了吹嘘的资本,但是一直没有理解MQTT到底是什么,单片机开发人员都喜欢刨根问底,MQTT在程序中存在的最终形式是什么?作为嵌入式开发人员该怎样理解。
一、从嵌入式角度看MQTT
从很久之前就开始关注MQTT了,大部分资料都是站在服务器开发,前端开发的角度,或者是单纯的分析协议本身,这两种解释对嵌入式开发着很不友好。比如网站服务器开发人员,他们只需要调用相关的软件包或者库,看看对应的API就可以使用了,比如下面node开发的服务端和客服端。
var server = new mosca.Server(settings);server.on('clientConnected', function(client) {console.log('client connected', client.id);
}); //mqtt服务器
var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://192.168.1.136:8000');//创建客户端
What?这样也可以,对应嵌入式开发来说是不可想象的,底层的驱懂全部封装起来,使用十分简单。
而我为了在stm32上实现一个mqtt客户端写了这么多。
所以说不同的开发角度,导致对这个问题解释出现了偏差,这个解释权我觉得掌握在了开发服务器这些人手里了,嵌入式工程师只会上网看别人写的博客,自己又不写,写的人大部分都是做服务器开发的,所以才会很难理解。
看到这是不是觉得说了一堆废话,赶紧上代码,做嵌入式的要服务器代码,做服务器的要嵌入式的代码。可惜了,我只能说说我的见解,有没有代码看以后的心情了,毕竟理解了MQTT本质,用单片机开发出MQTT客户端还是很容易。做嵌入式应该都知道modbus协议吧,我觉得MQTT就相当于在modbus,这种通信协议可以在TCP或者UDP上跑就是了,举个栗子。
MQTT | modbus |
SOCKET | 串口 |
TCP/UDP |
SOCKET透传,和串口透传,透传就是所发即所收,我想能看懂上面的人应该也是玩烂了这两种通信方式。
下面我们做个试验,说明一下MQTT和SOCKET的关系。
下面这串16进制的报文是我通过串口助手从单片机发出去的数据中抓取的MQTTCONNECT – 连接服务端报文。具体啥意思感兴趣的可以
对照一下MQTT-3.1.1协议,3章 MQTT控制报文,这里不解释了,在贴上
对应的单片机程序。
10 2E 00 04 4D 51 54 54 04 EE 00 14 00 09 77 68 6F 5F 69 73 5F 6D 65 00
0A 49 5F 61 6D 5F 64 65 61 74 68 00 07 68 65 6C 70 20 6D 65 00 00 00 00
myMqttConData.clientID.cstring = "who_is_me";myMqttConData.keepAliveInterval = 20;myMqttConData.cleansession = 1;myMqttConData.username.cstring = "";myMqttConData.password.cstring = "";myMqttConData.willFlag = 1;myMqttConData.will.topicName.cstring = "I_am_death";myMqttConData.will.qos = 1;myMqttConData.will.retained = 1;myMqttConData.will.message.cstring = "help me";
实验开始之前先找个公共的MQTT服务器,这里推荐一个国内的通信猫服务器http://tongxinmao.com/App/Detail/id/126
如果想自己搭建一个服务器推荐EMQ3条命令即可运行一个服务器非常简单 https://developer.emqx.io/docs/emq/v3/cn/install.html#linux
开始实验:
1、开启一个TCP客户端正确填写IP和端口号点击连接
显示连接成功。随便发送点东西测试一下
发了几次发现TCP断开连接了 ,想想为什么断开连接?
现在的服务器是MQTT服务器,通信格式必须要按MQTT格式发送,为啥断开,因为MQTT服务器检测到通信格式不对,就是“”“暗号”对不上了,跑路了。就相当于你往modbus客户端上随便发送写数据,同样也不会叼你一个道理。
下面我们按照正确的格式发送一个连接报文。
奇迹发生了,服务器给我应对了,激动的泪流满面!!!
对照一下通信协议第一个字节是报文的类型,2表示的服务器收到你的请求了,剩下的信息啥意思感兴趣请对照协议。
总结:
对于做嵌入式开发的人员可以将SOCKET抽象成单片机的串口,而MQTT相当于是串口上的modbus协议,不管使用的是何种方式上网(wifi GPRS 3G 4G)首先要调通TCP或者UDP能实现透传,然后将要透传的内容按照MQTT的报文打包,将打包后的数据包(数组)通过TCP/UDP透传出去就好了,接收也是同样的道理。
使用MQTT的意义
对于嵌入式开发人员,可能会有个疑惑,使用MQTT咋就节约资源了呢,我一直就是这样用发送的16进制包啊,这个问题其实是对比对象的问题,MQTT是相对于其他的网络协议比如HTTP 这类,你如果和modbus、CAN等协议相比,MQTT同样也很繁琐。其实使用MQTT是减轻了开发服务器人员的负担,直接调用API,就OK了,在一个就是MQTT协议比较严谨,出现问题的机会小一些。
可不可以不使用MQTT
答案是当然可以了,如果你的团队愿意,可以在socket透传上使用modbus,只要你愿意使用啥都没有问题,完全可以自己定义一个比MQTT更简洁的通信协议,当然这样会苦了,开发服务器的小伙伴。但是使用MQTT坑嵌入式开发的,单片机维护这个网络连接也是需要动些脑筋的。最后祝看到的小伙伴,互相甩锅,和气生财! 手动滑稽.jpg
这篇关于站在单片机码农的角度对物联网、MQTT、SOCKET、TCP的另类理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!