MQTT에서 Subscribe하는 주제에 키워드가 나타나면 다른 주제로 게시
【개요】
…라는 처리를, 벌써 몇번이나 써 있어, 좋은 가감 재이용하려고 드디어 생각나게 했다.
이미지적으로는 아래 그림과 같은 느낌으로 왼쪽의 Topic A에 대해서는 Subscribe, 오른쪽의 Topic B에 대해서는 Publish하는 이미지.
스크립트 중에서는 좌측의 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()
추기: 디버그 내용을 표준 에러 출력으로 토출하도록 변경했습니다.
Reference
이 문제에 관하여(MQTT에서 Subscribe하는 주제에 키워드가 나타나면 다른 주제로 게시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tinaba/items/e863cf42a30603bf47bd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이런 느낌.
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()
추기: 디버그 내용을 표준 에러 출력으로 토출하도록 변경했습니다.
Reference
이 문제에 관하여(MQTT에서 Subscribe하는 주제에 키워드가 나타나면 다른 주제로 게시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tinaba/items/e863cf42a30603bf47bd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)