ラベル Cloud の投稿を表示しています。 すべての投稿を表示
ラベル Cloud の投稿を表示しています。 すべての投稿を表示

2016年8月1日月曜日

MODE の SmartModule から IFTTT の Maker に Webhook する方法

概要

MODE の SmartModule を使って IFTTT の Maker チャネルに Webhook を送信してみました
Maker でリクエストボティを使えるように変換してあげるのがポイントでした

環境

  • MODE 2016/08/01 時点
  • IFTTT 2016/08/01 時点

IFTTT で Maker レシピの作成

IFTTT で Maker チャネルを使ったレシピを作成します
今回は Maker チャネルでリクエストを受信したら (IF) Gmail にメールを送信してみます (Then)
mode_with_ifttt_creating_maker_recipe.png

「Event Name」は適当に設定して OK ですが、URL に使うのでそれっぽいのにしましょう
Gmail 側の設定は適当に設定しください

レシピが作成できたら Webhook 用の URL を取得します
mode_with_ifttt_checking_maker_info.png

これが取得できれば IFTTT での設定は OK です

mode2maker-proxy のデプロイ

このプロキシは MODE の SmartModule から送信された Json のボディ情報を Maker で使える形式に変更してくれます

今回は Heroku 上にデプロイします
Heroku ボタンがあるのでそれでデプロイしてください

あとは環境変数の設定をします

という感じで設定することで以下のように Json の変換をした上で、Maker にリクエストしてくれます

  • MODE からリクエストボディ
{
  "eventType":"abc",
  "eventData":{"light":"on"},
  "homeId":3,
  "timestamp":"2015-06-07T08:37:37.997281148Z",
  "originDeviceId":3
}
  • Maker にリクエストしてくれる Json のリクエストボディ
{
  "value1" : "abc",
  "value2" : {"light":"on"},
  "value3" : "on"
}

各 VALUE1, 3 の値は変換する Json のキー名を指定します
今回 VALUE3 に light を指定しています
light は Json のキー内には存在しません
その場合は eventData の中の Json を検索してキーがあればそのキーの値を設定してくれます
どこのキー名にも当てはまらない場合は null が設定されます

そして MAKER_URL の環境変数には IFTTT で作成した Maker チャネルの Webhook 用の URL を設定してください

MODE で SmartModule の作成

ここでのポイントはリクエストする URL を Heroku にデプロイしたプロキシアプリの URL を指定することです

自分は Heroku 上に kaka-mode2maker-proxy という名前でデプロイしているので、そのアプリの URL を SmartModule に指定しています

mode_with_ifttt_creating_smartmodule.png

Key は GEENRATE ボタンを押せば勝手に生成してくれます
これだけ気をつけて SmartModule は作成してください

動作確認

  • IFTTT の Maker を使ったレシピの作成
  • mode2maker-proxy のデプロイ
  • SmartModule の作成

が終わった準備 OK です
デバイスなりから MODE にイベントを送信してみましょう
するとプロキシが動作して Maker がコールされ Gmail が来ると思います

Gmail のメール本文の設定がデフォルトのままであれば以下のような内容で届くはずです
mode_with_ifttt_result.png

最後に

MODE + IFTTT の連携をしてみました
IFTTT が便利すぎるので通知系をやりたい場合はとりあえず IFTTT 経由しておけば安心だと思います

2016年1月16日土曜日

TinkerMode のスマートモジュール機能を使ってみた

概要

前回 TinkerMode を使ってデバイスの制御を行いました
今回は TinkerMode のスマートモジュールという機能を使ってみました
スマートモジュールは簡単に説明すると Webhook です
あるデバイスからのイベントが発生した際に、特定の URL に対して GET リクエストを送信することができます

環境

  • Mac OS X 10.10.5

今回は RaspberryPi 等の実際のデバイスを使って試していないので PC があれば OK です
ただ、前回行ったデバイスの登録や制御ができる環境は事前に構築しておいてください

Scriptr.io の登録

いきなり出てきましたが、Scriptr.io というサービスを今回使います
scriptr_top.png

Scriptr.io は任意の JavaScript を実行できるサービスで、スクリプトの実行を API (URL) で行うことができます
同様のサービスだと Parse.com のクラウドコード等があります

登録は簡単で Twitter や Github のアカウントをすでに持っていれば、それを使うこともできます
SNS サービスと連携したくない場合はメールアドレスを持っていれば、それを使って登録することもできます
自分は少しハマったのですが、Github のアカウントを使う場合には Github のアカウントのプロフィールでメールアドレスを Public にする必要があります
scriptr_registration.png

Scriptr.io でサンプルコードの作成

ログインできたら早速コードを作成します
今回は何でも良いので簡単な JSON レスポンスを返却するスクリプトを作成します

var http = require("http");
var log = require("log");
log.setLevel("DEBUG");

var name = request.parameters.myName
if (name != null) storage.local.theName = name
var ip = request.headers["x-forwarded-for"];
var requestObject = {
 "url": "https://scriptr.io/hello",
 "params": {"name": storage.local.theName, "ip": ip},
 "method": "GET"
}

log.debug("Access Remote IP : " + ip);
var response = http.request(requestObject);
if(response.status == "200"){
 var result = JSON.parse(response.body);
 return result
}

Scriptr.io のコンパネにログインすると「HelloDevice」というサンプルのスクリプトがあります
今回のスクリプトは、ほぼそれを流用しています
このスクリプトは https://scriptr.io/hello という Scriptr.io がデフォルトで提供するスクリプトがあり、そこにアクセスして取得できた JSON レスポンスを返却しています

追加で修正している箇所は log モジュールを require して独自のログを少し出すように修正しています

とりあえず今回は mySample という名前でスクリプトを保存しておきます

GET リクエスト作成

スクリプトを保存したら Scriptr.io のコンパネでスクリプトを実行してみましょう
実行ボタン ( Run ) があるのでそれをクリックすれば OK です
scriptr_execute_script.png

下段のペインに実行コマンドとレスポンスが表示されます
ここに記載されている POST の curl コマンドを GET 用のリクエストに変換します

スクリプトを実行するにはトークンが必要で POST の場合はヘッダにトークンを設定します
TinkderMode のスマートモジュールは POST のリクエストをコールすることができません
なのでこれを GET でコールできるように変更する必要があります
具体的には以下のように変更します

curl -X POST -H 'Authorization: bearer <Token>' 'https://api.scriptr.io/mySample'

curl -X GET 'https://api.scriptr.io/mySample?auth_token=<Token>&apsws.time=123456789'

パラメータの「auth_token」にトークンを設定します
また、apsws.time というパラメータにも適当な数字を設定します
ドキュメントにも記載がなかったので詳細はわかりませんが、適当な数字を設定しても通ったのでとりあえず、適当な数字を当て込んでいます

これでスマートモジュールの実行先の URL を作成することができました

スマートモジュールの作成

ここから TinkerMode での作業になります
まずスマートモジュールを作成します

Smart Modules -> New

で以下を設定します

  • Module ID・・・適当な名前を設定すれば OK (必須)
  • Description・・・スマートモジュールの説明を記載します (必須)
  • Command Webhook・・・今回は使いません
  • Event Webhook・・・先ほど作成した GET 用の URL を入力します

mode_create_smart_module.png

入力したら Save をクリックして保存します
これでデバイスからイベントが TinkderMode に対して発行されると指定した Event Webhook の URL にリクエストが送信されます

テスト実行

これで準備が整ったのでイベントを発行して挙動を確認してみます
TinkerMode でデバイスシミュレータを起動してイベントを発行します

Device -> 事前に作成したデバイスクラス -> 事前に登録したデバイス -> DEVICE SIMULATOR ( 別ウィンドウで開く ) -> Outgoing: Events

でイベントを登録します
今回はどんなイベントでもいいので適当に設定して「TRIGGER EVENT」をクリックしてイベントを送信します
mode_trigger_event.png

デバイスシミュレータ上では何が起きたか確認できないので、Scriptr.io に行ってアクセスログを確認してみます

コンパネの右上に「Logs」という項目があるのでクリックします
するとスクリプトに対するアクセスログが表示されます
ここに TinkerMode からのアクセスログがあれば OK です
scriptr_confirm_logs.png

ログを開いておけばリアルタイムで更新されるので、その状態でイベントを発行してもいいと思います

最後に

長文になりましたが以上です
とりあえず TinkerMode のスマートモジュールの挙動を確認することができました
リクエスト先として今回は Scriptr.io を選択しましたが、自信のサーバがあればそこでも OK ですし、データ保存系のサービスに直接リクエストしても良いと思います

ここから触ってみた所感を少し記載します
まず TinkderMode のスマートモジュールが GET でしかリクエストできないのは結構きついです
最近のクラウドサービスは REST-API なので POST や PUT が使えないとなると独自のラッパを実装してそこに GET リクエストを送った上でそこから POST や PUT を送信する必要が出てきます

あとは Scriptr.io 側の話ですが、npm で好きなモジュールを使えないのが痛いです
ここで例えば Parse.com やニフティクラウドモバイルバックエンドの Node.js SDK が使えれば Scriptr.io だけでデータを保存する機能を作ることができます
現状は Scriptr.io が提供する数個のモジュール (http, log, twitter, facebook など ) しか使えません
おそらくはセキュリティの関係だとは思いますが、これが好きな npm モジュールを使えるようになるとかなり応用が広がると思いました

