站在单片机码农的角度对物联网、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

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socket read timed out的问题

《如何解决Druid线程池Cause:java.sql.SQLRecoverableException:IO错误:Socketreadtimedout的问题》:本文主要介绍解决Druid线程... 目录异常信息触发场景找到版本发布更新的说明从版本更新信息可以看到该默认逻辑已经去除总结异常信息触发场景复

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

基于C#实现MQTT通信实战

《基于C#实现MQTT通信实战》MQTT消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点,下面我们就来看看C#实现... 目录1、连接主机2、订阅消息3、发布消息MQTT(Message Queueing Telemetr

SpringBoot快速搭建TCP服务端和客户端全过程

《SpringBoot快速搭建TCP服务端和客户端全过程》:本文主要介绍SpringBoot快速搭建TCP服务端和客户端全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录TCPServerTCPClient总结由于工作需要,研究了SpringBoot搭建TCP通信的过程

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka