
今、MQTTのテスト中。
前にもMQTTはやっていて問題なく動作する他人のプログラムを採用して使っていたところが、先週金曜日の帰り間際に問題が出た。続けて送信を何回もするとしばらくしてエラーが出て回復しない。
別に何も変えていないはずなのに?
いろいろやってみて、connectの後にpublish(送信)、そして再度connectのpublish、connect、publishしているとダメになるようだった。よく見るとdisconnectと言う関数もあった。なのでpublishの後にdisconnectを挟んでみたたエラーは出なくなった。
FBで相談したらMQTTにはkeepaliveと言うのがあって、何も指定しないと60秒だとか。その間にデータ送信が無くてもpingを送れ、送ったと言う相手確認が行われているそう。今回の問題はデータを送らないのではなくて、keepaliveの時間gq終わってないうちに再度connectしてしまっているのがダメな可能性が高い。
しかしながら仕様上はかなりの数、数万など、クライアントがあっても問題無さそうに書いてあるのだが?
それは置いておいて、まずkeepaliveの試験だけれど、デフォルトで何も指定無しでも1時間後に送ると再接続ができていた。なぜか?...不明。とりあえず、ループになっていて連続して送信できるらしい。が、もしかすると遠い将来それも有限かも知れないので、一定回数送信したらdisconnectして再connectするようにしておく事にした。それでも何の支障も無さそうなので。
それから、これまでのテストでは送信するデータは1個だったのを複数対応にした。計算値も一緒に送る事にしたから。また、サイクルタイムが長い行程の場合、サイクルタイムを待ってから受信側の画面更新になると空白期間ができるので送信データが無い場合に前のデータを1分置きに送るようにした。1分なら待てるだろう。
今日はここまで。
前にもMQTTはやっていて問題なく動作する他人のプログラムを採用して使っていたところが、先週金曜日の帰り間際に問題が出た。続けて送信を何回もするとしばらくしてエラーが出て回復しない。
別に何も変えていないはずなのに?
いろいろやってみて、connectの後にpublish(送信)、そして再度connectのpublish、connect、publishしているとダメになるようだった。よく見るとdisconnectと言う関数もあった。なのでpublishの後にdisconnectを挟んでみたたエラーは出なくなった。
FBで相談したらMQTTにはkeepaliveと言うのがあって、何も指定しないと60秒だとか。その間にデータ送信が無くてもpingを送れ、送ったと言う相手確認が行われているそう。今回の問題はデータを送らないのではなくて、keepaliveの時間gq終わってないうちに再度connectしてしまっているのがダメな可能性が高い。
しかしながら仕様上はかなりの数、数万など、クライアントがあっても問題無さそうに書いてあるのだが?
それは置いておいて、まずkeepaliveの試験だけれど、デフォルトで何も指定無しでも1時間後に送ると再接続ができていた。なぜか?...不明。とりあえず、ループになっていて連続して送信できるらしい。が、もしかすると遠い将来それも有限かも知れないので、一定回数送信したらdisconnectして再connectするようにしておく事にした。それでも何の支障も無さそうなので。
それから、これまでのテストでは送信するデータは1個だったのを複数対応にした。計算値も一緒に送る事にしたから。また、サイクルタイムが長い行程の場合、サイクルタイムを待ってから受信側の画面更新になると空白期間ができるので送信データが無い場合に前のデータを1分置きに送るようにした。1分なら待てるだろう。
今日はここまで。
※コメント投稿者のブログIDはブログ作成者のみに通知されます