質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

Q&A

解決済

2回答

1041閲覧

LTE回線経由でのcloudMQTT接続(Paho-mqtt+Python3)の自動切断

sandalwalk

総合スコア77

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

MQTT

MQTT(Message Queue Telemetry Transport)とは、TCP/IPネットワークで利用可能な通信プロトコルの一つで、IoT/M2M向けに開発された軽量なプロトコルです。ヘッダ部分は最小2バイトと小さく、通信量・CPU負荷・電力消費量などを抑えることができます。

0グッド

0クリップ

投稿2018/11/10 01:56

以下のpythonプログラムでpaho-mqttを使いcloudMQTTにsubscribeしています。作っているアプリケーションでは、実際にメッセージを受け取るのは一週間に一度程度なので、長い間待ちの状態を維持する必要があります。このプログラムを実行すると、問題無くsubscribeすることができ、メッセージの受信も問題無くできます。また、長時間の待ち状態の維持もwifi経由での接続であれば問題ありません。一方で、インターネットへの接続をLTE回線にすると、毎回2時間12分程度経過した時点で、cloudMQTTのログにSocket error on client Python, disconnecting.と表示されmqtt接続が切れてしまいます。cloudMQTTのログを見ると、keepaliveの設定値60s毎にpingのやり取りがclientとcloudMQTTの間で行われている状態が2時間12分続いているのですが、突然上記のエラーが起きます。
どなたか、LTE回線を用いて、長時間コネクションを維持するアプリケーションを作成された方がいらしたら、アドバイスをお願い致します。
以下client側でのsubscribeのコードです。

1 import paho.mqtt.client as mqttClient 2 import time 3 4 def on_connect(client, userdata, flags, rc): 5 6 if rc == 0: 7 8 print("Connected to broker") 9 10 global Connected 11 Connected = True 12 13 else: 14 15 print("Connection failed") 16 17 def on_message(client, userdata, message): 18 msg = message.payload 19 print("Message received: ",msg.decode()) 20 21 Connected = False #global variable for the state of the connection 22 23 broker_address= "mxx.cloudmqtt.com" #Broker address 24 25 port = xxxx #SSL port 26 user = "xxxxxx" #Connection username 27 password = "yyyyy" #Connection password 28 29 client = mqttClient.Client("Python") #create new instance 30 client.username_pw_set(user, password=password) #set username and password 31 client.on_connect= on_connect #attach function to callback 32 client.on_message= on_message #attach function to callback 33 34 client.tls_set("/etc/ssl/certs/ca-certificates.crt") 35 36 client.connect(broker_address, port=port) #connect to broker 37 38 client.loop_start() #start the loop 39 40 while Connected != True: #Wait for connection 41 time.sleep(0.1) 42 43 client.subscribe("python/test") 44 print('subscribed to "python/test') 45 46 try: # just waiting for keyboard interrupt 47 while True: 48 time.sleep(3) 49 50 except KeyboardInterrupt: 51 print("exiting") 52 client.disconnect() 53 client.loop_stop()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

ssh経由で起動しているプログラムであったため、sshのタイムアウトと同時にプロセスが終了してしまっていました。プログラムの起動にはscreenを用いるとこで解決しました。

投稿2018/12/14 21:31

sandalwalk

総合スコア77

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

moonphase

2018/12/15 14:38

なるほど、そういうことだったんですね。 nohup 起動したいプログラム & すればSSHセッションが終了しても裏で動き続けると思います。 screenでもいいとは思いますが、より軽量です。
guest

0

LTEに限らない話ですが、切れたら再接続します。

投稿2018/11/10 03:04

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問