利用Snappy Ubuntu来控制piglow灯光

原创 2015年11月20日 12:23:21

在今天的文章中,我们来介绍如何利用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
版权声明:本文为博主原创文章,未经博主允许不得转载。

Snappy Ubuntu 入门

在这篇文章中,我们将介绍Snappy Ubuntu的一些基本知识.我们将介绍如何在我们的电脑上安装KVM,并利用它来学习Snappy的一些基本的命令...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年10月21日 10:19
  • 6855

snappy ubuntu core 演示

该文章展示了几个视频来介绍可以在snappy ubuntu core上的可能实现的应用.
  • UbuntuTouch
  • UbuntuTouch
  • 2016年01月12日 14:09
  • 1865

如何为我们的Snappy Ubuntu应用编译并打包Snap(1)

在今天的这篇文章中,我们来重点介绍如何利用snapcraft来编译我们的应用,并打包我们的应用成为.snap包.由于目前我们的snapcraft还不支持cross-compile,所有我们还需要为我们...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年11月11日 12:27
  • 1365

一个简单的Snappy Ubuntu python webserver

在前面的文章中,我们已经介绍了如何使用golang来创建我们的webserver.在今天的文章中,我们来介绍如何使用python在Snappy Ubuntu上创建一个简单的webserver.如果大家...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年12月09日 13:12
  • 1151

利用snapweb来管理我们的Ubuntu Core应用

这篇文章介绍了如何使用Ubuntu Core系统所提供的snapweb服务来管理我们的Ubuntu Core系统....
  • UbuntuTouch
  • UbuntuTouch
  • 2016年10月31日 10:50
  • 1243

如何为我们的Snappy Ubuntu应用编译并打包Snap(2)

在我的上一篇文章中,我已经展示了如何在Desktop环境下编译我们的项目并成功部署到我们的KVM环境中.可能有兴趣的开发者们想更一步把我们的项目部署到一个设备中,比如树莓派中,那么我们该怎么做呢?在今...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年11月11日 15:34
  • 1481

利用snapcraft为我们的Snappy Ubuntu应用打包

我们知道在现在的Ubuntu桌面中,我们几乎都使用的是debian包.有的Linux系统上是使用rpm包.在Snappy Ubuntu上,我们使用的包叫做snap包.它的包的扩展名叫做.snap.这是...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年11月04日 11:42
  • 2447

Ubuntu Snappy及Snap包介绍(英文)

在今天的视频里,它介绍什么是Snappy Ubuntu系统及Snap包的格式. http://v.youku.com/v_show/id_XMTY1NzQzMjM0NA==.html https://...
  • UbuntuTouch
  • UbuntuTouch
  • 2016年07月25日 12:59
  • 643

利用MQTT信息协议来控制piglow灯光

在先前的一篇文章"利用Snappy Ubuntu来控制piglow灯光"中,我们已经使用了webserver的方法来控制我们的piglow.在IoT世界里,MQTT信息协议也是用得非常多的一种协议.它...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年11月23日 14:29
  • 2177

到底snappy ubuntu core是什么?

我不知大家有没有听过Snappy Ubuntu Core.反正我第一次听到Snappy时,不是很理解.如果我们查查字典,它的意思是爽快的,敏捷的,精力充沛的.听起来非常不错!对了Snappy就是Can...
  • UbuntuTouch
  • UbuntuTouch
  • 2015年10月20日 12:52
  • 7818
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Snappy Ubuntu来控制piglow灯光
举报原因:
原因补充:

(最多只允许输入30个字)