snapcraft动手实践 --- Web Camera

在这篇文章中,我们将使用snapcraft来创建一个具体的有趣的应用:webcam 服务器.我们将从0开始做,只到我们把整个应用做出来.最终的应用是我们可以在一个webserver每10秒看到一个新的从webcam来的Image.

本教程的最终源代码在地址:https://github.com/liu-xiao-guo/webcam-webui


1)硬件组成


在这个练习中,我们将采用一个树莓派2及一个webcam(可以是logitech的照相机).关于如何组装自己的树莓派盒子,请参阅我的文章" 如何安装Snappy Ubuntu到树莓派(RaspBerry PI)上".目前,我将使用一个creative的照相机.这个相机的优点是在Snappy Ubuntu中不使用任何的驱动:

snapcraft动手实践 --- Web Camera_第1张图片      snapcraft动手实践 --- Web Camera_第2张图片

我们可以把我们的相机连到我们 树莓派的一个USB口上,当然,我们也可以购买一个原装的树莓派的 webcam.这样我们最基本的硬件就搭配好了.等我们连接上我们的webcam后,我们在我的Snappy ubuntu系统中可以用如下的命令来查看我们的video装置是否已经存在:
$ ls /dev/video*
/dev/video0
如果你已经看到上面有任何装置显示的话,那么恭喜你.你的照相机已经被系统成功认识了.开发者如果有自己的 beaglebone开发板,也是可以直接使用的.这里就不累述了.


2)软件安装


在这一节中,我们想在自己的Desktop上安装用于创建snap的工具.我们可以通过这个工具来创建我们需要的snap包.这个包可以被成功用于KVM中的snappy系统.虽然webcam应用目前不能在KVM中测试(video装置不能被正确认识),但是我们还是可以通过在KVM环境中安装来测试我们的安装情况.最终,我们可以把我们的应用打包为armhf架构的包,并在arm架构中的装置,比如树莓派中测试.如果开发者已经安装好一个Snappy Personal的Desktop,那么下面的步骤就不需要了.

$ sudo add-apt-repository ppa:snappy-dev/tools  
$ sudo apt-get update  
$ sudo apt-get install snappy-tools bzr snapcraft  

通过上的指令,我们就可以把我们需要开发Snappy的包安装好了.
为了能够使得该教程在Desktop的环境中进行打包,我们必须安装如下的golang包:

$ sudo apt-get install golang-go


3)建立一个webserver



golang语言在它的库里有一个自己的标准的webserver.在这里,我们将直接使用.我将只使用很少的几句话,就可以创建一个自己的webserver:

package main
import "net/http"
func main() {
    panic(http.ListenAndServe(":8080", http.FileServer(http.Dir("."))))
}

这个webserver建立在端口8080,并显示当前目录的所有的内容.如果当前目录下有一个index.html文件,它将被展示.否则它将直接显示当前目录的所有的文件.我们可以在地址 golang-static-http找到它的源码.在本教程中,我们可以直接在我们的snapcraft.yaml中使用github中的 代码,所有我们不必自己建立这个文件.



4)webcam应用


在Ubuntu archive里,有一个叫做fswebcam的应用.它有很多的功能.事实上,我们可以通过如下的方法来进行安装到我们的desktop上面:

$ sudo apt-get install fswebcam

我们也可以通过如下的方式来得到webcam的一帧图像文件:

$ fswebcam output.jpg

整个项目的源码在 fswebcam.在我们的webcam应用中,我们会通过snapcraft.yaml中描述的方法来自动帮我们下载到项目中,并打包到我们最终的snap包中去.在这里我们只是想展示在Desktop的环境中fswebcam到底是如何使用的.


5)snapcraft使用方法


在这一节中,我们将具体介绍如何使用snapcraft把上面的应用(webserver + fswebcam)结合起来,并最终生产我们需要的snap安装文件.snapcraft只读取一个文件.这个文件的名字叫做snapcraft.yaml.利用它,我们可以把我们所需要的代码都结合起来.在这个文件中,它定义了一个parts的列表,或一段代码及一个最终用于生产snap包所需要的metadata信息.我们先不考虑metadata方面的东西.

