python 3.7.6
Scratch 3.0与BLE设备连接时要经过ScratchLink代理,两者其实是通过websocket连接,地址为wss://device-manager.scratch.mit.edu:20110/scratch/ble
。通过修改C:\Windows\System32\drivers\etc
中的HOSTS文件,增加以下内容将域名重定向到localhost
127.0.0.1 device-manager.scratch.mit.edu
用cherrypy和ws4py在本地建立websocket服务
用tornado建立websocket服务,截获Scratch软件的消息。主要难点在于Scratch软件是通过https(wss)进行连接,在本地建立https服务没有太好的方法,目前查到可以用mkcert实现。需要先安装windows的包管理器choco
choco install mkcert
mkcert -install
mkcert device-manager.scratch.mit.edu
生成证书后在server的配置中加上:
server = httpserver.HTTPServer(scratchlink_parser, ssl_options={
"certfile": "device-manager.scratch.mit.edu.pem",
"keyfile": "device-manager.scratch.mit.edu-key.pem",
})
安装依赖包并运行
pip install -r package.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python scratchlink.py
可以继承ScratchLink类来处理scratch的microbit积木中display和display_text的消息,从而实现自己的扩展,比如把消息转发到串口,就可以控制其他外设。使用display_text更加直观,但是效率较低,因为microbit显示文字的速度比较慢,所以scratch做了等待。使用display的效率比较高,但是用的是LED阵列的编码,需要自己去根据scratch上面LED的图案来设置解码。下面是一个使用scratchlink库的demo
import scratchlink
import colorlog
import logging
class MyParser(scratchlink.ScratchBleParser):
def on_display_text(self, txt):
print('I recieve: '+ txt)
def on_display(self, bytelist):
for line in self.led_matrix:
for led in line:
print(led, end=' ')
print('')
if __name__ == '__main__':
# 设置打印的日志级别,默认INFO,可以改为DEBUG看到更多信息
colorlog.getLogger('scratchlink').setLevel(logging.INFO)
scratchlink.ScratchLink(MyParser)
2020-03-19
❌遇到一个bug,建立的wss:websocket服务消息有一条滞后,也就是客户端发送A,B两条消息,服务端只收到A,等客户端发送C消息时,服务端才收到B。目前不知道如何解决。
2020-03-19 night
更换为tornado框架后完美解决上面的bug
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。