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

2024-01-21 08:08

本文主要是介绍站在单片机码农的角度对物联网、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不严谨对比
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

 

 

 

 

这篇关于站在单片机码农的角度对物联网、MQTT、SOCKET、TCP的另类理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628883

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

QT实现TCP客户端自动连接

《QT实现TCP客户端自动连接》这篇文章主要为大家详细介绍了QT中一个TCP客户端自动连接的测试模型,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录版本 1:没有取消按钮 测试效果测试代码版本 2:有取消按钮测试效果测试代码版本 1:没有取消按钮 测试效果缺陷:无法手动停

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(