phpMQTTでVerneMQに接続する

さて、前回セットアップしたVerneMQを動かしてみましょう。MQTTクライアントはphpで実装します。ライブラリは、phpMQTTを使ってみます。

それでは、まず最初にvernemqサービスの起動をします。ファイルディスクリプタ上限数を推奨の65536に変えていないと、以下のように警告が出ます。個人的には親切な設計だと思います。

MQTTクライアントの作成

MQTTクライアントを実装していきます。phpMQTTのソースコードはgithubで公開されているので、ダウンロードしてお好きなディレクトリに配置してください。

publisher

まずは、publisherから。phpMQTT.phpをrequireし、phpMQTTクラスを生成、認証情報をセットしてBrokerへ接続、その後publishという流れになります。

接続する各クライアントは、user/(ユーザ名) というトピックを subscribeしているものとし、publisherは、ユーザ名のみを指定して、特定のsubscriberのみに任意のメッセージを送る仕様とします。

引数は2つで、1つ目はtopic、2つ目はメッセージです。ファイル名は、publisher.phpとします。

subscriber

次は、subscriberです。引数は2つで、 Brokerに接続するユーザ名とパスワードです。自分宛のメッセージを受信すると、トピックとメッセージを標準出力へ出す仕様とします。ファイル名は、subscriber.phpです。

実行

まずはsubscriberを2つ起動します。

この状態で、publisherを起動します。sub1にメッセージを送ってみましょう。

一見上手くいっているようですが、/var/log/vernemq/console.log をみると

subscriberがエラーで切断されてしまいます。んー、なんでだろうと調べていたのですが、一点怪しいところが。phpMQTT.php の function subsucribe() にて、MQTTのsubscribeコマンドを生成しているところで、

となっているのですが、これはMQTT3.1.1の仕様書をみると、subscribeの固定ヘッダ1バイト目の0~3ビット目は(0010)でなければならないようです。

さらに、このパラメータが正しくない場合は、切断をしなければならない、というように記述されています。VerneMQはこの仕様に沿った実装なのかと思います。

3.8 SUBSCRIBE – Subscribe to topics
3.8.1 Fixed header
Bits 3,2,1 and 0 of the fixed header of the SUBSCRIBE Control Packet are reserved and MUST be set to 0,0,1 and 0 respectively. The Server MUST treat any other value as malformed and close the Network Connection [MQTT-3.8.1-1].

ちなみに、MQTT3.1仕様書でもsubscribeの場合は0x82とするように書かれてはいますが、予期せぬパラメータが来た場合の挙動は特には記述されていません。

それでは、気を取り直して phpMQTT.php の該当部分を以下のように直します。

subscriberを立ち上げ直します。この状態でpublisherしても、エラーが出なくなりました。うまくいったようです。

いかがでしたでしょうか。次回は、クラスターを組んでみます。お楽しみに!