Python mqtt+AWS AppSync:WebsocketConnectionError:WebSocket握手错误,连接未升级

Python mqtt+AWS AppSync:WebsocketConnectionError:WebSocket握手错误,连接未升级,python,amazon-web-services,websocket,aws-appsync,Python,Amazon Web Services,Websocket,Aws Appsync,我正在使用paho mqtt Python库来实现对AWS AppSync的订阅 以下是订阅的代码: PostHeader={ “内容类型”:“应用程序/json”, **自选标题 } 有效载荷={ 操作名称:onCommand, 查询:订阅命令$deviceId:ID{ onCommandCreateddeviceId:$deviceId{ 司令部 设备ID 命令 论据 地位 } } , 变量:{deviceId:self.\u device\u id} } r=requests.post\u

我正在使用paho mqtt Python库来实现对AWS AppSync的订阅

以下是订阅的代码:

PostHeader={ “内容类型”:“应用程序/json”, **自选标题 } 有效载荷={ 操作名称:onCommand, 查询:订阅命令$deviceId:ID{ onCommandCreateddeviceId:$deviceId{ 司令部 设备ID 命令 论据 地位 } } , 变量:{deviceId:self.\u device\u id} } r=requests.post\u ROOT\u URL,headers=postHeaders,json=payload 尝试: r、 为_状态引发_ 除例外情况外: self.\u异常'无法订阅设备命令,状态%s,响应%s',r.status\u代码,r.content 提升 data=r.json self.\u logger.info'订阅响应:%s',json.dumpsdata,缩进=3,排序键=True if数据。获取“错误”: raise VALUERROR“订阅时出错:{}”.formatdata 客户端\u id=data['extensions']['subscription']['mqttConnections'][0]['client'] ws_url=r.json['extensions']['subscription']['mqttConnections'][0]['url'] topic=r.json['extensions']['subscription']['mqttConnections'][0]['topics'][0] 局部肾盂无检查 连接客户端上的def、_用户数据、标志、rc: self.\u调试“已连接到订阅主题” client.subscribetopic urlparts=urlparsews\u url 标题={ 主机:{0:s}.formaturlparts.netloc, } client=mqtt.Clientclient\u id=client\u id,transport=websockets client.enable_loggerlogging.getLogger'paho-mqtt' client.on\u connect=on\u connect client.on_消息=。。。 client.on_log=lambda*a,**kw:self.\u logger.info'on log',exc_info=True client.ws_set_optionspath={}?{}.formaturlparts.path,urlparts.query,headers=headers client.tls_集 self.\u调试“正在尝试连接…” client.connecturlparts.netloc,443 尝试: client.loop_永远 除例外情况外: self.\u logger.exception“错误永远循环” 提升 最后: client.disconnect 它在大约24小时内运行良好,之后开始失败,即使它尝试重新连接。我成功截获了导致失败的异常:

May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:     self.reconnect()
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:     self._websocket_path, self._websocket_extra_headers)
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:     self._do_handshake(extra_headers)
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]:     "WebSocket handshake error, connection not upgraded")
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]: paho.mqtt.client.WebsocketConnectionError: WebSocket handshake error, conne
May 01 20:39:21 ip-10-0-1-121 test_chattyraspi[8022]: 2020-05-01 20:39:21,194 - paho-mqtt - DEBUG - Connection failed, retrying
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]: 2020-05-01 20:39:23,207 - client.raspi.alexa.mirko.io - INFO - On log
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]: Traceback (most recent call last):
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:     self.reconnect()
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:     self._websocket_path, self._websocket_extra_headers)
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:     self._do_handshake(extra_headers)
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:   File "/home/ubuntu/chattyraspi/lib/python3.6/site-packages/paho/mqtt/clie
May 01 20:39:23 ip-10-0-1-121 test_chattyraspi[8022]:     "WebSocket handshake error, connection not upgraded")
如果我重新启动脚本,它会立即返回接收通知

您可以找到完整的代码

我添加了一些日志来深入研究这个问题。似乎是
AWS AppSync返回一个连接:keep alive,这会导致崩溃。

IoT会断开WebSocket连接,并要求每24小时进行一次身份验证。您需要每24小时重新进行身份验证并连接到预签名的URL。

谢谢您的回答。但故障发生在重新连接期间。此外,paho mqtt似乎没有提供在任意时间后停止循环的方法。好的,最后我使用了loop_start并在12小时后调用loop_stop,然后断开连接并重新连接。谢谢你的提示,不客气。我还建议迁移到纯WebSocket端点,它提供了更好的性能和可伸缩性。参考:指南: