开发者社区 问答 正文

请问,阿里云的mqtt,js端的收发,为什么不兼容ie10啊

主要的问题就是ie10无法收发消息,提示:
SCRIPT5022: AMQJS0011E Invalid state not connected.
mqttws31.min.js, 行34 字符169
SCRIPT12008: WebSocket Error: Incorrect HTTP response. Status code 400, Bad Request

还有就是,消息无法持久,比如一个接收端连接上了,然后关闭连接(网页关闭),发送方发送消息,接收方重新打开网页连接,此时收不到之前的消息了

展开
收起
财金消息 2017-04-25 18:20:33 5014 分享 版权
阿里云 AI 助理回答

遇到您描述的问题,主要涉及两个方面:IE10浏览器不支持WebSocket以及消息队列的持久化问题。下面我将分别针对这两个问题提供一些建议和解决方案:

1. IE10与WebSocket的问题

IE10确实对WebSocket的支持存在一些限制和bug,特别是当使用较旧版本的WebSocket库时,可能会遇到连接问题。错误信息SCRIPT5022: AMQJS0011E Invalid state not connected表明客户端尝试在未建立连接的状态下进行消息收发操作,而SCRIPT12008: WebSocket Error: Incorrect HTTP response. Status code 400, Bad Request则说明WebSocket握手请求未能成功,服务器返回了400错误。

  • 解决方案
    • 升级或更换WebSocket库:确保您使用的WebSocket客户端库是最新的,并且兼容IE10。虽然IE10支持WebSocket,但可能需要特定的polyfill或修改来适应其限制。
    • 检查服务器配置:确认服务器端WebSocket握手的响应头设置正确,没有阻止IE10的连接请求。例如,确保没有因为CORS设置不当导致的400错误。
    • 考虑使用其他通信方式:鉴于IE10的局限性,如果WebSocket不是必须的,可以考虑退回到轮询或长轮询等更广泛支持的技术作为备选方案。

2. 消息持久化问题

您提到的消息在接收端断开连接后无法收到之前的消息,这通常是因为所使用的MQTT服务或实现没有提供消息队列的持久化功能。

  • 解决方案
    • 启用MQTT的QoS:MQTT协议提供了三种服务质量(QoS)级别,其中QoS 1和QoS 2可以在一定程度上保证消息的可靠传输。特别是QoS 2,它能确保消息至少被送达一次,即使在客户端离线的情况下也能在重新连接后接收到消息。您需要在发布消息时指定适当的QoS级别,并确保客户端和服务器都支持并配置了相应的QoS策略。
    • 使用持久化会话:在MQTT连接时,可以通过设置Clean Session为false来开启持久化会话。这样,当客户端重新连接时,它可以恢复之前的会话状态,包括未接收的消息。
    • 配置消息存储:如果您使用的是阿里云的物联网平台,可以配置消息队列的存储策略,确保离线消息能够被保存并在客户端上线时重新投递。在阿里云物联网平台中,可以通过设置设备的生命周期管理、消息保留时间等参数来实现消息的持久化。

综上所述,对于IE10的WebSocket问题,建议更新客户端库或调整通信策略;对于消息持久化问题,则需利用MQTT协议的特性及云服务的配置来确保消息的可靠传递。希望这些建议能帮助您解决问题。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答