基于mqtt协议谈谈物联网开发

huatuo      2022-02-13     529

关键词:

1.MQTT协议:

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于TCP/IP实现发布/订阅模式的应用层协议,其主要特点有:

(1)基于发布/订阅模式,应用程序解耦;

(2)基于TCP/IP建立网络连接;

(3)协议交换最小化,降低网络流量;

 

2.基于MQTT协议应用:

(1)简单的发布订阅应用:

技术分享图片

 

(2)消息系统推送应用:

技术分享图片

 

(3)阿里云物联网应用:

技术分享图片

 

由于知识能力受限,无法一一列举基于MQTT协议的各种应用,下面就以上述消息推送系统作为例子,讲讲基于MQTT协议的消息推送系统具体开发,不考虑太复杂的业务逻辑,仅以最简洁的方式,阐述整个流程,针对一款应用来说,以一百万用户在线作为设计目标,基于golang/c/c++/javascript开发.

 

3.MQTT控制报文组成结构:

技术分享图片

 

3.1FixedHeader(固定头部)结构:

技术分享图片

 

针对MQTT固定头部定义相关数据结构,并定义相关编解码方法,如下:

type FixedHeader struct {

    MessageType    byte
    Dup            bool
    Qos            byte
    Retain          bool
    RemainingLength int
}

func boolToByte(b bool) byte {
switch b {
case true:
return 1
default:
return 0
}
}
//编码固定头部
func (fh *FixedHeader) pack() bytes.Buffer {
var header bytes.Buffer
header.WriteByte(fh.MessageType<<4 | boolToByte(fh.Dup)<<3 | fh.Qos<<1 | boolToByte(fh.Retain))
header.Write(encodeLength(fh.RemainingLength))
return header
}
//解码固定头部
func (fh *FixedHeader) unpack(typeAndFlags byte, r io.Reader) {
fh.MessageType = typeAndFlags >> 4
fh.Dup = (typeAndFlags>>3)&0x01 > 0
fh.Qos = (typeAndFlags >> 1) & 0x03
fh.Retain = typeAndFlags&0x01 > 0
fh.RemainingLength = decodeLength(r)
}
//编码剩余长度
func encodeLength(length int) []byte {
var encLength []byte
for {
digit := byte(length % 128)
length /= 128
if length > 0 {
digit |= 0x80
}
encLength = append(encLength, digit)
if length == 0 {
break
}
}
return encLength
}
//解码剩余长度
func decodeLength(r io.Reader) int {
var rLength uint32
var multiplier uint32
b := make([]byte, 1)
for {
io.ReadFull(r, b)
digit := b[0]
rLength |= uint32(digit&127) << multiplier
if (digit & 128) == 0 {
break
}
multiplier += 7
}
return int(rLength)
}

 

3.2VariableHeader(可变头部)结构:
可变头部结构根据请求报文的不同而不同,下面以CONNECT报文为例讲述,CONNECT报文可变头部结构:
协议名称:

技术分享图片

 

协议级别:

技术分享图片

 

连接标志:

技术分享图片

 

保持连接:

技术分享图片

 

3.3Payload(有效负荷):
有效负荷根据请求报文的不同而不同,下面以CONNECT报文为例讲述,CONNECT报文可变头部结构,CONNECT报文的有效载荷包含一个或多个以长度为前缀的字段,由可变报头中的标志决定是否包含这些字段,字段必须按这个顺序出现:客户端标识符,遗嘱主题,遗嘱消息,用户名,密码.

3.4连接报文编解码:
综上,针对MQTT连接报文定义相关数据结构,并定义相关编解码方法,如下:

type ConnectPacket struct {
FixedHeader
ProtocolName string
ProtocolVersion byte
CleanSession bool
WillFlag bool
WillQos byte
WillRetain bool
UsernameFlag bool
PasswordFlag bool
ReservedBit byte
KeepaliveTimer uint16

ClientIdentifier string
WillTopic string
WillMessage []byte
Username string
Password []byte
}
//连接报文编码
func (c *ConnectPacket) Write(w io.Writer) error {
var body bytes.Buffer
var err error
body.Write(encodeString(c.ProtocolName))
body.WriteByte(c.ProtocolVersion)
body.WriteByte(boolToByte(c.CleanSession)<<1 | boolToByte(c.WillFlag)<<2 | c.WillQos<<3 | boolToByte(c.WillRetain)<<5 | boolToByte(c.PasswordFlag)<<6 | boolToByte(c.UsernameFlag)<<7)
body.Write(encodeUint16(c.KeepaliveTimer))
body.Write(encodeString(c.ClientIdentifier))
if c.WillFlag {
body.Write(encodeString(c.WillTopic))
body.Write(encodeBytes(c.WillMessage))
}
if c.UsernameFlag {
body.Write(encodeString(c.Username))
}
if c.PasswordFlag {
body.Write(encodeBytes(c.Password))
}
c.FixedHeader.RemainingLength = body.Len()
packet := c.FixedHeader.pack()
packet.Write(body.Bytes())
_, err = packet.WriteTo(w)

return err
}
//连接报文解码
func (c *ConnectPacket) Unpack(b io.Reader) {
c.ProtocolName = decodeString(b)
c.ProtocolVersion = decodeByte(b)
options := decodeByte(b)
c.ReservedBit = 1 & options
c.CleanSession = 1&(options>>1) > 0
c.WillFlag = 1&(options>>2) > 0
c.WillQos = 3 & (options >> 3)
c.WillRetain = 1&(options>>5) > 0
c.PasswordFlag = 1&(options>>6) > 0
c.UsernameFlag = 1&(options>>7) > 0
c.KeepaliveTimer = decodeUint16(b)
c.ClientIdentifier = decodeString(b)
if c.WillFlag {
c.WillTopic = decodeString(b)
c.WillMessage = decodeBytes(b)
}
if c.UsernameFlag {
c.Username = decodeString(b)
}
if c.PasswordFlag {
c.Password = decodeBytes(b)
}
}

 

