前言

IoT

近期写了几篇IoT相关的文章:

因为沉迷于Pharo提供的沉浸式、可探索的编程体验,决定将IoT相关的探索性工作放在Pharo上来做。

空间操作系统

「空间操作系统」是我随口杜撰的一个名词,我最近对这个概念感兴趣,它的背景是这样的:

CodeLab Adapter目前已经用于驱动Neverland整个空间,最近在考虑如何扩展这个逻辑模型,用以驱动一个小区或者一座城市。设备的连接并不是大问题,最坏方式可以硬整合(像目前大多数公司在做的)。但复杂性并不在通信,而在于如何驯服业务增长带来的复杂度,UNIX之前的系统都是被不断增长的复杂度压垮的,如何保证系统的未来可生长,《unix编程艺术》论述了很多设计原则,组件之间的开放和协作是核心机制。最近在学习Smalltalk,隐约觉得Smalltalk的设计十分适合驱动大型复杂系统(一些军事模拟系统和金融系统是Smalltalk 驱动的),于是去Quora上阅读Alan Kay近期的思考。正巧看到他在讨论城市的复杂性问题,以及如何在软件层面驯服它

Alan Kay提到:

The methods used to invent Smalltalk (Pharo is a version of Smalltalk) at Xerox Parc will work well for creating What Is Actually Needed (WIAN). I have outlined some of the first steps above …

我相信Smalltalk提供了绝佳的环境去探索「空间操作系统」。

pharo-iot

搜索Pharo和IoT,很容易发现pharo-iot,以及该组织开源的PharoThings

于是我决定从这里起步。 以下是我的学习和使用笔记。

PharoThings

PharoThings是什么东西? 它是基于Pharo的IoT编程环境,拥有Pharo的沉浸式、可探索的编程体验。

PharoThings基于TelePharo构建,TelePharo又是个啥?这是一个用于管理和开发远程Pharo镜像(image)的工具。

PharoThings目前可用于驱动树莓派(由WiringPi library驱动),未来计划支持Arduino(由Firmata驱动)和Beaglebone。

尽管可以按照PharoThings readme来使用它,但我更喜欢这本小册子: A PharoThings Tutorial

我基本遵照A PharoThings Tutorial的引导来开发,以下是使用记录。

树莓派环境搭建

我目前在树莓派3B+上运行Raspbian(Stretch)。

首先安装WiringPi library:

1
2
3
cd /tmp
wget https://unicorn.drogon.net/wiringpi-2.46-1.deb
sudo dpkg -i wiringpi-2.46-1.deb

检查按照是否成功:

1
2
gpio -v
gpio readall

接下来下载Pharo和所需image: wget -O - get.pharoiot.org/server | bash

操作很简单,实际上是在下载一个压缩包:server.zip

解压之后运行即可:

1
2
cd pharoiot-server
./pharo-server

成功运行后可以看到:

1
2
pi@raspberrypi:~/mylab/pharo/pharoiot-server $ ./pharo-server
'a TlpRemoteUIManager is registered on port 40423'

本地环境

我的本地环境是MacOS。 但Pharo是跨平台的,所以各个平台下应该都没问题。

首先下载:multi.zip

解压之后可以看到里边的文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
➜  pharoiot-multi ls -l
total 299528
-rw-rw-r--@ 1 wuwenjie  staff  34321732  3 29 00:43 Pharo7.0-32bit-890f474.sources
-rw-rw-r--@ 1 wuwenjie  staff   1535210  6  7 12:46 PharoThings32.changes
-rw-rw-r--@ 1 wuwenjie  staff  49325464  5 12 18:42 PharoThings32.image
-rw-rw-r--@ 1 wuwenjie  staff   1523385  3 29 00:43 PharoThings64.changes
-rw-rw-r--@ 1 wuwenjie  staff  66628472  3 29 00:43 PharoThings64.image
-rwxrwxr-x@ 1 wuwenjie  staff      1933  3 29 00:43 pharo
drwxr-xr-x  4 wuwenjie  staff       128  6  7 12:40 pharo-local
-rwxrwxr-x@ 1 wuwenjie  staff      2049  3 29 00:43 pharo-server
-rwxrwxr-x@ 1 wuwenjie  staff      1853  3 29 00:43 pharo-ui
-rw-rw-r--@ 1 wuwenjie  staff        60  3 29 00:43 pharo.bat
drwxrwxr-x@ 7 wuwenjie  staff       224  6  7 12:39 vm

Linux, Mac用户双击 pharo-ui, Windows用户双击pharo.bat.

可以看到,image目前使用的Pharo版本为7.0.2,几乎是最新的。

连接到树莓派

既可以使用hostname连接也可以使用IP连接

使用hostname连接

1
2
3
ip := NetNameResolver addressForName: 'rpi.codelab.club'.
remotePharo := TlpRemoteIDE connectTo: (TCPAddress ip: ip port:
40423).

使用IP连接

1
2
remotePharo := TlpRemoteIDE connectTo: (TCPAddress ip: #[192 168 1
    200] port: 40423).

如果没有报错就可以随意使用:

  • Remote Playground
  • Remote System Browser
  • Remote Proxcess Browser

    1
    2
    3
    
    remotePharo openPlayground.
    remotePharo openBrowser.
    remotePharo openProcessBrowser.

远程树莓派GPIO面板

1
2
remoteBoard := remotePharo evaluate: [ RpiBoard3B current].
remoteBoard inspect.

我们在Pharo中将7号引脚设为关闭状态:

1
2
3
led1 := gpio7.
led1 beDigitalOutput.
led1 value: 0.

从shell中可以看到生效了。

在shell中将7号引脚设为开启状态: gpio write 7 1

可以看到Pharo里的远程树莓派GPIO面板发生相应变化。

你可以点击指示状态的圆点切换其状态!

更多用法

参考A PharoThings Tutorial

当然也鼓励在Pharo中自由探索。在Pharo中的旅程常有意外收获。

参考