Introduction
The Scratch development platform is a great way for younger coders to get into computer programming with it’s simple “lego brick” style of drag and drop code construction. However interfacing hardware to it can be a little bit tricky (although not totally impossible).
One feature of Scratch that can be very useful is the mesh network feature which provides a mechanism for broadcasting messages and sharing variables (as “sensor-updates”) via standard network sockets.
This feature means that practically any modern computer language (python,c,c++,java,php to name but a few) could be used to interface to a scratch session via the mesh. For example these languages can be used to directly interface other hardware such as game controllers (wii remotes, console game pads etc.), to scratch via the mesh network.
There are two little wrinkles in this plan however. Firstly because the program is acting as a proxy between the hardware and scratch via a network connection the response can be sluggish. Press button here and wait half a second plus before scratch responds. This isn’t the nanosecond responses that console games expect in “real world” game titles, but this is scratch games, not the next multinational block buster game.
The second wrinkle is that you have to turn on the Mesh networking. Not the hardest thing to do in the world, but one should be aware of what mesh networking is doing in the background. For one thing its allowing anything that understands the Mesh networking protocol (which I will be explaining later in this article) to access variables in your scratch session without a single nod or wink to authentication or security (because frankly mesh networking on scratch has none). If you think of a scratch variable holding one of your private emails then switching on mesh networking would allow another computer on the same local network to access that email. Worse still if you open up port 42001 on your firewall then potentially anyone on the Internet could access your scratch session. The good news here is that by default it is highly unlikely that your firewall will have opened up port 42001 to any machine on your local network (let alone one used by a primary school child). However it is possible to do this through your firewall management software and there maybe a point where you would want to consider a school-to-school project link. If that opportunity does ever arise, open up your firewall to port 42001, do the exercise, close down access to port 42001, job done.
Having said all that, the reality is that you will not (should not) be doing anything that sensitive with scratch. By making you aware of the minor risks and dangers in opening up mesh networking (when compared to the benefits that it brings to young coders discovering new ways to do things like inter process communication), I am hoping that you will be able to appreciate the issues involved and head them off in the more controlled environment of the classroom. The most likely scenario is when some bright kid realised that they can snoop on another kids classroom project by connecting to his/her mesh. If that happens credit them for having a deeper understanding of how mesh network works with Scratch… but also take some time to explain to them the ethical issues of doing such things “unannounced” with a hope that they will grow up to be network security consultants not master cyber criminals…..
Most importantly be aware of how it works yourself. If you know how to detect it (and hopefully this article will explain it well enough for you to understand) then it probably will never happen. And even an “up front” lesson on ethical computing would not go amiss. Give them the old spiderman pep talk “with great power comes great responsibility ….”
Turning Mesh On
I could write a really boring sub section on this but frankly M.I.T’s own instructions for doing this pretty much cover it, after all they did develop Scratch so they should have an idea or two about how it works! See: http://wiki.scratch.mit.edu/wiki/Mesh
The only other thing I would add to this from my own personal experience is that while turning mesh networking on for Scratch on Linux based systems like the Raspberry Pi you will need to run it as root (sudo scratch) from the console. If you don’t do this it will probably freeze up as the “save” stage and you will have to follow the instructions all over again.
Once you have updated the image with mesh enabled you will be able to switch it on/off from within any scratch session started as a “normal” user via the usual desktop shortcut link.
My Python ScratchListener Class
I have adopted and adapted other peoples work in constructing my own “ScratchListener” class. The code is meant as a test piece framework for someone to add new features to or interface new devices to scratch
from array import array
import threading
import struct
import socket
import time
import sys
class Scratch():
def __init__(self):
PORT = 42001
HOST = 'localhost'
if not HOST:
sys.exit()
print("connecting...")
self.scratchSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.scratchSock.connect((HOST, PORT))
print("connected")
def send(self,cmd):
print(cmd)
head = len(cmd).to_bytes(4,byteorder="big")
self.scratchSock.send(head + cmd.encode("utf-8"))
def broadcast(self,message):
self.send("broadcast %s" % message)
def update(self,variable,value):
self.send("sensor-update \"%s\" %s" % (variable,value))
def recv(self):
return(self.scratchSock.recv(1024).decode("utf-8",'replace'))
class ScratchListener(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
PORT = 42001
HOST = 'localhost'
if not HOST:
sys.exit()
print("connecting...")
self.scratchSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.scratchSock.connect((HOST, PORT))
print("connected")
def run(self):
while(True):
data = self.scratchSock.recv(1024)
length = struct.unpack(">l",data[0:4])[0]
pdata = data[4:].decode("utf-8")
if(length != len(pdata)):
print("Data Length Missmatch on received data")
return
print("Data Received %d %s" % (length,pdata))
self.process(pdata)
def process(self,pdata):
if("sensor-update" in pdata):
print("Sensor Stuff")
parts = pdata.split(" ")
variable = (parts[1])[1:-1]
val = (parts[2])
exec("%s_temp = %s" % (variable,val))
print(external1_temp)
def send(self,cmd):
print(cmd)
head = len(cmd).to_bytes(4,byteorder="big")
self.scratchSock.send(head + cmd.encode("utf-8"))
def broadcast(self,message):
self.send("broadcast %s" % message)
def update(self,variable,value):
self.send("sensor-update \"%s\" %s" % (variable,value))
def recv(self):
return(self.scratchSock.recv(1024).decode("utf-8",'replace'))
# Main....
if(__name__ == "__main__"):
scratch = ScratchListener()
scratch.start()
external1 = 0
while(True):
#scratch.send("broadcast broadcast")
#scratch.send("sensor-update \"external1\" %d " % external1)
#scratch.send("sensor-update \"external2\" %d " % external1)
#scratch.send("set variable \"external1\" to %d" % external1)
#scratch.send("broadcast hello")
#scratch.broadcast("broadcast")
#print(scratch.recv()[4:])
scratch.update("external1","%d" % external1)
#scratch.broadcast("broadcast")
time.sleep(5)
external1 = external1 + 1
http://www.nikeairmaxfreedom.com nike air max 2015