自製Scratch2擴充功能--傳送指令與接收資料

透過Scratch 2.0 Offline Editor的「實驗性HTTP 擴充功能」匯入擴充功能,自製Scratch擴充功能可以傳送資料,也可以接收資料。

本程式碼參考s2aio(https://github.com/MrYsLab/s2aio)進行修改,完整程式碼放置於https://github.com/jang0820/Scratch2-Extension-Hello,需要事先安裝Scratch2.0 Offline Editor,Python3與Python3模組(aiohttp與asyncio),若s2aio可以執行,本程式應該也可以執行。

Step1)建立Scratch 2.0的擴充檔。

第5到9行:傳送區塊,第6行為"",表示為傳送指令的程式區塊,第7行顯示名稱「你好嗎」,第8行使用send_hi可以傳送資料給網頁伺服器,傳送給網址http://127.0.0.1:50209/send_hi。

第10到14行:接收區塊,第11行為"r",表示為可回傳資料的程式區塊,第12行顯示名稱「你好嗎結果」,第13行使用return_hi為鍵值(key)回傳資料給Scratch。

以下檔案命名為s2aio_zh_TW.s2e。

Step2)使用Scratch 2.0 Offline Editor匯入s2aio_zh_TW.s2e轉換成s2aio_base_zh_TW.sb2

在Scratch 2.0 Offline Editor,按著Shift鍵,點選「檔案->匯入實驗性HTTP 擴充功能」,將擴充設定檔s2aio_zh_TW.s2e匯入,在「更多積木」會多出以下積木,「你好嗎」由s2aio_zh_TW.s2e的第5到9行產生,「你好嗎結果」由s2aio_zh_TW.s2e的第10到14行產生,接著點選「檔案->另存」指定檔名「s2aio_base_zh_TW.sb2」。

結果如圖

Step3)使用Python建立web server與Scratch互動

Scratch2的實驗性HTTP 擴充功能使用web server進行互動,本機需要建立一個web server才能與Scratch2的實驗性HTTP 擴充功能互動。

(A) Scratch2傳送指令到電腦

點選「你好嗎」Scratch2會去瀏覽http://127.0.0.1:50209/send_hi,所以要建立一個web server連接埠設定為50209,將對應程式寫在send_hi網址,這就是擴充檔s2aio_zh_TW.s2e的第5到9行所產生「你好嗎」積木的運作方式。

(B)回傳資料給Scratch2

Scratch2會不斷的瀏覽網址http://127.0.0.1:50209/poll,每秒會瀏覽幾十次,所以如果資料要回傳給Scratch2,只要在poll網址寫入資料,資料以key-value方式呈現,並在擴充檔s2aio_zh_TW.s2e指定key,擴充檔s2aio_zh_TW.s2e的第10到14行所產生「你好嗎結果」,指定key為「return_hi」,

只要在poll網址寫入「return_hi hello」接著換行,就可以將資料送給Scratch2。

(C)使用Python建立web server

使用aiohttp建立web server,連接埠為50209(第12行),網址poll呼叫函式poll(第8行),網址send_hi呼叫函式send_hi(第9行),啟動本機的Scratch2(第15與17行)。

函式poll的作用,Scratch會定時瀏覽網址poll,就會驅動poll函式,poll函式將poll_reply設定給total_reply(第6行),清空poll_reply(第7行),使用函式Response將total_reply回應給Scratch2(第10到11行)。

函式send_hi的作用,當接收到程式區塊「你好嗎」就會瀏覽網址send_hi,就會呼叫函式send_hi,就會在poll_reply串接「return_hi hello」,接著換行,這個訊息會被函式poll回傳給Scratch,如此達成Scratch與本機web server互動。

完整程式碼(檔案命名為hello.py)

Step4)執行Python程式

在命令提示字元,使用「python hello.py」執行程式,會自動啟用web server接著自動Scratch2,就可以開始撰寫Scratch程式,如下。

點選開始執行貓咪就會說出「Hello」,如下圖。