MQTTでServer(Broker)も設置してRaspberry Pi 3とLinux機を通信させてみた。
概要
先日、RaspberryPi3にGroveの温湿度センサを取り付けて温湿度をREST APIとして提供する装置を作ってみました。
REST APIでも良いのですが、今回はMQTTというプロトコルを使って温度・湿度を送受信してみました。 MQTTについてはMQTT as a Service sango MQTTについて詳しく知る(外部)が参考になると思います。
目標
- Raspberry PIをPublisherとし、温湿度を送信すする。
- Linux上に構築したMQTT Server(Broker)を構築する。
- 別のLinuxマシンが温湿度を受信する。
RaspberryPiが送信した温湿度を、MQTT Serverを経由して別のLinuxマシンが受信します。
Raspberry Piではじめるおうちハック ~ラズパイとIoTでつくる未来の住まい~
- 作者: 大和田茂,川上和義,小菅昌克,.
- 出版社/メーカー: マイナビ出版
- 発売日: 2016/10/31
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
やってみた
MQTT Serverのセットアップ
まっ更なUbuntuにmosquittoをインストール。各OSごとの導入方法はDownloads | Mosquittoで紹介されています。 Ubuntu16.04では標準のパッケージリストにすでに含まれているようです。最新のパッケージが欲しい場合はリポジトリを追加する必要がありそうですが、このまま行きます。
$ sudo apt-get install mosquitto $ sudo service mosquitto status sudo: unable to resolve host mqtt-broker ● mosquitto.service - LSB: mosquitto MQTT v3.1 message broker Loaded: loaded (/etc/init.d/mosquitto; bad; vendor preset: enabled) Active: active (running) since Mon 2017-01-02 17:39:05 UTC; 19h ago ・・・
MQTTのおためし
MQTTのSubscriverをセットアップ
こちらもまっ更なUbuntuにインストール。mosquitto_clients
をインストールします。
$ sudo apt-get install mosquitto-clients
mosquitto_sub
で起動します。とりあえずトピック名はsample
でいきます。
$ mosquitto_sub -d -t sample -h <mosuqittoサーバのアドレス> Client mosqsub/2193-mqtt-test2 sending CONNECT Client mosqsub/2193-mqtt-test2 received CONNACK Client mosqsub/2193-mqtt-test2 sending SUBSCRIBE (Mid: 1, Topic: sample, QoS: 0) Client mosqsub/2193-mqtt-test2 received SUBACK Subscribed (mid: 1): 0 Client mosqsub/2193-mqtt-test2 received PUBLISH (d0, q0, r0, m0, 'sample', ... (5 bytes))
MQTTのPublisherをセットアップ
温湿度センサのRaspberryPi3にインストール。mosquitto_clients
をインストールします。
$ sudo apt-get install mosquitto-clients
テキトーなメッセージを送ってみます。
$ mosquitto_pub -d -t sample -m "Hello" -h <mosquittoサーバのアドレス>
Subscriberの方にメッセージのHello
が標準出力されました。
MQTTのPublisherをPythonで実装
pythonインターフェイスの導入
ありがたいことにmosquittoのpythonインターフェイスが用意されているので導入します。
$ sudo pip install paho-mqtt
まぁこんな感じかな。grovepiからセンサの値を取得して、そのままMQTTで送信。 コード全体はこちらのリポジトリ このスクリプトをcronあたりで定期実行すればとりあえずOKと。
#!/usr/bin/python2.7 # -*- coding:utf-8 -*- import paho.mqtt.publish import grovepi def parse_args(): ・・・ def sensing(): (temperature, humidity) = grovepi.dht(8, 0) return (temperature, humidity) def publish(hostname, data): print data paho.mqtt.publish.multiple([data], hostname=hostname) if __name__ == '__main__': args = parse_args() (temperature, humidity) = sensing() data = { 'topic': args.topic, 'payload':str({'temperature':temperature, 'humidity':humidity}) } publish(args.hostname, data)