出于篇幅考虑,上述使用到的具体一些函数,如decodeString,decodeByte,encodeString等,就不一一列举出来了,如有错误,恳请指出!!!


未完待续...
参考文字:MQTT协议中文版

 







物联网协议mqtt

...;  MQTT(消息队列遥测传输)是ISO标准(ISO/IECPRF20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息... 查看详情

物联网6.物联网常用的通信协议-mqtt协议

前两篇文章已经介绍了两种协议,这篇是第三种协议- MQTT协议【物联网】4.物联网常用的通信协议-HTTP协议【物联网】5.物联网常用的通信协议-WebSocket协议MQTT(MQTelemetryTransport,消息队列遥测传输)是近年来出现... 查看详情

mqtt和coap哪个最可能成为未来物联网通信标准协议?

物联网通信标准目前主要有三种:基于协议的无线通信(无线局域网和无线接入技术)、基于身份的安全通信、基于位置的数据通信和基于互联网的通信。其中,MQTT和CoAP是物联网通信标准最为主要的两个方案。目前MQT... 查看详情

mqtt----物联网常用的消息队列协议

...geQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远... 查看详情

mqtt协议及安全详解

...tryTransport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布,目前最新版本为v3.1.1。MQTT最大的优点在于可以以... 查看详情

中国移动物联网开放平台onenet学习笔记——设备接入(mqtt协议)onenetstudio篇(代码片段)

...物联网开放平台(OneNET)是中移物联网有限公司基于物联网技术和产业特点打造的开放平台和生态环境,适配各种网络环境和协议类型,支持各类传感器和智能硬件的快速接入和大数据服务,提供丰富的API和... 查看详情

qt软件开发:编写mqtt客户端连接各大物联网平台(主题订阅发布)(代码片段)

...人开发都非常方便。这些物联网云平台都支持标准的MQTT协议接入,对个人开发者而言,在学习阶段手上没有合适的硬件,或者说使用硬件的门槛较高,又想要快速体验一遍设备通过MQTT协议接入服务器完成通信的过程,那么这篇... 查看详情

基于阿里云物联网平台设计的实时图传系统_采用mqtt协议传输图像

一、项目功能介绍当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B... 查看详情

1883端口是啥协议

您好,1883端口是一种基于MQTT协议的TCP端口,它是一种专门用于物联网应用的消息传输协议。MQTT协议是一种轻量级的发布/订阅消息传输协议,它可以帮助设备之间进行高效的消息传输,从而实现物联网应用的快速发展。1883端口... 查看详情

20210311全网唯一,物联网mqtt协议报文结构分析以及基于c#代码的报文组装实现(代码片段)

全网唯一,物联网MQTT协议报文结构分析以及基于C#代码的报文组装实现一、介绍MQTT是一种基于TCP/IP协议的应用层协议,它规定了不同应用之间进行数据交换时的传送格式。既然是协议,理论上可以被任何开发语言实... 查看详情

基于esp32搭建物联网服务器十二(使用mqtt协议与esp32互动)

...势,下图是一个MQTT的概念图:如图所示,MQTT基于一个MQTT服务器(MQTT Broker),所有设备或客户端都可以是一个发布设备同时也可以是一个订阅设备,所以,只要你的设备可以连接在同一个MQTT服务器,都... 查看详情

#创作者激励#物联网协议mqtt(代码片段)

...T简介  MQTT(消息队列遥测传输)是ISO标准(ISO/IECPRF20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息... 查看详情

国内物联网平台初探——阿里云物联网套件

...全通道。数据通道目前支持CCP协议和MQTT协议。用户可以基于CCP协议实现Pub/Sub异步通信,也可以使用远程调用(RPC)的通信模式实现设备端与云端的通信。用户也可以基于开源协议MQTT协议连接阿里云IoT,实现Pub/Sub异步通信。 ... 查看详情

mqtt是ibm开发的一个即时通讯协议,构建于tcp/ip协议上,是物联网iot的订阅协议,借助消息推送功能,可以更好地实现远程控制

...制原理,主要讲解理论。背景MQTT是IBM开发的一个即时通讯协议。MQTT构建于TCP/IP协议上,面向M2M和物联网IoT的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了MQTTv3.1协议的开源消息代理软件,提供轻量级的,支... 查看详情

物联网云端对接-4通过mqtt协议与百度云进行云端通信

百度云的天工物联网服务目前包括:物接入、物解析、物管理、时序数据库和规则引擎等5大部分,本篇文章仅介绍物接入。天工物联网的物接入,从开发者的角度来说相对有些复杂,需要多步操作才能实现一个云设备的创建,... 查看详情

基于阿里云mqtt物联网平台视频监控(代码片段)

1.项目介绍  本项目基于物联量平台远程的视频监控项目,通过MQTT协议实现两个设备间的数据上报与订阅。通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。在阿里云服务器上创建2个设备,分... 查看详情

esp8266连接物联网平台

...对物品和过程的智能化感知、识别和管理。物联网是一个基于互联网、传统电信网等的信息承载体,它让所有能够被独立寻址的普通物理对象形成互联互通的网络。  物联网平台是一个集成了设备管理、数据安全通信和消... 查看详情

物联网一定要用mqtt协议吗?用kafka行吗?

参考技术A物联网通讯协议有很多啊,例如z-wave、zigbee、wifi、蓝牙等 查看详情