LoginSignup
6
3

More than 5 years have passed since last update.

ScratchからMQTT publishする

Posted at

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さえてみました
scratch.png

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等の他サービス連携までやりたかったのですが、うまく連携まで確認できなかったので、今日はここまで。

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3