200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > MQTT 服务端搭建以及详解

MQTT 服务端搭建以及详解

时间:2019-11-20 21:14:00

相关推荐

MQTT 服务端搭建以及详解

服务端配置链接方法

创建MQTT服务器类似于创建MQTT客户机。下面的代码显示了创建一个新的MQTT服务器的最简单方法,该服务器的TCP端点正在默认端口1883上侦听。

// Configure MQTT server.var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionBacklog(100)//最大链接数.WithDefaultEndpointPort(1883);//监听端口号var mqttServer = new MqttFactory().CreateMqttServer();mqttServer.StartAsync(optionsBuilder.Build());//服务启动

配置参数如下所示

账户验证

var optionsBuilder = new MqttServerOptionsBuilder().WithConnectionValidator(c =>{if (c.ClientId.Length < 10){c.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;return;}if (c.Username != "mySecretUser"){c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;return;}if (c.Password != "mySecretPassword"){c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;return;}c.ReasonCode = MqttConnectReasonCode.Success;});

另一种验证账户方式

mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(MqttClientConnectedEvent);/// <summary>/// 可以增加对客户端的校验规则/// </summary>/// <param name="e"></param>static void MqttClientConnectedEvent(MqttServerClientConnectedEventArgs e){if (e.ClientId.Length < 10){Console.WriteLine(MqttConnectReturnCode.ConnectionRefusedIdentifierRejected);}if (e.UserName != "gaodong"){Console.WriteLine(MqttConnectReturnCode.ConnectionRefusedBadUsernameOrPassword);}}

可以在服务器选项中设置自定义拦截器。对于服务器接收到的每个应用程序消息,都会调用该拦截器。这允许在应用程序消息被持久化(对于保留的消息)之前以及在被分派给订阅者之前扩展它们。这允许在硬件设备不知道时间或时区等情况下向每个应用程序消息添加时间戳。以下代码显示了如何使用拦截器:

var optionsBuilder = new MqttServerOptionsBuilder().WithApplicationMessageInterceptor(context =>{if (context.ApplicationMessage.Topic == "my/custom/topic"){context.ApplicationMessage.Payload = Encoding.UTF8.GetBytes("The server injected payload.");}// 可以像这样禁止发送特定客户端id的消息:if (context.ClientId != "Someone"){context.AcceptPublish = false;return;}// 还可以读取有效负载并扩展它。例如,在JSON文档中添加时间戳.// 当物联网设备没有自己的时钟且消息的创建时间可能很重要时,这很有用.}).Build();

拦截订阅

可以设置自定义拦截器来控制MQTT客户机可以订阅哪些主题。这允许将私有API主题移动到仅对某些客户端可用的受保护区域。下面的代码显示了如何使用订阅拦截器。

// 防止每个客户端订阅多个主题.var optionsBuilder = new MqttServerOptionsBuilder().WithSubscriptionInterceptor(context =>{if (context.TopicFilter.Topic.StartsWith("admin/foo/bar") && context.ClientId != "theAdmin"){context.AcceptSubscription = false;}if (context.TopicFilter.Topic.StartsWith("the/secret/stuff") && context.ClientId != "Imperator"){context.AcceptSubscription = false;context.CloseConnection = true;}}).Build();

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。