1,简介

MQTT协议(Message Queuing Telemetry Transport),翻译过来就是遥信消息队列传输,是IBM公司于1999年提出的,现在最新版本是3.1.1。MQTT是一个基于TCP的发布订阅协议,设计的初始目的是为了极有限的内存设备和网络带宽很低的网络不可靠的通信,非常适合物联网通信

特点:

1轻量,

2可以在网络差的环境中使用  

3 使用发布订阅模式

4遗嘱

5消息有三种QOS(消息质量)0只发布不管关心不收到,1最少收到一次,2确保收到一次,只一次)

 

越来越的的物联网,互联网应用在使用Mqtt协议,小黄车就是其中之一 。可以被用作即时通讯,消息队列,消息推送(智联招聘企业版就使用mqtt做前端的消息推送)等等。各种语言的成熟库都有。

总之就是很棒,应用很广,将来会更广。

2 C#中使用Mqtt

Net也很多库

我们这里使用MQTTnet

  1. using MQTTnet;
  2. using MQTTnet.Client.Connecting;
  3. using MQTTnet.Client.Disconnecting;
  4. using MQTTnet.Client.Options;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Security.Cryptography;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11.  
  12. namespace AliyunMqtt2
  13. {
  14. class Program
  15. {
  16.  
  17. static void Main(string[] args)
  18. {
  19.  
  20. string CId = "1"; //用户标识ID
  21. String userName = "admin"; //用户名
  22. String passWord = "password"; //密码
  23. var will = new MqttApplicationMessage() { Topic = "lastwill", Payload = System.Text.Encoding.UTF8.GetBytes("我掉线了") };//定义遗嘱消息
  24.  
  25. IMqttClientOptions Option = new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1", 61613)//地址端口号
  26. .WithClientId(CId) //客户端标识Id要唯一。
  27. .WithCredentials(userName, passWord) //用户名,密码
  28. .WithWillMessage(will) //加上遗嘱消息
  29. .WithCleanSession()
  30. .Build();
  31.  
  32. MqttFactory factory = new MqttFactory();
  33. var mqttClient = factory.CreateMqttClient(); //创建客户端实例
  34.  
  35. mqttClient.Connected += (object sender, MqttClientConnectedEventArgs e) => //连接成功
  36. {
  37. Console.WriteLine("连接成功:" + CId);
  38.  
  39. var topics = new List<TopicFilter>();
  40. topics.Add(new TopicFilter() { Topic = "家具/#" });
  41.  
  42. mqttClient.SubscribeAsync(topics);//订阅
  43. Console.WriteLine("订阅成功:");
  44.  
  45. mqttClient.PublishAsync("家具/饮水机/加热/10度", "10");//发布
  46. Console.WriteLine("发布成功");
  47.  
  48. };
  49. mqttClient.Disconnected += (object sender, MqttClientDisconnectedEventArgs e) =>
  50. {
  51. Console.WriteLine("断开连接:" + CId);
  52.  
  53. };
  54. mqttClient.ApplicationMessageReceived += (object sender, MqttApplicationMessageReceivedEventArgs e) =>
  55. {
  56. ///收到消息
  57. string content = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
  58. Console.WriteLine($"收到消息 msg={content}:");
  59.  
  60. };
  61.  
  62. mqttClient.ConnectAsync(Option);
  63.  
  64. Console.ReadLine();
  65.  
  66. }
  67.  
  68. }
  69. }

  

3 Broker服务搭建

Mqtt需要一个Broker服务器做消息的中转站,所有的客户端发布都是往broker发布,订阅也都是从broker订阅

这里我们介绍两种broker,免费简单的apollo和稳定高性能的阿里云mqtt服务

Apollo

1.下载地址 http://activemq.apache.org/apollo/download.html

2.创建一个broker实例,命令行cd到bin目录,执行/bin/apollo create mybroker,执行后就会在bin目录下创建mybroker文件夹。

3.运行broker实例,命令行cd到mybroker/bin目录,执行mybroker/bin/apollo-broker.cmd run

:apollo依赖java环境。

运行成功的界面

 

4在浏览器查看连接的状况

在浏览器输入 http://127.0.0.1:61680/ 或者 https://127.0.0.1:61681/,默认账号 admin,密码 password

在这里看当前连接状况

 

 

阿里云 Mqtt搭建

1,首先要上阿里云购买服务

购买地址https://common-buy.aliyun.com/?commodityCode=onsMqtt#/buy

购买成功进入控制台

要是看不到实例列表的话,注意是否选择对了区域,默认是公网,我这里是华南区

选择group管理

创建一个新的groupid

然后就可以使用应用程序连接了

常用的net mqtt库有MQTTnet,M2Mqtt我这里使用 MQTTnet

使用Nuget安装

此处的username和pwd需要从阿里云账户里面获取

在右上角获取

这个分别就是key和secret

然后连接mqtt的时候username用key

Pwd用groupid加secret的哈希算法得来

public static string HMACSHA1(string key, string dataToSign)

{

Byte[] secretBytes = UTF8Encoding.UTF8.GetBytes(key);

HMACSHA1 hmac = new HMACSHA1(secretBytes);

Byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(dataToSign);

Byte[] calcHash = hmac.ComputeHash(dataBytes);

String calcHashString = Convert.ToBase64String(calcHash);

return calcHashString;

}

连接地址

在阿里云的控制台获取 即接入点域名 ,这里就不再需要端口号了

连接成功

4 客户端测试工具

添加MqttLens

使用谷歌浏览器 打开谷歌插架商店搜索MqttLens 并添加到浏览器

