关于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 服务端客户端通讯的更多相关文章

  1. 采用MQTT协议实现android消息推送(2)MQTT服务端与客户端软件对比、android客户端示列表

    1.服务端软件对比 https://github.com/mqtt/mqtt.github.io/wiki/servers 名称(点名进官网) 特性 简介 收费 支持的客户端语言 IBM MQ 完整的 ...

  2. 动手实现一个较为简单的MQTT服务端和客户端

    项目地址:https://github.com/hnlyf168/DotNet.Framework 昨天晚上大致测试了下 ,490个客户端(一个收一个发)  平均估计每个每秒60个包  使用mqtt协 ...

  3. 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 ...

  4. react服务端/客户端,同构代码心得

    FKP-REST是一套全栈javascript框架   react服务端/客户端,同构代码心得 作者:webkixi react服务端/客户端,同构代码心得 服务端,客户端同构一套代码,大前端的梦想, ...

  5. 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice

    一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...

  6. JAVA WEBSERVICE服务端&客户端的配置及调用(基于JDK)

    前言:我之前是从事C#开发的,因公司项目目前转战JAVA&ANDROID开发,由于对JAVA的各种不了解,遇到的也是重重困难.目前在做WEBSERVICE提供数据支持,看了网上相关大片的资料也 ...

  7. NTP时间同步 服务端 客户端 自动化安装配置

    NTP时间同步 服务端 客户端 自动化安装配置 原创内容 http://www.cnblogs.com/elvi/p/7657994.html #!/bin/sh #运行环境 centos6.cent ...

  8. chrony时间同步 服务端 客户端 安装配置

    chrony时间同步 服务端 客户端 安装配置 原创内容http://www.cnblogs.com/elvi/p/7658021.html #!/bin/sh #运行环境 centos7 #chro ...

  9. eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(二)

    eclipse使用CXF3.1.*创建webservice服务端客户端以及客户端手机APP(二) 接上篇博客,本篇博客主要包含两个内容: 4.使用Android studio创建webservice客 ...

随机推荐

  1. NOIP 2012 疫情控制(二分+贪心+倍增)

    题解 二分时间 然后一个显然的事是一个军队向上爬的越高它控制的点越多 所以首先军队尽量往上爬. 当一个军队可以爬到根节点我们记录下它的剩余时间T和它到达根结点时经过的根节点的子节点son. 当一个军队 ...

  2. Linux中常用命令(文件)

    1.cat 显示出文件的全部内容 (1)格式:cat 文件名 -n 显示行号 (2)特点:一次性显示所有文件内容 2.tac 从最后一行倒着显示文件全部内容 3.more 全屏方式分页显示文件内容 回 ...

  3. unity调用Android的两种方式:其二,调用aar包

    上一篇我们讲了unity如何调用jar包 http://www.cnblogs.com/Jason-c/p/6743224.html, 现在我们介绍一下怎么生成aar包和unity怎么调用aar 一. ...

  4. 无比强大!Python抓取cssmoban网站的模版并下载

    Python实现抓取http://www.cssmoban.com/cssthemes网站的模版并下载 实现代码 # -*- coding: utf-8 -*- import urlparse imp ...

  5. Codeforces Round #337 (Div. 2) 610C Harmony Analysis(脑洞)

    C. Harmony Analysis time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  6. windows下用ADT进行android NDK开发的具体教程(从环境搭建、配置到编译全过程)

    郑重申明:如需转载本博客,请注明出处,谢谢! 这几天在学习android NDK的开发.那么首先让我们来看看android NDK开发的本质是什么. NDK(Native Development Ki ...

  7. hdu1501 Zipper--DFS

    原题链接:pid=1501">http://acm.hdu.edu.cn/showproblem.php?pid=1501 一:原题内容 Problem Description Giv ...

  8. 23. Angular 中用 a 标签 href 路由时在浏览器中显示异常 "%2F" 路由失败问题1

    这个是angular1.6默认给hash路由上添加了!(感叹号),导致出错,修改方法如下(添加配置,去掉默认前缀感叹号):   angular.module('routingDemoApp',['ng ...

  9. impala 概述

    impala 概述 什么是Impala? Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎. 它是一个用C ++和Java编写的开源软件. 与其他Had ...

  10. Right turn(四川省第七届)

    Right turn Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class n ...