问题标签 [mqttnet]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 无法连接到部署为 docker 容器的 MQTTNet 服务器
我有一个示例 MQTTNet 服务器,我想将其部署为 docker 容器。下面是作为 Net Core Web App (net core 2.2) 一部分的服务器代码,我将在命令行中手动构建并部署到 Docker:
我正在使用 net core 2.2,mqttnet 3.0.8。
“docker build -t mqttwebservice 。” “docker run -d -p 32780:80 -p 1883:1883 --name myapp2 mqttwebservice”
部署成功。但是,我无法连接到 MQTT 服务器 (MqttCommunicationTimedOutException)。
1)什么会阻止mqtt客户端与服务器通信?
2) 如何知道服务器是否正确启动?
DockerFile
mqtt - MQTTNet UseApplicationMessageReceivedHandler 未触发
我正在做 POC,所以这里是快速而肮脏的代码。我使用 MQTT.fx 桌面客户端来测试 Pub/Sub 到我的 MQTT 服务器。工作正常。我可以发布/订阅我的主题。我可以从另一个 mqtt 客户端发布并收到消息。使用此代码时,当我从 MQTT.fx 或任何其他发布者发布消息时,我没有收到任何信息。如果我使用 mqttClient 发布(如果您取消注释该行),我会收到一些东西。我在挠头......有人可以帮忙吗?谢谢。
mqttnet - 10K 客户端时 MQTTNet 性能下降
我用 MQTTNet 进行了几次性能测试,得到了意想不到的结果 寻求帮助以查看是否有一些我错过的配置更改或 MQTTNet 实现限制。环境:我在一个盒子上有 3 个进程:发件人 -> 服务器 -> 订阅者
测试:
我看到从 1 个实例迁移到 1000 个不会显着影响性能,但迁移到 10K 发送者(1 个进程和 10k 客户端实例)会显着影响性能。
在最后一次测试中,所有消息在 50 秒内以及服务器向订阅者发送消息之后传递到服务器。50 秒后 CPU 降至 25%
服务器启动
客户端启动
MQTTNet 3.0.11 版,
操作系统视窗 10
为什么我观察到 10K 客户端的降级如此之大,而 1000 个客户端几乎没有降级。我可以错过一些配置吗?
mqttnet - 尽管发送相同数量的消息,但多线程时 MQTTnet 性能不佳
我每秒发送大约 20,000 条消息,这些消息可以跨越多个任意线程(消息在发送到 MQTTnet 之前被处理)。
我发现,线程越少性能越好,超过 16 个同时发送者会导致 MQTTnet 停止运行,即使每秒有 10k 条消息。
慢的不是线程,我每 10 秒轮询一次 MQTTnet Managed Client 缓冲区大小,并看到它增加到变满的程度(在我设置的限制处)。
这是最新的代码版本,也是我几个月前(从今天 2020 年 8 月开始)注意到的——它在我最近的 ThreadRipper 系统升级中突出显示,我的代码创建的线程数等于环境处理器的数量——相同的代码基础但 8 与以前的硬件与 48 在新硬件上导致“失败”。
48 个解码/发送线程导致 MQTTnet 停止运行,而 4 到 8 个线程正常且性能良好。当使用更高的线程数时,我可以看到 NIC 到 MQTT 服务器的速度从 8Mbps(4 到 8 个发送线程)下降到不到 100kbps。
本地或远程 MQTT 服务器没有区别 - 如前所述,我可以看到 MQTT 中的发送缓冲区增加,并且会一直这样做,直到内存耗尽,除非设置了限制(无论哪种方式,它都会在线程的胁迫下并在此状态下丢弃消息) .
请注意,在这两种情况下,每秒发送的消息总数保持不变 - 唯一的变量是发送消息的工作线程数。
这是一个错误,还是我做错了什么?我是否应该创建自己的队列来前端托管客户端并一次调度一个(我不想重新发明轮子,但想确保我正确使用库)。
c# - 为 MQTTnet 客户端消息的 TLS/SSL 加密导入的 PFX 证书适用于服务,但适用于 Xamarin UWP 应用程序失败
我们正在尝试做的事情
我们正在加密我们的 MQTT 消息。我们一直在使用 MQTTnet。这支持 TLS 加密,因此需要为现有解决方案启用此功能。我们的 UWP Xamarin 应用程序和 .NET 控制台应用程序都使用相同的 .NET 标准 DLL 来处理所有 MQTT。对于代理,我们使用的是 Mosquitto,但我们计划切换到使用 MQTTnet 服务器的简单应用程序。
这是问题所在
我们已经成功地在代理端以及控制台应用程序之一添加了 TLS 加密,但我们的 UWP Xamarin 应用程序遇到了问题。在其当前状态下,它会引发异常,并显示“提供的客户端证书缺少所需的私钥信息”的消息。
我们在寻找什么
- 确认这是可能的
- 对为什么这不起作用的基本理解(即确认我们的假设或其他)
- 这个问题的解决方案
- 要检查的事情的想法。
因此,如果有人知道“答案”,那就太好了。否则,想法,建议,专业知识,共享经验等。
我们的假设
- 我们假设这是可能的
- 这似乎不是 MQTTnet 错误或限制
- 我们假设在使用 Xamarin UWP 应用程序时出现此错误的原因是对磁盘访问或注册表访问的某些限制
- 我们一直假设因为 PFX 文件适用于控制台应用程序,它也应该适用于 Xamarin UWP 应用程序(但我们已经玩弄了它所在的存储,因为 Xamarin UWP 应用程序只能在用户密钥中访问它店铺)
我们尝试过的事情
- 我们已经阅读了 MSDN 上的规范文档
- 我们已经阅读了博客文章
- 我们已阅读并遵循各种 Stack Overflow 帖子的建议
- 我们已阅读并遵循各种 MQTTnet 支持帖子的建议
- 我们尝试了两种不同的代理(Mosquitto 和一个使用 MQTTnet 服务器的示例应用程序)。
- 我们尝试使用 OpenSSL 并通过操作系统(Windows 10)手动创建证书;为了获得更可控/确定性/可重复的结果,我们将切换到使用 PS 脚本来处理后者
- 我们已经尝试为用户存储和机器存储创建证书
- 我们已经尝试将证书导入商店(见代码)
- 我们已经为 X509KeyStorage 标志尝试了许多不同的组合(即可导出、持久、用户密钥集等)
- 我们尝试以管理员身份运行 Visual Studio
- 我们使用了 SysInternals ProcMon 并试图确定失败的地方(即 HD 访问或注册表访问)
- 我们尝试为 Xamarin 应用程序启用不同的功能
有用的链接
- https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/working-with-certificates
- https://docs.microsoft.com/en-us/troubleshoot/iis/cannot-import-ssl-pfx-local-certificate
- https://github.com/chkr1011/MQTTnet/wiki/Server-and-client-method-documentation
- https://github.com/chkr1011/MQTTnet/issues/115
- https://github.com/chkr1011/MQTTnet/issues/124
- https://paulstovell.com/x509certificate2/
- MQTTnet 客户端无法连接服务器证书
- 在 Windows 上不使用 OpenSSL 从 pfx 文件或证书存储中提取私钥
我们的一些准则
堆栈跟踪
.net-core - MQTTnet:无法使用 TLS 连接:Interop+AppleCrypto+SslException:协议版本错误
我是一个新的 .NET 核心用户,试图学习如何使用MQTTnet在 MacOS Catalina 上将托管客户端与 TLS 连接起来。
我正在尝试从 ASP.NET Core 3 后台服务连接到 Mosquitto 代理。使用MqttExplorer,我可以使用用户名、密码和服务器证书 (CA) 文件通过 TLS 成功连接到服务器。所以,我知道 Mosquitto Broker 配置正确。
但是,我无法通过 MQTTnet 实现这一点。
我收到以下异常:
此外,明确尝试添加WithProtocolVersion(MQTTnet.Formatter.MqttProtocolVersion.V311)
到客户端选项生成器。
有人能帮忙吗?
c# - 客户端证书在 xamarin.android 中不起作用
我正在尝试在我的 xamarin.android 项目中使用https://github.com/chkr1011/MQTTnet库建立 mtls 连接。在此过程中,我在调用 conResult.Wait(TimeSpan.FromSeconds(60)); 的 Init 方法中遇到了这样的异常;
{MQTTnet.Exceptions.MqttCommunicationException:身份验证失败,请参阅内部异常。---> System.Security.Authentication.AuthenticationException:身份验证失败,请参阅内部异常。---> System.Security.Cryptography.CryptographicException:捕获...} {System.Security.Cryptography.CryptographicException:捕获未处理的异常MonoBtlsSslCtx.ProcessHandshake
。---> System.NullReferenceException:对象引用未设置为对象的实例。在 Mono.Btls.MonoBtlsSsl.SetPrivateKey (Mono.Btls....}
这是我的代码:
我有几个选择:
- 在 GetCertificate 方法中构造证书可能存在一些问题;
- MqttNet 库本身存在问题。我怀疑该库不适用于 xamarin.android 中的证书,因为我发现了这样的主题:https://github.com/xamarin/xamarin-android/issues/4481,https://github.com/chkr1011/MQTTnet /问题/883。
我尝试以这种方式构造证书,但 xamarin 不支持 rsa.ImportRSAPrivateKey。我得到:System.PlatformNotSupportedException:此平台不支持操作。
c# - 无法在 Ubuntu 上匿名连接到 Mosquitto 2.0.5
我在 Ubuntu Core 18 系统上运行 Mosquitto 2.0.5 snap(版本 511)。我没有对配置进行任何修改,也没有将其他配置传递给 Mosquitto。
在同一系统上,我正在运行一个 .NET 5 应用程序,它使用 MQTTnet 连接到 Mosquitto。我没有传递任何凭据来连接到 Mosquitto。但是,我无法连接到 Mosquitto 2.0.5,之前我可以连接到 Mosquitto 1.6.12。
我确实知道 Mosquitto 2.0 提高了安全性(这也是升级的原因),但升级文档明确指出,在默认配置(无侦听器)中,localhost:1883 上仍然可以进行匿名连接。奇怪的是,当我在 Windows 上运行 Mosquitto 2.0.5 和我的应用程序时,它一切正常,但在 Ubuntu Core(目标系统)上不起作用。
当我尝试建立连接时,Mosquitto 2.0.5 正在记录以下内容:
我使用以下 C# 代码(使用 MQTTnet)进行连接:
我不明白什么,我做错了什么吗?
任何帮助表示赞赏。
编辑:我一直在玩更多,似乎默认情况下在使用 snap 时会加载动态安全插件,但是我在配置文件中没有找到任何关于此的内容。我想因此,身份验证失败。然后下一个问题出现了,在这种情况下,我如何才能找出默认管理员用户及其密码,因为我需要那些能够将组、客户端和角色添加到插件中。
sql-server - EF Core - 添加范围 - 可能重复
我有一项服务,它每秒将数据发布到网络服务器(asp.net core 3.1),我使用 EF Core 3.1 存储到 sql 服务器。到目前为止,我在尝试存储新数据时分别为每个新数据行:
- 检查数据库中是否存在数据实体(实体类型
.IsUnique()
在方法中配置了索引OnModelCreating()
) - 如果不存在 - 添加单个实体
- DBContext.SaveChanges()
但是,这在 sql server 上似乎有点“重”,有很多调用。它在 Azure 上运行,有时似乎数据库出现了一些问题,并且 Web 服务器开始返回 500(据我了解,内部服务器错误)。当有人调用 web 服务器上的另一个控制器并尝试从 sql 服务器检索一些数据(更大的块)时,有时会发生这种情况。(这可能是另一个问题 - 关于 Azure SQL 服务器的可靠性)
在网络服务器上保留一个缓冲区并一次性保存所有内容是否更好,例如:DBContext.AddRange(entities)
使用更粗略的时间分辨率(即每分钟)?我不知道如果一个或多个数据重复会发生什么?那些不是重复存储的还是所有插入都被拒绝?(我似乎找不到对此的解释)。
非常感谢您对此事的任何帮助。
编辑 2021-02-08:我尝试扩展一下情况:
我无法控制:MQTT Broker(发布消息)
在我的控制下:
- MQTT 客户端(目前为 azure webjob),订阅 MQTT Broker
- ASP.NET 服务器
- SQL 数据库
MQTT 客户端正在从 mqtt 代理收集来自不同传感器的消息并将其分组为一种(或多或少)可以直接存储在数据库中的格式。
asp.net 服务器充当 mqtt 客户端和 sql 数据库之间的中间人。BUT 还向访问该网站的任何人持续发送“实时”更新。所以目前网络服务器有很多工作(也许问题出现在这里??)
- 从 MQTT 服务接收数据
- 将数据存储到数据库/从数据库中检索数据
- 为访问者提供来自 MQTT 客户端的“实时”数据以及来自数据库的历史数据
希望这有助于理解。