初始化项目

我们可以通使用snapcraft创建一个最基本的模版.我们首先来创建一个叫做webcam-webui的文件目录:

$ mkdir webcam-webui
$ cd webcam-webui
$ snapcraft init

然后我们打开我们创建的snapcraft.yaml文件,并修改里面的信息:

name: webcam-webui # the name of the snap
version: 1 # the version of the snap
vendor:  XiaoGuo Liu <[email protected]>
summary: Webcam web UI
description: Expose your webcam over a Web UI
icon: icon.png

我们可以通过如下的方式来拷贝一个icon.png到当前的目录中:

$ cp /usr/share/icons/hicolor/64/mimetypes/text-x-apport.png ./icon.png

当然开发者可以根据自己的需求设计属于自己的应用icon. 
如果我们现在运行snapcraft的话,你会看到如下的信息:

liuxg@liuxg:~/snappy/exercise/webcam-webui$ snapcraft
Issues while validating snapcraft.yaml: 'parts' is a required property

显然,它在抱怨没有parts在这个文件中.在下面的章节中,我们将介绍如何加入相应的parts.

webserver part

让我们先来加入一个webserver的part.打开我们的snapcraft.yaml文件,并在icon行的下面加入:

parts:
  cam:
    plugin: go
    source: git://github.com/mikix/golang-static-http

我们刚刚定义了一个叫做cam的part.它位于parts的下面.事实上这个cam的名称可以是你喜欢的任何一个名字.在一个part的下面,有两个option:
  • plugin: 它告诉snapcraft如何解释part.在我们的这个情况,它是golang项目
  • source: 它告诉snapcraft在哪里下载源码.在我们的这个情况,代码位于github.com/mikix/golang-static-http
现在,我们可以build及stage我们的项目了.stage意味着我们把不同的parts都放到一个snap所需要的共同目录下.它们拥有共同的文件架构.它可以让我们看到所有用于构造snap的所有东西都在那里.

liuxg@liuxg:~/snappy/exercise/webcam-webui$ snapcraft stage
Pulling cam 
env GOPATH=/home/liuxg/snappy/exercise/webcam-webui/parts/cam/build go get -t -d github.com/mikix/golang-static-http
Building cam 
env GOPATH=/home/liuxg/snappy/exercise/webcam-webui/parts/cam/build go build github.com/mikix/golang-static-http
env GOPATH=/home/liuxg/snappy/exercise/webcam-webui/parts/cam/build go install github.com/mikix/golang-static-http
env GOPATH=/home/liuxg/snappy/exercise/webcam-webui/parts/cam/build cp -a /home/liuxg/snappy/exercise/webcam-webui/parts/cam/build/bin /home/liuxg/snappy/exercise/webcam-webui/parts/cam/install
Staging cam 

在上面我们可以看出snapcraft所进行的步骤:pull/build/stage.现在整个项目的目录架构如下:

liuxg@liuxg:~/snappy/exercise/webcam-webui$ tree -L 5
.
├── icon.png
├── parts
│   └── cam
│       ├── build
│       │   ├── bin
│       │   │   └── golang-static-http
│       │   ├── golang-static-http
│       │   └── src
│       │       └── github.com
│       ├── install
│       │   └── bin
│       │       └── golang-static-http
│       ├── src
│       ├── state
│       └── ubuntu
├── snap
├── snapcraft.yaml
└── stage
    └── bin
        └── golang-static-http

从上面可以看出来:snapcraft把go项目的源码下载下来,并编译到它自己所在part cam的bin目录.在stage目录下,它收集了各个part的bin文件等.


为Ubuntu项目添加dependence到part中

在这一节中,我们为我们的snap加入fswebcam项目.编辑我们的snapcraft.yaml文件,并使得它的内容如下:

parts:
  cam:
    plugin: go
    source: git://github.com/mikix/golang-static-http
    stage-packages:
      - fswebcam

