快速搭建MQTT服务器(MQTTnet和Apache Apollo)
前言
MQTT协议是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分,http://mqtt.org/。
MQTT is a machine-to-machine (M2M)/"Internet of Things" connectivity protocol. It was designed as an extremely lightweight publish/subscribe messaging transport. It is useful for connections with remote locations where a small code footprint is required and/or network bandwidth is at a premium. For example, it has been used in sensors communicating to a broker via satellite link, over occasional dial-up connections with healthcare providers, and in a range of home automation and small device scenarios. It is also ideal for mobile applications because of its small size, low power usage, minimised data packets, and efficient distribution of information to one or many receivers
通过https://github.com/mqtt/mqtt.github.io/wiki/servers 找到官方推荐的服务端软件,比如:Apache Apollo,
通过https://github.com/mqtt/mqtt.github.io/wiki/libraries可以找到推荐的客户端类库,比如:Eclipse Paho Java
MQTTnet
MQTTnet 是MQTT协议的.NET 开源类库。
MQTTnet is a .NET library for MQTT based communication. It provides a MQTT client and a MQTT server. The implementation is based on the documentation from http://mqtt.org/.
通过Nuget搜索MQTT找到了MQTTnet,它不是下载量最多的,也不在官方推荐列表中,主要是因为同时支持客户端和服务端,所以开始下载试用,结果证明有坑,源码在vs2015中不能打开,客户端示例接收不到消息。
开源地址:https://github.com/chkr1011/MQTTnet
首先把官方的控制台程序改成winform的,界面如下:


public partial class Form1 : Form
{ private MqttServer mqttServer = null;
private MqttClient mqttClient = null; public Form1()
{
InitializeComponent();
} private void button_启动服务端_Click(object sender, EventArgs e)
{ MqttTrace.TraceMessagePublished += MqttTrace_TraceMessagePublished; if (this.mqttServer == null)
{
try
{
var options = new MqttServerOptions
{
ConnectionValidator = p =>
{
if (p.ClientId == "SpecialClient")
{
if (p.Username != "USER" || p.Password != "PASS")
{
return MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
}
} return MqttConnectReturnCode.ConnectionAccepted;
}
}; mqttServer = new MqttServerFactory().CreateMqttServer(options); }
catch (Exception ex)
{
MessageBox.Show(ex.Message);
return; }
}
mqttServer.Start(); this.txt_服务器.AppendText( $">> 启动成功..." + Environment.NewLine);
} private void MqttTrace_TraceMessagePublished(object sender, MqttTraceMessagePublishedEventArgs e)
{
this.Invoke(new Action(() =>
{
this.txt_服务器.AppendText($">> [{e.ThreadId}] [{e.Source}] [{e.Level}]: {e.Message}" + Environment.NewLine);
if (e.Exception != null)
{
this.txt_服务器.AppendText( e.Exception + Environment.NewLine);
}
}));
} private void button_停止服务端_Click(object sender, EventArgs e)
{
if (mqttServer != null)
{
mqttServer.Stop();
}
this.txt_服务器.AppendText( $">> 停止成功" + Environment.NewLine);
} private async void button_启动客户端_Click(object sender, EventArgs e)
{
if (this.mqttClient == null)
{
var options = new MqttClientOptions
{
Server = "192.168.2.54",
ClientId = "zbl",
CleanSession = true
};
this.mqttClient = new MqttClientFactory().CreateMqttClient(options);
this.mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived;
this.mqttClient.Connected += MqttClient_Connected;
this.mqttClient.Disconnected += MqttClient_Disconnected; }
try
{
await this.mqttClient.ConnectAsync();
}
catch(Exception ex)
{
this.txt_客户端.AppendText( $"### CONNECTING FAILED ###" + Environment.NewLine);
} } private void MqttClient_Connected(object sender, EventArgs e)
{ this.Invoke(new Action( async () =>
{ this.txt_客户端.AppendText( $"### CONNECTED WITH SERVER ###" + Environment.NewLine);
await this.mqttClient.SubscribeAsync(new List<TopicFilter>{
new TopicFilter("#", MqttQualityOfServiceLevel.AtMostOnce)
});
this.txt_客户端.AppendText($"### SUBSCRIBED ###" + Environment.NewLine);
}));
} private void MqttClient_Disconnected(object sender, EventArgs e)
{
this.Invoke(new Action(() =>
{
this.txt_客户端.AppendText( $"### DISCONNECTED FROM SERVER ###" + Environment.NewLine); }));
} private void MqttClient_ApplicationMessageReceived(object sender, MQTTnet.Core.MqttApplicationMessageReceivedEventArgs e)
{
this.Invoke(new Action(() =>
{
this.txt_客户端.AppendText( $">> Topic:{e.ApplicationMessage.Topic} Payload:{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)} QoS:{e.ApplicationMessage.QualityOfServiceLevel} Retain:{e.ApplicationMessage.Retain}" + Environment.NewLine); }));
} private async void button_停止客户端_Click(object sender, EventArgs e)
{
if (this.mqttClient != null)
{
await this.mqttClient.DisconnectAsync();
}
this.txt_客户端.AppendText( $">> 停止成功" + Environment.NewLine);
} private async void button_发送_Click(object sender, EventArgs e)
{ //var options = new MqttClientOptions
//{
// Server = "localhost"
//};
//var client = new MqttClientFactory().CreateMqttClient(options); //await client.ConnectAsync(); var applicationMessage = new MqttApplicationMessage(this.txt_topic.Text,
Encoding.UTF8.GetBytes(this.txt_message.Text), MqttQualityOfServiceLevel.AtMostOnce, false); await this.mqttClient.PublishAsync(applicationMessage); } private void button_清空服务端_Click(object sender, EventArgs e)
{
this.txt_服务器.Text = "";
}
}

