根据此博客,Mosquitto(MQTT 代理)现在支持通过 Web 套接字连接到客户端。博客文章似乎暗示 Web 套接字对浏览器应用程序更有用,因为 Web 浏览器(尚)不支持正确的 TCP 套接字,尽管大多数现代浏览器都支持Web 套接字协议。
如果我在网络中只有各种客户端(例如基于 Raspberry Pi 等微控制器的传感器和执行器),使用网络套接字而不是直接 TCP 连接有什么优势吗?仅当您与浏览器通信时,网络套接字协议的开销才值得吗?
根据此博客,Mosquitto(MQTT 代理)现在支持通过 Web 套接字连接到客户端。博客文章似乎暗示 Web 套接字对浏览器应用程序更有用,因为 Web 浏览器(尚)不支持正确的 TCP 套接字,尽管大多数现代浏览器都支持Web 套接字协议。
如果我在网络中只有各种客户端(例如基于 Raspberry Pi 等微控制器的传感器和执行器),使用网络套接字而不是直接 TCP 连接有什么优势吗?仅当您与浏览器通信时,网络套接字协议的开销才值得吗?
这里的问题似乎是“我应该通过 TCP 使用 MQTT,还是通过 websocket(也通过 TCP)使用 MQTT?” 换句话说,“在 websockets 协议中封装 MQTT 是个好主意吗?”
这(几乎)完全取决于您的应用程序以及您是否需要 websockets 支持 - 可能是为了在浏览器中使用消息或出于防火墙原因。如果您无法在端口 1883 或纯 MQTT 的 8883 端口上访问您的服务器,那么 websockets 可能是您的最佳选择。
Websockets 确实需要额外的带宽,但这对您来说是否重要只有您才能回答。
还值得注意的是,在当前版本的 Mosquitto 中,websockets 无法正常工作,因此在发送/接收 websockets 消息时可能会有额外的延迟。不过,这在未来的版本中不会成为问题。
当您仅在您的网络(内联网)内部进行通信时,使用纯 TCP 就可以了。但是如果你必须连接到另一台服务器,就会出现问题。
因为大多数现代服务器不允许客户端通过随机端口连接。它们只允许一些专用端口连接。就这样。因此,如果您必须连接到另一台服务器,最好使用 websocket 而不是纯 TCP 连接。
如果您考虑开销,它并没有那么大。如果你想了解更多关于 websocket 的开销,你可以参考这篇文章。
在我个人看来,最好总是使用 websocket,除非你有一些严重的担忧。
tl;dr -总是更喜欢免费的库而不是你自己编码(除非你有极端的要求)
我应该使用 Mosquitto 的网络套接字还是直接连接客户端?
一段绳子有多长?(YMMV)
我只能说一般,但我总是更喜欢包装库而不是原始套接字(或者,实际上,编码我可以从库中免费获得的任何东西)。
它们使编码更简单,更不容易出错。他们负责大量的内务管理和错误处理,这是您必须自己编写和调试的代码,因为一个库通常已经过良好的审查和测试,并被成千上万的其他人使用,所有这些人将为您报告/修复错误。
此外,您需要维护的代码更少(可能还有移植),这意味着有更多时间来开发、测试和完善您的应用程序,或者继续进行下一个应用程序。
唯一的开销可以说是一个函数调用,如果你接受所有图书馆员的优点(错误处理、软管保持等)是你必须自己编码以获得好的、稳定的软件的东西。
如果您关心性能,只需配置文件。但是,除非您的套接字每秒活动数百次,否则我什至不会打扰。