我应该使用Mosquitto的Web套接字还是直接连接客户端?


11

根据此博客,Mosquitto(MQTT经纪人)现在支持通过Web套接字连接到客户端。该博客文章似乎暗示Web套接字对浏览器应用程序更有用,因为Web浏览器尚不支持正确的TCP套接字(尽管),尽管大多数现代浏览器支持Web套接字协议。

如果我在网络中只有多个客户端(例如,基于Raspberry Pi等微控制器的传感器和执行器),使用Web套接字比直接TCP连接有任何优势吗?仅当与浏览器进行通信时,Web套接字协议的开销才值得吗?


1
您能否告诉我们您是否正在对整个网络进行编码?是所有节点还是客户端和服务器?或者,如果您必须与他人的软件进行交互?听起来您可能只在编码客户端,但我不确定
Mawg说恢复Monica

1
@Mawg服务器将是Mosquitto MQTT代理,但是我可以选择我为所有客户端使用的协议(而Mosquitto提供Web套接字和直接TCP连接,这就是我要求的原因)。
Aurora0001

1
我认为这里有些混乱。我假设@ Auroa0001通过“直接TCP”的含义是在TCP上使用MQTT,而不是在Websockets(...上通过TCP)使用MQTT。在这两种情况下,都有可用的库,因此无需为套接字编写任何代码。
ralight

@ralight是的,那确实是我问问题时的意图。看来,答案确实有些误入歧途。
Aurora0001

Answers:


7

这里的问题似乎是“我应该在TCP上使用MQTT,还是在websockets(也通过TCP)上使用MQTT?” 换句话说,“将MQTT封装在websockets协议中是一个好主意吗?”

这(几乎)完全取决于您的应用程序以及您是否需要Websockets支持-可能是为了在浏览器中使用消息或出于防火墙原因。如果您无法通过端口1883或更高的8883上的纯MQTT访问服务器,那么websockets可能是您的最佳选择。

Websocket确实需要额外的带宽,但是这对您是否重要只有您可以回答。

还值得注意的是,在当前版本的Mosquitto中,Websocket不能很好地工作,因此在发送/接收Websockets消息时可能会有额外的延迟。不过,这在将来的版本中将不会成为问题。


7

当你只是内部连通网络(内网),采用纯TCP将被罚款。但是,如果必须连接到另一台服务器,则会出现问题。

因为大多数现代服务器不允许客户端通过随机端口进行连接。它们仅允许某些专用端口进行连接。就这样。因此,如果必须连接到另一台服务器,最好使用websocket而不是纯TCP连接。

如果您正在考虑开销,那不会太大。如果您想进一步了解Websocket的开销,可以参考本文

我个人认为,最好始终使用websocket,除非您有一些严重的顾虑。


2
Err,TCP和websocket是协议:tools.ietf.org/html/rfc6455,此外TCP是底层套接字。
Goufalite '16

@ThisaruGuruge谢谢您的回答-在我的问题中,我假设您根据您的回答来选择通过网络套接字使用TCP?尤其是由于Web套接字似乎主要受浏览器支持,因此存在在TCP套接字上使用Web套接字的代码开销。
Aurora0001

1
“大多数现代服务器不允许客户端通过随机端口进行连接”-服务器可以选择绑定到哪个端口(man7.org/linux/man-pages/man2/bind.2.html),并且防火墙可以进一步限制。但是,当您说“如果必须连接到另一台服务器,将会出现问题” 时,我并不同意。改写为“ 可能出现”。即使这样,也只需要配置,哪个websocket可能比原始套接字更容易。
Mawg说恢复Monica

6

tl; dr- 始终喜欢使用免费库对自己进行编码(除非您有极端要求)


我应该使用Mosquitto的Web套接字还是直接连接客户端?

一段绳子有多长?(YMMV)

我只能说一般,但是我总是更喜欢包装库而不是原始套接字(或者,实际上,是对我可以从库中免费获得的任何东西进行编码)。

它们使编码更简单,错误更少。他们负责大量的内部管理和错误处理,这是您必须自己编写和调试的代码,因为通常对库进行充分的审查和测试,并且有成千上万的其他人正在使用它们。将为您报告/修复错误。

此外,您维护(以及可能移植)的代码更少,这意味着您有更多时间来开发,测试和完善您的应用程序,或者继续进行下一个应用程序。

如果您接受了所有图书馆员的善意(错误处理,软管维护等),那么您可以说只有一个开销就是函数调用,您必须自己编写代码才能获得良好,稳定的软件。

如果您担心性能,只需配置文件即可。但是,除非您的套接字每秒活动数百次,否则我什至不会打扰。


嗯,有免费的TCP连接和(web)套接字连接库,并且都需要一个“接收到的消息”事件。
Goufalite '16

2
OP想要知道使用TCP或websockets来提高效率是否更好,并且您说“使用抽象库,这样您就不会打扰”。当然可以,但是哪一个呢?在C#中,System.Net.Sockets中有一个TcpClient库(好吧,好...),而nuget包中有一个websocket库(WebSocketSharp)。我同意所有语言都有通用的MQTT库,但是OP希望对其进行控制以选择必须使用的协议。
Goufalite
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.