# scratchlink-server **Repository Path**: MAMAMAisused/scratchlink-server ## Basic Information - **Project Name**: scratchlink-server - **Description**: ScratchLink Microbit模块的python代理 - **Primary Language**: Python - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2020-03-19 - **Last Updated**: 2021-07-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## ScratchLink Server ### 📕开发环境`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的配置中加上: ``` python 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 ``` python 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