Symfoware

Symfowareについての考察blog

MQTTクライアントpahoでmosquittoに接続する(Python使用)

MQTTブローカー mosquittoをインストールしてみました。
MQTTブローカー mosquittoをUbuntu 18.04へインストールする

Pythonで操作してみます。

paho



https://www.eclipse.org/paho/

各種言語のライブラリが公開されています。
https://www.eclipse.org/paho/downloads.php

今回はPythonのライブラリを使ってみることにしました。
https://github.com/eclipse/paho.mqtt.python


$ pip3 install paho-mqtt




送信側のソース

・publisher.py


  1. # -*- coding:utf-8 -*-
  2. import paho.mqtt.client as mqtt
  3. client = mqtt.Client()
  4. client.connect('192.168.1.102', 1883, keepalive=60)
  5. client.publish('test/topic', 'hello world')




受信側のソース

・subscriber.py


  1. # -*- coding:utf-8 -*-
  2. import paho.mqtt.client as mqtt
  3. def on_connect(client, userdata, flags, respons_code):
  4.     topic = 'test/topic'
  5.     print('watch %s' % topic)
  6.     client.subscribe(topic)
  7. def on_message(client, userdata, msg):
  8.     print(msg.topic + ' ' + str(msg.payload))
  9. client = mqtt.Client()
  10. client.on_connect = on_connect
  11. client.on_message = on_message
  12. client.connect('192.168.1.102', 1883, keepalive=60)
  13. client.loop_forever()




受信側のプログラムを起動しておきます。


$ python3 subscriber.py
watch test/topic



送信側のプログラムを実行。


$ python3 publisher.py



受信側のコンソールがこんな表示になるはずです。

903_01.png




トピックのワイルドカード指定



トピックは[項目1]/[項目2]/[項目3]/...のようにスラッシュで分類するのが作法です。
こうしておくことで、監視するトピック名をワイルドカードで指定できるようになります。


+/[項目2]



前半は何でも良いので、後半は[項目2]にマッチするもの。


[項目1]/#



後半は何でも良いので、前半は項目1にマッチするのも。

サンプルを書き換えて試してみます。

・publisher.py


  1. # -*- coding:utf-8 -*-
  2. import paho.mqtt.client as mqtt
  3. client = mqtt.Client()
  4. client.connect('192.168.1.102', 1883, keepalive=60)
  5. client.publish('test/topic', 'hello world')
  6. client.publish('test/any', 'hello world')
  7. client.publish('any/topic', 'hello world')




・subscriber.py


  1. # -*- coding:utf-8 -*-
  2. import sys
  3. import paho.mqtt.client as mqtt
  4. def on_connect(client, userdata, flags, respons_code):
  5.     print('watch %s' % topic)
  6.     client.subscribe(topic)
  7. def on_message(client, userdata, msg):
  8.     print(msg.topic + ' ' + str(msg.payload))
  9. topic = sys.argv[1]
  10. client = mqtt.Client()
  11. client.on_connect = on_connect
  12. client.on_message = on_message
  13. client.connect('192.168.1.102', 1883, keepalive=60)
  14. client.loop_forever()




狙い通りの実行結果です。

903_02.gif



Retain



subscriberを起動していないときにpublisherから送信されたメッセージを
知ることはできません。

Retainを指定しておけば、publisherから送信された最後の1件の
メッセージを取得できるようになります。

・publisher.py


  1. # -*- coding:utf-8 -*-
  2. import paho.mqtt.client as mqtt
  3. client = mqtt.Client()
  4. client.connect('192.168.1.102', 1883, keepalive=60)
  5. client.publish('test/topic', 'hello', retain=True)
  6. client.publish('test/topic', 'world', retain=True)
  7. client.publish('test/topic', 'last message', retain=True)




publisherを実行した後、subscriberを実行してみます。


$ python3 subscriber.py test/topic
watch test/topic
test/topic b'last message'



最後のメッセージが取得できました。


【参考URL】
IoT時代のプログラミング(主にMQTTについて)
初めての MQTT
https://github.com/eclipse/paho.mqtt.python

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/06/24(日) 16:56:30|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Ubuntu 18.04でDynamoDB Localを動作させる | ホーム | MQTTブローカー mosquittoをUbuntu 18.04へインストールする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/2206-7227e128
この記事にトラックバックする(FC2ブログユーザー)