参考サイト

2015年12月2日水曜日

TinkerMode 試してみた

概要

Tinker Mode は IoT 用のクラウドサービスで Tinker Mode に接続しているデバイスをスマートフォンや PC から制御できるようにすることができます
シミュレータを使って制御することもできますが、せっかくなので RaspberryPi を使って Tinker Mode に接続しスマホから L チカしてみました

環境

  • TinkerMode 2015/12/01 時点
  • node 4.2.1
  • mode-device ( npm module ) 1.0.3
  • iPhone 6 ( iOS 9.1 )
  • Raspberry Pi Type B Single Board Computer 512MB
  • Raspbian 8.0 (Jessie)
  • Kernel Version 4.1.7+

サインアップ

まずはサインアップします
名前/パスワードとメールアドレスを入力して確認のメールが来たら記載の URL をクリックすれば登録完了です
signup_mode.png

登録できたら早速コントロールパネルにログインしてみましょう
https://console.tinkermode.com/console/

サンプルプロジェクトの作成

サンプルプロジェクトを作成します
ログインするとすでに「Sample Project」というプロジェクトが 1 つ存在していると思います
今回はこれを使っていきます

制御用のサンプルアプリ Lumos をダウンロードする

このアプリを使って最終的に RPi の L チカを制御します

App Store から「Lumos」というアプリをダウンロードしてください
検索すると Lumos という同じ名前の他のアプリがいろいろと出てきてしまうので MODE INC が公開者になっているアプリをダンロードしてください

ダウンロードしたら早速アプリを開きましょう
アプリを開くといきなりプロジェクト ID を入力させられます
先ほど確認したサンプルプロジェクトのプロジェクト ID を入力すれば OK です
プロジェクト ID はコントロールパネルの

Dashboard -> OVERVIEW -> Project ID

で確認することができます
プロジェクトを開いているのであれば URL にも番号があるのでそれでも OK です

次にプロジェクト内に存在するユーザを登録します ( これはサインアップしたユーザとは違うユーザになります )
登録には電話番号が必要になります
Name と Phone number を入力したら Next で登録処理に進みます
電話番号は国別コードから入力する必要があるので、日本で試している場合は「+8109xxxxyyyy」みたいな感じで入力してください
入力した電話番号に SMS メッセージが届きます
そこに記載されている PIN コードを入力すれば登録完了です

Tinker Mode ではユーザの認証に電話番号による SMS 認証を採用しています
電話番号に記載の PIN コードを入力することで認証することができます

ここの流れは Getting Started の Install the Sample App を見ると画像もあるので、やり方のイメージがつかみやすいと思います

Home を作成する

このまま Lums のアプリ上で作成します
Home はデバイスやユーザを管理するものです

アプリにログインすると初めは Home の一覧になるので何もないと思います
右上に「+」ボタンがあるのでそこから Home を追加しましょう
名前とタイムゾーンを決定すれば OK です

制御するデバイスを Home に登録する

コントロールパネルでデバイスシミュレータを開きます
Sample Project にはすでにデバイス ( デバイスクラス ) も登録されているのでそれを使います

Devices -> smart_light -> DEVICE LIST -> 適当なデバイスを選択 ->
Device Simulator -> LAUNCH SIMULATOR

でシミュレータを起動しましょう
起動すると別ウィンドウで開きます
シミュレータの左ペインに「CLAIM MODE」というボタンがあるのでクリックします
claim_code.png

すると 300 秒間のカウントに入ります
この間に再度 Lumos のアプリ上で Home にデバイスの登録を行います

作成しておいた Home を選択して Devices を開きます
Home 追加時同様に右上に「+」ボタンがあるのでタップしてデバイスを追加します
デバイスを追加するには「Claim Code」が必要になります
これはデフォルトだとランダムに発行される文字列になります ( スクリーンショットの Claim Code は自分で変更したものになります )
Claim Code の確認は開いているシミュレータ上でもできます
コントロールパネルのデバイス一覧からも行えます
Claim Code を 300 秒間の間に入力してアプリ上で Add しましょう
エラーが発生しなければ登録成功です

一覧に出てこない場合は一旦 back して再度 Home を選択してみてください
登録したデバイスが表示されるはずです
ここまでできれば一旦アプリ上での作業は完了です

RPi 側の準備

ここからは RPi 側の準備になります
OS のインストールやネットワークの設定は事前に済ませておいてください

node をインストールする

最新の node が必要になります

Tinkder Mode を操作する Javascript SDK をインストールします

エラーなくインストールされれば OK です
執筆時点での SDK のバージョンは 1.0.3 でした
https://www.npmjs.com/package/mode-device

ソースコードを修正する