我们在上面为我们cam part添加了一个新的叫做stage-packages的property.它里面包含了一个yaml列表.这个列表里的包将为我们最终的snap包服务.在我们的这种情况下,它包含了一个叫做fswebcam的包,这个包是一个基于debian的包.
接下来让我们再次stage我们的项目:

$ snapcraft stage --force

或者,我们先做一个:

$ snapcraft clean
$ snapcraft

liuxg@liuxg:~/snappy/exercise/webcam-webui$ tree -L 4
.
├── icon.png
├── parts
│   └── cam
│       ├── build
│       │   ├── bin
│       │   ├── golang-static-http
│       │   └── src
│       ├── install
│       │   ├── bin
│       │   ├── etc
│       │   ├── lib
│       │   ├── usr
│       │   └── var
│       ├── src
│       ├── state
│       └── ubuntu
│           ├── download
│           ├── etc
│           └── var
├── snap
├── snapcraft.yaml
└── stage
    ├── bin
    │   └── golang-static-http
    ├── etc
    │   ├── fonts
    │   │   ├── conf.avail
    │   │   ├── conf.d
    │   │   └── fonts.conf
    │   └── ucf.conf
    ├── lib
    │   └── x86_64-linux-gnu
    │       ├── libexpat.so.1 -> libexpat.so.1.6.0
    │       ├── libexpat.so.1.6.0
    │       ├── libpng12.so.0 -> libpng12.so.0.51.0
    │       └── libpng12.so.0.51.0
    ├── usr
    │   ├── bin
    │   │   ├── fswebcam
    │   │   ├── lcf
    │   │   ├── ucf
    │   │   ├── ucfq
    │   │   └── ucfr
    │   ├── lib
    │   │   └── x86_64-linux-gnu
    │   └── share
    │       ├── doc
    │       ├── doc-base
    │       ├── fonts
    │       ├── lintian
    │       ├── man
    │       └── X11
    └── var
        └── lib
            └── ucf

或更详细的图在 地址可以找到.从上面可以看出,在stage中的/usr/bin目录中出现了fswebcam应用.Snapcraft下载了所有关于fswebcam相关的包到项目中.这些包都是运行fswebcam所必需的.如果我们查看目录stage,我们可以看到如下的内容:
$ ls stage
bin  etc  lib  usr  var


Copy part


现在我们的项目中有两个可以执行的项目(golang项目及fswebcam).那么我们怎么把它们联系起来呢?
我们下面来创建一个叫做webcam-webui的脚本.它的内容如下:

#!/bin/sh
set -e

cd "$SNAP_APP_DATA_PATH"

golang-static-http &

while :; do
    fswebcam shot.jpeg
    sleep 10
done

在这个脚本里,我们首先进入到目录SNAP_APP_DATA_PATH.关于SNAP_APP_DATA_PATH的内容,我们可以试着从snappy store中安装hello-world应用,并运行hello-world.env可以得到关于hello-world的这个路径.对于这个应用来说,也是同样的道理.它位于类似如下的路径:

/var/lib/apps/webcam-webui.sideload/IEcPTcTMdHOG$ 

这里的后面的数字"IEcPTcTMdHOG"代表是一个临时分配的版本号.等传人到Snappy商店后,这个号码才最终取自于snapcraft中所定义的版本号码.关于这个路径的具体内容,也可以参照文章" Snappy Ubuntu 入门".在上面的脚本中,它在进入到SNAP_APP_DATA_PATH目录后,启动web server,然后每隔10秒中,获取一张照片,并存于一个叫做shot.jpeg的文件中.
我们把上面的脚本修改为可以执行的文件:

$ chmod a+x webcam-webui

我们下面来把脚本也放到我们的snapcraft.yaml中:

parts:
  cam:
    plugin: go
    source: git://github.com/mikix/golang-static-http
    stage-packages:
      - fswebcam
  glue:
    plugin: copy
    files:
      webcam-webui: bin/webcam-webui

