2017年2月8日水曜日

Hubot で MQTT を使う方法

概要

単純な 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 件のコメント:

コメントを投稿