私は、私たちのデバイス用のAWS IoTデバイスシャドーアップデートをしばらく開発しています。私たちは、AWBのIoT PythonデバイスSDK(Yocto/Bitbake製)とPython 2.7.3(ARM用にYoctoを提供する弊社のハードウェアベンダーが提供する唯一のバージョンです)のhttps://github.com/aws/aws-iot-device-sdk-pythonにあるLinuxディストリビューションを使用していますボード)。AWS IoT PythonデバイスSDKシャドーアップデートタイムアウト
AWSリポジトリからサンプルのシャドウアップデートコードをダウンロードし、ニーズに合わせて変更し、デバイスビルドに配置しました。ほとんどの場合、うまくいっていますが、私はまだ不快感を感じています。このコードでは、デバイスの接続に時間がかかる場合に処理するために、 "OfflinePublishQueueing"設定を追加しました。これは私たちが得ていた "PublishQueueDisabled"エラーを防ぐために1つのサイトで推奨されていました。ここに初期化コードがあります。私は、使用している証明書が良いことを知っていると付け加えます。それ以外の場合は、これまで成功していません。
self.AWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient("InCoIoTShadowUpdate")
self.AWSIoTMQTTShadowClient.configureEndpoint(endpoint, 8883)
self.AWSIoTMQTTShadowClient.configureCredentials(rootCAPath, privateKeyFile,
jointCertificateFile)
# AWSIoTMQTTShadowClient configuration
self.AWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20)
self.AWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10) # 10 sec
self.AWSIoTMQTTShadowClient.configureMQTTOperationTimeout(15) # 15 sec
MQTTClient = self.AWSIoTMQTTShadowClient.getMQTTConnection()
MQTTClient.configureOfflinePublishQueueing(5, DROP_OLDEST)
以降に、影を更新するためのコード、ThingIdは、他の場所のローカルデバイスの設定から設定されていることを指摘しました。
def ConnectAndUpdate(self):
deviceState = InovaIoTDeviceState()
log = logging.getLogger("InovaIoTDeviceClient:connectAndUpdate")
# Connect and subscribe to AWS IoT
try:
self.AWSIoTMQTTShadowClient.connect()
except (connectError, connectTimeoutException):
log.error("Error connecting to AWS IoT service")
return False
# Create a deviceShadow with persistent subscription
updateBot = self.AWSIoTMQTTShadowClient.createShadowHandlerWithName(self.ThingId, True)
JSONPayload = deviceState.GetDeviceShadowDocument()
try:
updateBot.shadowUpdate(JSONPayload, self.ShadowUpdateCallback, 15)
# This is bad if these errors are thrown, probably either an initial device registration failure
# or global problem with Inova AWS IoT console configuration or lambda function
except (publishError, subscribeError):
log.error('Publish or subscribe error..')
return False
except (publishTimeoutException, subscribeTimeoutException):
# It is possible we are here due to a temporary snafu in AWS
log.error('Publish or subscribe timeout..')
return False
except publishQueueDisabledException:
# From time to time, AWS will randomly disconnect.
log.error('Publish Queue disabled..')
return False
while not self.ResponseReceived:
time.sleep(1)
# reset state
self.ResponseReceived = False
try:
self.AWSIoTMQTTShadowClient.disconnect()
except (disconnectError, disconnectTimeoutException):
log.error('Error attempting to disconnect')
return self.UpdateSuccess
、最終的には、コールバックコードここ
# Custom MQTT message callback
def ShadowUpdateCallback(self, payload, responseStatus, token):
log = logging.getLogger("InovaIoTDeviceClient:shadowUpdateCallback")
if responseStatus == "timeout":
log.info("Shadow update timeout")
self.UpdateSuccess = False
elif responseStatus == "accepted":
log.info("Shadow update successful")
self.successive_errors = 0
self.UpdateSuccess = True
elif responseStatus == "rejected":
log.info("Rejected shadow update")
self.UpdateSuccess = False
self.ResponseReceived = True
は比較的一般的であり、我々が得る様々なエラー、です。影の更新の成功率は約60%に過ぎないと私は言います。ここではAWSから報告されたタイムアウトがあります:
2017-09-06 11:15:13: (INFO:AWSIoTPythonSDK.core.shadow.deviceShadow)
Subscribed to update accepted/rejected topics for deviceShadow:
qqpba4fgsfazl2zfgqq8zkavj (Line:372)
2017-09-06 11:15:13: (INFO:AWSIoTPythonSDK.core.protocol.mqttCore) Offline
publish request detected. (Line:343)
2017-09-06 11:15:13: (INFO:AWSIoTPythonSDK.core.protocol.mqttCore) Try
queueing up this request... (Line:347)
2017-09-06 11:15:28: (INFO:AWSIoTPythonSDK.core.shadow.deviceShadow) Shadow
request with token: InCoIoTShadowUpdate_qqpba4fgsfazl2zfgqq8zkavj_0_acbxa
has timed out. (Line:202)
2017-09-06 11:15:28: (INFO:InCoIoTDeviceClient:shadowUpdateCallback) Shadow
update timeout (Line:188)
はここで実際の影更新コール
2017-09-06 12:40:11: (INFO:AWSIoTPythonSDK.core.protocol.mqttCore) Connected
to AWS IoT. (Line:302)
2017-09-06 12:40:27: (ERROR:AWSIoTPythonSDK.core.protocol.mqttCore) No
feedback detected for subscribe request 1. Timeout and failed. (Line:413)
2017-09-06 12:40:27: (ERROR:InCoIoTDeviceClient:connectAndUpdate) Publish
or subscribe timeout.. (Line:147)
2017-09-06 12:40:27: (INFO:cycle) Unsuccessful shadow update... (Line:173)
からのタイムアウトエラーですので、これらは基本的にすべてのエラーでタイムアウトが、あります。追加のしわとして、私たちはデバイスの接続をwiresharkedし、(TLS 1.2暗号化されているので)コンテンツを見るのではなく、接続の動作を見るために試行を公開します。 wiresharkの出力から見た動作は、AWSエンドポイントが少なくとも8つの異なるIPアドレスによって処理されるということです。タイムアウトの場合、接続はいつもどこかで行われます。シャドウアップデートトピックを購読してパブリッシュしてタイムアウトを受け取った場合、そのアドレスのいずれかにしか接続しません。サブスクライブまたはパブリッシュタイムアウトでは、3つの異なるアドレスが試行されます。
これはすべてAWSとパフォーマンスの最終段階ですが、誰かがこれを見て回避することができたかどうかは疑問でした。タイムアウト値を上回ることは役に立たないようです。
他の誰かが最近のバージョンのPythonで成功している人は、それも関連しているかもしれません。何とか2.7.11にアップグレードする必要があるかもしれませんが、それはここでは非常に難しい作業です。あるいは、リクエストライブラリをどのようにアップグレードするかを考え出すこともできます。 –
pythonリクエストをurllib3で2.18.4にアップグレードしました。行動に変化はない。 –