利用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
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

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

Snappy Ubuntu 入门

在这篇文章中,我们将介绍Snappy Ubuntu的一些基本知识.我们将介绍如何在我们的电脑上安装KVM,并利用它来学习Snappy的一些基本的命令...

snappy ubuntu core 演示

该文章展示了几个视频来介绍可以在snappy ubuntu core上的可能实现的应用.

如何安装Snappy Ubuntu到树莓派(RaspBerry PI)上

大家可能已经阅读了我前面的有关Snappy Ubuntu的介绍了.是不是想迫不及待地弄一个自己的Snappy系统到自己的开发板上啊?在今天的这篇文章中,我们将介绍如何组装自己的树莓派Snappy Ub...

MQTT再学习 -- 搭建MQTT服务器及测试

最近在搞 PM2.5 采集,需要用到 MQTT 传输协议。协议部分看了几天的,讲的七七八八。本身在 intel 上有 写好的MQTT 的源码,现在的工作其实也就是移植到单片机上或者DM368板卡上。不...

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

我们知道在现在的Ubuntu桌面中,我们几乎都使用的是debian包.有的Linux系统上是使用rpm包.在Snappy Ubuntu上,我们使用的包叫做snap包.它的包的扩展名叫做.snap.这是...

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

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

如何在装上Snappy Ubuntu的树莓派上启动WiFi

有些朋友可能已经安装好自己的Snappy Ubuntu到自己的树莓派的开发版上了.我们可以通过连上网路线直接到我们的路由器上.对于使用TP-link路由器的开发者来说,我们可以zhiji...

Ubuntu Snappy 学习心得 (1)

前言第一次在 CSDN 开个博客,写点自己学习的东西。 首先就先写个 Ubuntu Snappy 的专题,我知道英文的网站以及 Ubuntu 官方网站已经有很多文章介绍了,我尽量翻译并结合自己的心得...

基于ARM的智能灯光控制系统(2)需求分析

基于ARM的智能灯光控制系统(2)需求分析项目实践流程: 1.设计项目需求文档 说明项目设计目的,项目功能,项目模块,实现技术。 2.项目编码设计 程序要求模块结构化(函数...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Snappy Ubuntu来控制piglow灯光
举报原因:
原因补充:

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