herokuのCloudMQTTでデータを定期送信してみた

MQTTを試してみたいと思っていたら、herokuのadd-onにCloud MQTTが。
早速チャレンジしてみました。

MQTTは、データを送るPublisher、データを取得するSubscriber、その間でデータを受け渡しするBrokerの3本立てで動きます。

言語は、PublisherがC言語、SubscriberがPHPです。
(どっちもぱいそんで、みたいな事例は他へどうぞ……)

 

今回は、クライアントのIPアドレスと送信時間を、一時間に一回、MQTTで送ってみます。

 

1.cloudMQTT

MQTTのBrokerです。

CloudMQTT
https://devcenter.heroku.com/articles/cloudmqtt

herokuそのものの使い方はぐぐってください。

herokuのアプリのadd-onに、cloudMQTTを追加してください。
確認用なのでまずは無料のプランで大丈夫です。

追加すると、接続情報などが生成されます。

この画面のUserなどの情報を接続に使います。

heroku上で使うときは、環境変数に登録されているので、楽ちんです。

 

2.クライアントのプログラム

MQTTのPublisherです。

IoTに使う機器で、OSはubuntuなどDebian系です(ラズパイ的な)。

C言語です。
現在、現場で使用している機器が、CやC++だと扱いやすいことが多いからです。

 

クライアントのIPアドレスを取得して、時間を付け加えて、定期的にブローカーに送ってみます。

Cがすでにコンパイルできる前提ですすめていますが、Cが入っていないときは apt-get install build-essential でもしておいてください。

そして、MQTTのライブラリを入れます。ソースコードがここにあるので、落として、インストールしてください。
https://github.com/eclipse/paho.mqtt.c

https://www.eclipse.org/paho/clients/c/ ここのLinux用のコマンドを。

 

そして、IPアドレスと時間をcloudMQTTに送るCのソースコードです。

こちらのサイトなどを参考にしました。

CでMQTTを利用する。
MQTTクライアントを使うことで、C言語など様々な言語でMilkcocoaを利用できるようになりました

 

ここではごく単純な、送るだけのプログラムです。

「//この接続IDが同じものは同時に接続できない」とありますが、IDの違うクライアントからの同時接続数が、ライセンスの違いの一つです。
注意点は、メッセージが長すぎると受信してくれません。そもそも、そんな長いならわざわざMQTTにする意味がなさそう。

そして、コンパイル。デバッグなどのオプションは各々追加してください。

ipsendというアプリができたら crontabに定期実行を登録。

sudoかsuで、

fprintf でエラーを書き出しているので、書き出したいときは、 実行時にログファイルを指定してください。

 

cloudMQTTに送られているかを確認。

一行目のオレンジが、上のプログラムで送ったものです。
他のプログラムやクライアントからも次々と送られてきています。topicは階層でアクセスできます。

 

3.ウェブ側のプログラム

MQTTのSubscriberです。

MQTTサーバーは待ち受けているものを受け取るだけなので、受信したデータがないかを見に行かないと取得できません。

herokuにPHPで書きました。dynoをケチって、heroku Schedulerを使わずに、PHPで動いている社内アプリのあるサーバーで強引に動かしました。
VPSからのウェブアクセスで、このプログラムをたたき起こしています。

//herokuは30秒で返ってこないとエラーで止まってしまうので25秒間だけ動かすためのタイマー
などというダメな変数があるのですが、ケチらずにスケジューラーを使えば24時間を超えなければ必要ないのでは?

まず、phpMQTT.phpを入れる。
https://github.com/bluerhinos/phpMQTT
composerでも入るそうですがエラーになったので、ソースコードを落として置きました。

PHP用のSubscriberのサンプルコードは上にあるのですが、herokuのスケジューラーじゃなくてウェブサイトだと問題が。
while($mqtt->proc()) {} これが30秒で止まるため、この無限ループがエラーになる。

なのでこう作りまして。

三日くらい動かしてみましたが、SubscriberによってDBにどんどんIPアドレスが溜まっていくのを確認できました。