copy plugin从files列表中拷贝文件到指定的目录中.对于我们的情况,它把我们建立的脚本文件webcam-webui拷到bin目录下.
如果我们现在重新运行我们的snapcraft,我们不难发现webcam-webui脚本出现在bin目录中.

$ snapcraft stage

我们显示在stage/bin中的内容:

liuxg@liuxg:~/snappy/exercise/webcam-webui$ ls stage/bin -al
total 5660
drwxrwxr-x 2 liuxg liuxg    4096 11月 16 17:13 .
drwxrwxr-x 7 liuxg liuxg    4096 11月 16 16:35 ..
-rwxr-xr-x 2 liuxg liuxg 5781856 11月 16 16:35 golang-static-http
-rwxrwxr-x 2 liuxg liuxg     119 11月 16 17:12 webcam-webui

Filesets

在stage目录中,有些文件是为了在staging阶段build其它依赖的parts,也有一些会被打包到最终的snap包中.在stage阶段中,有很多的生产的文件,但是不是所有的文件都是我们最终需要用来生产我们的snap文件用的.对我们的情况,我们需要使用filesets来提取我们需要的文件.我们来编辑我们的snapcraft.yaml:

parts:
  cam:
    plugin: go
    source: git://github.com/mikix/golang-static-http
    stage-packages:
      - fswebcam
    filesets:
      fswebcam:
        - usr/bin/fswebcam
        - lib
        - usr/lib
      go-server:
        - bin/golang-*
    snap:
      - $fswebcam
      - $go-server
  glue:
    plugin: copy
    files:
      webcam-webui: bin/webcam-webui

在上面,我们加入了俩个filesets:fswebca及go-server.我们在snap项中引用它们时需要加上$.针对我们的情况,它们是$fswebcam及$go-server.你可以使用*来包含所有的文件或目录(如果文件的第一个字母是*,你需要引用,比如 '*').


对metadata进行扩展


在snapcraft.yaml中定义的项将最终被用来生产在meta文件目录下的package相关的文件.你可以在" format of this metadata"链接中得到更多的信息.在上面利用snapcraft所创建的模版不包含任何和我们parts相关的任何信息,它也不包含我们所需要的services或binaries.它们用来告诉我们如何启动我们的应用.我们重新打开我们的snapcraft.yaml,并编辑如下:

name: webcam-webui # the name of the snap
version: 1 # the version of the snap
vendor:  XiaoGuo Liu <[email protected]>
summary: Webcam web UI
description: Expose your webcam over a Web UI
icon: icon.png

services:
  webcam-webui:
    start: bin/webcam-webui

parts:
  cam:
    plugin: go
    source: git://github.com/mikix/golang-static-http
    stage-packages:
      - fswebcam
    filesets:
      fswebcam:
        - usr/bin/fswebcam
        - lib
        - usr/lib
      go-server:
        - bin/golang-*
    snap:
      - $fswebcam
      - $go-server
  glue:
    plugin: copy
    files:
      webcam-webui: bin/webcam-webui

在上面,我们已经加上了services这部分.表明这个应用是一个服务.它将在安装或系统启动时自动运行.我们使用如下的命令来生成我们的最终的.snap文件.

$ snapcraft

我们可以在我们的目录下看到生产的文件 webcam-webui_1_amd64.snap.



6)为树莓派生成armhf snap包



我们可以把我们的代码push到github中.我已经把最终的完整的代码放到 https://github.com/liu-xiao-guo/webcam-webui.我们可以参照文章" 如何为我们的Snappy Ubuntu应用编译并打包Snap(2)"在树莓派中建立一个环境并生产相应的.snap包

$ git clone https://github.com/liu-xiao-guo/webcam-webui  

