概要
単純な Publish と Subscribe する方法を紹介します
環境
- Mac OS X 10.11.5
- nodejs 5.9.1
- npm 3.7.3
- mqtt 1.12.0 (node lib)
ローカルで Hubot の作成
- yo hubot
作成時の入力項目は以下の通り
? Owner hawksnowlog
? Bot name test-bot
? Description A simple helpful robot for your Company
? Bot adapter campfire
以下のファイル郡が作成されれば OK です
Procfile
README.md
bin
external-scripts.json
hubot-scripts.json
node_modules
package.json
scripts
MQTT ライブラリの追加
package.json を編集して mqtt を追加します
全体で以下のような感じで記載すれば OK です
- vim package.json
{
"name": "iotbot",
"version": "0.0.0",
"private": true,
"author": "kakakikikeke",
"description": "Controll any devices",
"dependencies": {
"hubot": "^2.19.0",
"hubot-diagnostics": "0.0.1",
"hubot-google-images": "^0.2.6",
"hubot-google-translate": "^0.2.0",
"hubot-help": "^0.2.0",
"hubot-heroku-keepalive": "^1.0.2",
"hubot-maps": "0.0.2",
"hubot-pugme": "^0.1.0",
"hubot-redis-brain": "0.0.3",
"hubot-rules": "^0.1.1",
"hubot-scripts": "^2.17.2",
"hubot-shipit": "^0.2.0",
"hubot-slack": "^3.4.2",
"mqtt": "^1.12.0"
},
"engines": {
"node": "0.10.x"
}
}
追加したのは「”mqtt”: “^1.12.0”」の部分だけです
- npm install
でインストールしましょう
スクリプトの作成
coffee スクリプトを追加して MQTT に pub/sub してみましょう
今回は以下のような感じで作成しました
- vim scripts/mqtt.coffee
# Description:
# Subscribe/Publish to an MQTT server
#
# Dependencies:
# mqtt
#
# Configuration:
# HUBOT_MQTT_HOST
# HUBOT_MQTT_PORT
# HUBOT_MQTT_USERNAME
# HUBOT_MQTT_PASSWORD
# HUBOT_MQTT_PUBTOPIC
# HUBOT_MQTT_SUBTOPIC
#
# Commands:
# hubot pub <message> - Powered on/off the fan
# hubot show sub - Show the newest subscribed data
#
mqtt = require('mqtt')
HOST = process.env.HUBOT_MQTT_HOST
PORT = process.env.HUBOT_MQTT_PORT
URL = "mqtt://#{HOST}:#{PORT}"
USERNAME = process.env.HUBOT_MQTT_USERNAME
PASSWORD = process.env.HUBOT_MQTT_PASSWORD
pub_topic = process.env.HUBOT_MQTT_PUBTOPIC || "pub_topic"
sub_topic = process.env.HUBOT_MQTT_SUBTOPIC || "sub_topic"
options =
username: USERNAME
password: PASSWORD
client = mqtt.connect(URL, options)
client.on 'connect', ->
console.log "Connected to #{URL}"
client.subscribe(sub_topic)
latest_topic = ""
latest_payload = ""
client.on 'message', (topic, message) ->
latest_topic = topic
latest_payload = message
module.exports = (robot) ->
robot.respond /pub (.*)$/i, (res) ->
msg = res.match[1]
client.publish pub_topic, msg
res.send "Send message: #{msg}"
robot.respond /show sub$/i, (res) ->
res.send "Latest sub message: topic -> #{latest_topic}, payload -> #{latest_payload}"
Hubot が受け付けるコマンドは「pub message」と「show sub」の 2 つになります
Hubot を起動すると同時に MQTT に接続しにいきます
MQTT の接続情報は環境変数で渡せるようにしています
( 実際に環境変数を渡して起動する方法は後述しています )
ローカルで Hubot の起動
Hubot に渡す環境変数が多いのでコマンドが長いですが、以下で起動できます
MQTT のブローカ情報やユーザ情報は適当に設定しているので各自の環境に合わせて変更してください
- export HUBOT_MQTT_PORT=1883 && export HUBOT_MQTT_HOST=”your.mqtt.broker” && export HUBOT_MQTT_USERNAME=user && export HUBOT_MQTT_PASSWORD=pass && export HUBOT_MQTT_PUBTOPIC=pub_t && export HUBOT_MQTT_SUBTOPIC=sub_t && ./bin/hubot -a shell -n hubot
問題なく起動できればターミナル上で動作確認してみます
動作確認
Pub/Sub できているかの確認は mosquitto-clients のコマンドを使って確認しました
- Publish
hubot> hubot pub hoge
hubot> Send message: hoge
$ mosquitto_sub -h your.mqtt.broker -p 1883 -t pub_t -u user -P pass
hoge
- Subscribe
$ mosquitto_pub -h your.mqtt.broker -p 1883 -t sub_t -u user -P pass -m "hoge"
hubot> hubot show sub
hubot> Latest sub message: topic -> topic, payload -> hoge
最後に
紹介は以上です
これで Hubot 上から MQTT に Pub/Sub することができるようになりました
あとはこれをベースにコマンドを修正するなり、Pub するペイロードをカスタマイズすればいいと思います
Tips
何点か
- 証明書を使った TLS での pub/sub には対応していません
- Subscribe の情報を表示するコマンドは Subscribe したデータの最新 1 つだけを表示するようになっています、リアルタイムで表示しているわけではありません
0 件のコメント:
コメントを投稿