在这篇文章中,我们将使用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中不使用任何的驱动:
我们可以把我们的相机连到我们
树莓派的一个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
为了能够使得该教程在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
name: webcam-webui # the name of the snap
version: 1 # the version of the snap
vendor: XiaoGuo Liu <xiaoguo.liu@canonical.com>
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
如果我们现在运行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
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
.
├── 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
接下来让我们再次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
├── 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
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 <xiaoguo.liu@canonical.com>
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
我们可以通过如下的方法来检验它是否工作:
注意上面的IP地址需要你们修改为自己的树莓派IP地址.至此,我们已经成功完成了我们的应用的部署及测试.我希望你们也同样完成了这个练习!
7)更多学习资料
我们现在已经成功地创建了我们的snap文件.我们可以下载
snapcraft源码:
git clone https://github.com/ubuntu-core/snapcraft
cd snapcraft/examples
在它的
examples目录下,有更多的例程可以供大家参考.