Mosquitto の payload を MongoDB に保存してみる
「Mosquitto を VPN で試しました」から2ヶ月が経ちます。
試してみたいことがいくつかありまして、今回は、Mosquitto の payload を MongoDB に保存してみることにしました。
環境は、ConoHa VPS で、CentOS 6.5 です。
Mosquitto の Python サンプルプログラムを参考に、MongoDB へのアクセスを書き加えてみました。
import os, sys import time from datetime import datetime import paho.mqtt.client as paho sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../model') from mchat import (connecter, ChatLog) def on_connect(mosq, obj, rc): print("on connect [rc]:" + str(rc)) def on_message(mosq, obj, msg): now = int(time.mktime(datetime.now().timetuple())) ChatLog(text=msg.payload, user='MQTT', created_at=now).save() print("on message [topic]:"+msg.topic + " [qos]:" + str(msg.qos) + " [payload]:" + str(msg.payload)) def on_publish(mosq, obj, mid): print("on publish [mid]:" + str(mid)) def on_subscribe(mosq, obj, mid, granted_qos): print("on subscribe [mid]:" + str(mid) + " [qos]:" + str(granted_qos)) def on_disconnect(mosq, obj, rc): print("on disconnect [rc]:" + str(rc)) def on_log(mosq, obj, level, string): print(string) mqttc = paho.Client() mqttc.on_message = on_message mqttc.on_connect = on_connect mqttc.on_publish = on_publish mqttc.on_subscribe = on_subscribe mqttc.on_disconnect = on_disconnect mqttc.username_pw_set("mqtt", "mqttpasswd") mqttc.connect("localhost", 1883, 60) connecter() mqttc.subscribe("test/chat", 0) mqttc.publish("test/chat", "conected mqtt subscribe") mqttc.loop_forever()
-(ホームディレクトリ)/test/mqtt/sub.py で保存しました。
当初は、Mosquitto の Python モジュールで進めていましたが、途中で Paho に切り替えました。Paho MQTT Python Client
MongoDB アクセス部分は、今後作成する Web アプリケーションでも利用することとしましたので、いわゆる MVC におけるモデルとして、別のディレクトリでモジュールとしました。
from mongoengine import * class ChatLog(Document): text = StringField(required=True) user = StringField(required=True) created_at = LongField(required=True) def connecter(): con = connect('chattest') print con
-(ホームディレクトリ)/test/model/mchat.py で保存しました
MongoEngine は、サンプルを調べていたとき、たまたま参考にしていたソースで利用されていましたので。
created_at は、当初はデフォルトでセットしていましたが、PHP からも MongoDB にアクセスしてみたいと思い変更しています。ここには UNIXTIME を設定することにしました。
python sub.py
で起動しますが、自動でスタートさせてみたいと思い、Supervisor の利用を試してみました。
sudo yum install supervisor
EPEL レポジトリからバージョン 2.1 がインストールできました。supervisor の設定について検索すると、バージョン 3.x のものが多くみられますが、バージョン 2.x とは構造が変更されていますので要注意です。とはいえ、/etc/supervisord.conf 内のコメント説明にそって設定を進めればコントロールできました。
[supervisord] http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server) http_port=127.0.0.1:9001 ; (alternately, ip_address:port specifies AF_INET) ;~途中省略~ [supervisorctl] serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL for a unix socket serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;~途中省略~ ;~以下追加~ [program:mqttsub] command=python /home/hoge/test/mqtt/sub.py ; the program (relative uses PATH, can take args) priority=999 ; the relative start priority (default 999) autostart=true ; start at supervisord start (default: true) autorestart=true ; retstart at unexpected quit (default: true) startsecs=10 ; number of secs prog must stay running (def. 10) startretries=3 ; max # of serial start failures (default 3) exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) stopsignal=QUIT ; signal used to kill process (default TERM) stopwaitsecs=10 ; max num secs to wait before SIGKILL (default 10) user=hoge ; setuid to this UNIX account to run the program log_stdout=true ; if true, log program stdout (default true) log_stderr=true ; if true, log program stderr (def false) logfile=/var/log/supervisor/mqttsub.log ; child log path, use NONE for none; default AUTO logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB) logfile_backups=10 ; # of logfile backups (default 10)
さて次回は、HTML5 の Server-Sent Events と PHP でブラウザに、この MongoDB に保存した Mosquitto の payload を表示していきたいと思います。「Server-Sent Events(EventSource)を試してみます」以来、Server-Sent Events(EventSource)を利用する機会を待っていました。
さらに唐突ではありますが、Python での Web アプリケーションにもトライしてみます。
今回の第1回は、Mosquitto の payload を MongoDB に保存しました。
次回の第2回は、HTML5 の Server-Sent Events と PHP でブラウザに表示します。
「MongoDB に保存した Mosquitto の payload を Server-Sent Events で表示してみる」
第3回は、Python で WebSocket を利用した簡単なチャットプログラムを参考に MongoDB アクセスを書き加えてみます。
「Python WebSocket のチャットサンプルに、MongoDB 保存を付け加えました」
第4回は、第3回の Python の WebSocket チャットプログラムを参考にしつつ、ブラウザから POST メソッドで Mosquitto へ Publish し、また、Server-Sent Events でブラウザに表示する方式を Python で試してみます。
「Mosquitto Publish と Server-Sent Events で Python チャットサンプルを改造」
また、「Mosquitto へ SSL で接続してみる」では、SSL/TLS での接続にトライします。