添加成功后在浏览器打开chrome://apps/

点击运行添加一个连接

测试发布订阅

测试成功

5 遗嘱和消息格式

遗嘱

遗嘱是mqtt的一个大特点

遗嘱的原理:连接成功后立即往往broker发送一条消息(遗嘱),但不生效,当客户端断开连接,broker检测不到心跳时,遗嘱生效。

消息格式

消息格式应当是下功夫去定义的,好的topic格式可以让我们更简洁方便

三种符号

/  代表层级 一般定义消息时都以 /分割成层级

比如  家具/饮水机/加热

通配符+ 代表一层匹配

比如

比如有设备 饮水机想要订阅 加热和保温两个topic,只需要订阅家具/饮水机/+

全通配符  # 能完全匹配,不限制层数

6  各种broker服务器对比

Apollo 免费 数量少没问题,数量大就不是很稳定了。而且实测时连接数和机器的内核数有关比如我这里4核的 WinServer最多只能连上512个

 

EMQ 国产的。也有免费版。各种服务器的版本都有,也很不错,

这里是官网 http://www.emqtt.com/

 

 

阿里云微消息服务如果可靠性要求比较高,或者客户端的数量比较大时,推荐使用阿里云。价格也不是很贵,安全性高,稳定性很高,这里还是很推荐

 

Mqtt使用教程,简介的更多相关文章

  1. GBDT(MART) 迭代决策树入门教程 | 简介

    GBDT(MART) 迭代决策树入门教程 | 简介  http://blog.csdn.net/w28971023/article/details/8240756

  2. CMake 构建项目教程-简介

    CMake 构建项目教程-简介 Linux 平台构建项目,选择了CLion作为C++的IDE,而CLion默认就是使用CMake构建项目,所以这里记录了CMake在构建项目过程的一些小知识. 1. 项 ...

  3. lucene教程简介

    1 lucene简介 1.1 什么是lucene     Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是 ...

  4. Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例

    场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...

  5. 20181019-JSP 教程/简介

    JSP 教程 这是第一篇JSP JSP与PHP.ASP.ASP.NET等语言类似,运行在服务端的语言. JSP(全称Java Server Pages)是由Sun Microsystems公司倡导和许 ...

  6. 【转载】GBDT(MART) 迭代决策树入门教程 | 简介

    转载地址:http://blog.csdn.net/w28971023/article/details/8240756 GBDT(Gradient Boosting Decision Tree) 又叫 ...

  7. 转:GBDT(MART) 迭代决策树入门教程 | 简介

    在网上看到一篇对从代码层面理解gbdt比较好的文章,转载记录一下: GBDT(Gradient Boosting Decision Tree) 又 叫 MART(Multiple Additive R ...

  8. css系列教程--简介及基础语法和注意事项

    css简介:css指的是层叠样式表,cascading style sheets.用来定义html中的dom节点如何展示在页面中的问题.解决了内容与表现形式的分离问题.常见的样式表有外部链接样式表和内 ...

  9. 16-GDBT(MART) 迭代决策树入门教程 | 简介

    转载:http://blog.csdn.net/w28971023/article/details/8240756 GBDT(Gradient Boosting Decision Tree) 又叫 M ...

随机推荐

  1. SpringBoot2.0初识

    核心特性 组件自动装配: Web MVC , Web Flux , JDBC 等 激活: @EnableAutoConfiguration 配置: /META_INF/spring.factories ...

  2. CRLF在过滤XSS语句后打Cookie方式

    看了很长时间的漏洞奖励计划,学到了不少骚姿势,我觉得这个姿势很不错,总结下写篇文章发出来.针对CRLF漏洞打cookie的方法. 这里不讲概念挖掘方式了,以实战为主: 阅读文章前先参考文章:http: ...

  3. wp系统笔记

    1.了解了justified-image-grid是wp插件,继而查看wp,wp是一个免费建站系统.内置主题和插件.博客,CMS,企业站等.php+mysql 环境至少5.0以上 2.在zh-word ...

  4. (二分查找 拓展) leetcode 34. Find First and Last Position of Element in Sorted Array && lintcode 61. Search for a Range

    Given an array of integers nums sorted in ascending order, find the starting and ending position of ...

  5. Django_restframework+vue解决跨域问题

    1. 安装 pip3 install django-cors-headers 2.在settings.py里设置 INSTALLED_APPS = ( ... 'corsheaders', ... ) ...

  6. JProfiler性能分析工具

    1.简介 JProfiler是一个商业授权的Java剖析工具,用于分析Java EE和Java SE应用程序. 2.JVMTI JDK本身定义了目标明确并功能完善的JNI(Java Native In ...

  7. Beamer 目录分栏

    导言区加入 \usepackage{multicol} 然后 \section*{目录} \frame{\begin{multicols}{} \tableofcontents[hideallsubs ...

  8. SQL Server 跨服务器操作

    Ø  简介 在工作中编写 SQL 时经常会遇到跨库或跨服务器操作,比如查询时,通过 A 服务器的某张表关联 B 服务器某张表,进行连接查询.或者从另一台服务器中的数据,对当前数据库中的数据进行 CRU ...

  9. 不定参数对arguments对象的影响

    如果声明函数时定义了不定参数,则在函数被调用时,arguments对象包含了所有传入的参数: function checkArgs(...args){ console.log(args.length, ...

  10. 本地图片上传与H5适配知识

    最近用到本地图片上传作为API的参数,在网上看了许多,记录一下,以后可能用的着(仅自己记录用,看不清请绕路) function getObjectURL(file) { var url = null ...