AWS IoT Mqttのエラー処理

AWS IoTにてサーバリクエストを行う「MQTT」。比較的簡易ですが、エラー処理面でやや留意点がありました。必ずしもではないかとおもいますが、記録しておきます。機器はラズパイ、言語はPythonです。

1 . connect()でエラーになりやすい場合

インターネットおよびLANも生物ですから不安定な場合もあります。そのせいか当方では、MQTTクライアントのconnect()メソッドでエラー一時的に多発しました。

よくよく調べると、connect()メソッドのタイムアウトのデフォルト値は5秒です。

これではすぐに引っかかりそうです。AWSサーバで生成した「接続キット」のサンプルコードのままではNGです。30秒は欲しいところです。以下のように修正しました。

    mqttc = AWSIoTMQTTClient(clientId)
            ( 中 略 )
           
    mqttc.configureConnectDisconnectTimeout(30)  
    mqttc.configureMQTTOperationTimeout(30)
    mqttc.connect( )

ついでに、publish()メソッドのタイムアウト値も延ばしておきます。

2 . publish()がエラーにならずスルーする

publish()メソッドのエラー検出のテストのため、テストコードで先にmqttc.closeメソッドし、publish()したところ、エラーにならずスルーしました。

これは疑似的なので仕方ないと、実機テストに踏み切ったところ、たまたまネットワークが切れ、サーバ受信にできなかったのですが、publish()側では正常スルーなりました。ネットワーク本体が切れると、スルーしてしまうのかな?

しかなく、Pythonスクリプトとは別に、シェルスクリプトでネットワークデバイスを、数秒置きに監視しするようにしました。当方では、4Gによるppp接続だったため以下のようにした。

while [ 1 ]
do
    ifconfig ppp0 > /dev/null
    RET_PPP=$? 

    if [ $RET_PPP -eq 0 ];then
	PPP_ON=1
    else
    	# flash disk cash
	sync
	sync
	sync
	shutdown -r now
    fi

    sleep 30
done

少し乱暴ですが、pppが切れる要因によっては復帰できない場合もあるため、一律リブートとしました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です