利用Snappy Ubuntu来控制piglow灯光

在今天的文章中,我们来介绍如何利用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

如果我们想查看目前的该应用的硬件访问情况,我们可以使用如下的命令:

$ sudo snappy hw-info piglow.sideload
为了大家方便,我已经把编译好的" piglow_1.0_armhf.snap"文件放到github了以方便大家测试.

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值