Mqtt使用教程,简介
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
using MQTTnet;
using MQTTnet.Client.Connecting;
using MQTTnet.Client.Disconnecting;
using MQTTnet.Client.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks; namespace AliyunMqtt2
{
class Program
{ static void Main(string[] args)
{ string CId = "1"; //用户标识ID
String userName = "admin"; //用户名
String passWord = "password"; //密码
var will = new MqttApplicationMessage() { Topic = "lastwill", Payload = System.Text.Encoding.UTF8.GetBytes("我掉线了") };//定义遗嘱消息 IMqttClientOptions Option = new MqttClientOptionsBuilder().WithTcpServer("127.0.0.1", 61613)//地址端口号
.WithClientId(CId) //客户端标识Id要唯一。
.WithCredentials(userName, passWord) //用户名,密码
.WithWillMessage(will) //加上遗嘱消息
.WithCleanSession()
.Build(); MqttFactory factory = new MqttFactory();
var mqttClient = factory.CreateMqttClient(); //创建客户端实例 mqttClient.Connected += (object sender, MqttClientConnectedEventArgs e) => //连接成功
{
Console.WriteLine("连接成功:" + CId); var topics = new List<TopicFilter>();
topics.Add(new TopicFilter() { Topic = "家具/#" }); mqttClient.SubscribeAsync(topics);//订阅
Console.WriteLine("订阅成功:"); mqttClient.PublishAsync("家具/饮水机/加热/10度", "10");//发布
Console.WriteLine("发布成功"); };
mqttClient.Disconnected += (object sender, MqttClientDisconnectedEventArgs e) =>
{
Console.WriteLine("断开连接:" + CId); };
mqttClient.ApplicationMessageReceived += (object sender, MqttApplicationMessageReceivedEventArgs e) =>
{
///收到消息
string content = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
Console.WriteLine($"收到消息 msg={content}:"); }; mqttClient.ConnectAsync(Option); Console.ReadLine(); } }
}
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使用教程,简介的更多相关文章
- GBDT(MART) 迭代决策树入门教程 | 简介
GBDT(MART) 迭代决策树入门教程 | 简介 http://blog.csdn.net/w28971023/article/details/8240756
- CMake 构建项目教程-简介
CMake 构建项目教程-简介 Linux 平台构建项目,选择了CLion作为C++的IDE,而CLion默认就是使用CMake构建项目,所以这里记录了CMake在构建项目过程的一些小知识. 1. 项 ...
- lucene教程简介
1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是 ...
- Nginx入门教程-简介、安装、反向代理、负载均衡、动静分离使用实例
场景 Nginx入门简介和反向代理.负载均衡.动静分离理解 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/102790862 Ub ...
- 20181019-JSP 教程/简介
JSP 教程 这是第一篇JSP JSP与PHP.ASP.ASP.NET等语言类似,运行在服务端的语言. JSP(全称Java Server Pages)是由Sun Microsystems公司倡导和许 ...
- 【转载】GBDT(MART) 迭代决策树入门教程 | 简介
转载地址:http://blog.csdn.net/w28971023/article/details/8240756 GBDT(Gradient Boosting Decision Tree) 又叫 ...
- 转:GBDT(MART) 迭代决策树入门教程 | 简介
在网上看到一篇对从代码层面理解gbdt比较好的文章,转载记录一下: GBDT(Gradient Boosting Decision Tree) 又 叫 MART(Multiple Additive R ...
- css系列教程--简介及基础语法和注意事项
css简介:css指的是层叠样式表,cascading style sheets.用来定义html中的dom节点如何展示在页面中的问题.解决了内容与表现形式的分离问题.常见的样式表有外部链接样式表和内 ...
- 16-GDBT(MART) 迭代决策树入门教程 | 简介
转载:http://blog.csdn.net/w28971023/article/details/8240756 GBDT(Gradient Boosting Decision Tree) 又叫 M ...
随机推荐
- AtCoder Grand Contest 012
AtCoder Grand Contest 012 A - AtCoder Group Contest 翻译 有\(3n\)个人,每一个人有一个强大值(看我的假翻译),每三个人可以分成一组,一组的强大 ...
- Eclipse 添加 Source 源代码、Javadoc 文档
源代码 Source 按住 Ctrl 键,鼠标放到对应的类.方法上,出现 Open Declaration,Open Implementation ,可查看对应的实现.声明源代码. 也可以在[Proj ...
- Java EE 开发环境搭建
1 Windows 1.1 JDK 下载: 下载地址:https://developer.oracle.com/java 安装文件:jdk-8u201-windows-x64.exe JDK 并不是越 ...
- 寒冬之下,移动开发没人要了? 浅谈 iOS 开发者该 何去何从?
前言: 作者 | 梅梅 文章来源 CSDN 对于移动互联网而言,2018 年像是球场上的一声裁判哨.哨声响起,高潮迭起的上半场结束.本该再创辉煌的下半场,还没开赛却被告之:规则改变.场地收缩.教 ...
- 不得不用的提高效率小技巧让你用Mac更顺手| Mac小技巧(三)
文章内容及图片来源于:知乎,如果涉及版权问题,请联系作者删除 文章收录于:风云社区(提供上千款各类mac软件的下载) 1. 用预览给GIF删帧 我们在给文章配图或者做表情包的过程中,常需要截取 GIF ...
- JN_0004:轻松解码类似eval(function(p,a,c,k,e,d){}))的JavaScript代码
百度访问统计代码JavaScript源码:红色加粗部分将是要修改的地方.eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"&qu ...
- django - 总结 - 中间件
中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到性能. MID ...
- 你对安卓触控一体机了解多少?视野还停留在windows一体机上?
android一体机可以根据用户的不同需求拓展各种不同的硬件外接设备和各种应用软件,环境适应能力又强,所以在诸多领域的应用都非常受欢迎,并且还在不断地开拓新市场.安卓系统触摸一体机占据绝对性优势. 1 ...
- 字符串常量池和String.intern()方法在jdk1.6、1.7、1.8中的变化
字符串常量池也是运行时常量池 jdk1.6中,它是在方法区中,属于“永久代” jdk1.7中,它被移除方法区,放在java堆中 jdk1.8中,取消了“永久代”,将常量池放在元空间,与堆独立了 pub ...
- 什么是UDP