Mosquitto源码分析及用go语言的重新实现(一、开篇)

简介: Mosquitto源码分析及用go语言的重新实现(一、开篇)

Mosquitto简介:


Mosquitto是用C语言实现的MQTT物联网协议v3.1 的消息代理服务器。提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单。


5G时代已经到来,物联网时代,万物互联。未来只有人想不到的,没有做不到的。物联网最近乃至以后都会很火,业余时间计划对Mosquitto源码进行一个研究分析以及用go语言按着Mosquitto的思路去重新实现一遍MQTTv3.1协议,作为一个学习和提高的过程。


Mosquitto源码下载位置:http://mosquitto.org/files/source/


物联网(Internet of Things,IoT)最近曝光率越来越高。虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的模式:之前的请求/回答(Request/Response)模式不再合适,取而代之的是发布/订阅(Publish/Subscribe)模式。这就是轻量级、可扩展的MQTT(Message Queuing Telemetry Transport)可以施展拳脚的舞台。


MQTT简介:


MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。


MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。



image.png


mosquitto的安装和使用:


安装过程略,可参照网上博文:常见MQTT服务器搭建与试用https://www.jianshu.com/p/e5cf0c1fd55c


常用客户端测试工具还有:MQTTBox和MQTT.fx


常用MQTT服务器有:EMQTT,Mosquitto,Apollo


apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。


或者现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务。


EMQ是目前开源社区最为流行的MQTT Broker


安装成功后,在终端运行mosquitto_sub --help 或 mosquitto_pub —help获取脚本参数说明:


mosquitto_pub参数说明:


-d  打印debug信息


-f  将指定文件的内容作为发送消息的内容


-h  指定要连接的域名  默认为localhost


-i  指定客户端clientid,默认为附加进程ID的mosquitto_pub_


-I  指定clientId前缀


-m  消息内容


-n  发送一个空(null)消息


-p  连接端口号


-q  指定QoS的值(0,1,2)


-t  指定topic


-u  用户名


-P  用户密码    


-V  指定MQTT协议版本


--will-payload  指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用


--will-qos  Will的QoS值。该参数需要与--will-topic一起使用


--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使 用


--will-topic  用户发送Will消息的topic


mosquitto_sub参数说明


-c  指定客户端clean_session是否保存。


-d  打印debug信息


-h  指定要连接的域名  默认为localhost


-i   指定客户端clientid


-I   指定clientId前缀


-k  keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒.


-q 指定希望接收到QoS为什么的消息  默认QoS为0


-R 不显示陈旧的消息


-t 订阅topic


-v 打印消息


--will-payload  指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用


--will-qos  Will的QoS值。该参数需要与--will-topic一起使用


--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使>用


--will-topic  用户发送Will消息的topic


启动代理服务


mosquitto -v


【-v】打印更多的调试信息


订阅主题


mosquitto_sub -v -t sensor


【-t】指定主题,此处为sensor


【-v】打印更多的调试信息


发布内容


mosquitto_pub -t sensor -m 12


【-t】指定主题


【-m】指定消息内容


mosquitto客户端和服务器运行命令:


[1] 发布者客户端运行命令示例:


./mosquitto_pub -h 127.0.0.1 -p 1883 -t "111" -m "this is a msg" -u root -P 123


[2] 订阅者客户端运行命令示例:


./mosquitto_sub -h 127.0.0.1 -i 111 -p 1883 -t 111 -k 60 -d -c -u root -P 123


[3] mosquitto服务器端运行命令示例:


./mosquitto  


相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
26天前
|
存储 监控 算法
员工上网行为监控中的Go语言算法:布隆过滤器的应用
在信息化高速发展的时代,企业上网行为监管至关重要。布隆过滤器作为一种高效、节省空间的概率性数据结构,适用于大规模URL查询与匹配,是实现精准上网行为管理的理想选择。本文探讨了布隆过滤器的原理及其优缺点,并展示了如何使用Go语言实现该算法,以提升企业网络管理效率和安全性。尽管存在误报等局限性,但合理配置下,布隆过滤器为企业提供了经济有效的解决方案。
73 8
员工上网行为监控中的Go语言算法:布隆过滤器的应用
|
1月前
|
存储 Go 索引
go语言中数组和切片
go语言中数组和切片
45 7
|
1月前
|
Go 开发工具
百炼-千问模型通过openai接口构建assistant 等 go语言
由于阿里百炼平台通义千问大模型没有完善的go语言兼容openapi示例,并且官方答复assistant是不兼容openapi sdk的。 实际使用中发现是能够支持的,所以自己写了一个demo test示例,给大家做一个参考。
|
1月前
|
程序员 Go
go语言中结构体(Struct)
go语言中结构体(Struct)
112 71
|
1月前
|
存储 Go 索引
go语言中的数组(Array)
go语言中的数组(Array)
115 67
|
7天前
|
算法 安全 Go
Go语言中的加密和解密是如何实现的?
Go语言通过标准库中的`crypto`包提供丰富的加密和解密功能,包括对称加密(如AES)、非对称加密(如RSA、ECDSA)及散列函数(如SHA256)。`encoding/base64`包则用于Base64编码与解码。开发者可根据需求选择合适的算法和密钥,使用这些包进行加密操作。示例代码展示了如何使用`crypto/aes`包实现对称加密。加密和解密操作涉及敏感数据处理,需格外注意安全性。
30 14
|
1月前
|
Go 索引
go语言for遍历数组或切片
go语言for遍历数组或切片
114 62
|
7天前
|
Go 数据库
Go语言中的包(package)是如何组织的?
在Go语言中,包是代码组织和管理的基本单元,用于集合相关函数、类型和变量,便于复用和维护。包通过目录结构、文件命名、初始化函数(`init`)及导出规则来管理命名空间和依赖关系。合理的包组织能提高代码的可读性、可维护性和可复用性,减少耦合度。例如,`stringutils`包提供字符串处理函数,主程序导入使用这些函数,使代码结构清晰易懂。
40 11
|
7天前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
|
11天前
|
监控 安全 算法
深度剖析核心科技:Go 语言赋能局域网管理监控软件进阶之旅
在局域网管理监控中,跳表作为一种高效的数据结构,能显著提升流量索引和查询效率。基于Go语言的跳表实现,通过随机化索引层生成、插入和搜索功能,在高并发场景下展现卓越性能。跳表将查询时间复杂度优化至O(log n),助力实时监控异常流量,保障网络安全与稳定。示例代码展示了其在实际应用中的精妙之处。
36 9