取得した app.js を修正します
修正するといっても API 認証のための情報を書き換えるだけです

Tinker Mode の API をコールするためには Device ごとに割り振られている DeviceID と API Key が必要になります
プロジェクトごとではなくデバイスごとなので別のデバイスを制御したい場合は、別の DeviceID と API Key に書き換えてください

DeviceID と API Key の取得はコントールパネルから行えます

Devices -> smart_light -> DEVICE LIST -> 適当なデバイスを選択

get_id_and_key.png

取得できたらソースを修正していきます
修正する箇所は app.js の 10, 11 行目です

var DEVICE_ID = 1;
var API_KEY = 'v1.cccc.bbbbbbbbbbbbbbbbbb.aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';

取得した Device ID と API Key に書き換えたら保存して終了しましょう

接続できるか試してみる

この状態で一旦 RPi から Tinker Mode に接続できるか試してみるといいと思います

  • node app.js

でスクリプトを起動しましょう

Connecting to wss://api.tinkermode.com:443/devices/1/command
Event is triggered
WebSocket Client Connected

となれば成功です
ほっておくと ping - pong のやり取りもはじまります

Lチカ用の配線をする

ブレッドボードを使って L チカ用の配線をしましょう
ここでは配線に関する詳細は省略します
Lチカ配線は過去にも紹介しているので参考にしてください
あとはググってもいろいろと情報がでてくると思います

一点だけポイントですが、GPIO は論理番号 4 番ピンを使ってください
app.js 内で 4 番 PIN を制御しているためです
もちろんスクリプトを修正して別の番号の PIN を制御するようにすれば別の PIN を使っても OK です

アプリシミュレータから LED を点灯させてみる

これで準備が整いました
では、アプリから LED を点灯させてみましょう
まずはアプリシミュレータを使って点灯させます
アプリも Sample Project 作成時に 1 つ存在するのでそれを使えば OK です

Apps -> controller_app -> App Simulator -> LAUNCH SIMULATOR

で別ウィンドウでシミュレータが起動します
スマホから Home を作成したと思うのですでにシミュレータ側にも Home があると思います
ないスマホで作成した方法と同様でいいので Home を作成してください

Home を選択すると右ペインに「Outgoing: Commands」というのが表示されます
これを使ってデバイス ( RPi ) に信号を送り LED をチカっとさせます
送信する信号の情報は以下の通りです
send_signal.png

Target のデバイス情報は Home に登録したデバイスがプルダウンで選択できるので、登録したデバイスを選択してください
プルダウンにデバイスが表示されない場合は、Home へのデバイス登録が失敗している可能性があります
再度 Claim Mode にして Claim Code を使って Home にデバイスを登録してください

情報が入力できたら「SEND COMMAND」で OK です
で、成功すると LED がチカっ光るはずです
なんかリモコンみたいな感じで初めは感動します
消灯する場合は送信する信号の Parameters を on : 0 にすれば OK です

Lumos アプリから LED を点灯させてみる

アプリの場合はトグルを ON/OFF するだけで LED が点灯したり消灯したりします
アプリにログインして Home を選択してデバイスの一覧を表示するとデバイスの右にトグルボタンが表示されていると思います
そのトグルを ON/OFF してみてください
LED がチカチカするはず、、、がしない

ちょっとだけソースを修正する必要があります
21, 22 行目で Tinker Mode から受け取る信号を if 文で切り分けている部分があります
そこを書き換えましょう
以下のようにすれば OK です

device.commandCallback = function(msg, flags) {
  if (msg['action'] == 'change') {
    var v = msg['parameters']['switch'] ? 1 : 0;
    led.writeSync(v);
  }
}

どうやら Lumos アプリから送信される信号は以下の JSON 情報のようでシミュレータから送られる情報とは異なるようです

{“action”:”change”, “parameters”:{“switch”:0}}

書き換えて再度 node app.js で起動して Lumos アプリからトグルを ON/OFF すればアプリから L チカを制御できるようになります

最後に

確かにおもしろいサービスだと思いました
おそろく制御の情報はすべて WebSocket でやり取りしているのでほぼリアルタイムに行えます
今回は GPIO の制御をしましたが、逆に言えば GPIO の制御ができるデバイスは全て Tinker Mode から制御できるということになります

参考サイト

Tips

iPhone アプリの「Lumos」で制御したい場合はプロジェクト配下にあるアプリ名が「controller_app」でなければなりません
一度プロジェクトを削除した場合などで Lumos を使いたい場合はアプリ名を必ず上記にしてください

2015年2月21日土曜日

CloudMQTTを使ってみた

概要

MQTT as a Service であるCloudMQTTを使ってみました
サインアップからRubyでのサンプルの動作まで実施してみました
あと最後に軽く考察しています

環境

  • CloudMQTT 2015/02/20時点
  • CentOS 6.6 64bit (Final)
  • Ruby 2.2.0

試す

サインアップ

まずはサインアップします
CloudMQTTのサイトトップにアクセスして右上のメニューの「Control Panel」をクリックします
home.png

ログイン or サインアップする画面になるので「Sign Up」側にメールアドレスを入力します
signup.png
メールアドレスを入力して「Sign Up」をクリックするとサインアップ用のURLが記載されたメールがくるのでURLにアクセスしてサインアップします

サインアップ画面では

  • E-mail
  • Company name
  • Address
  • Country
  • Password
  • Confirm password

の項目が必須になります
input_account_info.png

入力が完了したら「Submit」をクリックしてサインアップを完了しましょう

インスタンス作成

インスタンスと呼ばれるMQTTの器を作成します
インスタンスにはプランがあり無料から$299の有料版まで全4プランがあります
今回は無料プランの「Cute Cat」のインスタンスを作成します

Control Panelからインスタンスを作成します
「+Create」ボタンがあるのでクリックします

インスタンス情報を入力する画面に遷移するので必要な情報を入力してインスタンスを作成します
input_instance_info.png

  • Name・・・好きなインスタンス名を入力してください
  • Data Center・・・Northern Virginia と Ireland の2つから選択できます、どちらでもOKです
  • Plan・・・今回は「Cute Cat」を選択します

必要な情報が入力できたら「Create」をクリックしてインスタンスを作成しましょう

Control Panelに戻ると作成したインスタンスが存在することが確認できると思います
list.png

「Details」をクリックするとインスタンスの詳細を確認することができます
ここにMQTTに接続するための情報(アクセスポイントやID/PW)が記載されてます

Rubyから呼び出してみる

さて、作成したインスタンスに対してMQTTプロトコルでアクセスしてメッセージのpublishとsubscribeを実施してみたいと思います
CloudMQTTはpublisherとsubscriberのためのSDKが充実しており様々なプログラム言語やPaaSサービス(HerokuやAmazon Kinesis)からCloudMQTTにアクセスすることができるようになっています
今回はCentOS上にインストールしたRubyからCloudMQTTにアクセスしてみたいと思います

必要なGemのインストール

gem install mqtt

CloudMQTTが用意しているGemではなく既存のMQTTライブラリを使うことでアクセスすることができます

Publisher

Publisherのソースコードは以下のとおりです

  • publisher.rb
require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

MQTT::Client.connect(conn_opts) do |c|
  # publish a message to the topic 'test'
  c.publish('test', 'Hello World')
  sleep 1
end

testというトピックに対して1つのメッセージを送信します
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
でアクセスするURLを指定しています
環境変数のCLOUDMQTT_URLにアクセスするURLをセットしてrubyを実行するかPlease input your MQTT URLにControl Panelに表示されているURLの部分を貼り付けてもOKです

Subscriber

subscriberのソースコードは以下のとおりです

  • subscriber.rb
require 'mqtt'
require 'uri'

# Create a hash with the connection parameters from the URL
uri = URI.parse ENV['CLOUDMQTT_URL'] || 'Please input your MQTT URL'
conn_opts = {
  remote_host: uri.host,
  remote_port: uri.port,
  username: uri.user,
  password: uri.password,
}

MQTT::Client.connect(conn_opts) do |c|
  # The block will be called when you messages arrive to the topic
  loop do
    c.get('test') do |topic, message|
      puts "#{topic}: #{message}"
    end
  end
end

Subscriberは無限ループしてtestというトピックに入ってきたメッセージを常に取得するようにします
アクセスURLに関してはpubliser.rbのときと同じです

実行してみる

まず先にsubscriber.rbを起動します
無限ループになるのでターミナルは返ってこないと思います

次にpublisher.rbを実行します
すると先に起動させておいたsubscriber.rbのターミナルの方にpublishしたメッセージの情報が表示されると思います

[root@localhost cloud_mqtt]$ ruby subscriber.rb
test: Hello World
test: Hello World

...

subscriber.rbを終了する場合はCtrl+cでOKです

その他Tips

CloudMQTTには他にも便利な機能があります

「Users and ACL」はトピックに対してアクセス制限を設けることが出来る機能で例えばAというユーザはtestというトピックに対してはsubscribeしかできないなどの設定ができます
作成したユーザを使用する場合はアクセスURLに記載されているID:PWの部分を変更すればOKです

mqtt://ID:PW@m11.cloudmqtt.com:11111

実際に試してみるとわかりますが、例えば「Read Access」のみにした場合はpublishできなくなります
Rubyスクリプトで試した場合の挙動ですが特にエラーは返却されずメッセージが投入されずに終了しました

「bridge」という機能は他のMQTTサービスにメッセージを転送する機能です
CloudMQTT側のあるトピックにきたメッセージをリモート側の指定したトピックに転送できます
ちょっとこの機能は詳細に試せていないので説明に自信がないです、すいません

あとは「Amazon Kinesis」という機能があり、おそらくこれもCloudMQTTで受け取ったメッセージをKinesisに転送できる機能かと思います

などなど様々な機能が用意されています

最後に

CloudMQTTは無料で使える割には機能が充実していると感じました
ただ無料プランは最大が10同時接続で転送量が10 Kbit/sなので公開するサービスで使うにはちょっとスペック的に厳しいかなと思います
今回みたいに試してみるだけならぴったりだと思います

CloudMQTTは非常にユーザフレンドリーに作られているような気がしました
機能も多いしドキュメントも充実しているし、導入のハードルも低いです
他のPaaSサービスとのシナジーもちゃんと考えられているのも素晴らしいと思います

あとインスタンスのステータスを確認できる画面があり、そこで裏側の情報も見れたのですが、どうやらCloudMQTTはmosquittoというオープンソースのMQTTブローカーを利用しているようです
instance_status.png

参考サイト

2015年1月23日金曜日

PubNub使ってみた

pubnub

概要

PubNubとは「メッセージングAs a Service」と呼ばれる分野のサービスでメッセージングするための中央サーバ(ブローカー)をホスティングしてくれるサービスです
よくpub/subやMQTTといったコンテキストで登場するサービスかと思います
今回は簡単なJavaScriptのサンプルが動作するまでの使い方を紹介したいと思います

環境

  • Mac OS X 10.8.5
  • Firefox 35.0(JavaScript + HTML)
  • PubNub 2015/1/22時点

使ってみた

アカウントの作成

利用するにはアカウントの登録が必要です
サイトにアクセスして「GET STARTED」をクリックします
top.png

必要な情報(ユーザ名、パスワード、会社名、電話番号、メールアドレス)が結構多いですが必須なので入力して「CREATE FREE ACCOUNT」をクリックします
regist.png

アカウントが作成できるとダッシュボード的なものに遷移します
dashboard.png

今回はQuick Start Guideを実施してみたいと思います

Get Started

サンプルコードはJavaScript+HTMLで書いて動作確認はブラウザ(Firefox)を使います

PubNubクライアント(SDK)のインストール

インストールと言っても公開されているJavaScriptをHTMLから読み込むだけです
以下、インストールしている部分のサンプルのコードです

  • test_pubnub.html
<html>
<head>
<title>test pubnub</title>
</head>
<body>
<h3>Welcome PubNub Test</h3>
<!-- Include the PubNub Library -->
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>

<!-- Instantiate PubNub -->
<script type="text/javascript">
var PUBNUB_demo = PUBNUB.init({
  publish_key: 'Your Publish Key Here',
  subscribe_key: 'Your Subscribe Key Here'
});
</script>
</body>
</html>

Your Publish Key HereYour Subscribe Key Hereにキー情報を入力します
キー情報はダッシュボードで確認することができます
ダッシュボードにアクセスしPublish KeySubscribe Keyをそれぞれ入力します
key_info.png

今回はpublisherとsubscriberの2つのコードを作成します
2つのコードはこれを元に作成していきたいと思います

とりあえずこの状態でHTMLファイルをブラウザで開いてFirebug等のコンソール機能を使ってみると通信している状況がわかります
GETの200が返ってきていれば設定したキーの情報が合っていることがわかります
firebug_console.png
ブラウザを開いていると定期的に通信を続けるので確認できたら閉じてしまってください

Subscriberの作成

Subscriberを作成します
Subscriberはメッセージを受信する側のことです

先ほどのインストール時に作成したHTMLファイルをベースにSubscribeするためのコードを追記します
追記した全体のコードは以下の通りです

  • test_pubnub_sub.html
<html>
<head>
<title>test pubnub</title>
</head>
<body>
<h3>Welcome PubNub Test</h3>
<!-- Include the PubNub Library -->
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>

<!-- Instantiate PubNub -->
<script type="text/javascript">
var PUBNUB_demo = PUBNUB.init({
  publish_key: 'Your Publish Key Here',
  subscribe_key: 'Your Subscribe Key Here'
});

//Subscribe to the demo_tutorial channel
PUBNUB_demo.subscribe({
  channel: 'demo_tutorial',
  message: function(m){console.log(m)}
});
</script>
</body>
</html>

こいつを使ってメッセージを受信します

Publiserの作成

Publisherを作成します
Publisherはメッセージを送信する側のことです

こちらもベースのコードに追記するだけです
全体のコードは以下です

  • test_pubnub_pub.html
<html>
<head>
<title>test pubnub</title>
</head>
<body>
<h3>Welcome PubNub Test</h3>
<!-- Include the PubNub Library -->
<script src="https://cdn.pubnub.com/pubnub.min.js"></script>

<!-- Instantiate PubNub -->
<script type="text/javascript">
var PUBNUB_demo = PUBNUB.init({
  publish_key: 'Your Publish Key Here',
  subscribe_key: 'Your Subscribe Key Here'
});

// Publish a simple message to the demo_tutorial channel
PUBNUB_demo.publish({
  channel: 'demo_tutorial',
  message: {"color":"blue"}
});
</script>
</body>
</html>

Subscriberとほぼ変わりませんがPublisherもこれでOKです

動かしてみる

作成したSubscriberとPublisherを動かしてみます

まずはSubscriberを動かします
test_pubnub_sub.htmlをブラウザで開きましょう
特に何も起きませんがまずはこれでOKです
一応firebugのコンソールで通信状況を確認して「200 OK」になっていることを確認してください

次にtest_pubnub_pub.htmlを動かします
もう1つブラウザを開くかタブを作成してファイルを開いてください
ファイルを開いた瞬間メッセージが送信されます
送信されるメッセージは「{color=”blue”}」という簡単なJSON情報です

メッセージが送信された瞬間Subscriber側のブラウザでコンソールを開くとメッセージが送信されていることがわかると思います
message.png
上記のようになれば、ちゃんとSubscriber側でメッセージを受信できていることになります

いちいちコンソールをみるのが面倒という場合にはsubscribeメソッドを以下のように書き換えればHTMLとしてブラウザ上に表示されます

//Subscribe to the demo_tutorial channel
PUBNUB_demo.subscribe({
  channel: 'demo_tutorial',
  message: function(m){
    console.log(m)
    target = document.getElementById("output");                                                                  
    target.innerHTML = m.color;
  }
});

今回の紹介は以上です

送信しているメッセージのサイズが小さいということもありましたが、あまりネットワークのレイテンシーを感じることはありませんでした
今回、紹介したのは簡単なpub/subメッセージングのサンプルでしたが、他にも

  • 溜めたメッセージを解析するサービスや
  • iOSやAndroidのメッセージをプッシュ送信できるサービス

といった様々なバックエンドサービスを提供してみたいなので興味があれば触ってみるといいと思います
SDKもJavaScript以外にたくさんのSDKを提供しているのでいろんなクライアントで使えそうです

2015年1月15日木曜日

MQTT as a Serviceの「sango」を使ってみた

sango_logo

概要

MQTT as a Serviceであるsangoを使ってみました
MQTTとは非常に軽量なメッセージングプロトコルでIoTやM2Mといったコンテキストで最近聞かれるようになりました
技術自体は1999年にスタートしており歴史があります
ここではMQTTに関しては詳しい説明はしませんがWeb上に多くの情報があるので興味のある方は調べてみてください

sangoはMQTTを簡単に使うことができるサービスです
今回はサービスの登録から簡単なメッセージのやり取りができるRubyのサンプルまでを紹介します

環境

  • Mac OX X 10.8.5
  • Ruby 2.1.2p95 (クライアント)
  • ruby-mqtt 0.3.1 (クライアント)
  • sango 2015/1/15時点

サービス登録

まずはサービスサイトにアクセスします
アクセスすると「新規登録/ログイン」というボタンがあるのでクリックします
するとGithubアカウントでサインアップするように求められるのでGithubのアカウントを使ってサインアップします
(当たり前ですがGithubアカウントがない場合は作成しておいてください)

ログインするとsangoのダッシュボードにアクセスします
アクセスするとMQTTのbroker(サーバ)情報が表示されていると思います
dashboard.png

これでもうMQTTを使うための準備は整いました
トピックとかWebSocketとかいろいろと気になるワードもありますがまずは使ってみます

サンプルクライアントの作成と実行

gemのインストール

gem コマンドでインストールします

gem install mqtt

無事インストールできればOKです

サンプルクライアント

pub_sango.rbとsub_sango.rbという2つのスクリプトを作成します
publish(メッセージ送信)をpub_sango.rbで実行しsubscribe(メッセージ受信)をsub_sango.rbで実行します
まずはサンプル全体です

  • pub_sango.rb
require 'mqtt'

MQTT::Client.connect(
                     :host => 'lite.mqtt.shiguredo.jp',
                     :port => 1883,
                     :username => 'Please input your username',
                     :password => 'Please input your password') do |c|
  c.publish('Please input your topic', 'message')
end
  • sub_sango.rb
require 'mqtt'

