# NewLife.MQTT - MQTT协议
![GitHub top language](https://img.shields.io/github/languages/top/newlifex/newlife.mqtt?logo=github)
![GitHub License](https://img.shields.io/github/license/newlifex/newlife.mqtt?logo=github)
![Nuget Downloads](https://img.shields.io/nuget/dt/newlife.mqtt?logo=nuget)
![Nuget](https://img.shields.io/nuget/v/newlife.mqtt?logo=nuget)
![Nuget (with prereleases)](https://img.shields.io/nuget/vpre/newlife.mqtt?label=dev%20nuget&logo=nuget)
MQTT协议是物联网领域最流行的通信协议!
`NewLife.MQTT`包含了MQTT的完整实现,并实现了客户端`MqttClient`,以及服务端`MqttServer`。
其中MqttServer仅实现基本网络框架,支持消息收发,完整的消息交换功能位于商用版IoT平台[FIoT](https://newlifex.com/iot/fiot)中。
## MQTT协议
最流行的物联网通信协议MQTT,包括客户端、服务端和Web管理平台。
提供订阅/发布模式,更为简约、轻量,易于使用,针对受限环境(带宽低、网络延迟高、网络通信不稳定),可以简单概括为物联网打造,官方总结特点如下:
1. 使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
2. 对负载内容屏蔽的消息传输。
3. 使用 TCP/IP 提供网络连接。
4. 有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5. 小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
6. 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
## MQTT 发布与订阅
发布时,指定消息Qos,broker保存的消息包含了Qos;
订阅时,指定这次订阅要求的Qos,broker回复授权使用的Qos,一般就是申请那个;
消费时,消息的Qos取发布订阅中较小者!
详细场景:
- 订阅Qos=0,不管发布什么消息,消费到的消息Qos都是0;
- 订阅Qos=1,发布消息Qos=0时,消费得到Qos=0,发布消息Qos=1或2时,消费得到Qos=1;
- 订阅Qos=2,消费得到的消息Qos,就是发布时的Qos;
- 发布Qos=0,broker不做任何答复,理论上中途丢了都不知道,但是因为Tcp,如果网络异常客户端能发现;
- 发布Qos=1,broker答复`PubAck`,表示已经收到消息;
- 发布Qos=2,broker答复`PubRec`,客户端再次发送`PubRel`,broker答复`PubComp`,消息才算发布完成;
- 订阅Qos=2,broker推送Qos=2消息,客户端先回`PubRec`,broker再次发送`PubRel`,客户端答复`PubComp`,消息才算消费完成;
- 发布Qos=2消息时,双重确认流程不需要等消费端在线,仅限于发布者与broker之间即可完成。
## 快速尝鲜
打开源码解决方案,把Test设为启动项目,启动即可。
默认先后启动TestServer和TestClient。
![Demo](Doc/Demo.png)
## 服务端
Nuget引用`NewLife.MQTT`,使用以下代码启动服务端:
```csharp
var services = ObjectContainer.Current;
services.AddSingleton<ILog>(XTrace.Log);
services.AddTransient<IMqttHandler, MqttHandler>();
services.AddSingleton<MqttExchange, MqttExchange>();
var server = new MqttServer
{
Port = 1883,
ServiceProvider = services.BuildServiceProvider(),
Log = XTrace.Log,
SessionLog = XTrace.Log,
};
server.Start();
```
通过指定端口1883,默认处理器`MqttHandler`,默认交换机`MqttExchange`,启动服务端。
## 客户端
Nuget引用`NewLife.MQTT`,使用以下代码连接服务端:
```csharp
var client = new MqttClient
{
Log = XTrace.Log,
Server = "tcp://127.0.0.1:1883",
//UserName = "admin",
//Password = "admin",
ClientId = Guid.NewGuid() + "",
};
await client.ConnectAsync();
// 订阅“/test”主题
var rt = await client.SubscribeAsync("/test", (e) =>
{
XTrace.WriteLine("收到消息:" + "/test/# =>" + e.Topic + ":" + e.Payload.ToStr());
});
// 每2秒向“/test”主题发布一条消息
while (true)
{
try
{
var msg = "学无先后达者为师" + Rand.NextString(8);
await client.PublishAsync("/test", msg);
}
catch (Exception ex)
{
XTrace.WriteException(ex);
}
await Task.Delay(2000);
}
```
客户端连接服务端有几个要素:`服务端地址`、`用户名`、`密码`、`客户端标识`,然后通过`ConnectAsync`连接服务端。
客户端可以是消费者角色,通过`SubscribeAsync`订阅指定Topic。
客户端也可以是生产者角色,通过`PublishAsync`发布消息到指定Topic。
## 自定义服务端
需要在服务端处理客户端连接和消息交互逻辑时,就需要自定义服务端。例如IoT平台,在收到设备上报MQTT数据以后,直接接收落库,而不需要再次消费。
自定义处理器示例如下:
```csharp
private class MyHandler : MqttHandler
{
private readonly ILog _log;
public MyHandler(ILog log) => _log = log;
protected override ConnAck OnConnect(ConnectMessage message)
{
_log.Info("客户端[{0}]连接 user={1} pass={2} clientId={3}", Session.Remote.EndPoint, message.Username, message.Password, message.ClientId);
return base.OnConnect(message);
}
protected override MqttMessage OnDisconnect(DisconnectMessage message)
{
_log.Info("客户端[{0}]断开", Session.Remote);
return base.OnDisconnect(message);
}
protected override MqttIdMessage OnPublish(PublishMessage message)
{
_log.Info("客户端[{0}]发布[{1}:qos={2}]: {3}", Session.Remote, message.Topic, (Int32)message.QoS, message.Payload.ToStr());
return base.OnPublish(message);
}
}
```
稍微修改一下服务端注入处理器的代码即可使用自定义处理器:
```csharp
var services = ObjectContainer.Current;
services.AddSingleton<ILog>(XTrace.Log);
services.AddTransient<IMqttHandler, MyHandler>();
services.AddSingleton<MqttExchange, MqttExchange>();
var server = new MqttServer
{
Port = 1883,
ServiceProvider = services.BuildServiceProvider(),
Log = XTrace.Log,
SessionLog = XTrace.Log,
};
server.Start();
```
## 集群
集群管理,Join、Ping、Lease。
Join加入集群,告诉对方我是集群节点之一,启动时调用N-1次。
每15秒Ping一次所有节点,更新活跃时间。
Lease离开集群,调用N-1次。
每个节点根据最后活跃时间,定时剔除超时节点。
## 新生命项目矩阵
各项目默认支持net8.0/net7.0/netstandard2.1/netstandard2.0/net4.61,旧版(2022.1225)支持net4.5/net4.0/net2.0
| 项目 | 年份 | 说明 |
| :--------------------------------------------------------------: | :---: | -------------------------------------------------------------------------------------- |
| 基础组件 | | 支撑其它中间件以及产品项目 |
| [NewLife.Core](https://github.com/NewLifeX/X) | 2002 | 核心库,日志、配置、缓存、网络、序列化、APM性能追踪 |
| [NewLife.XCode](https://github.com/NewLifeX/NewLife.XCode) | 2005 | 大数据中间件,单表百亿级,MySql/SQLite/SqlServer/Oracle/TDengine/达梦,自动分表 |
| [NewLife.Net](https://github.com/NewLifeX
没有合适的资源?快使用搜索试试~ 我知道了~
最流行的物联网通信协议MQTT,包括客户端、服务端和Web管理平台.zip
共89个文件
cs:55个
pdf:8个
png:5个
0 下载量 124 浏览量
2024-08-24
08:14:39
上传
评论
收藏 10.9MB ZIP 举报
温馨提示
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助 【资源内容】:项目具体内容可查看/点击本页面下方的*资源详情*,包含完整源码+工程文件+说明(若有)等。【若无VIP,此资源可私信获取】 【本人专注IT领域】:有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为您提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【适合场景】:相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可基于此项目来扩展开发出更多功能 #注 1. 本资源仅用于开源学习和技术交流。不可商用等,一切后果由使用者承担 2. 部分字体及插图等来自网络,若是侵权请联系删除,本人不对所涉及的版权问题或内容负法律责任。收取的费用仅用于整理和收集资料耗费时间的酬劳 3. 积分资源不提供使用问题指导/解答
资源推荐
资源详情
资源评论
收起资源包目录
最流行的物联网通信协议MQTT,包括客户端、服务端和Web管理平台.zip (89个子文件)
DSwebffv1
.editorconfig 4KB
NewLife.MqttServer
MqttSetting.cs 796B
Program.cs 2KB
DefaultManagedMqttClient.cs 5KB
NewLife.MqttServer.csproj 1KB
MqttController.cs 2KB
.github
workflows
publish-beta.yml 777B
publish.yml 680B
test.yml 466B
NewLife.MQTT.sln 3KB
Doc
Connect.png 32KB
MQTT协议中文版(2017.04.05).pdf 1007KB
MQTT V3.1 Protocol Specification_files
style.css 3KB
logo.png 7KB
mqtt-v3.1.1-os.pdf 2.16MB
MQTT V3.1 Protocol Specification.html 125KB
MQTT-v5.0协议中文版.pdf 7.51MB
MQTT集群.eddx 22KB
MQTT-v5.0协议介绍.pptx 923KB
MQTT集群.png 287KB
Demo.png 151KB
startCluster.bat 836B
newlife.snk 1KB
MQTT协议V3.1.1最新中文翻译版.pdf 1.26MB
MQTT集群.svg 19KB
MQTT协议详解.pdf 387KB
leaf.png 92KB
MQTT-V3.1协议规范(中文版).docx 1.96MB
mqtt-v5.0.pdf 1.84MB
MQTT-SN_spec_v1.2.pdf 419KB
mqtt-v3.1.1.pdf 1.44MB
LICENSE 1KB
XUnitTestClient
PropertyInfo.cs 251B
MqttClientTests.cs 4KB
MqttTopicFilterTests.cs 4KB
XUnitTestClient.csproj 1KB
AliyunMqttClientTests.cs 2KB
MqttSignTests.cs 2KB
Clusters
MqttClusterTests.cs 2KB
ClusterControllerTests.cs 3KB
SubscriptionInfoTests.cs 762B
ClusterServerTests.cs 3KB
MqttController.cs 950B
NewLife.MQTT
MqttTopicFilter.cs 5KB
AliyunMqttClient.cs 3KB
MqttCodec.cs 3KB
MqttFactory.cs 2KB
Handlers
IMqttHandler.cs 11KB
IMqttExchange.cs 1KB
MqttExchange.cs 6KB
MqttServer.cs 6KB
MqttClient.cs 17KB
Properties
PublishProfiles
FolderProfile.pubxml 453B
NewLife.MQTT.csproj 3KB
Messaging
PingResponse.cs 506B
QualityOfService.cs 445B
MqttMessage.cs 9KB
PubComp.cs 598B
PubRel.cs 1KB
Subscription.cs 1KB
MqttType.cs 1KB
MqttIdMessage.cs 2KB
UnsubscribeMessage.cs 2KB
PublishMessage.cs 2KB
DisconnectMessage.cs 518B
SubAck.cs 2KB
PingRequest.cs 503B
ConnAck.cs 2KB
PubAck.cs 592B
UnsubAck.cs 604B
PubRec.cs 732B
SubscribeMessage.cs 2KB
ConnectMessage.cs 9KB
Clusters
PublishInfo.cs 355B
SubscriptionInfo.cs 871B
ClusterNode.cs 4KB
ClusterController.cs 4KB
ClusterServer.cs 5KB
ClusterExchange.cs 5KB
NodeInfo.cs 265B
MqttSign.cs 3KB
Models
TrieNode.cs 341B
SubscriptionManager.cs 2KB
PruningRadixTrie.cs 13KB
Trie.cs 2KB
Test
Program.cs 4KB
Test.csproj 1004B
.gitignore 410B
README.md 14KB
共 89 条
- 1
资源评论
热爱技术。
- 粉丝: 2479
- 资源: 7862
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功