MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。
MQTT是一个客户端-服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M)以及物联网环境(IoT)。
MQTT设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这套机制下,提供了三种不同层次QoS(Quality of Service)
| MQTT消息质量 | |
|---|---|
| QoS0 | 发送就不管了,最多一次; |
| QoS1 | 发送之后依赖MQTT规范,是否启动重传消息,所以至少一次; |
| QoS2 | 发送之后依赖MQTT消息机制,确保只有一次。 |
MQTT协议中定义了一些方法,客户端可以通过这些方法实现连接服务器、订阅主题、发布主题等操作。
| MQTT方法 | |
|---|---|
| Connect | 等待与服务器建立连接。 |
| Disconnect | 等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。 |
| Subscribe | 等待完成订阅。 |
| UnSubscribe | 等待服务器取消客户端的一个或多个topics订阅。 |
| Publish | MQTT客户端发送消息请求,发送完成后返回应用程序线程。 |
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
(1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
(2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
| Mqtt客户端请求/响应的步骤 |
|---|
| 1、发布其他客户端可能会订阅的信息; |
| 2、订阅其它客户端发布的消息; |
| 3、退订或删除应用程序的消息; |
| 4、断开与服务器连接。 |
| MQTT服务器请求/响应步骤 |
|---|
| 1、接受来自客户的网络连接; |
| 2、接受客户发布的应用信息; |
| 3、处理来自客户端的订阅和退订请求; |
| 4、向订阅的客户转发应用程序消息; |
看完了上面的简介,接下来我就手把手的教大家如何组MQTT的协议包,其实也就是一串十六进制,并且通过组好的包连接上我们的服务器,并且实现主题订阅和发布。以下组成报文我就不逐个解释了,主要是针对一些有基础的朋友。这个组包规则是我每天花一个小时时间写的,整整肝了一个星期,所以大家不要吝啬点赞和收藏啊,感谢你们的不吝支持。
下面就是我们连接MQTT所需要的鉴权三元组,我们的MQTT服务器就是通过这个来实现对设备的鉴权操作的。
| 鉴权三元组 | |
|---|---|
| CLIENTID | 111|hmvcfu |
| USERNAME | hmvcfu |
| PASSWORD | a02d6361531c2dae941d5b022982d944 |
| Bit | 描述 | HEX | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 固定报头 | |||||||||||
| byte1 | 固定报头 | 0x10 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | |
| 剩余长度 | |||||||||||
| byte2 | Length MSB | 0x40 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
| byte3 | Length LSB | 0x00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 协议名称 | |||||||||||
| byte4 | 'M' | 0x4D | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | |
| byte5 | 'Q' | 0x51 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | |
| byte6 | 'T' | 0x54 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | |
| byte7 | 'T' | 0x54 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | |
| 协议级别 | |||||||||||
| byte8 | Level (4) 级别 | 0x04 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | |
| 连接标志 Connect Flags | |||||||||||
| User Name Flag | Password Flag | Will Retain | Will QoS | Will Flag | Clean Session | Reserved | |||||
| byte9 | 连接标志位 | 0xC0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | |
| 保活时间 | |||||||||||
| byte10 | Length MSB | 0x00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| byte11 | Length LSB | 0x78 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | |
| 客户端ID长度 | |||||||||||
| byte12 | Length MSB | 0x00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| byte13 | Length LSB | 0x0A | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | |
| 客户端ID数据部分 | |||||||||||
| byte31 | 如果长度不为0,这里就是数据部分 | 0x31 0x31 0x31 0x7C 0x68 0x6D 0x76 0x63 0x66 0x75 0x00 0x06 0x68 0x6D 0x76 0x63 0x66 0x75 | |||||||||
| 用户名长度 | |||||||||||
| byte32 | Length MSB | 0x00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| byte33 | Length LSB | 0x06 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | |
| 用户名数据部分 | |||||||||||
| byte39 | 如果长度不为0,这里就是数据部分 | 0x68 0x6D 0x76 0x63 0x66 0x75 | |||||||||
| 密码长度 | |||||||||||
| byte40 | Length MSB | 00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
| byte41 | Length LSB | 20 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | |
| 密码数据部分 | |||||||||||
| byte69 | 如果长度不为0,这里就是数据部分 | 0x61 0x30 0x32 0x64 0x36 0x33 0x36 0x31 0x35 0x33 0x31 0x63 0x32 0x64 0x61 0x65 0x39 0x34 0x31 0x64 0x35 0x62 0x30 0x32 0x32 0x39 0x38 0x32 0x64 0x39 0x34 0x34 | |||||||||
订阅主题之前,我们要定义好一个订阅主题(Topic),这样订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)。
| 订阅主题 | |
|---|---|
| 主题名称 | sys/hmvcfu/control |
| Bit | 描述 | HEX | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 固定报头 | ||||||||||||
| byte1 | 固定报头 | 82 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
| 剩余长度=可变报头长度+主题名称长度+服务质量等级所占字节数 | ||||||||||||
| byte2 | Length | 17 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
| 可变报头长度=主题名称长度+主题名称长度的占字节数 | ||||||||||||
| byte3 | Length MSB | 0x00 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| byte4 | Length LSB | 0x14 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
| 主题名称长度 | ||||||||||||
| byte5 | Length MSB | 0x00 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
| byte6 | Length LSB | 0x12 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | ||
| byte24 | 如果长度不为0,这里就是数据部分 | 0x73 0x79 0x73 0x2F 0x68 0x6D 0x76 0x63 0x66 0x75 0x2F 0x63 0x6F 0x6E 0x74 0x72 0x6F 0x6C | ||||||||||
| 服务质量等级 | ||||||||||||
| byte25 | 服务质量等级 | 0x00 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | ||
发布主题之前,我们要定义好一个发布主题(Topic),将数据包封装好之后,就会发布消息内容(payload)给订阅了这个主题的订阅者。
| 发布主题 | |
|---|---|
| 主题名称 | sys/hmvcfu/post |
| 数据包 | {“msg”:{“paramdata”:[{“temp”:20,“humi”:98}]}} |
| Bit | 描述 | HEX | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 固定报头 | ||||||||||||
| byte1 | 固定报头 | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ||
| 剩余长度=主题名称长度+数据包长度 | ||||||||||||
| byte2 | Length | 0x3E | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | ||
| 主题名称长度 | ||||||||||||
| byte3 | Length MSB | 0x30 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | ||
| byte4 | Length LSB | 0x07 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ||
| 主题名称 | ||||||||||||
| byte19 | 紧跟着的是主题名称 | 0x73 0x79 0x73 0x2F 0x68 0x6D 0x76 0x63 0x66 0x75 0x2F 0x70 0x6F 0x73 0x74 | ||||||||||
| 数据包 | ||||||||||||
| byte64 | 紧跟着的是数据包 | 0x7B 0x22 0x6D 0x73 0x67 0x22 0x3A 0x7B 0x22 0x70 0x61 0x72 0x61 0x6D 0x64 0x61 0x74 0x61 0x22 0x3A 0x5B 0x7B 0x22 0x74 0x65 0x6D 0x70 0x22 0x3A 0x32 0x30 0x2C 0x22 0x68 0x75 0x6D 0x69 0x22 0x3A 0x39 0x38 0x7D 0x5D 0x7D 0x7D | ||||||||||
下面就是我们要用到的MQTT服务器,这个是EMQ官方搭建的公共MQTT服务器,并不需要交一分钱。
| MQTT服务器 | |
|---|---|
| IP地址 | broker-cn.emqx.io |
| 端口号 | 1883 |
我们祭出MQTT.fx工具,填入IP地址和鉴权三元组,就可以连接上MQTT服务器(其实不用三元组也可以连接,这个是为了模拟有三元组的时候)。











我们可以通过网络调试助手模拟单片机的方式,通过发送十六进制数据来连接我们的服务器。




我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
@作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors 1、什么是behaviors 2、behaviors的工作方式 3、创建behavior 4、导入并使用behavior 5、behavior中所有可用的节点 6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors 1、什么是behaviorsbehaviors是小程序中,用于实现
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
我想在服务器启动时在我的Rails应用程序中订阅一个mqtt主题,并保持订阅始终处于事件状态和运行状态。我正在使用这个mqttgem进行mqtt通信:https://github.com/njh/ruby-mqtt这是我现在拥有的:在application.rb中:config.after_initializedomqttSub=BackgroundMQTT.newmqttSub.runend后台MQTT类:classMQTTSubscriberdefrunThread.newdoMQTT::Client.connect(:host=>'localhost',:port=>1883,)
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就