前回はRapiroをカスタマイズして無線LAN対応させたので
今回は実際にWebと接続して任意のクライアントからRapiroを操作できるようにします!
方法としてはRapiro(Raspberry Pi)を起点にPush型にするか(RapiroをWebサーバ化する)
Pull型でRapiro側からWebにデータを取りに行くかの2パターンがありますが、
今回はPull型でデータ取得先にコマンド入力のデータがあれば
シリアル経由でRapiroを操作するフローで構築してみます。
cron使えば言語/フレームワーク問わないのですが
入出力がプラガブルで拡張性の高いhubot使えば色々便利そうだったので今回はコレを使います。
hubotと言えば以前にhubot-chatterを作ったのでChatter使ってRapiroを操作してみます!
Chatterに命令文書いたらrapiroが動く感じです。
1. Node.jsをRaspberry Piにインストール
Raspberry Piでapt-getでパッケージインストールしたら、yaomanインストールあたりのエラーでハマったのでPi用のバイナリを使ってインストールします。
$ curl -O http://nodejs.org/dist/v0.10.28/node-v0.10.28-linux-arm-pi.tar.gz
$ sudo tar --strip-components 1 -xzvf node-v0.10.28-linux-arm-pi.tar.gz -C /usr/local
2. hubotのインストール&ボット作成
まずはhubotのインストール$ sudo npm install -g yo generator-hubot
hubotの作成
$ mkdir hubot
$ cd hubot
$ yo hubot
$ npm install hubot-chatter
3. hubotスクリプトの作成
こんな感じのスクリプトをscripts/test.coffeeに設置SerialPort = require("serialport").SerialPort
serialPort = new SerialPort("/dev/ttyAMA0", {
baudrate: 57600
}, false)
serialPort.open (error)->
if error
console.log('failed to open: #{error}')
else
console.log('open')
module.exports = (robot) ->
robot.respond /RAPIRO (.*)$/i, (msg) ->
command = msg.match[1]
switch command
when "stop"
serialPort.write("#M0")
when "forward"
serialPort.write("#M1")
when "back"
serialPort.write("#M2")
when "right"
serialPort.write("#M3")
when "left"
serialPort.write("#M4")
when "green"
serialPort.write("#M5")
when "yellow"
serialPort.write("#M6")
when "blue"
serialPort.write("#M7")
when "red"
serialPort.write("#M8")
when "push"
serialPort.write("#M9")
else
serialPort.write("#M0")
さらに起動用のシェルファイルも作成
#!/bin/bash
export HUBOT_SFDC_USERNAME="test@example.com"
export HUBOT_SFDC_PASSWORD="hogefuga"
export HUBOT_SFDC_TOPIC="AllMessages"
export HUBOT_SFDC_POLLING_TYPE="streaming"
bin/hubot -a chatter
serialportもインストール
$ npm install serialport
4. Salesforce側の設定を行う
Rapiroを動かすということで即時性が求められる為、StreamingAPIを使う方式にしました。FeedItemは相変わらずStreamingAPIに対応していないので
FeedItemのInsertのDMLでカスタムオブジェクト(Message__c)を作成するようなトリガを組みました。
trigger FeedItem on FeedItem (before insert, after insert) {
if (Trigger.isAfter && Trigger.isInsert) {
List<Message__c> messages = new List<Message__c>();
for (FeedItem fi : Trigger.new) {
Message__c message = new Message__c();
message.ParentID__c = fi.ParentId;
message.Body__c = fi.Body;
message.User__c = UserInfo.getUserId();
message.FeedItemId__c = fi.id;
messages.add(message);
}
if (!messages.isEmpty()) {
insert messages;
}
}
}
この作成先であるMessage__cをPushTopicに登録してあげればStreamingAPIへの準備はOKです。
PushTopic pushTopic = new PushTopic();
pushTopic.ApiVersion = 31.0;
pushTopic.Name = 'AllMessages';
pushTopic.Description = 'All records for the Message__c object';
pushtopic.Query = 'SELECT Id, Name, ParentId__c, Body__c, User__c, FeedItemId__c FROM Message__c';
insert pushTopic;
ChatterとStreamingAPIの連携に関しては以下の記事が詳しいです↓
Force.com Streaming APIでChatterへの投稿を通知 - Appirio Japan
5. 実行
Rapiroに通電して、Raspberry Piにsshでログインし、3で作成したシェルファイルを起動します。その後、”hubot rapiro green”とFeedに投稿すると、こんな感じでhubotが動き出します!
“hubot rapiro stop”で止まります。