创建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());//服务启动
函数名 | 功能说明 |
Build | 构建配置参数 |
WithApplicationMessageInterceptor | 允许处理来自客户端的所有已发布消息 |
WithClientId | 服务端发布消息时使用的ClientId |
WithConnectionBacklog | 设置要保留的连接数 |
WithConnectionValidator | 验证连接 |
WithDefaultCommunicationTimeout | 设置默认的通信超时 |
WithDefaultEndpoint | 使用默认端点 |
WithDefaultEndpointBoundIPAddress | 使用默认端点IPv4地址 |
WithDefaultEndpointBoundIPV6Address | 使用默认端点IPv6地址 |
WithDefaultEndpointPort | 使用默认端点端口 |
WithEncryptedEndpoint | 使用加密的端点 |
WithEncryptedEndpointBoundIPAddress | 使用加密的端点IPv4地址 |
WithEncryptedEndpointBoundIPV6Address | 使用加密的端点IPv6地址 |
WithEncryptedEndpointPort | 使用加密的端点端口 |
WithEncryptionCertificate | 使用证书进行SSL连接 |
WithEncryptionSslProtocol | 使用SSL协议级别 |
WithMaxPendingMessagesPerClient | 每个客户端允许最多未决消息 |
WithPersistentSessions | 保持会话 |
WithStorage | 使用存储 |
WithSubscriptionInterceptor | 允许处理来自客户端的所有订阅 |
WithoutDefaultEndpoint | 禁用默认端点 |
WithoutEncryptedEndpoint | 禁用默认(SSL)端点 |
账户验证
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();
TL138/1808/6748F-EasyEVM是广州创龙基于SOM-TL138/SOM-TL1808/SOM-TL6748F核心板开发的一款开发板。由于SOM-TL138/SOM-TL1808/SOM-TL6748核心板管脚兼容,所以此三个核心板共用同一个底板。开发板采用核心板+底板的设计方式,尺寸为16.5cm*11cm,它主要帮助开发者快速评估核心板的性能。核心板采用高密度8层板沉金无铅...
什么是健身房管理作用随着人民的生活水平的不断提高,人们越来越注重养生保健,保健健身行业的消费持续增长,竞争愈来愈激烈。然而,传统健身房的日常运作还是靠人工管理,从服务项目到会员消费,再到结账基本上由人工完成记录,这样做不仅耗费人力资源而且容易导致记录丢失或重复等错误,会员结账由手工记录,人力耗费大,会员等待时间长,管理效率低下,这就迫切需要标准的、高效率的计算机管理方式引导其发展,通过计算机管理该企业的日常运作,给管理者以决策参考的模型,来不断完善管理水平,提高工作效率。健身馆管理系统的特点和适用群体_健身房管理系统问题定义该怎么写呢
1,运行react-native run-android报错:adb版本不对称。https://blog.csdn.net/aLLLiyyy/article/details/865552282,在各种连接说adb版本不对称,重新下载adb,或者手机助手占用端口啥的,好像不太管用,后来是下面的操作好的。在终端运行命令: adb kill-server adb start-server 然后...
Collection1.1 集合知识回顾集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。1.2 集合类体系结构1.3 Collection集合概述和使用Collection集合概述(1)是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素(2)JDK不提供此接口的任何直接实现,它提供更具体的子接口(Set/List)实现。创建Collection集合的对象(1)多态的方式(2)具体的实现类ArrayListpackage c.
1、struct inode──字符设备驱动相关的重要结构介绍内核中用inode结构表示具体的文件,而用file结构表示打开的文件描述符。Linux2.6.27内核中,inode结构体具体定义如下:struct inode {struct hlist_node i_hash;struct list_head i_list;struct list_head i_sb_list;_struct inode与struct file
Maven目录1什么是Maven?2Maven 的好处3获取和安装3.1获取3.2安装3.2.1环境变量的配置4设置本地仓库5创建简单的Maven实例5.1使用骨架创建maven项目5.1.1使用默认的骨架创建项目5.1.2骨架介绍5.1.3创建其他骨架语法...
DevExpress v20.1完整版下载富文本控件难上手?这堂公开课你一定不能错过,不同视图不同应用场景全解!DevExpress Winforms Controls内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。在一些场合,我们往往需要使用印章来给每页文档加盖一个印章,以表示该文档经过某个部门的认证的,常规的做法就是打印文档后盖章,如果需要电子档再行扫描一下。这样的处理,如果文档很多,且仅仅需要电子文档的就很麻烦了,需要打印再盖章再扫描,而且电子文档往往有失真的问题。本._c# spire 印章挡住文字
如何使用OpenLayer发布离线地图一. 说明:本实例中使用的Openlayer 版本为最新的 Openlayer3,地图下载器使用的是Bigemap 地图下载器。Openlayer 下载地址:https://github.com/openlayers/ol3/releases/download/v3.20.1/v3.20.1-dist.zip二. 下载地图..._openlayers bigmap 离线地图
我国科学家提出,真菌疾病或是恐龙大灭绝的“元凶”在距今约6500万年前的白垩纪末期,统治地球的霸主恐龙为什么全部灭绝了?这一千古之谜吸引了世界各国科学家为之求索众说纷纭,但至今没有确切说法。最近,我国科 学家通过对恐龙蛋壳内微米尺度大小的真菌化石进行研究,提出了一种新说法:白垩纪末期的恐龙及其它们所下的恐龙蛋,可能是因为普遍感染了真菌疾病,导致恐龙蛋不能正常孵化,而造成了物种灭绝
转载地址:http://beauty-soft.net/blog/ceiba/Ios/20130914/657.html在写微博界面的过程中使用到了cell,那么就是在cell上添加一些控件,但是由于每条微博的内容都是不同的,所以在显示的过程中,出现了内容重叠的问题,其实就是UITableViewCell重用机制的问题。1234567
http://www.infoq.com/cn/articles/questions-about-cloud-computing 云计算七问七答 作者 吕维德 发布于 2009年3月28日 上午12时30分 社区Architecture主题云计算标签MapReduce,GoogleAppEn...
一.缓存需求资源文件没有更新,只加载本利缓存文件;资源文件发生改变或者更新,第一时间使用新的文件。二.缓存策略1.NSURLRequestUseProtocolCachePolicy = 0,默认策略,使用缓存2.NSURLRequestReloadIgnoringLocalCacheData = 1,忽略本地缓存3.NSURLRequestReturnCacheDataElseLoad = 2,