站在单片机码农的角度对物联网、MQTT、SOCKET、TCP的另类理解

7 篇文章 1 订阅
7 篇文章 0 订阅

    物联网这个词已经火了一阵子(觉得炒作的成分大一些),现在到像是过气的网红,今天咱就说说基于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不严谨对比
MQTTmodbus
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

 

 

 

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在服务器的数据传输中,HTTP(Hypertext Transfer Protocol)和TCP(Transmission Control Protocol)是两个不同的层次。 TCP是一种传输层协议,负责在网络中可靠地传输数据。它使用连接导向的通信方式,通过三次握手建立连接,并使用确认和重传机制来确保数据的可靠传输。下面是一个简单的示例代码,使用Python的socket库来实现TCP服务器的数据传输: ```python import socket # 创建TCP服务器套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器地址和端口 server_address = ('localhost', 8080) server_socket.bind(server_address) # 监听连接请求 server_socket.listen(1) print('服务器已启动,等待连接...') while True: # 接受客户端连接 client_socket, client_address = server_socket.accept() print(f'接受来自 {client_address} 的连接') # 接收客户端发送的数据 data = client_socket.recv(1024) print(f'接收到的数据:{data.decode()}') # 发送响应给客户端 response = 'Hello, client!' client_socket.send(response.encode()) # 关闭客户端连接 client_socket.close() ``` HTTP则是一种应用层协议,建立在TCP协议之上,用于在客户端和服务器之间传输超文本数据。HTTP使用请求-响应模型,客户端发送HTTP请求到服务器,服务器处理请求并发送HTTP响应返回给客户端。下面是一个简单的示例代码,使用Python的flask库实现一个简单的HTTP服务器: ```python from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['GET']) def index(): return 'Hello, client!' if __name__ == '__main__': app.run(host='localhost', port=8080) ``` 这段代码创建了一个基于Flask的HTTP服务器,当客户端发送GET请求到根路径'/'时,服务器返回'Hello, client!'作为响应。在这里,Flask库简化了HTTP服务器的实现过程,并提供了方便的路由和请求处理功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值