1. 程式人生 > >scratch圖形化程式設計操作硬體

scratch圖形化程式設計操作硬體

一,簡介

scratch是一款又麻省理工開發的圖形化程式設計軟體,這款軟體提供了可以使用javascript與scratch互動的介面,同時提供了一個socket埠和一系列的命令與應用程式互動,這裡我們講解如何通過python與scratch互動

二,說明

之所以選擇python是主要基於以下幾個原因:
1,python是非編譯性語言,所以除非庫的提供者將不想開源的程式碼寫在C/C++,或者java等編譯性語言的程式碼中,然後通過python呼叫,一般情況下我們是可以看到原始碼的
2,scratch 對於使用python與它互動,有現成的python庫可以呼叫,這樣我們就不需要詳細瞭解scratch對外定義的繁瑣的命令結構,這樣沒有意義

三,原理

1,當scratch啟動的時候會預設開啟本機的42001埠作為伺服器端的socket接收應用程式請求(這個port只是預設的,可以修改)
2,我們通過本地socket連線到scratch,然後可以傳送一系列的命令與scratch互動,這樣我們就能通過scratch圖形化程式設計操作我們希望操作的任何東西,比如硬體

四,環境配置

說明:我實在ubuntu下面,可以在類似的linux發行版上面都行
1,安裝scratch:注意要安裝1.4版的,我在自己的機臺上面用下面這條命令安裝的就是1.4,如果有人安裝不是1.4版,我這裡暫時不敢保證
sudo apt-get install scratch
2,安裝scratch 的python庫
sudo apt-get install python-pip scratchpy
3,安裝之後在安裝目錄有一個scratch.py的python指令碼,可以檢視scratch.py的程式碼,這個裡面提供的通過python操作scratch的所有介面以及命令

五,scratch.py提供的介面

下面貼出scratch.py在我們這裡用到的部分程式碼:有興趣的可以看scratch.py的原始碼

import array
import errno
import itertools
import socket
import struct

class ScratchError(Exception): pass
class ScratchConnectionError(ScratchError): pass        

class Scratch(object):

    prefix_len = 4
    broadcast_prefix_len = prefix_len + len('broadcast '
) sensorupdate_prefix_len = prefix_len + len('sensor-update ') msg_types = set(['broadcast', 'sensor-update']) def __init__(self, host='localhost', port=42001): self.host = host self.port = port self.socket = None self.connected = False self.connect() def connect(self): """ Connects to Scratch. """ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: self.socket.connect((self.host, self.port)) except socket.error as (err, msg): self.connected = False raise ScratchError("[Errno %d] %s" % (err, msg)) self.connected = True def broadcast(self, msg): if getattr(msg, '__iter__', False): # iterable for m in msg: self._send('broadcast "%s"' % self._escape(str(m))) print "hjptestfor:",self._escape(str(m)) else: # probably a string or number self._send('broadcast "%s"' % self._escape(str(msg))) print "hjptestfor:",self._escape(str(msg)) def receive(self): return self._parse(self._recv())

1,我們可以看到使用的port埠是42001,是host是“localhost”(說明不支援遠端連線),當然我們可以用我們的應用程式做一個跳板,然後遠端操作scratch,這都是後話
2,我們也可以將上述程式碼翻譯成其他語言比如C語言等,當然既然已經有了這個庫也就沒有必要了,有興趣的作為一種嘗試練習

六,我們的例子

程式碼如下:

#filename:helloscratch.py
import scratch
try:
      s = scratch.Scratch()
      if s.connected:
            print "Connected to Scratch successfully"
      else:
            print "Connected to Scratch error"
except scratch.ScratchError:
      print "Scratch is  not opened or remote sensor connections aren't enabled"


try:
      print "broadcast begin"
      s.broadcast('hello scratch')
except NameError:
      print "Scratch: Unable to Broadcast"

while True:
      try:
            msg = s.receive()
            print "Scratch: receive:",msg
      except KeyboardInterrupt:
            print "GrovePi Scratch: Disconnected from Scratch"
            break

這段程式碼的主要功能是將scratch傳送過來的字串打印出來,為了操作硬體,我們可以自定義一套命令,比如i2c,address等,當收到這些字串的時候我們可以在我們的客戶端裡面操作硬體(當然這個例子裡面只是列印)
比如要操作i2c,只需要執行sudo apt-get install python-smbus就可以了,

七,執行效果

執行:首先手動啟動scratch,否則我們的客戶端會由於伺服器端不線上連線失敗
在shell下直接輸入:scratch 回車就啟動了scratch

然後在shell下執行我們的客戶端,就連線到了scratch:
suso python helloscratch.py
這樣我們就可以與shell互動了
比如我們加入下面這個模組
在scratch裡面的圖形程式設計

當我們點選旗幟的時候scratch圖形程式碼執行,在我們的客戶端收到112這個字串,效果如下:
helloscratch.py執行log

如果需要操作硬體,可以把在join裡面定義自己的命令:在接收到這些命令字串之後,緊接著操作硬體,這樣就起到了操作硬體的效果