ubuntu@a5ceb8ea0825:~/work$ git clone https://github.com/liu-xiao-guo/webcam-webui
Cloning into 'webcam-webui'...
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 5 (delta 0), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
Checking connectivity... done.
ubuntu@a5ceb8ea0825:~/work$ source /home/ubuntu/.gvm/scripts/gvm  
ubuntu@a5ceb8ea0825:~/work$ cd webcam-webui/
ubuntu@a5ceb8ea0825:~/work/webcam-webui$ ls
icon.png  snapcraft.yaml  webcam-webui
ubuntu@a5ceb8ea0825:~/work/webcam-webui$ snapcraft
Pulling cam 
Get:1 http://ports.ubuntu.com wily InRelease [218 kB]                                             
Get:2 http://ports.ubuntu.com wily-updates InRelease [64.4 kB]                                    
Get:3 http://ports.ubuntu.com wily-security InRelease [64.4 kB]                                   
Get:4 http://ports.ubuntu.com wily/main armhf Packages [1793 kB]                                  
Get:5 http://ports.ubuntu.com wily/restricted armhf Packages [12.4 kB]                            
Get:6 http://ports.ubuntu.com wily/universe armhf Packages [8507 kB]                              
Get:7 http://ports.ubuntu.com wily/multiverse armhf Packages [150 kB]                             
Get:8 http://ports.ubuntu.com wily-updates/main armhf Packages [56.6 kB]                          
Get:9 http://ports.ubuntu.com wily-updates/restricted armhf Packages [40 B]                       
Get:10 http://ports.ubuntu.com wily-updates/universe armhf Packages [25.6 kB]                     
Get:11 http://ports.ubuntu.com wily-updates/multiverse armhf Packages [40 B]                      
Get:12 http://ports.ubuntu.com wily-security/main armhf Packages [45.5 kB]                        
Get:13 http://ports.ubuntu.com wily-security/restricted armhf Packages [40 B]                     
Get:14 http://ports.ubuntu.com wily-security/universe armhf Packages [21.6 kB]                    
Get:15 http://ports.ubuntu.com wily-security/multiverse armhf Packages [40 B]                     
Fetched 11.0 MB in 6s (73.0 kB/s)                                                                 
Skipping blacklisted from manifest packages: ['adduser', 'apt', 'apt-utils', 'base-files', 'base-passwd', 'bash', 'bsdutils', 'coreutils', 'dash', 'debconf', 'debconf-i18n', 'debianutils', 'diffutils', 'dmsetup', 'dpkg', 'e2fslibs', 'e2fsprogs', 'file', 'findutils', 'gcc-4.9-base', 'gcc-5-base', 'gnupg', 'gpgv', 'grep', 'gzip', 'hostname', 'init', 'initscripts', 'insserv', 'libacl1', 'libapparmor1', 'libattr1', 'libaudit-common', 'libaudit1', 'libblkid1', 'libbz2-1.0', 'libc-bin', 'libc6', 'libcap2', 'libcap2-bin', 'libcomerr2', 'libcryptsetup4', 'libdb5.3', 'libdebconfclient0', 'libdevmapper1.02.1', 'libgcc1', 'libgcrypt20', 'libgpg-error0', 'libgpm2', 'libkmod2', 'liblocale-gettext-perl', 'liblzma5', 'libmagic1', 'libmount1', 'libncurses5', 'libncursesw5', 'libpam-modules', 'libpam-modules-bin', 'libpam-runtime', 'libpam0g', 'libpcre3', 'libprocps3', 'libreadline6', 'libselinux1', 'libsemanage-common', 'libsemanage1', 'libsepol1', 'libslang2', 'libsmartcols1', 'libss2', 'libstdc++6', 'libsystemd0', 'libtext-charwidth-perl', 'libtext-iconv-perl', 'libtext-wrapi18n-perl', 'libtinfo5', 'libudev1', 'libusb-0.1-4', 'libustr-1.0-1', 'libuuid1', 'locales', 'login', 'lsb-base', 'makedev', 'manpages', 'manpages-dev', 'mawk', 'mount', 'multiarch-support', 'ncurses-base', 'ncurses-bin', 'passwd', 'perl-base', 'procps', 'readline-common', 'sed', 'sensible-utils', 'systemd', 'systemd-sysv', 'sysv-rc', 'sysvinit-utils', 'tar', 'tzdata', 'ubuntu-keyring', 'udev', 'util-linux', 'zlib1g']
Get:1 http://ports.ubuntu.com/ubuntu-ports/ wily/main libpng12-0 armhf 1.2.51-0ubuntu3 [108 kB]   
Get:2 http://ports.ubuntu.com/ubuntu-ports/ wily/main libxau6 armhf 1:1.0.8-1 [7324 B]            
Get:3 http://ports.ubuntu.com/ubuntu-ports/ wily/main libxdmcp6 armhf 1:1.1.2-1 [9804 B]          
Get:4 http://ports.ubuntu.com/ubuntu-ports/ wily/main fonts-dejavu-core all 2.35-1 [1039 kB]      
Get:5 http://ports.ubuntu.com/ubuntu-ports/ wily/main ucf all 3.0030 [55.5 kB]                    
Get:6 http://ports.ubuntu.com/ubuntu-ports/ wily/main fontconfig-config all 2.11.1-0ubuntu6 [48.7 kB]
Get:7 http://ports.ubuntu.com/ubuntu-ports/ wily/main libexpat1 armhf 2.1.0-7 [52.4 kB]           
Get:8 http://ports.ubuntu.com/ubuntu-ports/ wily/main libfreetype6 armhf 2.5.2-4ubuntu2 [265 kB]  
Get:9 http://ports.ubuntu.com/ubuntu-ports/ wily/main libfontconfig1 armhf 2.11.1-0ubuntu6 [110 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports/ wily/main libjpeg-turbo8 armhf 1.3.0-0ubuntu2 [85.2 kB]
Get:11 http://ports.ubuntu.com/ubuntu-ports/ wily/main libjbig0 armhf 2.1-3.1 [24.3 kB]           
Get:12 http://ports.ubuntu.com/ubuntu-ports/ wily/main libjpeg8 armhf 8c-2ubuntu8 [2202 B]        
Get:13 http://ports.ubuntu.com/ubuntu-ports/ wily/main libtiff5 armhf 4.0.3-12.3ubuntu2 [129 kB]  
Get:14 http://ports.ubuntu.com/ubuntu-ports/ wily/main libxcb1 armhf 1.11-0ubuntu1 [36.6 kB]      
Get:15 http://ports.ubuntu.com/ubuntu-ports/ wily/main libx11-data all 2:1.6.3-1ubuntu2 [113 kB]  
Get:16 http://ports.ubuntu.com/ubuntu-ports/ wily/main libx11-6 armhf 2:1.6.3-1ubuntu2 [514 kB]   
Get:17 http://ports.ubuntu.com/ubuntu-ports/ wily/main libxpm4 armhf 1:3.5.11-1 [28.6 kB]         
Get:18 http://ports.ubuntu.com/ubuntu-ports/ wily/main libapt-pkg4.16 armhf 1.0.10.2ubuntu1 [585 kB]
Get:19 http://ports.ubuntu.com/ubuntu-ports/ wily/main libapt-inst1.7 armhf 1.0.10.2ubuntu1 [55.2 kB]
Get:20 http://ports.ubuntu.com/ubuntu-ports/ wily/main libvpx2 armhf 1.4.0-4 [925 kB]             
Get:21 http://ports.ubuntu.com/ubuntu-ports/ wily/main libgd3 armhf 2.1.1-4build1 [106 kB]        
Get:22 http://ports.ubuntu.com/ubuntu-ports/ wily/universe fswebcam armhf 20140113-1 [40.8 kB]    
Fetched 4341 kB in 6s (30.7 kB/s)                                                                 
env GOPATH=/home/ubuntu/work/webcam-webui/parts/cam/build go get -t -d github.com/mikix/golang-static-http
Building cam 
env GOPATH=/home/ubuntu/work/webcam-webui/parts/cam/build go build github.com/mikix/golang-static-http
env GOPATH=/home/ubuntu/work/webcam-webui/parts/cam/build go install github.com/mikix/golang-static-http
env GOPATH=/home/ubuntu/work/webcam-webui/parts/cam/build cp -a /home/ubuntu/work/webcam-webui/parts/cam/build/bin /home/ubuntu/work/webcam-webui/parts/cam/install
Staging cam 
Snapping cam 
Pulling glue 
Building glue 
cp --preserve=all -R webcam-webui /home/ubuntu/work/webcam-webui/parts/glue/install/bin/webcam-webui
Staging glue 
Snapping glue 
2015/11/17 01:13:26.323310 main.go:42: WARNING: can not create syslog logger
Generated 'webcam-webui_1.0_armhf.snap' snap
ubuntu@a5ceb8ea0825:~/work/webcam-webui$ ls 
icon.png  parts  snap  snapcraft.yaml  stage  webcam-webui  webcam-webui_1.0_armhf.snap

