MQTT是基于二进制消息的发布/订阅编程模式的消息协议html
实现MQTT协议须要客户端和服务器端通信完成,在通信过程当中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者能够同时是订阅者。编程
MQTT传输的消息分为:主题(Topic)和负载(payload)两部分:服务器
MQTT协议中定义了一些方法(也被称为动做),来于表示对肯定资源所进行操做。这个资源能够表明预先存在的数据或动态生成数据,这取决于服务器的实现。一般来讲,资源指服务器上的文件或输出。主要方法有:网络
服务质量(Quality of Service,QoS)
MQTT 定义了三种客户端与代理服务器之间消息到达的难度函数
0:broker/client 之间消息传一次,并不确认传到没有,消息可能丢失
1:broker/client 之间消息至少一次,带确认消息的传输,可能重复收到
2:broker/client 之间消息仅有一次,利用四次握手进行确认,网络延迟可能会增长
ui
##主题
MQTT是经过主题对消息进行分类的,本质上就是一个UTF-8的字符串,不过能够经过反斜杠表示多个层级关系。主题并不须要建立,直接使用就是了。spa
主题还能够经过通配符进行过滤。其中,+能够过滤一个层级,而*只能出如今主题最后表示过滤任意级别的层级。举个例子:.net
- building-b/floor-5:表明B楼5层的设备。
- +/floor-5:表明任何一个楼的5层的设备。
- building-b/#:表明B楼全部的设备。
注意,MQTT容许使用通配符订阅主题,可是并不容许使用通配符广播。 线程
//建立客户端实例 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);
1.ConnectionClosed代理
客户端与服务端断开时触发
2.MqttMsgPublished
消息发布成功后触发
3.MqttMsgSubscribed
客户端订阅Topic成功后触发
4.MqttMsgPublishReceived
客户端收到来自服务端的消息后触发
5.MqttMsgUnsubscribed
客户端成功取消订阅后触发
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: