MITメディアラボが開発したプログラミング言語学習環境であるScratchから、他サービスと連携できるか調べてみました。
すると、そのものずばりの記事がありました。
スクラッチからツイートするよ - Scratch(スクラッチ)を外部のプログラムなどとつなぐ「遠隔センサー接続」を解説する(その5)
@jishihaの記事でした。
たしかscratch2romoでは、iPhone上でwebサーバを起動して、scartchから呼び出しているはずなので、「ソースコード読めばヒントあるかな」と思っていた所でした。
そんな時に、解説を見つけたので感謝です。
Scratchから外部プログラムを呼び出す
ScratchはwebサービスのScratch2と、local PCで動かすScratch1.4があるのですが、今回はScratch1.4を使う必要があります。
Scratch1.4からlocal PC内の外部プログラムを呼び出す方法は、上記記事をご参照ください。
MQTT publishしてみた
遠隔センサー接続実施後、下記ブロックを用意し、「Hello from Scratch」部分をMQTTでpublishさえてみました
rubyスクリプトは下記
mqtt.rb
require 'rubygems'
require 'mqtt'
require "socket"
host = <FQDN>
topic = <topic>
token = <token>
# localhost の TTCPを42001に接続
socket = TCPSocket.open("localhost", 42001)
# MQTT
client = MQTT::Client.connect(:host => host, :username => topic, :password => token)
loop do
# 十分な長さのメッセージを読み取る
message = socket.recv(100)
# バイトで表示
str = message.unpack("H*")[0]
puts message.unpack("H*")[0]
# 最初の4バイトを削除
newStr = str[8, str.length]
convertStr = ""
# 123456を12 34 56形式に変換
newStr.each_char.with_index(1) do |s,i|
if i.even? then
print(s + " ")
convertStr << "#{s} "
else
print(s)
convertStr << "#{s}"
end
end
convertStr.chop!
# ascii codeを文字列に変換
ascii = convertStr.split.collect {|c| c.hex}.pack("C*")
p ascii
# MQTT publish
if ascii =~ /\"(.+)\"/ then
client.publish('message', '{"devices": ["' + topic + '"], "payload":"' + $1 + '"}')
end
end
MQTT subscribe側は下記のようになります。
data.payloadにScratch側で設定した文字列を受信することができました。
% mosquitto_sub -h <FQDN> -p 1883 -t <topic> -u <topic> -P <token> -d
Client mosqsub/1078-*** sending CONNECT
Client mosqsub/1078-*** received CONNACK
Client mosqsub/1078-*** sending SUBSCRIBE (Mid: 1, Topic: ***, QoS: 0)
Client mosqsub/1078-*** received SUBACK
Subscribed (mid: 1): 0
Client mosqsub/14959-*** received PUBLISH (d0, q0, r0, m0, '***', ... (160 bytes))
{"topic":"message","data":{"devices":["***"],"payload":"Hello from scratch","fromUuid":"***"}}
本当は、このままmyThingsやIFTTTと連携して、Twitter等の他サービス連携までやりたかったのですが、うまく連携まで確認できなかったので、今日はここまで。