我们从上面看见我们已经生产了为我们树莓派armhf的snap包.我们可以安装它到我们的树莓派上去.

ubuntu@a5ceb8ea0825:~/work/webcam-webui$ exit
logout
(RaspberryPi2)ubuntu@localhost:~$ cd apps/docker/1.6.2.004/work/webcam-webui/
(RaspberryPi2)ubuntu@localhost:~/apps/docker/1.6.2.004/work/webcam-webui$ ls
icon.png  parts  snap  snapcraft.yaml  stage  webcam-webui  webcam-webui_1.0_armhf.snap
(RaspberryPi2)ubuntu@localhost:~/apps/docker/1.6.2.004/work/webcam-webui$ sudo snappy install --allow-unauthenticated webcam-webui_1.0_armhf.snap 
Installing webcam-webui_1.0_armhf.snap
2015/11/17 01:16:59.252451 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  
glowapi        2015-10-31 0.1.2        vtuson    
hello-world    2015-11-12 1.0.18       canonical 
mqtt-piglow    2015-11-02 IEWUKJCENbWA sideload  
mqtttestclient 2015-11-12 IFOTYdKLCaGB 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-14 IFUgCESTPcKT sideload  
webdm          2015-10-29 0.9.4        sideload  
pi2            2015-09-25 0.16         canonical 

