C# MQTT 服务端客户端通讯
关于MQTT
在这里我就不做过多的介绍了 , 超时空连接点我
MQTT示例
注: 该示例演示统一使用WPF, 简单MVVM模式演示, 复制代码需注意引用 NuGet包 GalaSoft
MQTT服务端建立:
演示界面:

演示代码:
public class MainViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
ClientInsTances = new ObservableCollection<ClientInstance>();
} IMqttServer mqttServer; //MQTT服务端实例 string message; /// <summary>
/// 消息 用于界面显示
/// </summary>
public string Message
{
get { return message; }
set { message = value; RaisePropertyChanged(); }
} ObservableCollection<ClientInstance> clientInstances; //客户端登陆缓存信息 /// <summary>
/// 客户端实例
/// </summary>
public ObservableCollection<ClientInstance> ClientInsTances
{
get { return clientInstances; }
set { clientInstances = value; RaisePropertyChanged(); }
}
//开启MQTT服务
public void OpenMqttServer()
{
mqttServer = new MqttFactory().CreateMqttServer();
var options = new MqttServerOptions(); //拦截登录
options.ConnectionValidator = c =>
{
try
{
Message += string.Format("用户尝试登录:用户ID:{0}\t用户信息:{1}\t用户密码:{2}", c.ClientId, c.Username, c.Password) + "\r\n";
if (string.IsNullOrWhiteSpace(c.Username))
{
Message += string.Format("用户:{0}登录失败,用户信息为空", c.ClientId) + "\r\n"; c.ReturnCode = MQTTnet.Protocol.MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
return;
}
//解析用户名和密码,这个地方需要改成查找我们自己创建的用户名和密码。
if (c.Username == "admin" && c.Password == "")
{
c.ReturnCode = MqttConnectReturnCode.ConnectionAccepted;
Message += c.ClientId + " 登录成功" + "\r\n";
ClientInsTances.Add(new ClientInstance()
{
ClientID = c.ClientId,
UserName = c.Username,
PassWord = c.Password
});
return;
}
else
{
c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword;
Message += "用户名密码错误登陆失败" + "\r\n";
return;
}
}
catch (Exception ex)
{
Console.WriteLine("登录失败:" + ex.Message);
c.ReturnCode = MqttConnectReturnCode.ConnectionRefusedIdentifierRejected;
return;
}
};
//拦截订阅
options.SubscriptionInterceptor = async context =>
{
try
{
Message += "用户" + context.ClientId + "订阅" + "\r\n";
}
catch (Exception ex)
{
Console.WriteLine("订阅失败:" + ex.Message);
context.AcceptSubscription = false;
}
};
//拦截消息
options.ApplicationMessageInterceptor = context =>
{
try
{
//一般不需要处理消息拦截
// Console.WriteLine(Encoding.UTF8.GetString(context.ApplicationMessage.Payload));
}
catch (Exception ex)
{
Console.WriteLine("消息拦截:" + ex.Message);
}
}; mqttServer.ClientDisconnected += ClientDisconnected;
mqttServer.ClientConnected += MqttServer_ClientConnected;
mqttServer.Started += MqttServer_Started;
mqttServer.StartAsync(options); } private void MqttServer_Started(object sender, EventArgs e)
{
Message += "消息服务启动成功:任意键退出" + "\r\n";
} private void MqttServer_ClientConnected(object sender, MqttClientConnectedEventArgs e)
{
//客户端链接
Message += e.ClientId + "连接" + "\r\n";
} private void ClientDisconnected(object sender, MqttClientDisconnectedEventArgs e)
{
//客户端断开
Message += e.ClientId + "断开" + "\r\n";
} /// <summary>
/// 客户端推送信息 - 用于测试服务推送
/// </summary>
/// <param name="clientID"></param>
/// <param name="message"></param>
public void SendMessage(string clientID, string message)
{
mqttServer.PublishAsync(new MqttApplicationMessage
{
Topic = clientID,
QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce,
Retain = false,
Payload = Encoding.UTF8.GetBytes(message),
});
}
}
添加MQTT 客户端登陆实例, 用于保存客户的登陆信息, 如下:
演示界面:
/// <summary>
/// 登陆客户端信息
/// </summary>
public class ClientInstance : ViewModelBase
{
private string clientID;
private string userName;
private string passWord; /// <summary>
/// 识别ID
/// </summary>
public string ClientID
{
get { return clientID; }
set { clientID = value; RaisePropertyChanged(); }
} /// <summary>
/// 账户
/// </summary>
public string UserName
{
get { return userName; }
set { userName = value; RaisePropertyChanged(); }
} /// <summary>
/// 密码
/// </summary>
public string PassWord
{
get { return passWord; }
set { passWord = value; RaisePropertyChanged(); }
} }
MQTT客户端建立:
演示代码:
public class MainViewModel : ViewModelBase
{
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
clientID = new Random().Next(, ) + ""; //测试随机生成ClientID
} IMqttClient mqttClient; //MQTT客户端实例 string clientID; //机器ID string message; public string Message //用于接收当前 消息
{
get { return message; }
set { message = value; RaisePropertyChanged(); }
}
//开启MQTT连接
public async void SignMqttServer()
{
var options = new MqttClientOptionsBuilder()
.WithClientId(clientID) //传递ClientID
.WithTcpServer("127.0.0.1", ) //MQTT服务的地址
.WithCredentials("admin", "") //传递账号密码
.WithCleanSession()
.Build();
mqttClient = new MqttFactory().CreateMqttClient();// .CreateManagedMqttClient();
mqttClient.Connected += MqttClient_Connected;
mqttClient.Disconnected += MqttClient_Disconnected;
mqttClient.ApplicationMessageReceived += MqttClient_ApplicationMessageReceived; //创建消息接受事件 await mqttClient.ConnectAsync(options);
//await mqttClient.SubscribeAsync(clientID);
} private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e)
{
Message += "收到的信息:" + Encoding.UTF8.GetString(e.ApplicationMessage.Payload) + "\r\n";
} private void MqttClient_Disconnected(object sender, MqttClientDisconnectedEventArgs e)
{
Message += "客户端断开";
} private void MqttClient_Connected(object sender, MqttClientConnectedEventArgs e)
{
Message += "客户端已连接" + "\r\n";
mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic(clientID).Build()); //关联服务端订阅, 用于接受服务端推送信息 }
}
演示界面:

