scratch3-adapter重构笔记

近期在重构scratch3-adapter,目前的最新版本是0.1.1, 我们计划在10月份发布0.2.0

这次重构带来的改变包括:

  • 本地SSL安全证书
  • 引入json-rpc,鼓励开发者使用json-rpc简化插件的开发
  • 引入Scratch Link模式(目前scratch3-adapter在开发模式下允许切换为Scratch Link模式,与官方Scratch Link保持相同的架构,官方暂未开放Scratch Link,我做了逆向分析。)
  • 允许在GUI面板上启停插件
  • 发布不同平台的安装包(exe/dmg/Python package)
    • 在跨平台软件分发这块,很多地方参考了mu
  • 在插件方面,添加了优必选alpha系列机器人的支持

缘起

近期使用官方七月底发布的Scratch Link,我很喜欢这个软件,对它做了不少分析,Scratch Link有许多聪明的设计,准备把这些好的主意移植到scratch3-adapter上。当然也有一些我们不喜欢的地方,我们准备做些有趣的探索和调整。

目标

此次重构的主要目标是提升软件易用性,muScratch Link在易用性方面都做得非常好,这两个软件是我们主要的学习对象。

重大变更

下边记录重构前后,发生的一些大的变更

本地SSL安全证书

我在为Scratch3.0设计的插件系统(下篇)中描述了scratch3-adapter的架构设计,其中提到:scratch3-adapter中包含了一个websocket-server

逆向分析Scratch Link可以看到,它内部也包含了一个websocket-server,使用的是Telegraph

当我们从https网站访问本地websocket-server服务时,如果本地websocket-server服务没有采用SSL安全证书,会给用户增加操作步骤(需要用户确认继续访问),体验不够友好,问题的描述和解决方案我都写在本地https/wss服务与SSL安全证书

引入json-rpc

scratch3-adapter受ROS影响很深,ROS本质上是一个消息系统。

我很喜欢Smalltalk的设计原则中的这条:

计算应该被视为可通过发送消息来统一调用的对象的内在功能。

Scratch的第一个版本由Smalltalk的方言Squeak写成,受Smalltalk影响极深。可以看到Scratch3.0依然保持着这条设计原则。

我希望scratch3-adapter能延续Smalltalk的设计原则。所以消息会一直作为核心要素。

我相信这条原则是scratch3-adapter达成它的目标将万物积木化的核心所在。

但原始的消息对于大多开发者来说,可能过于原始了,所以我们决定学习Scratch Link,在消息之上抽象出RPC,方便开发者写自定义的插件。当然这个特性是可选的,是否使用json-rpc由开发者自行决定。我原本计划在消息之上添加自定义协议,后来发现json-rpc就是我想要的,所以就不重造轮子了。

Scratch Link本身非常简单,我大约使用100代码实现了它的功能。这部分作为Scratch Link模式,开发模式下可以启用,Scratch Link模式很简单,不包含ZeroMQ,它的核心是websocket-server + json-rpc

我们来演示scratch3-adapter的Scratch Link模式下,如何完美替代官方的Scratch Link。

我们让scratch3-adapter模拟成Scratch Link,欺骗前端说它已经搜索到了micro:bit。实际上我们连电脑的蓝牙都没打开。

接着让我们点击连接,再次成功骗过前端

我比较坚持引入ZeroMQ,所以scratch3-adapter默认不采用Scratch Link模式,而将ZeroMQ作为架构的核心部分(默认模式)。对于异步任务、分布式组件、协同控制,ZeroMQ都能帮上大忙。ZeroMQ会让scratch3-adapter极为灵活,如果之后要引入复杂的机器人、AI、飞行器矩阵,ZeroMQ会让这些事变得简单。我希望提供一个强大、灵活而开放的架构。

jupyter架构的核心元素之一便是ZeroMQ,jupyter如此健壮的原因之一便是ZeroMQ。我在jupyter notebook架构分析做了讨论

允许在GUI面板上启停插件

重写了插件管理系统,支持线程管理。于是可以在GUI面板上随意启停插件。而不必反复重启软件

软件安装包

为了让软件更加易于使用,我们决定提供各个平台的安装包,windows下为exe,macOS下为dmg,linux下可以选择python package或者打包好的软件。

这部分主要学习了mu-editor

参考




Fork me on GitHub