从上面可以看出来,我们已经成功地把webcam-webui部署到我们的树莓派上去了.接下来,我们可以通过如下的命令来让我们的应用访问我们的硬件设备/dev/video0.

$ sudo snappy hw-assign webcam-webui.sideload /dev/video0

(RaspberryPi2)ubuntu@localhost:~/apps/docker/1.6.2.004/work/webcam-webui$ cd
(RaspberryPi2)ubuntu@localhost:~$ ls /dev/video0 
/dev/video0
(RaspberryPi2)ubuntu@localhost:~$ sudo snappy hw-assign webcam-webui.sideload /dev/video0
'webcam-webui.sideload' is now allowed to access '/dev/video0'
(RaspberryPi2)ubuntu@localhost:~$ sudo snappy service status
Snap		Service		State
docker		docker-daemon	; not-found; inactive (dead)
docker		docker-daemon	enabled; loaded; active (running)
glowapi		glowapi		enabled; loaded; active (running)
mqtt-piglow	mqtt-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)

如果我们取消该应用访问该硬件,我们可以使用如下的命令:

$ sudo snappy hw-unassign webcam-webui.sideload /dev/video0

我们可以通过如下的命令来查看当前的应用的硬件访问情况:

$ sudo snappy hw-info webcam-webui.sideload

我们可以通过如下的方法来检验它是否工作:

snapcraft动手实践 --- Web Camera_第3张图片

snapcraft动手实践 --- Web Camera_第4张图片


注意上面的IP地址需要你们修改为自己的树莓派IP地址.至此,我们已经成功完成了我们的应用的部署及测试.我希望你们也同样完成了这个练习!



7)更多学习资料


我们现在已经成功地创建了我们的snap文件.我们可以下载 snapcraft源码:

git clone https://github.com/ubuntu-core/snapcraft
cd snapcraft/examples

在它的 examples目录下,有更多的例程可以供大家参考.

你可能感兴趣的:(snapcraft动手实践 --- Web Camera)