スマートフォン・タブレットからインターネットサーバーオペレーション 2014

APPW.jp 2014

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 での接続にトライします。

「さくらのVPS」2014年11月27日にリニューアル

SSL ボックス が SHA-2 の SSL 証明書発行に対応

Bottle – Cork サンプルを Apache mod_wsgi で試してみます

Mosquitto の Bridge を SSL で試します

Mosquitto へ SSL で接続してみる

Mosquitto の SSL 対応を試してみる

Mosquitto Publish と Server-Sent Events で Python チャットサンプルを改造

Python WebSocket のチャットサンプルに、MongoDB 保存を付け加えました

MongoDB に保存した Mosquitto の payload を Server-Sent Events で表示してみる

Mosquitto を VPN で試しました

via IPv4

カテゴリー