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客 ...
随机推荐
- [JLOI2011]飞行路线(分层图)
[JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在 n 个城市设有业务,设这些城市分别标记为 0 到 n−1 ,一共有 m ...
- Raphaeljs入门到精通(一)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...
- 【LeetCode】3Sum Closest 解题报告
[题目] Given an array S of n integers, find three integers in S such that the sum is closest to a give ...
- IDEA中如何设置自动导包
IDEA跟eclipse还是有一些差别,一些东西要自己去设置,但同时也还是有快捷键的方式来帮助我们 1.如何设置自动导包:如下图所示 点击FIle--->settings 其次还可以通过按快捷键 ...
- vue30-单一事件管理组件通信: vuex
------------------------------------------------------ 可以单一事件管理组件通信: vuex var Event=new Vue(); Event ...
- 记一次struts2漏洞修复带来的问题
struts2作为万年漏洞王,感觉已经被弃如敝屣了,除了一些古老的项目,比如我手上的一个项目,以前每次出现漏洞就如临大敌,手忙脚乱的赶在公司红头文件发出来前修复它.然后改了一两次后毅然决然用别的框架代 ...
- BZOJ5204: [CodePlus 2018 3 月赛]投票统计
[传送门:BZOJ5204] 简要题意: 有n个选手,每个选手会选择一道题投票,求出投票最多的题目个数和这些题目的编号,如果所有题目的投票数相同,则输出-1 题解: 直接搞 离散化,然后判断就可以了 ...
- Gitblit从一个服务器,迁移到另外一个服务器
http://gitblit.com/federation.html A Gitblit federation is a mechanism to clone repositories and kee ...
- matlab 常用机器学习算法的实现
1. KNN 分类 load fisheriris X = meas; Y = species; % 3 分类问题 % 通过训练集进行训练 Mdl = fitcknn(X, Y, 'NumNeighb ...
- 14.c语言dll注入
#include <Windows.h> //dll不需要main函数 //导出接口 _declspec(dllexport) void go() { MessageBoxA(, ); }