在今天的文章中,我们来介绍如何利用Snappy Ubuntu系统实现一个web server,并利用这个web server来控制我们在树莓派中的piglow灯光.
1)硬件设备
如果大家还没有配置好自己的树莓派的话,可以参考我在文章"
如何安装Snappy Ubuntu到树莓派(RaspBerry PI)上"中的介绍.
2)软件安装
我们需要在我们的电脑上安装如下的软件包:
$ sudo add-apt-repository ppa:snappy-dev/tools
$ sudo apt-get update
$ sudo apt-get install snappy-tools bzr snapcraft
并安装文章" 如何为我们的Snappy Ubuntu应用编译并打包Snap(2)"中介绍的那样在我们的树莓派设备中设置自己的编译环境.
3)软件开发
我的一个同事已经开发了一个项目.这个项目的地址在
https://code.launchpad.net/~vtuson/+junk/glowapi.我们可以利用如下的方法来得到它所有的源码:
bzr branch lp:~vtuson/+junk/glowapi
这个代码的问题在于它不能利用我们的snapcraft来编译我们的项目.我们必须对它进行改造.为此,我们创建了一个新的项目 https://github.com/liu-xiao-guo/piglow.它的项目结构如下:
我们把项目的源码放在src/piglow的下面.我们项目的snapcraft.yaml如下:
snapcraft.yaml
name: piglow
version: 1.0
vendor: XiaoGuo, Liu <xiaoguo.liu@canonical.com>
summary: Piglow API
description: This is the webserver API to control the piglow
icon: icon.png
services:
piglow:
start: bin/piglow
caps:
- network-client
- network-service
parts:
piglow:
plugin: go
source: ./src/piglow
从上面可以看出来,它是一个service.它在被安装或启动的时候就被自动启动.另外它的源码是放在一个本地的目录src/piglow中的.
由于一些原因,我们的snapcraft版本0.4还不能支持本地源码的编译,所有我们必须安装0.5的版本.如果大家还不能得到这个版本的话,请到snapcraft的master版本
地址进行安装:
$ git clone https://github.com/ubuntu-core/snapcraft
我们可以利用setup.py来进行build及安装.最后来确信我们的版本:
liuxg@liuxg:~$ snapcraft version
snapcraft (0.5).
Run "snapcraft help" to get started.
当然,这样的操作,我们也必须在我们的树莓派docker的container中也需要同样的安装.
在我们的树莓派设备中,我们参照文章"
如何为我们的Snappy Ubuntu应用编译并打包Snap(2)",最后得到我们所需要的snap文件:
ubuntu@a5ceb8ea0825:~/work$ git clone https://github.com/liu-xiao-guo/piglow
Cloning into 'piglow'...
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 14 (delta 1), reused 14 (delta 1), pack-reused 0
Unpacking objects: 100% (14/14), done.
Checking connectivity... done.
ubuntu@a5ceb8ea0825:~/work$ cd piglow
ubuntu@a5ceb8ea0825:~/work/piglow$ snapcraft
Pulling piglow
env GOPATH=/home/ubuntu/work/piglow/parts/piglow/go go get -t -d ./piglow/...
package piglow
imports runtime: C source files not allowed when not using cgo or SWIG: defs.c float.c heapdump.c lfstack.c malloc.c mcache.c mcentral.c mem_linux.c mfixalloc.c mgc0.c mheap.c msize.c os_linux.c os_linux_arm.c panic.c parfor.c proc.c runtime.c signal.c signal_arm.c signal_unix.c softfloat_arm.c stack.c string.c sys_arm.c vlrt.c
Failed doing pull for piglow: Command '['/bin/sh', '/tmp/tmpgmcv3p11', 'env', 'GOPATH=/home/ubuntu/work/piglow/parts/piglow/go', 'go', 'get', '-t', '-d', './piglow/...']' returned non-zero exit status 1
ubuntu@a5ceb8ea0825:~/work/piglow$ source /home/ubuntu/.gvm/scripts/gvm
ubuntu@a5ceb8ea0825:~/work/piglow$ snapcraft
Pulling piglow
env GOPATH=/home/ubuntu/work/piglow/parts/piglow/go go get -t -d ./piglow/...
Building piglow
env GOPATH=/home/ubuntu/work/piglow/parts/piglow/go go install ./piglow/...
Staging piglow
Snapping piglow
Snapping -
Generated 'piglow_1.0_armhf.snap' snap
在有些时候,下载东西会很慢,我们在确保已经pull下来的source后,避免再次下载,我们可以直接使用如下命令来重新进行stage,这样我们就不用再下载了:
$ snapcraft stage --force
我们退出我们的container,并通过如下的方法在Snappy Ubuntu中来安装我们已经得到的snap文件:
(RaspberryPi2)ubuntu@localhost:~$ cd apps/docker/1.6.2.004/work/piglow
(RaspberryPi2)ubuntu@localhost:~/apps/docker/1.6.2.004/work/piglow$ ls
icon.png parts piglow_1.0_armhf.snap snap snapcraft.yaml src stage
(RaspberryPi2)ubuntu@localhost:~/apps/docker/1.6.2.004/work/piglow$ sudo snappy install --allow-unauthenticated piglow_1.0_armhf.snap
Installing piglow_1.0_armhf.snap
2015/11/20 04:01:23.276857 verify.go:85: Signature check failed, but installing anyway as requested
Name Date Version Developer
ubuntu-core 2015-09-25 2 ubuntu
docker 2015-11-13 1.6.2.005 sideload
hello-world 2015-11-12 1.0.18 canonical
mqtt-piglow 2015-11-02 IEWUKJCENbWA sideload
mqtttestclient 2015-11-12 IFOTYdKLCaGB sideload
piglow 2015-11-20 IGCNEEceALce sideload
snappy-debug 2015-11-14 0.6 canonical
webcam-demo 2015-11-12 1.0.2 canonical
webcam-webui 2015-11-17 IFbYNNbSUdHS sideload
webcam 2015-11-18 IFeGRLEgffcQ sideload
webdm 2015-10-29 0.9.4 sideload
pi2 2015-09-25 0.16 canonical
Reboot to use the new ubuntu-core.
我们可以看到我们的piglow应用已经被成功安装了.为了能够让我们的应用使用我们的硬件:
(RaspberryPi2)ubuntu@localhost:~$ sudo ls /dev/i2c-1
/dev/i2c-1
(RaspberryPi2)ubuntu@localhost:~$ sudo snappy hw-assign piglow.sideload /dev/i2c-1
'piglow.sideload' is now allowed to access '/dev/i2c-1'
如果我们想取消该应用对该文件的访问,我们可以执行如下的命令:
$ sudo snappy hw-unassign piglow.sideload /dev/i2c-1
如果我们想查看目前的该应用的硬件访问情况,我们可以使用如下的命令:
4)测试我们的应用
我们的应用已经被成功地安装到我们的设备中了.那么我们该如何来测试我们的应用呢?
查看我们的服务是否已经运行:
(RaspberryPi2)ubuntu@localhost:~$ sudo snappy service status
Snap Service State
docker docker-daemon ; not-found; inactive (dead)
docker docker-daemon enabled; loaded; active (running)
mqtt-piglow mqtt-piglow enabled; loaded; active (running)
piglow piglow enabled; loaded; active (running)
webcam-demo webcam-demo enabled; loaded; active (running)
webcam-webui webcam-webui enabled; loaded; active (running)
webcam webcam enabled; loaded; active (running)
webdm snappyd ; not-found; inactive (dead)
webdm snappyd enabled; loaded; active (running)
从上面可以看出来,我们的服务已经在成功地运行.
查看我们的webserver是否运行
我们在我们的应用中使用了如下的代码:
func init() {
m = martini.New()
// Setup middleware
m.Use(martini.Recovery())
m.Use(martini.Logger())
m.Use(MapEncoder)
// Setup routes
r := martini.NewRouter()
r.Get("/", func() string {
return "Hello, piglow2" // HTTP 200 : "hello world"
})
r.Post(`/:version/clear`, GlowOff)
r.Post(`/:version/on`, TurnAllOn)
r.Post(`/:version/flare`, Flare)
r.Post(`/:version/colors/:id`, SetGlowColor)
r.Post(`/:version/legs/:id`, SetLeg)
r.Post(`/:version/legs/:id/colors/:colid`, SetLed)
// Add the router action
m.Action(r.Handle)
}
在上面,我们定义了Get"/",所以,我们可以在我们的browser中看到:
从上面可以看出来,我们的webserver是正常工作的.注意这里的192.168.1.112是我的树莓派上的地址.开发者必须根据自己的实际情况来更改.
在电脑上通过脚本来测试
$ curl -i -X POST "http://192.168.1.112:8008/v1/colors/blue?intensity=0.1"
$ curl -i -X POST "http://192.168.1.112:8008/v1/colors/blue?intensity=0.1"
HTTP/1.1 200 OK
Content-Type: application/json
Date: Fri, 20 Nov 2015 04:16:04 GMT
Content-Length: 21
set color blue to On
我们可以看出来,上面的命令将把所有三个腿上的绿灯都打开.
通过应用来测试
我们已经创建了一个测试的应用:
https://launchpad.net/make-me-glow.大家可以去下载这个应用,并使用这个项目来从ubuntu的手机上控制我们的灯光.这个应用也可以在ubuntu商店中下载.
开发者可以利用其它的方法来访问piglow:
few ways to interact with PiGlow api