AWS IoT CoreへアクセスするPythonプログラムを書いた。
ライブラリはpahoではなくAWSIoTPythonSDKを使った。
話をもどすが、どうも AWS IoT に Will
がないと思っている人が意外と多い。
AWS IoT に Will がないと書かれたブログ記事もすくなくなく
これを鵜呑みにした人がおおいのだろう。
ベータ版の頃はそうらしかったのだけど、
今のバージョンでは存在している。
#この先、消えるかはわからないけど ;-p
AWSIoTPythonSDK の AWSIoTMQTTClient クラスには
configureLastWill(topic, payload, QoS, retain=False)
というインスタンスメソッドが存在する。
なのでQoS=2にしてWillメッセージをセットすると..
というエラーになってconnectできない状態になってしまった。
どうも Will はサポートされたけど、
AWS IoT はあくまで QoS は 0 か 1 までで
QoS=2は未だにサポートしていないらしい..
というより、今サポートしてないなら、やる気なしでしょ..
ということでQoS=1にしたら正常に動作した。
ちなみに引数にretainがあり、
AWSIoTPythonSDKのコードをおっていくとpahoのクライアントクラスに
そのまま値を渡しているので、
もしかしたら..とおもって retain=True で実行してみた。
..結果は、QoS=2のときと全く同じ例外が発生してしまった..
retain とは、
最後にpublishされたメッセージをブローカで保持し、
新規Subscriberにそのメッセージを渡す
MQTTベースのメッセージブローカに標準提供される機能のひとつ。
AWS IoTベータのころからサポートされておらず、
こちらもQoS=2同様
現時点でもサポートされていない
ということらしい..
そのかわりにシャドウを使えってことなのだろうけど..
この機能AWS IoT Coreにしか存在しない独自機能なんだよなあ..
..日本のSIerは、こういったベンダ依存をきらうからねえ..
ライブラリはpahoではなくAWSIoTPythonSDKを使った。
ちなみにMQTTブローカへ接続するプログラムを書く場合、
ベンダ提供ライブラリを素直に使うのが生産性を上げるコツだ。
ベンダ固有の機能の有無を関数やメソッドのコード上ドキュメントで
確認できるし、
一番困るのがベンダ固有のpayloadやtopicフォーマットを持っている
場合だ。
ドキュメントをイチから読むより、関数やメソッドのドキュメントを
見るほうが圧倒的に速い..と私はおもっている。
..Eclipse Mosquitto、IBM Watson IoT PlatformとAWS IoT Coreしか
まだ触ったことがないのだけど..
話をもどすが、どうも AWS IoT に Will
つまりデバイスが死んだ際に
特定のメッセージを指定トピックへ送信してくれる
MQTTベースのメッセージブローカに標準搭載される機能
がないと思っている人が意外と多い。
AWS IoT に Will がないと書かれたブログ記事もすくなくなく
これを鵜呑みにした人がおおいのだろう。
ベータ版の頃はそうらしかったのだけど、
今のバージョンでは存在している。
#この先、消えるかはわからないけど ;-p
AWSIoTPythonSDK の AWSIoTMQTTClient クラスには
configureLastWill(topic, payload, QoS, retain=False)
というインスタンスメソッドが存在する。
なのでQoS=2にしてWillメッセージをセットすると..
Traceback (most recent call last):
File "test_dev.py", line 45, in
test_dev()
File "test_dev.py", line 31, in test_dev
client = Client('conf/aws/xxxx/xxxx.yml', 'xxxx_test')
File "C:\Users\xxxxx\projects\xxxx\aws\broker.py", line 354, in __init__
client.connect()
File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\envs\xxxx\lib\site-packages\AWSIoTPythonSDK\MQTTLib.py", line 486, in connect
return self._mqtt_core.connect(keepAliveIntervalSecond)
File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\envs\xxxx\lib\site-packages\AWSIoTPythonSDK\core\protocol\mqtt_core.py", line 195, in connect
raise connectTimeoutException()
AWSIoTPythonSDK.exception.AWSIoTExceptions.connectTimeoutException
というエラーになってconnectできない状態になってしまった。
どうも Will はサポートされたけど、
AWS IoT はあくまで QoS は 0 か 1 までで
QoS=2は未だにサポートしていないらしい..
というより、今サポートしてないなら、やる気なしでしょ..
ということでQoS=1にしたら正常に動作した。
ちなみに引数にretainがあり、
AWSIoTPythonSDKのコードをおっていくとpahoのクライアントクラスに
そのまま値を渡しているので、
もしかしたら..とおもって retain=True で実行してみた。
..結果は、QoS=2のときと全く同じ例外が発生してしまった..
retain とは、
最後にpublishされたメッセージをブローカで保持し、
新規Subscriberにそのメッセージを渡す
MQTTベースのメッセージブローカに標準提供される機能のひとつ。
AWS IoTベータのころからサポートされておらず、
こちらもQoS=2同様
現時点でもサポートされていない
ということらしい..
そのかわりにシャドウを使えってことなのだろうけど..
この機能AWS IoT Coreにしか存在しない独自機能なんだよなあ..
..日本のSIerは、こういったベンダ依存をきらうからねえ..
0 件のコメント:
コメントを投稿