实际演示效果(GIF)

C# MQTT 服务端客户端通讯的更多相关文章
- 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表
1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...
- 动手实现一个较为简单的MQTT服务端和客户端
项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发) 平均估计每个每秒60个包 使用mqtt协 ...
- mqtt 服务器与客户端通讯
mqtt 服务器与客户端通讯. 服务器端 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...
- react服务端/客户端,同构代码心得
FKP-REST是一套全栈javascript框架 react服务端/客户端,同构代码心得 作者:webkixi react服务端/客户端,同构代码心得 服务端,客户端同构一套代码,大前端的梦想, ...
- 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice
一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...
- JAVA WEBSERVICE服务端&客户端的配置及调用(基于JDK)
前言:我之前是从事C#开发的,因公司项目目前转战JAVA&ANDROID开发,由于对JAVA的各种不了解,遇到的也是重重困难.目前在做WEBSERVICE提供数据支持,看了网上相关大片的资料也 ...
- NTP时间同步 服务端 客户端 自动化安装配置
NTP时间同步 服务端 客户端 自动化安装配置 原创内容 http://www.cnblogs.com/elvi/p/7657994.html #!/bin/sh #运行环境 centos6.cent ...
- chrony时间同步 服务端 客户端 安装配置
chrony时间同步 服务端 客户端 安装配置 原创内容http://www.cnblogs.com/elvi/p/7658021.html #!/bin/sh #运行环境 centos7 #chro ...
- eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(二)
eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(二) 接上篇博客,本篇博客主要包含两个内容: 4.使用Android studio创建webservice客 ...
随机推荐
- mongodb 的数据备份与恢复
导入/导出可以操作是本地的或远程的,所以都有以下通用选项[如果是操作本地机并且没有密码的话可以省去]: 1.-h host 主机 ...
- iOS日期转换之UTC/GMT时间格式
GMT只需要将代码中的UTC替换为GMT即可 //将本地日期字符串转为UTC日期字符串 //本地日期格式:2013-08-03 12:53:51 //可自行指定输入输出格式 -(NSString *) ...
- django-xadmin定制之列表页searchbar placeholder
环境:xadmin-for-python3 python3.5.2 django1.9.12 列表页的searchbar如果提供的可搜索字段,都没提示哪个字段可搜索,很不友好,本次定制主要增加inpu ...
- BitSet的使用
有些程序须要处理二进制有序集,标准库提供了bitset 类型,其实,bitset 是一个二进制容器.容器中每个元素都是一位二进制码,或为 0,或为 1. bitset除了能够訪问指定下标的bit位以外 ...
- OpenStack云桌面系列【1】—開始
关于"云桌面"和"桌面云" 首先,wiki里面是没有关于"桌面云"和"云桌面"的定义和其他信息. 百度百科 ...
- 洛谷P1200 [USACO1.1]你的飞碟在这儿
题目描述 众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走 ...
- VS初始化设置
来源于网上整理和 书<aps.net mvc企业级实战>中. 1.vs模版 版权注释信息 1.我的电脑上VS2015安装在D盘中,所以找的目录为:D:\Program Files (x86 ...
- OpenSUSE42.3 leap 开启ssh登陆
一.产看ssh是否安装 OpenSUSE:~ # rpm -qa | grep ssh libssh2-1-1.4.3-18.3.x86_64openssh-askpass-1.2.4.1-12.1. ...
- VBA关闭工作簿和退出Excel
VBA关闭工作簿和退出Excel链接:http://www.excelpx.com/thread-233045-1-1.html 兰色幻想VBA基础入门和高级开发全套80集视频教程,助你成为VBA开发 ...
- js003-4方向8方向函数
1,求四方向或者8方向的周围的棋子. /** * pos 1-4, 1-8 4/8方向的周围 * @param {*} pos * @param {*} dir */ var _nearChess = ...