MQTT 服务端搭建以及详解_mqttserveroptionsbuilder-程序员宅基地

技术标签: 前端  服务器  http  

  • 服务端配置
  1. 链接方法

创建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();

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38550901/article/details/123273525

智能推荐

创龙TI TMS320C6748(定点/浮点DSP C674x)的按键、串口-程序员宅基地

TL138/1808/6748F-EasyEVM是广州创龙基于SOM-TL138/SOM-TL1808/SOM-TL6748F核心板开发的一款开发板。由于SOM-TL138/SOM-TL1808/SOM-TL6748核心板管脚兼容,所以此三个核心板共用同一个底板。开发板采用核心板+底板的设计方式,尺寸为16.5cm*11cm,它主要帮助开发者快速评估核心板的性能。核心板采用高密度8层板沉金无铅...

什么是健身房管理系统_健身房管理系统问题定义该怎么写呢_普通网友的博客-程序员宅基地

什么是健身房管理作用随着人民的生活水平的不断提高,人们越来越注重养生保健,保健健身行业的消费持续增长,竞争愈来愈激烈。然而,传统健身房的日常运作还是靠人工管理,从服务项目到会员消费,再到结账基本上由人工完成记录,这样做不仅耗费人力资源而且容易导致记录丢失或重复等错误,会员结账由手工记录,人力耗费大,会员等待时间长,管理效率低下,这就迫切需要标准的、高效率的计算机管理方式引导其发展,通过计算机管理该企业的日常运作,给管理者以决策参考的模型,来不断完善管理水平,提高工作效率。健身馆管理系统的特点和适用群体_健身房管理系统问题定义该怎么写呢

adb server version (31) doesn't match this client (40); killing...-程序员宅基地

1,运行react-native run-android报错:adb版本不对称。https://blog.csdn.net/aLLLiyyy/article/details/865552282,在各种连接说adb版本不对称,重新下载adb,或者手机助手占用端口啥的,好像不太管用,后来是下面的操作好的。在终端运行命令: adb kill-server adb start-server 然后...

JAVA——集合进阶(Collection、List、Set、泛型、Map、Collections)_原小禾的博客-程序员宅基地

Collection1.1 集合知识回顾集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变。1.2 集合类体系结构1.3 Collection集合概述和使用Collection集合概述(1)是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素(2)JDK不提供此接口的任何直接实现,它提供更具体的子接口(Set/List)实现。创建Collection集合的对象(1)多态的方式(2)具体的实现类ArrayListpackage c.

struct inode 和 struct file_struct inode与struct file-程序员宅基地

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详细介绍-程序员宅基地

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创建其他骨架语法...

随便推点

WinForm界面开发——一招教你如何在Winform程序中使用Spire.Pdf实现添加印章处理!_c# spire 印章挡住文字-程序员宅基地

DevExpress v20.1完整版下载富文本控件难上手?这堂公开课你一定不能错过,不同视图不同应用场景全解!DevExpress Winforms Controls内置140多个UI控件和库,完美构建流畅、美观且易于使用的应用程序。在一些场合,我们往往需要使用印章来给每页文档加盖一个印章,以表示该文档经过某个部门的认证的,常规的做法就是打印文档后盖章,如果需要电子档再行扫描一下。这样的处理,如果文档很多,且仅仅需要电子文档的就很麻烦了,需要打印再盖章再扫描,而且电子文档往往有失真的问题。本._c# spire 印章挡住文字

bigemap如何使用OpenLayer发布离线地图_openlayers bigmap 离线地图-程序员宅基地

如何使用OpenLayer发布离线地图一. 说明:本实例中使用的Openlayer 版本为最新的 Openlayer3,地图下载器使用的是Bigemap 地图下载器。Openlayer 下载地址:https://github.com/openlayers/ol3/releases/download/v3.20.1/v3.20.1-dist.zip二. 下载地图..._openlayers bigmap 离线地图

真菌疾病可能是造成恐龙大灭绝的“元凶”-程序员宅基地

我国科学家提出,真菌疾病或是恐龙大灭绝的“元凶”在距今约6500万年前的白垩纪末期,统治地球的霸主恐龙为什么全部灭绝了?这一千古之谜吸引了世界各国科学家为之求索众说纷纭,但至今没有确切说法。最近,我国科 学家通过对恐龙蛋壳内微米尺度大小的真菌化石进行研究,提出了一种新说法:白垩纪末期的恐龙及其它们所下的恐龙蛋,可能是因为普遍感染了真菌疾病,导致恐龙蛋不能正常孵化,而造成了物种灭绝

iOS UITableViewCell重用问题-程序员宅基地

转载地址: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...

iOS-UIWebview缓存并保证实时性-程序员宅基地

一.缓存需求资源文件没有更新,只加载本利缓存文件;资源文件发生改变或者更新,第一时间使用新的文件。二.缓存策略1.NSURLRequestUseProtocolCachePolicy = 0,默认策略,使用缓存2.NSURLRequestReloadIgnoringLocalCacheData = 1,忽略本地缓存3.NSURLRequestReturnCacheDataElseLoad = 2,