在今天的文章中,我们来介绍如何利用Snappy Ubuntu系统实现一个web server,并利用这个web server来控制我们在树莓派中的piglow灯光.
$ sudo add-apt-repository ppa:snappy-dev/tools $ sudo apt-get update $ sudo apt-get install snappy-tools bzr snapcraft
bzr branch lp:~vtuson/+junk/glowapi
name: piglow version: 1.0 vendor: XiaoGuo, Liu <[email protected]> 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中的.
$ git clone https://github.com/ubuntu-core/snapcraft
liuxg@liuxg:~$ snapcraft version snapcraft (0.5). Run "snapcraft help" to get started.
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
$ snapcraft stage --force
(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.
(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
$ sudo snappy hw-info piglow.sideload
(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)
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) }
$ 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