Als Beispiel für die Erklärung hier wird die Methode zur Verwendung der Sprachsynthese und Spracherkennung in der Scratch 2-Offline-Version unten zusammengefasst.
Fügen Sie außerdem den Code, der in der folgenden Beschreibung angezeigt wird, in github ein.
Erklärung PDF In Scratch Extension Page Wenn Sie HTTP-9-11.pdf) lesen, heißt es, dass Sie Blöcke hinzufügen können, indem Sie eine Datei im JSON-Format mit der Erweiterung ".s2e" erstellen und lesen. (Es spielt keine Rolle, um welche Erweiterung es sich handelt, aber es scheint, dass Sie .s2e
verwenden sollten.) Im Folgenden werde ich versuchen, das in dieser Erklärung angegebene Beispiel zu verwenden.
test.s2e
{ "extensionName": "Extension Example",
"extensionPort": 12345,
"blockSpecs": [
[" ", "beep", "playBeep"],
[" ", "set beep volume to %n", "setVolume", 5],
["r", "beep volume", "volume"],
]
}
Speichern Sie dies in einer Datei namens test.s2e
. Wenn Sie die Umschalttaste gedrückt halten und [Datei] in Scratch auswählen, wird [Experimentelle HTTP-Erweiterung laden] angezeigt. Wenn Sie also die dort gespeicherte Datei test.s2e auswählen und laden, wird sie mit Sicherheit blockiert. Wird hinzugefügt werden!
Das? Der Kreis neben "Erweiterungsbeispiel" ist rot.
Laut Erklärung PDF fordert Scratch etwa 30-mal pro Sekunde eine Abfrage an `` GET / poll Ich sende `an den Helfer, aber es scheint rot zu werden, wenn keine Antwort darauf erfolgt. Wenn der Helfer reagiert, wird er grün.
Installieren Sie aiohttp mit $ pip install aiohttp
und erstellen Sie das folgende Programm (testhelper.py).
testhelper.py
from aiohttp import web
async def handle_poll(request):
return web.Response(text="OK")
app = web.Application()
app.router.add_get('/poll', handle_poll)
web.run_app(app, host='127.0.0.1', port=12345)
Ich werde es versuchen.
> python testhelper.py
======== Running on http://127.0.0.1:12345 ========
(Press CTRL+C to quit)
Übrigens, wenn ich auf den Bildschirm von Scratch schaue ... Oh, er wurde grün!
Für alle Fälle versuchen Sie GET from bash mit nc.
$ nc localhost 12345
GET /poll HTTP/1.1
Wenn Sie damit die Eingabetaste drücken ...
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 2
Date: Tue, 19 Sep 2017 13:41:21 GMT
Server: Python/3.5 aiohttp/2.1.0
OK
Es scheint, dass aiohttp antwortet.
Lassen Sie uns zunächst den Signaltonblock als Überprüfung implementieren. Der Block, der Befehle von Scratch an den Helfer sendet, wird als "Befehlsblock" bezeichnet. Wenn Sie sich s2e ansehen, können Sie sehen, dass dies mit dem Befehlsnamen playBeep
verbunden ist. Zu diesem Zeitpunkt wird GET / playBeep
an den Helfer gesendet, und der Helfer sollte dies nehmen und etwas tun. Versuchen Sie, mit "\ 007" zu klingeln.
async def handle_beep(request):
print("play beep!")
print("\007")
return web.Response(text="OK")
#Kürzung
app.router.add_get('/playBeep', handle_beep)
web.run_app(app, host='127.0.0.1', port=12345)
Durch Drücken des Signaltons auf Scratch 2 ertönt ein Geräusch.
Versuchen Sie als Nächstes, den Befehlsblock set beep volume auf (...)
zu implementieren, der den Wert sendet. Im folgenden Beispiel hat vol
einen Wert, sodass Sie ihn mit request.match_info ['vol']
abrufen können.
async def handle_setvolume(request):
volume = int(request.match_info['vol'])
if volume >= 0 and volume <= 10:
print("set volume= " + str(volume))
else:
print("out of range: " + str(volume))
return web.Response(text="OK")
#Kürzung
app.router.add_get('/setVolume/{vol}', handle_setvolume)
web.run_app(app, host='127.0.0.1', port=12345)
Die Anzeige ändert sich abhängig davon, ob Sie einen Wert von 0 bis 10 eingeben und den Block drücken oder ob Sie einen anderen Wert eingeben. (Es ist auch notwendig, "isinteger ()" vor "int ()" zu überprüfen, aber wegzulassen.)
Lassen Sie uns abschließend den Wert vom Helfer an Scratch zurückgeben. In Scratch wird der Block, der diesen Wert empfangen kann, als Reporterblock bezeichnet. Wenn er eine Zahl oder Zeichenfolge empfängt, wird ihm in der s2e-Datei das Präfix "r" vorangestellt. Wenn Sie dagegen einen booleschen Wert erhalten, fügen Sie "b" hinzu, um ihn zu unterscheiden.
Verwenden Sie die Antwort auf "GET / poll", um einen Wert an den Reporterblock zurückzugeben. "Beep Volume" ist mit dem Namen "Volume" verknüpft. Wenn Sie also "Volume 10" auf "GET / Poll" zurücksetzen, wird der Reporterblock gefüllt.
Im Folgenden wird der durch "Beep Volume auf (...) setzen" angegebene Wert unverändert zurückgegeben. Hier ist der gesamte Code bis jetzt.
testhelper.py
from aiohttp import web
volume = 0
async def handle_poll(request):
text = "volume " + str(volume) + "\n"
return web.Response(text=text)
async def handle_beep(request):
print("play beep!")
print("\007")
return web.Response(text="OK")
async def handle_setvolume(request):
global volume #Vergiss nicht
tmp_volume = int(request.match_info['vol']) #Einmal zu einer anderen Variablen
if tmp_volume >= 0 and tmp_volume <= 10:
volume = tmp_volume
print("set volume= " + str(volume))
else:
print("out of range: " + str(tmp_volume))
return web.Response(text="OK")
app = web.Application()
app.router.add_get('/poll', handle_poll)
app.router.add_get('/playBeep', handle_beep)
app.router.add_get('/setVolume/{vol}', handle_setvolume)
web.run_app(app, host='127.0.0.1', port=12345)
Es scheint besser, es zu einer Klasse zu machen und wie "self.volume" darauf zuzugreifen. Ist es so im Unterricht?
Versuchen Sie es mit Scratch. Überprüfen Sie zunächst den Wert neben dem Reporterblock "Beep Volume", um den Wert anzuzeigen. Wenn Sie als Nächstes eine Zahl in den Befehlsblock "Set Beep Volume auf (...)" eingeben und ausführen (auf den Block klicken), ändert sich der Wert des Reporterblocks "Beep Volume" auf den im Befehlsblock angegebenen Wert. Sie können sehen, dass.
Wenn mehrere Reporterblöcke vorhanden sind, geben Sie die Antwort getrennt durch den Zeilenvorschubcode "0A" zurück.
Einige Befehlsblöcke warten auf ihre Ausführung und werden durch das Präfix "w" in s2e angegeben. Um diesen Block zu implementieren, müssen Sie Scratch mitteilen, dass der Befehl ausgeführt wird.
Wenn Sie beispielsweise "w" hinzufügen, um die Signaltonlautstärke auf (...) zu setzen, wird aus "GET / setVolume / 5" die Befehls-ID "GET / setVolume / 2574/5". Wird hinzugefügt (2574 ist ein Beispiel, tatsächlich ist der Wert für jede Befehlsanforderung unterschiedlich). Durch Hinzufügen dieser Befehls-ID zur Antwort auf die Abfrage wird der Scratch-Seite mitgeteilt, welcher Block ausgeführt wird. Fügen Sie es zu diesem Zeitpunkt im Format "_busy 2574" hinzu. Wenn Sie mehrere Befehls-IDs zurückgeben müssen, trennen Sie diese durch ein Leerzeichen.
Darüber hinaus gibt es verschiedene Themen wie das Auswählen eines Blocks aus einem Pulldown-Menü ohne Eingabe eines Werts, das Empfangen einer Zeichenfolge, das Zurücksetzen, domänenübergreifende Richtlinien usw. [Erläuterung PDF](https: // wiki. Es wird in Scratch.mit.edu/w/images/ExtensionsDoc.HTTP-9-11.pdf erwähnt.
Die obige Methode kann eine Verbindung zu Scratch 3 sein (ich bin nicht sicher, was mit der Offline-Version von Scratch 3 passiert und wie sie erweitert werden kann), aber mit Python gibt es verschiedene Dinge wie OpenCV, maschinelles Lernen, numerische Berechnung usw. Da die Bibliothek einsatzbereit ist, scheint sie recht frei zu erweitern.
Natürlich kann Node.js auch einen kompakten Server mit ähnlichen asynchronen E / A einrichten. Wenn Sie sich also nicht mit Python-Modulen auskennen, können Sie ihn in JavaScript schreiben. (Ich habe diesen Artikel zusammengefasst)
Wenn Sie die HTTP-Erweiterung in Scratch 3 behalten möchten (und sie derzeit entfernt wird), können Sie auch Scratch 3 ändern.
Recommended Posts