需要注意的是按照作者说明是
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
while (true){ Console.ReadLine(); var applicationMessage = new MqttApplicationMessage( "A/B/C", Encoding.UTF8.GetBytes("Hello World"), MqttQualityOfServiceLevel.AtLeastOnce, false ); await client.PublishAsync(applicationMessage);} |
客户端死活都收不到消息,改成 MqttQualityOfServiceLevel.AtMostOnce 就可以了,找问题时尝试下载源码调试因为vs2015打不开项目也折腾了一会。这个问题提交了issues,期待作者回复。
Apache Apollo
1.下载Apollo服务器,我这里用的是Binaries for Windows。下载后解压到一个文件夹,注意路径不要包含中文,安装手册
2.创建Broker Instance,命令行cd到bin目录,执行/bin/apollo create mybroker,执行后就会在bin目录下创建mybroker文件夹。
3.运行Broker Instance,命令行cd到mybroker/bin目录,执行mybroker/bin/apollo-broker.cmd run
4.Web Administrator,地址 http://127.0.0.1:61680/ or https://127.0.0.1:61681/,默认账号 admin,密码 password

参考
搭建了MQTT服务端之后需要在Esp8266模块和手机App中分别实现客户端功能,稍后待续。。。。
快速搭建MQTT服务器(MQTTnet和Apache Apollo)的更多相关文章
- 快速搭建Web服务器软件PHP+Apache+MySQL
搭建网站或者博客,需要一个合适的 Web 服务器.除了如下能在购买的虚拟空间上进行操作外,我们也可以在自己的电脑上搞定,因为可以用来方便快捷地测试网站或者博客主题,无论是 Wordpress.Joom ...
- 转 【MQTT】在Windows下搭建MQTT服务器
MQTT简介 MQ 遥测传输 (MQTT) 是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放.简单.轻量.易于实现.这些特点使它适用于受限环境.该协议的特点有: 使用发布/订阅消息模式,提供 ...
- MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信
MQTT实战1 - 使用Apache Apollo代理服务器实现mqtt通信 MQTT实战2 - 使用MQTTnet实现mqtt通信 源码下载 -> 提取码 QQ:505645074 MQTT ...
- MQTT再学习 -- 搭建MQTT服务器及测试
最近在搞 PM2.5 采集,需要用到 MQTT 传输协议.协议部分看了几天的,讲的七七八八.本身在 intel 上有 写好的MQTT 的源码,现在的工作其实也就是移植到单片机上或者DM368板卡上.不 ...
- [Windows Azure] 使用 Windows Azure 快速搭建 Redis 服务器
[Windows Azure] 使用 Windows Azure 快速搭建 Redis 服务器 Redis相信玩开源,大数据的朋友们并不陌生,大家最熟悉的使用者就是新浪微博,微博的整体数据缓存都是 ...
- 使用EMQ搭建MQTT服务器
前言寒假的时候开始搭建mqtt服务器,一开始使用的是RabbitMQ,基于Erlang语言.但是RabbitMQ的本职工作是AMQP,MQTT只是他的一个插件功能,似乎有些大材小用,很多MQTT的功能 ...
- CentOS 6.5下快速搭建ftp服务器[转]
CentOS 6.5下快速搭建ftp服务器 1.用root 进入系统 2.使用命令 rpm -qa|grep vsftpd 查看系统是否安装了ftp,若安装了vsftp,使用这个命令会在屏幕上显示vs ...
- Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程
Ubuntu 搭建Web服务器(MySQL+PHP+Apache)详细教程 看了好多人的博客,有的不全 or 有问题,整理了一下,适合小白 新手先整理几个小问题 1.为啥使用 Linux 搭建服务器? ...
- 搭建MQTT服务器
MQTT协议简介 MQTT 是一个基于发布/订阅模式的消息传输协议.它具有轻量级.开放.简单,易于实现,通信带宽要求低等特点.这些特点使得它对机器与机器的通信(M2M)以及物联网应用(IoT)来说是很 ...
随机推荐
- [模板] K-D Tree
K-D Tree K-D Tree可以看作二叉搜索树的高维推广, 它的第 \(k\) 层以所有点的第 \(k\) 维作为关键字对点做出划分. 为了保证划分均匀, 可以以第 \(k\) 维排名在中间的节 ...
- Nginx 请求的11个阶段
48 1:当请求进入Nginx后先READ REQUEST HEADERS 读取头部 然后再分配由哪个指令操作 2:Identity 寻找匹配哪个Location 3:Apply Rate Limi ...
- php curl报错:417 - Expectation Failed
当我在post提交的数据增加一段内容后会报错:417 - Expectation Failed. 查资料发现在使用curl做POST时,当post的数据大于1024字节时,curl并不会直接发起pos ...
- 关于vue-cli的项目结构【转】
一.总体框架 一个vue-cli的项目结构如下,其中src文件夹是需要掌握的,所以本文也重点讲解其中的文件,至于其他相关文件,了解一下即可. vue-cli项目总体结构 二.文件结构细分 1.buil ...
- StringUtils常用方法+StringUtils详细介绍
StringUtils常用方法+StringUtils详细介绍 StringUtils用法+StringUtils详细介绍博文来源:http://yijianfengvip.blog.163.co ...
- di.xml
di.xml文件 该di.xml文件配置对象管理器要注入的依赖项. 领域和应用入口点 每个 模块 都可以具有全局和区域特定的di.xml文件.Magento读取di.xml系统中声明的所有配置文件,并 ...
- 越光后端开发——ygapi(1.新建项目ygapi、新建MySQL数据库yg、项目连接数据库)
1.新建MySQL数据库 show databases;//查看已经有的数据库 create database yg; 2.新建项目ygapi 1.使用pycharm新建django项目取名ygapi ...
- 使用FFMPEG进行一些视频处理(C#)视频合并、转码、获取时长
FFMPEG的强大无需多说,举几个用到的功能,直接贴代码了 还有更多命令用到时搜索即可 视频转码 ) { var args = "-y -i {0} -vcodec copy {1}&quo ...
- Hibernate报错,关于配置的SessionFactory找不到问题
最近写项目使用hibernate默认的dtd,在启动项目时经常会出现这个问题,hibernate报错,配置factory的id找不到,找不到mapping配置文件, 不能读取配置的xml文件 Coul ...
- 分布式监控系统开发【day38】:报警阈值程序逻辑解析(三)
一.需求讨论 1.请问如何解决延迟问题 1000台机器,每1分钟循环一次但是刚好第一次循环第一秒刚处理完了,结果还没等到第二分钟又出问题,你那必须等到第二次循环,假如我这个服务很重要必须实时知道,每次 ...