今天花了半天功夫,解决scratch3-adapter在移动端使用的问题,我在roadmap里有提到过这个计划:Roadmap 移动端

中途陷到几个坑里边,花了不少时间,做个笔记

Why

对于初学者而言(尤其是初次接触计算机的孩子而言),平板电脑是比电脑更为友好的工具。

平板 + 积木 + 图标,可以让一个不识字的孩子直接动手编程,孩子使用手指拖拽带有图标的积木,即可通过一个个的关卡,在操作中掌握所需的概念

目前大多数的家庭里,儿童的学习工具并不是PC,可能主要是ipad,至少我周围是这样(对于培训和课堂我强烈推荐树莓派)

scratch3目前正在做跨平台的一些工作,平板电脑将得到良好的支持。尽管目前的计划里,手机端暂时还不会成为操作界面(但官方会将其作为play界面),但在未来,也可能会作为创作平台(目前编程猫已经先行探路)

scratch3-adapter的兴趣是将scratch3.0连接到更广阔的区域,目前我们已经发布了几大主流平台的客户端,详情见:scratch3-adapter-docs 安装(install)。对移动端的支持,当然也是我们的目标。

移动端和PC的差异

移动端和PC在学习体验上的差异,前人述备矣,在此不多讨论

这里只谈谈,对于scratch3-adapter而言,这类设备在技术层面有什么差异

scratch3-adapter基于python,通过插件系统,我们允许scratch3-adapter与任何开放的设备相连,连接的方式也很自由:wifi、usb、bluetooth都行

在PC上,scratch3-adapter几乎可以干任何事,操控wifi、usb、bluetooth都没问题,主流的硬件无非这几种连接方法。但在移动端则不同

让我们以cozmo为例,说明这种不同。在PC端,可我们以使用usb连接控制cozmo的手机,进而使用cozmo-python-sdk控制cozmo

但在移动端,我们无法这样做,因为连接cozmo需要一个usb接口,cozmo作为案例向我们揭示了:我们无法预估来自现实世界的硬件采用怎样的连接方式

尽管我已经让scratch3-adapter运行在安卓上。但如果你要操控移动端的硬件(wifi、bluetooth)(usb目前无法使用),你需要写一个app,抛开工作量不谈,scratch3-adapter根本也不想这样做,scratch3-adapter希望学习平台是在web上,而不是包装为app,scratch3-adapter只是将web延伸出来。我们热爱开放的互联网

我们最终决定学习home assistant的策略(scratch3-adapter在很多层面和home assistant都很相似),让scratch3-adapter跑在树莓派上,而移动端只需要使用树莓派的web服务即可,硬件都被暴露在这些服务中

因为树莓派可以连接wifi、usb、bluetooth,以及更多的其他设备(树莓派有引脚!),所以你在移动端的浏览器上也能操控所有这些设备!

我相信,就学习编程而言,树莓派是个十分理想的环境。我们已经基于树莓派,利用PiNet完成了编程教室解决方案,这部分工作由@suli完成.这部分的文章,我之后有时间也梳理一下

思路

确定了方向之后,我们再来把思路理一下。

在此我们以cozmo为例,解释我们如何让scratch3-adapter支持移动端。最后我们会给一个演示视频,视频里,一个类似code.org这样的平台,可以直接将cozmo设计在教学关卡中!在这个视频我相信是会同时让code.org和cozmo社区震惊(cozmo英文社区已经期待很久了),我近期也准备写一篇英文文章发到cozmo社区里,英文比较渣,挤牙膏似的还蛮辛苦的

首先我们按照cozmo官方的http://cozmosdk.anki.com/docs/install-linux.html,在树莓派里配置cozmo-python-sdk。树莓派官方的最新镜像,默认带有python3.5,我们直接使用这个版本就够了.

安装依赖十分简单:pip3 install --user 'cozmo[camera]'

由于我使用安卓手机连接cozmo(社区里很多人用亚马逊$35的那款),所以需要安装一下adb:sudo apt-get install android-tools-adb

至此,我们就可以使用树莓派操作cozmo了

