HarmonyOS鸿蒙Next中WebSocket建立mqtt通讯失败。子协议之MQTT,Sec-WebSocket-Protocol
HarmonyOS鸿蒙Next中WebSocket建立mqtt通讯失败。子协议之MQTT,Sec-WebSocket-Protocol
API级别:API 9
语言:JS
API:@ohos.net.webSocket
场景:需要使用JS开发mqtt客户端应用程序,目前使用paho提供的mqtt js客户端
问题描述:使用API 9中携带的WebSocket库建立mqtt连接时发现异常,表现为websocket通道建立成功,但mqtt连接建立失败,抓包后发现鸿蒙WebSocket发起的mqtt连接请求,在HTTP切换协议阶段缺少请求头Sec-WebSocket-Protocol: mqtt,同时由浏览器端成功发起的mqtt连接是包含该请求头的,猜测是否是鸿蒙websocket底层还不支持mqtt子协议?
测试设备:openharmony开发板,HWP30手机
测试服务器:使用EMQX、mosquitto等著名mqtt broker server测试,均无法成功建立mqtt连接。
备注:单纯的建立websocket通讯是正常的,仅仅是扩展到mqtt层面失败
-
开发一个web测试客户端,在chrome浏览器上建立mqtt连接成功,浏览器端抓包如下:携带Sec-WebSocket-Protocol,server响应也携带,建立成功
-
鸿蒙抓包如下,可以看到没有Sec-WebSocket-Protocol的部分,server响应也不携带,websocket建立成功,mqtt建立失败:
-
随后尝试在建立mqtt连接时添加http header(使用Websocket库中的WebSocketRequestOptions添加{“Sec-WebSocket-Protocol”:“mqtt”}), 添加后mqtt连接成功,但成功之后TCP层面立即四次挥手断开连接了,并且鸿蒙没有收到任何关闭或失败回调,一直等待,抓包如下:
-
鸿蒙在建立mqtt通讯时会产生海量的心跳包,websocket协议,大量ping pong,一秒钟都能刷好几屏,使用websocket API时并未进行相关配置:
问题:
- 鸿蒙websocket是否不支持mqtt子协议?若支持的话该如何使用,文中添加HTTP header的思路是否正确,具体该如何使用?
- 使用JS如何开发一个mqtt客户端?
- 鸿蒙在建立mqtt通讯时会产生海量的心跳包,websocket协议,大量ping pong,如何控制?
更多关于HarmonyOS鸿蒙Next中WebSocket建立mqtt通讯失败。子协议之MQTT,Sec-WebSocket-Protocol的实战教程也可以访问 https://www.itying.com/category-93-b0.html
开发者您好,@ohos.net.webSocket未支持MQTT子协议
更多关于HarmonyOS鸿蒙Next中WebSocket建立mqtt通讯失败。子协议之MQTT,Sec-WebSocket-Protocol的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
那怎么开发mqtt的客户端软件呢?
请问是应该采用第三方的websocket库呢(是的话麻烦告知使用哪个)?还是应该使用C来开发客户端?迫切需要知道,期待回复!!!
这个可能需要到openHarmony开源社区上,去系统层实现websocket对MQTT协议的支持,
自己顶一下。物联网时代,mqtt之类的协议应该是很重要的基础功能,但是目前并未看到应用层(JS)成功使用mqtt的帖子,希望社区同僚们多多分享!
大佬可以加好友吗1329681187
楼主:问题解决到了吗?
在HarmonyOS鸿蒙Next中,使用WebSocket建立MQTT通讯时,如果遇到失败问题,可能与子协议Sec-WebSocket-Protocol
的配置有关。WebSocket协议允许在握手阶段通过Sec-WebSocket-Protocol
头字段指定子协议,MQTT作为子协议之一,需要在客户端和服务器端正确配置。
在鸿蒙Next中,WebSocket的初始化需要明确指定子协议为MQTT。如果未正确设置Sec-WebSocket-Protocol
,服务器可能无法识别客户端请求的协议,导致连接失败。以下是一个示例代码片段,展示如何在鸿蒙Next中配置WebSocket以使用MQTT子协议:
import webSocket from '@ohos.net.webSocket';
let ws = webSocket.createWebSocket();
ws.on('open', () => {
console.log('WebSocket connection established.');
});
ws.on('message', (data) => {
console.log('Received message: ' + data);
});
ws.on('close', () => {
console.log('WebSocket connection closed.');
});
ws.on('error', (err) => {
console.error('WebSocket error: ' + JSON.stringify(err));
});
ws.connect('wss://your-mqtt-broker-url', ['mqtt']);
在上述代码中,ws.connect
方法的第二个参数是一个数组,指定了子协议为mqtt
。确保服务器端也支持并正确配置了MQTT子协议。如果服务器端未正确响应Sec-WebSocket-Protocol
,连接将失败。
此外,检查网络环境、服务器状态以及证书配置(如使用wss协议)也是排查问题的关键步骤。确保客户端和服务器端的协议版本兼容,避免因协议不匹配导致的连接失败。
在HarmonyOS鸿蒙Next中使用WebSocket建立MQTT通讯时,如果遇到失败问题,可能是由于子协议配置不正确导致的。确保在WebSocket连接的请求头中正确设置Sec-WebSocket-Protocol
字段,并指定为mqtt
。例如:
const ws = new WebSocket('wss://your-mqtt-broker-url', 'mqtt');
此外,检查服务器端是否支持MQTT子协议,并确保网络连接和服务器配置无误。如果问题仍存在,建议使用调试工具(如Wireshark)抓包分析,或查看服务器日志以获取更多错误信息。