【物联网IoT - 10分钟,构建一个自己的MQTT Broker服务!】

常见的MQTT Broker

  • Eclipse Mosquitto:轻量级 MQTT Broker,易于部署和使用。
  • EMQX:高性能、可扩展的 MQTT Broker。
  • HiveMQ:企业级 MQTT Broker,支持集群和高可用性。
  • VerneMQ:高性能、可扩展的 MQTT Broker,支持集群。

需求

  • 配置要求低:单机可部署
  • 适配mqtt协议,客户端支持paho.mqtt
  • 部署相对简单
  • 部署环境支持

选哪个

选Eclipse Mosquitto

为什么

  1. 之前的客户端用了paho mqtt (也属于Eclipse下面的项目),和Eclipse Mosquitto 都属于Eclipse 基金会下的开源项目,完全适配。
  2. 部署简单,且支持多环境。

Eclipse Mosquitto 作为物联网IoT MQTT服务,对比其它MQTT Broker,类似于数据库中的SQLite。

单机可部署,轻量级,不支持分布式,简单快直接。

部署步骤

1.安装

go 复制代码
sudo apt-get update

安装客户端和服务端

go 复制代码
sudo apt-get install -y mosquitto mosquitto-clients

2. 启动

go 复制代码
mosquitto -c /etc/mosquitto/mosquitto.conf

3. 测试

使用mosquitto命令行客户端 mosquitto_sub/pub 安装完后试下,订阅和发布

go 复制代码
mosquitto_sub -h localhost -t test/topic
go 复制代码
mosquitto_pub -h localhost -t test/topic -m "Hello, MQTT"

代码 测试,一个Go Paho MQTT Client示例

go 复制代码
package main

import (
	"fmt"
	"time"
	mqtt "github.com/eclipse/paho.mqtt.golang"
)

func main() {
	// 创建 MQTT 客户端选项
	opts := mqtt.NewClientOptions().AddBroker("tcp://123.56.56.123:1883")
	opts.SetClientID("go_mqtt_client")
	// opts.SetUsername("username") // 添加用户名
	// opts.SetPassword("xxx")   // 添加密码
	opts.SetDefaultPublishHandler(messagePubHandler)

	// 创建 MQTT 客户端
	client := mqtt.NewClient(opts)
	if token := client.Connect(); token.Wait() && token.Error() != nil {
		panic(token.Error())
	}

	// 订阅主题
	topic := "test/topic"
	token := client.Subscribe(topic, 1, nil)
	token.Wait()
	fmt.Printf("Subscribed to topic: %s\n", topic)

	// 发布消息
	for i := 0; i < 5; i++ {
		text := fmt.Sprintf("Hello, MQTT %d", i)
		token = client.Publish(topic, 0, false, text)
		token.Wait()
		time.Sleep(1 * time.Second)
	}

	// 断开连接
	client.Disconnect(250)
}

// 消息发布处理函数
var messagePubHandler mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
	fmt.Printf("Received message: %s from topic: %s\n", msg.Payload(), msg.Topic())
}

4 安全相关

第一步:开启ssl加密传输,配置ssl,避免消息在网络中明文传输。

  1. 使用RSA算法生成,私钥,公钥,证书信息。
bash 复制代码
openssl genpkey -algorithm RSA -out mosquitto.key
openssl req -new -key mosquitto.key -out mosquitto.csr
openssl x509 -req -in mosquitto.csr -signkey mosquitto.key -out mosquitto.crt -days 365
  1. 在mosquitto中配置
go 复制代码
listener 8883
cafile /path/to/ca.crt
certfile /path/to/mosquitto.crt
keyfile /path/to/mosquitto.key
  1. 重启服务后,再次连接,注意代码中加上ssl配置
go 复制代码
// 更新连接串
opts := mqtt.NewClientOptions().AddBroker("ssl://123.56.56.123:8883")
...
// 配置TLS
tlsConfig := &tls.Config{
    InsecureSkipVerify: true, // 跳过对服务端CA证书的验证
}
opts.SetTLSConfig(tlsConfig)

第二步:身份验证,增加密码

go 复制代码
mosquitto_passwd -c /etc/mosquitto/passwd username

修改配置文件 ,路径 /etc/mosquitto/mosquitto.conf

go 复制代码
allow_anonymous false
password_file /etc/mosquitto/passwd

对应代码修改

复制代码
...
// 创建 MQTT 客户端选项
opts := mqtt.NewClientOptions().AddBroker("tcp://123.56.56.123:1883")
opts.SetClientID("go_mqtt_client")
opts.SetUsername("username") // 添加用户名
opts.SetPassword("xxx")   // 添加密码
opts.SetDefaultPublishHandler(messagePubHandler)
...

补充问题

mosquitto对于传输大小是否有限制

  • 默认限制 256MB ,可以设置
go 复制代码
max_packet_size 268435455  # 设置最大消息大小为256MB

mosquitto里面的消息队列长度默认多长,如果长时间不消费,怎么处理死信

  • 有过期时间, 比如1小时
go 复制代码
message-expiry-interval 3600  # 消息过期时间为1小时
相关推荐
qq_297574678 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
雪兽软件11 小时前
物联网 (IoT) 将如何改变我们的工作方式
物联网
才盛智能科技13 小时前
K链通×才盛云:自助KTV品牌从0到1孵化超简单
大数据·人工智能·物联网·自助ktv系统·才盛云
三佛科技-1341638421215 小时前
宠物洗澡打泡机方案,宠物泡泡机MCU方案开发设计分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺·宠物
计算机程序设计小李同学16 小时前
基于 Spring Boot + Vue 的龙虾专营店管理系统的设计与实现
java·spring boot·后端·spring·vue
WZGL123016 小时前
“十五五”发展展望:以社区为底座构建智慧康养服务
大数据·人工智能·物联网
Charlie_lll18 小时前
力扣解题-[3379]转换数组
数据结构·后端·算法·leetcode
VX:Fegn089518 小时前
计算机毕业设计|基于springboot + vue云租车平台系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
汤姆yu18 小时前
2026基于springboot的在线招聘系统
java·spring boot·后端
北京耐用通信18 小时前
耐达讯自动化Profinet转Devicenet网关:精细化工行业的“协议融合利器”
人工智能·物联网·网络协议·自动化·信息与通信