我们在树莓派里让cozmo_server开机启动,cozmo_server是一个代理了cozmo的python进程

scratch3-adapter以cli模式开机启动,启动时默认加载cozmo插件。

之后我们打开网站,点击页面按钮连接树莓派,就可以在ipad中使用浏览器打开网站,直接操控cozmo了,

我们来看看演示效果:

ps: 因为是web控制cozmo,所以我就不必要使用ipad演示了(毕竟原理没差别)

演示视频里,学生在网页中的编程关卡里,拖好积木块,点击运行,就可以同时控制虚拟角色和cozmo执行任务,这个过程是实时双向通信!所以我们能将评分之类的机制都加进来,我在之前的文章: 使用scratch3_adapter连接blockly与硬件里说:

这部分值得玩味的地方是,你可以在网页上做所有的教学,无论是结合某一款开源硬件还是某一个AI系统。而scratch3_adapter将允许你用积木来驱动它们,你也能拿到积木/代码在外部系统的执行结果,判断学生是否掌握该知识点,而这对教学可能是很重要的。

一些坑和需要解决的问题

思路和原理都很简单,但在实际使用中,有几个问题需要我们解决。这些问题主要是提升易用性和用户体验,毕竟树莓派运行着linux(raspbian),我们总不能把操作流程用bash来写,让孩子ssh进树莓派操作,尽管我们鼓励他们能力提高之后大胆去尝试。

所以我们做到了all in web

这篇文章以cozmo为例,来展示scratch3-adapter的移动端的解决方案。我们有意选择了cozmo,因为这个例子代表了最为复杂的情况,如果cozmo的连接都顺利,那么其他情况将变得十分简单(诸如micro:bit).所以如果你觉得这篇文章有些复杂是正常的,因为cozmo本身的连接方式很复杂,还会牵扯一些adb的问题

adb的坑

当你把手机连上树莓派之后,adb devices会跟你说没有认证(unauthorized),社区给出了解决方案:kill and restart:

1
2
adb kill-server  
adb start-server  

你需要在开机启动时把这个加上启动项上

接入wifi

如何将树莓派接入局域网,此前是个困难的问题。

如果你把树莓派用作一个网关,分发给普通用户,那么你就需要让这个过程变得简单易用。这一块目前的最佳实践是:

  • 以某种方式连接网关
    • 智能家居设备一般会让你使用蓝牙连接设备
  • 将密码传入设备
  • 重启设备,接入wifi

resin-wifi-connect完美得解决了这个问题。不过这个项目目前有些bug,还在改进中

开机自启 & 掉线重连

开启自启,我们统一使用supervisor来做,并且暴露出9001端口来管理进程,即便中途出现了意外,我们也可以轻松在web页面重启进程,而无需进入树莓派

https

scratch3-adapter的https模式在PC上使用正常,但在ipad上会报一个错误: WebSocket OSStatus error -9807,ipad对https证书有要求,尽管我们可以使用nginx代理scratch3-adapter来解决这个问题(tls v1.2)。但使用http可能更为简易

mDNS & hostname

mDNS允许你在局域网内,通过机器名找到它的ip地址,在智能家居中使用广泛。

对于课堂和机构的教学,我们可能希望,每个树莓派都有唯一标识,可以区分彼此,最好这个名字可以自定义,便于记忆。mDNS & hostname是这个问题的绝佳的解决方案。直接使用sudo raspi-config设置好hostname,重启即可

尽管大多时候你无需注意mDNS,因为大多数系统和路由器都支持,但值得注意的是一些老旧的安卓系统和windows并不支持,如果你使用windows,先安装一些这个软件:Bonjour Print Services (Windows). 安装之后,重启电脑即可

此外补充一些tips: 你可以把hostname和wifi热点名贴在树莓派外壳上,便于使用。如果你在做一个课堂解决方案,这块可能出现的问题和to c很不一样,值得注意

后话

前边这些配置看去比较繁琐,我之后会把这些东西做成镜像,大家直接往树莓派烧录我制作的镜像即可