C# MQTT M2MQTT
MQTT 入门介绍
MQTT是基于二进制消息的发布/订阅编程模式的消息协议
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:
- (1)Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload);
- (2)payload,可以理解为消息的内容,是指订阅者具体要使用的内容。
MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:
- (1)Connect。等待与服务器建立连接。
- (2)Disconnect。等待MQTT客户端完成所做的工作,并与服务器断开TCP/IP会话。
- (3)Subscribe。等待完成订阅。
- (4)UnSubscribe。等待服务器取消客户端的一个或多个topics订阅。
- (5)Publish。MQTT客户端发送消息请求,发送完成后返回应用程序线程。
服务质量(Quality of Service,QoS)
MQTT 定义了三种客户端与代理服务器之间消息到达的难度
0:broker/client 之间消息传一次,并不确认传到没有,消息可能丢失
1:broker/client 之间消息至少一次,带确认消息的传输,可能重复收到
2:broker/client 之间消息仅有一次,利用四次握手进行确认,网络延迟可能会增加
##主题
MQTT是通过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过可以通过反斜杠表示多个层级关系。主题并不需要创建,直接使用就是了。
主题还可以通过通配符进行过滤。其中,+可以过滤一个层级,而*只能出现在主题最后表示过滤任意级别的层级。举个例子:
- building-b/floor-5:代表B楼5层的设备。
- +/floor-5:代表任何一个楼的5层的设备。
- building-b/#:代表B楼所有的设备。
注意,MQTT允许使用通配符订阅主题,但是并不允许使用通配符广播。
运用M2MQTT实现
//创建客户端实例
MqttClient client = new MqttClient(IPAddress.Parse(MQTT_BROKER_ADDRESS)); //主机为IP时
MqttClient client = new MqttClient(MQTT_BROKER_ADDRESS); //当主机地址为域名时 // 注册消息接收处理事件,还可以注册消息订阅成功、取消订阅成功、与服务器断开等事件处理函数
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; //生成客户端ID并连接服务器
string clientId = Guid.NewGuid().ToString();
client.Connect(clientId); // 订阅主题"/home/temperature" 消息质量为 2
client.Subscribe(new string[] { "/home/temperature" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); ... void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
//处理接收到的消息
string msg = System.Text.Encoding.Default.GetString(e.Message);
textBox1.AppendText("收到消息:" + msg + "\r\n");
// 发布消息到主题 "/home/temperature" 消息质量为 2,不保留
client.Publish("/home/temperature", Encoding.UTF8.GetBytes("hello"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
M2MQTT类库说明
MqttClient主要事件
1.ConnectionClosed
客户端与服务端断开时触发
2.MqttMsgPublished
消息发布成功后触发
3.MqttMsgSubscribed
客户端订阅Topic成功后触发
4.MqttMsgPublishReceived
客户端收到来自服务端的消息后触发
5.MqttMsgUnsubscribed
客户端成功取消订阅后触发
MqttClient主要方法
1.连接MQTT服务器
Connect(string clientId);
Connect(string clientId, string username, string password);
Connect(string clientId, string username, string password, bool cleanSession, ushort keepAlivePeriod);
Connect(string clientId, string username, string password, bool willRetain, byte willQosLevel, bool willFlag, string willTopic, string willMessage, bool cleanSession, ushort keepAlivePeriod);
clientId :当前客户端的ID,相同ID的客户端连接服务器可能会产生异常,不同的客户端,应保证其ID不同。
username:如果服务器开启了身份授权,此处为账号
password:如果服务器开启了身份授权,此处为密码
willFlag:表示如果客户机不是发送DISCONNECT消息中断时,比如IO错误等,如果将此位置为1,要求重传。并且WillQos和WillRetain也要设置,消息体中的Topic和MessageID也要设置。
willRetain(遗嘱保留位):该位必须与遗嘱标志位状态相同(同为0 或者同为1)
willQosLevel:如果遗嘱标志被设置为 0,遗嘱 QoS 也必须设置为 0。 如果遗嘱标志被设置为 1,遗嘱 QoS 的值可以等于 0,1,2。
willTopic(遗嘱主题):如果遗嘱标志被设置为 1,异常断开时响应的主题
willMessage(遗嘱消息):如果遗嘱标志被设置为 1,异常断开时给遗嘱主题发送该消息
cleanSession:
C# MQTT M2MQTT的更多相关文章
- 通过集群的方式解决基于MQTT协议的RabbitMQ消息收发
在完成了基于AMQP协议的RabbitMQ消息收发后,我们要继续实现基于MQTT协议的RabbitMQ消息收发. 由于C#的RabbitMQ.Client包中只实现了基于AMQP协议的消息收发功能的封 ...
- MQTT 客户端应用及常见问题(C#)
https://blog.csdn.net/dengyaan/article/details/51752327 最近因为工作需要,需要使用C# 语言编写一个通过MQTT协议 ,上传数据到云端的工具.因 ...
- M2Mqtt is a MQTT client available for all .Net platform
Introduction M2Mqtt is a MQTT client available for all .Net platform (.Net Framework, .Net Compact F ...
- MQTT for UWP
老规矩,先简单介绍下MQTT: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分.该协 ...
- 物联网MQTT协议分析和开源Mosquitto部署验证
在<物联网核心协议—消息推送技术演进>一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信.Ajax轮询.Websocket.MQTT.CoAP等,其中MQTT协议为IBM制定 ...
- Mqtt学习指南
MQTT是物联网应用当中一种非常重要的,轻量级的协议,现将该协议的重要学习资源整理一下,希望能为初学者提供一个完整的学习资源. MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议.它的设计思 ...
- Mqtt使用教程,简介
1,简介 MQTT协议(Message Queuing Telemetry Transport),翻译过来就是遥信消息队列传输,是IBM公司于1999年提出的,现在最新版本是3.1.1.MQTT是一个 ...
- C# 接受MQTT服务器推送的消息
前言: MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制. 大家可以直接上GitHub下载MQQT服务的源码,源码地址:https:// ...
- 使用 MQTTnet 快速实现 MQTT 通信
1 什么是 MQTT ? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是 IBM 开发的一个即时通讯协议,有可能成为物联网的重要组成部分.MQT ...
随机推荐
- Spark教程——(8)本地执行spark-sql程序
在程序中设定Spark SQL的运行模式: //.setMaster("local")设置本地运行模式 val conf = new SparkConf().setAppName( ...
- LCS(最长公共子序列)
这个问题很有意思,在生物应用中,经常需要比较两个(或多个)不同生物体的DNA片段.例如,某种生物的DNA可能为S1 = ACCGGTCGAGTGCGCGGAAGCCGGCCGAA,S2 = GTCGT ...
- [经验] Java 使用 netty 框架, 向 Unity 客户端的 C# 实现通信 [1]
这是一个较为立体的思路吧 首先是技术选型: 前端 : HTML5 + jQuery ,简单暴力, 不解释 服务端 : Spring Boot + Netty + Redis/Cache 客户端 ...
- 技术|Android安装包极限优化
版权声明 1.本文版权归原作者所有,转载需注明作者信息及原文出处. 2.本文作者:赵裕(vimerzhao),永久链接:https://github.com/vimerzhao/vimerzhao.g ...
- Django 学习视图之FBV与CBV
一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...
- 视图家族 & 路由组件
目录 视图家族 & 路由组件 视图集与路由组件 基于 GenericAPIView 的十大接口 基于 generics 包下工具视图类的六大基础接口 视图集 路由组件:必须配合视图集使用 自定 ...
- ajax Ajax处理下载文件response没有反应
参考:https://blog.csdn.net/wf632856695/article/details/52040034
- VOC2012数据集提取自己需要的类的图片和对应的xml标签
根据需要修改路径和自己需要的类即可. import os import os.path import shutil fileDir_ann = r'/home/somnus/tttt/VOC2012/ ...
- Android加载手机磁盘上的资源---decodeFile方法的使用
一般在写Android程序时,通常会将图片资源放在/res/drawable/文件夹下,读取时,通过R.drawable.imageId即可读取图片内容,但用户在使用时,一般会想要读取存放在存储卡上的 ...
- 如何使用IDEA将maven项目打成war包
1.点击IDEA界面右边的maven project 2.双击package