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
相关文章
|
7天前
|
存储 JSON 监控
Viper,一个Go语言配置管理神器!
Viper 是一个功能强大的 Go 语言配置管理库,支持从多种来源读取配置,包括文件、环境变量、远程配置中心等。本文详细介绍了 Viper 的核心特性和使用方法,包括从本地 YAML 文件和 Consul 远程配置中心读取配置的示例。Viper 的多来源配置、动态配置和轻松集成特性使其成为管理复杂应用配置的理想选择。
26 2
|
12天前
|
JavaScript Java Go
探索Go语言在微服务架构中的优势
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出。本文将深入探讨Go语言在构建微服务时的性能优势,包括其在内存管理、网络编程、并发模型以及工具链支持方面的特点。通过对比其他流行语言,我们将揭示Go语言如何成为微服务架构中的一股清流。
103 53
|
6天前
|
Go 索引
go语言中的循环语句
【11月更文挑战第4天】
15 2
|
6天前
|
Go C++
go语言中的条件语句
【11月更文挑战第4天】
19 2
|
11天前
|
Ubuntu 编译器 Linux
go语言中SQLite3驱动安装
【11月更文挑战第2天】
34 7
|
11天前
|
关系型数据库 Go 网络安全
go语言中PostgreSQL驱动安装
【11月更文挑战第2天】
42 5
|
10天前
|
安全 Go
用 Zap 轻松搞定 Go 语言中的结构化日志
在现代应用程序开发中,日志记录至关重要。Go 语言中有许多日志库,而 Zap 因其高性能和灵活性脱颖而出。本文详细介绍如何在 Go 项目中使用 Zap 进行结构化日志记录,并展示如何定制日志输出,满足生产环境需求。通过基础示例、SugaredLogger 的便捷使用以及自定义日志配置,帮助你在实际开发中高效管理日志。
28 1
|
10天前
|
程序员 Go
go语言中的控制结构
【11月更文挑战第3天】
86 58
|
9天前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
10天前
|
存储 编译器 Go
go语言中的变量、常量、数据类型
【11月更文挑战第3天】
27 9