上一篇文章里,我们提到

本周,我会给出一个具体例子: 在树莓派中使用extension_iot.py,定制出extension_iot_rpi.py, 而后者是可以实际服务于硬件教学的插件。 在这个例子中我们将展示,如何在几天内快速构建一个教学产品,可以直接推向最终用户,它甚至包括了管理功能(如远程故障处理和升级)!

问题是什么

在给出解决方案是什么之前,我们先来问一下: 问题是什么呢?

树莓派作为编程教育平台

我们在 codelab-adapter ❤️ Raspberry Pi,写到:

就编程教育而言,树莓派是非常理想的开源硬件。

这句话是含混的。树莓派是一台电脑,这意味这它可以胜任无数工作,即便就编程教育而言,它的生态里也有数不清的工具,其中有好有坏。当我们说就编程教育而言,树莓派是非常理想的开源硬件。 我们实际是想说,树莓派是个开放的平台,充满了无限可能,无论你想做怎样的编程教育,它可能都是不错的选择。

树莓派生态里,有数不清的优秀项目用以支持编程。在CodeLab ❤️ IoT列出了我们尤其喜欢的两个项目:

自由有时候是一种负担

问题来了,现在有一群学生,一堆树莓派,有这么多的编程工具可供选择,你来说说要怎么开始编程吧?

这取决于你是谁,你的用户是谁,你构想的编程场景是怎样的。这些是很个性化的问题,并不存在通用的最佳实践。

让我们讨论一个具体的案例。在这个典型案例中,我们会看到一些常见的问题模式。

这个案例是这样的: 你将树莓派作为驱动小车的硬件平台,它是小车的大脑,你构建的产品是一辆编程小车,树莓派是你的项目的一部分。

它大约长这样:

你当然不会只是想卖出一辆可由树莓派驱动的小车,那样是没什么人想买的。它向左走两步,接着向右走两步就完事了,程序固化其中,这不是你想要的。你希望它是可编程的。

一辆可编程小车

一辆可编程小车,这么简单的问题用得着专门讨论吗?

Google/Github搜一下树莓派小车,不是有一堆教程和开源项目吗?淘宝上随便买个小车底盘,买几个电机,加上一些开源的驱动,不就好了吗?

外形不好看?3D打印一个。3D打印不够细腻?激光树脂了解一下。要批量生产?为外形开个模吧。

好的,你很快做出了一个可编程的小车,只需要ssh pi@raspberrypi.local,写几行Python,小车就按你的代码逻辑移动啦!

等等,命令行?对编程入门者不够友好吧。如果不用ssh,用户怎么为小车编程呢?

更简单的问题是: 用户怎么与小车上的树莓派建立连接呢? 只要连接能顺利建立,编程过程可以看作在信道上来回传递信息。

好的,我们似乎得关注"怎么建立连接"这个问题。

怎么建立连接

有许多方式建立用户与树莓派的连接。最新的树莓派自带了蓝牙(4.2)和wifi芯片。

所以在不添加任何模块的情况下,我们可以利用蓝牙或wifi与树莓派建立连接。

蓝牙

树莓派里的蓝牙是可编程的,当你希望利用树莓派自带的蓝牙与用户建立连接时,社区里有很多种实现方案,常规的思路是你可以在树莓派里运行蓝牙服务。用户的客户端主动连接树莓派的蓝牙。需要注意的事,目前操作系统对ble的兼容还不够好,所以你将蓝牙运行为什么模式是需要考虑的,视你的用户和场景而定。

但你依然需要考虑一些问题,小车树莓派的镜像是用同一个吗?小车的蓝牙服务名字是随机生成的吗?一个教室中有十个小车的话,学生怎么找到那个蓝牙服务对应自己的小车?

这个问题追问的是如何添加clientid,让用户容易发现它。

wifi

树莓派内置了wifi芯片。所以我们可以将树莓派接入无线热点。当然也可以将树莓派用作无线热点。

需要提醒的是,将树莓派用作热点,会强迫客户端接入它,如果没有双网卡,用户就失去了接入互联网的能力,而你的编程平台很可能在公网上。

于是我们只讨论将树莓派接入无线热点的方案。首先我们就会遭遇一个棘手的问题,如何将树莓派接入wifi?树莓派出产时并不知道用户的wifi信息。这意味着配置wifi的工作只能交给用户。

社区里有很多做法,诸如

  • /boot目录下常见wpa_supplicant.conf,写入wifi配置信息。
  • 初始化时,接入显示屏,在图形桌面里配置wifi。
  • wifi-connect: Easy WiFi setup for Linux devices from your mobile phone or laptop

wifi-connect做了非常出色工作,允许你用手机来配置树莓派。就像主流的智能家居网关和智能音箱那样。它可能是个不错的起步!

接入wifi还只是第一步,它只意味着你有网络了,那么你要如何与用户的客户端通信呢?

有很多种做法,无论那种做法,都会遇到前头提到的clientid问题。设备需要有标识。尤其是当多个设备在一个网络下使用时(课堂/活动场景)。

在局域网内,hostname(默认是raspberrypi.local)是个不错的标识,和大多数情况一样,windows系统负责拖后腿,默认并不支持它(需要mDNS的支持),如果你采用hostname来发现设备,那么windows需要安装Bonjour Print Services (Windows)

我们也可以把树莓派视为一个物联网设备,使用mqtt来连接它。这是我目前比较喜欢的方案,至于mqtt server在云端还是在局域网内(诸如跑在某个树莓派上),都没问题。

无论是基于局域网内hostname的连接策略还是基于mqtt的连接策略。codelab-adapter都将提供支持。

小车

我们想干嘛来着?我们希望提供的是一个可编程小车!好的,终于想起我们最初要做的事情了。

莫忘初心啊同学们!

想想一个典型的使用场景。一群学生在教室里使用Scratch3.0对小车编程。

他们使用无线网将小车接入了wifi中。我们也做到了每辆小车有个clientid,我们还构建了一个mqtt server,用以把信息从用户编程界面推到小车上。学生在积木里输入clientid,点击连接,之后就可以使用积木给小车发送信息了。

好的,截至倒目前,我们好像没有构建任何教学相关的内容!我们只是让消息可以从客户端抵达小车。甚至都还不包括如何升级和维护它!

一起来解决问题

这里边有大量工作是不必要的重复劳动,这正式CodeLab在做的事:CodeLab ❤️ IoT,我们希望开发者们一起来完善树莓派平台。将其打造为一个易用的环境。我们开放了围绕树莓派在做的所有工作。

下一篇文章里,我们会展示一个服务于编程教育的整体解决方案。

参考