LoginSignup
2
4

More than 5 years have passed since last update.

MQTTでSubscribeしているトピックにキーワードが出現したら別のトピックにPublishする

Last updated at Posted at 2016-10-24

【概要】

…という処理を、もう何度も書いていて、いい加減再利用しようとようやく思い立った。
イメージ的には下記の図みたいな感じで、左側のTopic Aに対してはSubscribe, 右側のTopic Bに対してはPublishするイメージ。

Kobito.jocseL.png

スクリプト中では左側のTopicを「SUB_TOPIC」、右側のTopicを「PUB_TOPIC」と表現。ついでに、ひょっとしたらSUB側とPUB側でホストとかも違うかもしれないじゃん、ということで接続情報についてはSUB側とPUB側でそれぞれに情報を持つようにしてみた。

【スクリプト】

こんな感じ。

sample.py
#!/usr/bin/python
# encoding:utf-8

import paho.mqtt.client as mqtt
import re
import sys

# このスクリプトがSubscribeするトピック関係の設定
SUB_TOPIC = "subtopic"
SUB_USERNAME = 'username'
SUB_PASSWORD = 'password'
SUB_HOST = 'localhost'
SUB_PORT = 1883

# このスクリプトがPublishするトピック関係の設定
PUB_TOPIC = "pubtopic"
PUB_USERNAME = 'username'
PUB_PASSWORD = 'password'
PUB_HOST = 'localhost'
PUB_PORT = 1883

# Sub側トピックでこのキーワードが出現したらPub側トピックへの出力を行う
KEYWORD = "TEST"

# デバッグ出力制御用のフラグ
ISDEBUG = True

def sub_on_connect(client, userdata, flags, rc):
    client.subscribe(SUB_TOPIC)

def sub_on_message(client, userdata, msg):
    # 受信したメッセージはmsg.payloadに格納されています
    debug_echo(msg.payload)

    match = re.match(KEYWORD, msg.payload)

    if match is None:
        debug_echo("Not Match")
    else:
        debug_echo("Match")
        publish("OK")


def publish(msg):
    pub_client.publish(PUB_TOPIC, msg)
    pass


def debug_echo(msg):
    if ISDEBUG :
        print msg
        sys.stderr.write(msg+"\n")

if __name__ == '__main__':
    # 送信側クライアントの準備
    pub_client = mqtt.Client(protocol=mqtt.MQTTv311)
    pub_client.username_pw_set(PUB_USERNAME, password=PUB_PASSWORD)
    pub_client.connect(PUB_HOST, port=PUB_PORT, keepalive=60)

    # 受信側クライアントの準備
    sub_client = mqtt.Client(protocol=mqtt.MQTTv311)
    sub_client.on_connect = sub_on_connect
    sub_client.on_message = sub_on_message
    sub_client.username_pw_set(SUB_USERNAME, password=SUB_PASSWORD)
    sub_client.connect(SUB_HOST, port=SUB_PORT, keepalive=60)

    # 受信ループ開始
    sub_client.loop_forever()

追記:デバッグ内容を標準エラー出力に吐き出すように変更しました。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4