MQTT::Client.connect(
                     :host => 'lite.mqtt.shiguredo.jp',
                     :port => 1883,
                     :username => 'Please input your username',
                     :password => 'Please input your password') do |c|
    # If you pass a block to the get method, then it will loop
    c.get('Please input your topic') do |topic,message|
    puts "#{topic}: #{message}"
  end
end

ポイントを説明します

sangoへの接続

まずsangoにコネクションするときに「host」「port」「username」「password」を指定する必要があります
これらはsangoのダッシュボードで確認することができ、それぞれ

  • host・・・ダッシュボードの接続先のホスト名の部分を入力
  • port・・・ダッシュボードの接続先のポート部分を入力
  • username・・・ダッシュボードのユーザー名を入力
  • password・・・ダッシュボードのパスワードを入力(パスワードを表示するには鍵マークをクリックします)

を入力すればOKです、サンプルコード中の情報はダミーなので適宜、ダッシュボードの値に変更してください
これらの情報はpublisherとsubscriberそれぞれのスクリプトで入力する必要があります

usernameとpasswordに関してはすべてのbrokerで必要というわけではありません、sangoに関してはパスワード認証でセキュリティを高めている感じです

トピックの指定

トピックとはメッセージを保存しておくための器のようなものでメッセージを送受信する際はトピックを指定します
今回はpublishメソッドとgetメソッドの引数にトピックを指定する必要があります
指定するべきトピックの情報もsangoのダッシュボードで確認することができ「アクセス先トピック」の部分を入力してください

トピックの指定にはワイルドカードが存在し「#」を指定するとすべてのトピックという意味になります
おそらくsangoのダッシュボードで確認できるトピック名は「username/#」と言う表示になっており、これを指定するとすべてのトピックに対してメッセージを送受信することになります

「#」の部分は好きな文字列に変更することができます
例えば「username/test」という風にpublishメソッドの引数に指定すれば「username/test」という1つのトピックにだけメッセージが送信されることになります
もちろんgetメソッドの引数にも同じトピックを指定しないと送信したメッセージを受信することができません

こんな感じで「#」の部分は好きなトピックを指定してあげてください

サンプルの実行

必要な情報を入力したらサンプルを実行してみましょう
ターミナルを2つ起動しておいてください

まずはsub_sango.rbを先に実行しておきます
するとメッセージの待機状態に入ります

ruby sub_sango.rb

この状態でpub_sango.rbを実行してみましょう

ruby pub_sango.rb

するとsub_sango.rb側で待機していたコンソールにpublishしたメッセージが表示されると思います
更にpub_sango.rbを実行するとまた送信したメッセージが表示されると思います
このようにsubscriberは実行されると常に接続状態となり、publisherからのメッセージの送信を常に待機しています
ちなみにこの状態でsangoのダッシュボードを確認するとコネクション数が1/6になっていることを確認できると思います
number_of_connection.png

超簡単ではありますが今回のサンプルは以上です
今回はWillやRetainといったメッセージングに特化した機能に関しては全く触れませんでしたがMQTTにはメッセージングに特化したシンプルで強力な機能がたくさんあります
そのあたりWebにいろいろと情報があると思いますので興味のある方は調べてみるといいと思います

参考サイト

2012年10月22日月曜日

ブラウザで気持ち悪いスライドが作れるサービス「prezi」を試してみた

①ユーザ登録

http://prezi.com/index/

でユーザ登録します
お持ちのfacebookアカウントと連携できるので、作成したpreziはすぐに誰かと共有することができます

無料登録も可能ですが、有料版にするとより充実したサービスを受けられるようです

http://prezi.com/pricing/

主にはストレージの容量やオリジナルのロゴ、githubのようなプライベート空間も持てるようです

②スライド(prezi)の作成



マイページのようなページから「New prezi」を押下します
TitleとDescriptionを設定するダイアログが出現するので入力します
入力すると画面が遷移して、templateを選択するダイアログが表示されるので選択しましょう
自分はBrainstormingを選択しました



preziを編集できる画面に遷移します
基本的にはすべてここで編集ができます

左したに各スライドのOverviewがあるのでそれを選択するとそれぞれのスライドが編集できるようになります

③閲覧
編集が完了したら左上にある「show」ボタンを押下すると作成したスライドが閲覧できます
というわけで自分が5分くらいで作成したpreziですw

http://prezi.com/dp-yil74qchz/kakakikeke-test-prezi/

ほぼ何もしていないですが、このインパクトwすごいw
ほかにも音を入れたり、パワーポイントをインポートすることもできるので既存のスライドも恩知を受けることができそうです

④他に気になったこと
  • アイコンはfacebookのやつしか設定できない
  • 無料版だと必ずパブリック公開になってしまう
  • slide-shareとかとの連携はないのかなー


以上ですー
インパクトあるプレゼンがしたい場合には非常に重宝しそうです
お試しあれ