利用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的一些基本的命令

snappy ubuntu core 演示

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

Ubuntu Snappy 学习心得 (1)

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

基于ARM的智能灯光控制系统(7)设备更新

基于ARM的智能灯光控制系统(7)设备更新5v-3.3v电压转换模块设备更新头文件(dev_pro.h)#ifndef _SL2000_DEV_PRO_H #define _SL2000_DEV_PR...

基于ARM的智能灯光控制系统(4)数据结构

基于ARM的智能灯光控制系统(4)数据结构主控后台服务程序daemon.c 程序功能模块 #include #include "config.h" #include "sys_ipc.h" ...

基于ARM的智能灯光控制系统(5)设备链表

基于ARM的智能灯光控制系统(5)设备链表设备自动动态更新 使用链表实现,方便数据实时动态增加与删除。 链表处理头文件 (link_pro.h) 函数 功能 使用 Create ...

LED灯光控制系统--基于WIZ610wi

LED是一种能够将电能转化为光能的半导体,它改变了白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。其几大特点:寿命长、光效高、无辐射与低功耗。        目前市场上的LED正在慢慢替代...

基于ARM的智能灯光控制系统(9)设备管理

基于ARM的智能灯光控制系统(9)设备管理设备管理网页界面设备管理页面程序(dev_con.c) #include #include #include #include #include "ht...

基于W5500+Yeelink的远程灯光控制设计

在W5500EVB端连接LED灯,通过W5500与网络连接,并与物联网云平台Yeelink中添加设备建立连接;之后系统会将读取的温度和湿度上传到物联网云平台Yeelink,这样就可以随时通过网络观察温...

基于ARM的智能灯光控制系统(8)设备添加

基于ARM的智能灯光控制系统(8)设备添加设备添加页面网页显示头文件(html.h)#include #define ERR_SHM 1 #define ERR_MSG 2 #define ERR_...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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