买不到称心的智能镜子,就DIY一面吧

智能镜子可谓是科幻电影的必备道具。作为未来世界中信息泛滥的最佳展现形式,它随时能为主人公提供需要的消息。

然而,如此高大上的设备,制造起来其实还挺简单的……

所以,别再等众筹网站上不靠谱儿的项目了,不如自己动手组装一面~

材料:

一块树莓派3主板,或者有Wi-Fi 功能的旧型号。

一台有HDMI接口的显示器。显示器的尺寸就是智能镜子的最终尺寸,显示器还应该带USB接口,这样就不需要再为树莓派拉根电源线。

一面双向镜。尺寸当然和显示器一样。

鼠标、键盘,用来设置树莓派。

一幅画框,用来框镜子。当然,如果你有更好的创意,也可以不用画框~

工具若干。

制作:

制造智能镜子最难的并不是编程,因为需要的软件,Michael Teeuw创建的《智能镜子计划》网站(https://magicmirror.builders/)都给你打包好了。基本上,只要链接好树莓派,再安装上MagicMirror2;软件就行,甚至不需要下载,只要在树莓派上运行一行代码就成。

bash -c “$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/master/installers/raspberry.sh)”

为防你想要亲力亲为…… GitHub上也有手动安装指南,地址如下:

https://github.com/MichMich/MagicMirror#manual-installation

安装时长在10-20分钟之间,一旦完成,编程上就没别的活儿了。不过还需要做一些设置,比如关掉屏保、旋转屏幕(镜子大部分都是竖着的嘛~),还有保证在待机状态下 Wi-Fi不会断开。

接下来就是真正有趣的部分了~

设置镜子界面:MagicMirror自带了时钟、当前天气、天气预报、新闻、问候语、Hello World,和闹钟模块。其中一些模块是需要额外设置的,比如说注册API钥匙,添加地址什么的。

MagicMirror还是个开源软件,这意味着第三方开发者会不时为它增添新的模块,让你持续完善自己的智能镜子。

一旦你把所有需要的模块都设置好了,就可以把显示器变成智能镜子了~

把双向镜放在显示器上(当然是镜面那面朝外),框好相框,你的智能镜子就做好了。

如果你想要做的再完美(彻底)点,还可以把显示器的硬件从塑料外壳中拆下来,让它一劳永逸地做面镜子~

来源:sohu

为什么说最适合IoT开发人员的发行版是Ubuntu

一句话前言:本文说的是用来“写”代码的机器,不是主要用来“跑”代码的机器。

适合做开发的桌面系统很多,但适合做IoT开发的并不多。

首先要支持各种硬件驱动和外设,再则要方便安装各种开源或闭源的IDE和插件。

很多朋友可能会说Mac OS X不错啊,Mac OS X是不错,但对应的Macbook实在不合群,一旦要用到USB口或者以太网口什么的……

Windows更适合用来进行Windows IoT版开发,而大部分嵌入式设备跑的是Linux……

好吧,那我们在Linux阵营里找。

此刻的答案可能要多如牛毛了,每个发行版的粉丝们都会讲出自己的理由。但我还是要说出我的选择 —— Ubuntu Desktop。

Eclipse 基金会在2017年四月完成了由 713 位开发者回答的 IoT 开发者那个调查,他们被问到了有关 IoT 编程语言、云平台、IoT 操作系统、消息协议(MQTT, HTTP)、IoT 硬件架构等问题。

当被问及大家在IoT开发时采用的操作系统/Linux发行版时,Raspbian 以 45.5% 的比例遥遥领先,Ubuntu/Ubuntu Core 紧随其后,使用比例达到了 44.0%。

嗯,答案看起来应该是Raspbian才对。

可大家别忘了Raspbian一直是跑在树莓派上的,而我们这里说的是技术人员平时用的开发环境。

Ubuntu/Ubuntu Core的官方支持列表大家有目共睹,不管是树莓派还是Orange Pi、DragonBoard 410c、Intel NUC……都能跑。

况且市面上很多公司的产品都在基于Ubuntu Core做定制,不管是大疆、Erle Robotics的无人机还是Rigado的IoT网关。

这样一对应,用Ubuntu的桌面来开发Ubuntu IoT这类系统的软件似乎再合适不过。很多包和组件都是配套的,有官方支持。

为各类设备做内核编译等操作的时候,运行Ubuntu Desktop的高性能X86桌面电脑可以快速交叉编译,搞定你需要的组件。不管是Ubuntu系统的,还是Raspbian系统的。

另外,近期开始流行的跨发行版Snappy包管理器,最初就是为Ubuntu系统构建的。其管理的Snap 包可对 App 和 Ubuntu Core 软件本身进行原子级事务性更新。具有沙箱的属性,不可以随意访问外部资源,和系统的其它部分隔离开来,并通过设计好的安全策略与其他 Snap 进行交互。这也是 Ubuntu Core 具有极强安全性的原因。

写了半天,突然发现Ubuntu官网已经把18.04 LTS这一“长期支持版”正式上线了。

是的,作为一个IoT开发平台,LTS —— “Long Term Support”也很重要。也许这就是我喜欢用Ubuntu Desktop来写代码的原因吧!

版权声明:本文为“IoT前哨站”原创,转载请注明原文作者和出处。

给树莓派装个Web界面的仪表盘

大部分人都习惯界面友好的系统监视器,以便直观的了解系统的实时运行情况。

哪怕是一个正在跑着简单应用的树莓派。

最近看到有些朋友在用一个叫“Pi Dashboard”的仪表盘程序,感觉还挺清爽。

于是也装了一个试试。如图所示。

该应用后端是PHP,前端使用了bootstrap和jquery,安装也很简单,标准的LAMP或者LNMP环境都可以。

sudo apt-get update

sudo apt-get install nginx php7.0-fpm php7.0-cli php7.0-curl php7.0-gd php7.0-mcrypt php7.0-cgi

启动完nginx 和 php7.0-fpm之后,编辑Nginx配置文件。

sudo nano /etc/nginx/sites-available/default

把location那一整个大括号区域替换成如下内容即可:

location / {
index index.html index.htm index.php default.html default.htm default.php;
}

location ~\.php$ {
fastcgi_pass unix:/run/php/php7.0-fpm.sock;
#fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}

如果是已经在跑Apache的PHP环境,直接运行即可。此应用在Raspbian Stretch系统 和 树莓派3B/3B+ 上均测试成功,感觉可以在后面加入温度显示。

注:该项目来自NXEZ.com的树莓派实验室,使用GPL v3.0许可证。

项目地址:https://github.com/spoonysonny/pi-dashboard

Windows平台也高效的GNU编译工具链 —— MSYS2

MSYS:Minimal GNU(POSIX)System on Windows,是一个小型的GNU环境,包括基本的bash,make等等。

而MSYS2除了集成了MinGW这个精简的Windows编译器以外,还集成了包管理器等等。

MSYS2可以在Windows下搭建一个完美的类Linux环境,包括bash、vim、gcc、make等工具都可以通过pacman这个包管理器来添加和卸载 。使用界面如图所示。

如果要安装git工具,可以这样。

是不是很方便?顺便说一句,高性能 Web 平台OpenResty的64位Windows版本也是用这个编译的。

安装限制:

  • MSYS2 不能安装在FAT* 分区。
  • MSYS2 仅支持Windows XP以后的版本。

基本工具包使用:

  • pacman -Sy 更新软件包数据
  • pacman -Syu 更新所有包
  • pacman -Ss xx 查询软件xx的信息
  • pacman -S xx 安装软件xx

延长树莓派上SD卡的使用寿命

据说SD卡的写入次数是有限的,那么这是否意味着用树莓派当作服务器会存在一些问题呢?也许吧,目前只是个别文章报告了SD卡会报废,但并没有完全的定论。于是我开始寻找一些方法把SD卡的写入次数降到最低,理论上有助于延长它的使用寿命。

在一个SD卡上运行GNU/Linux的最佳实践

一张容量更大的卡 假设写操作在卡上的各个地方都有可能进行,这样越大的卡在同一区域多次书写的概率越小。对于大多数的树梅派GNU/Linux发行版来说,一张4GB的卡够用了,但8GB或者16GB从这个角度来看更合适。让我们把4GB提高到8GB,那么在同一区域进行写操作的概率会减少一半。

坚持选个好牌子 已经有许多文章都提到要坚持选择顶级品牌的SD卡。我没有整理出一份品牌列表也没有特别支持哪个品牌,但幸运的是已经有很多文章显示了顶级品牌和它们的报废率。调整GNU/Linux写入到内存而不是SD卡上 这使用了一个叫“tm

pfs”的功能,它是GNU/Linux提供的一个非常酷的玩意。Tmpfs能够像写入一个正常的文件系统一样让写操作写入内存中。它快捷,高效并且易于使用。下面会详细介绍。SD卡设置为只读模式 这实际上把GNU/Linux变成了一个只读模式,类似于你从Live CD启动的GNU/Linux。这样阻止了任何的写操作从理论上来讲延长了SD卡的寿命。但这也有许多缺陷。首先,你得在配置上花点功夫,

这已经超出了本文的范围。其次,所有的改动会在系统重启后消失因为它们没有写入SD卡里。对于我来说,GNU/Linux运行在只读模式实在是要命所以我不推荐这么极端的做法。

使用Tmpfs

如我前面所说,tmpfs会写入到内存中而不是本地磁盘(树梅派上实际是SD卡)。使用它非常简单。你要做的只是增加一个到/etc/fstab文件的入口(挂载你想写入到内存的文件夹到内存里)并且重启(这样每次服务开始写文件之前都会把这些文件夹先挂载到内存里)。

剩下的事情系统内核会替你搞定,把写操作写入到内存里的虚拟文件系统。这还有个巧妙之处,系统内核只会使用写操作所需数量的内存而不是整个挂载的大小。让我们举个例子,我想要把下面这一行加入到/etc/fstab文件中:

tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0

系统内核将会把/var/log挂载到内存中,然而在文件真正被写入到/var/log之前不会使用任何内存。当文件被写入到/var/log时,系统内核将会把它保存在内存里并且只占用用于保存文件的内存空间。当文件从/var/log中删除时,相对应的内存空间将被释放。

这意味着它只占用用于保存文件的内存空间,这是非常高效的。

在/etc/fstab中,你也可以为每个挂载指定内存配额。在上面的例子里,我们设置的是”size=100m”所以/var/log最多使用100m的内存空间。这是为了防止一个文件系统占用了全部内存以至于系统速度变慢甚至崩溃。通过运行”mount”命令,我们可以看到在上面的例子里/var/log被挂载为一个tmpfs在内存里的卷,大小是100MB。

Filesystem Size Used Avail Use% Mounted on
tmpfs 100M 596K 100M 1% /var/log

在GNU/Linux里有许多可能会频繁写入到地方。下面是一个我初步整理的应该可以适用于大多数发行版的列表。

tmpfs /tmp tmpfs defaults,noatime,nosuid,size=100m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,nosuid,size=30m 0 0
tmpfs /var/log tmpfs defaults,noatime,nosuid,mode=0755,size=100m 0 0
tmpfs /var/run tmpfs defaults,noatime,nosuid,mode=0755,size=2m 0 0
tmpfs /var/spool/mqueue tmpfs defaults,noatime,nosuid,mode=0700,gid=12,size=30m 0 0

你看我使用了”size=”参数来避免试图保存大量的数据时占用大量内存的问题。出于安全和性能方面的考虑,”noatime”和”nosuid”参数也推荐设置,”mode=”和”gid=”对应的权限和用户组要与原来存在于SD卡上的文件系统保持一致。

恩,tmpfs也可以进行权限控制。通常情况下,所有在/etc/fstab下挂载的文件和标准的Unix/Linux文件没什么区别。所以即使因为一些原因挂载失效了,写操作也会成功写入到SD卡上。

需要记住的一点是所有挂载到tmpfs的文件将会在重启时丢失。所以上面的例子里/var/log文件会在关机时或重启时清空。所以不要把tmpfs用于那些你需要在重启后依然存在的文件。

我正在积极的使用这些设置,到目前为止结果还不错。时间会告诉我们这对于树莓派和/或者SD卡的寿命延续有何作用,但是现在已经有很多文章说能够正常运行很久,因为我们知道GNU/Linux不像其他操作系统一样需要频繁重启。上面的方法希望可以延长使用寿命,特别是你打算一年365天,每周7×24小时的开着树莓派。

本文来自:树莓派实验室

想要更多,请关注“IoT前哨站”微博或微信公众号

减少树莓派系统读写次数:用relatime挂载选项

SD卡和普通的磁盘驱动器有很多不同的地方,SD卡可以执行写和擦除的周期的次数是有限的,然而传统的磁盘驱动器没有写和擦除周期的概念。

什么是写和擦除周期?

对于一个普通的磁盘驱动器,每当你往磁盘里写东西,磁盘的某个扇区就会改变它的磁盘状态。这是磁盘物理上的改变,它不会给磁盘圆片本身带来损耗。当我们读取磁盘片上同一扇区的数据时,磁盘片的性质也不会发生改变。而SD卡显然是没有磁盘片,但是SD卡有小的内存芯片,其中包含内存单元,数据储存在内存单元上,就像物理硬盘的扇区一样。

和物理硬盘不一样,当你读写内存单元时,它的状态就发生了改变。

这是因为闪存单元使用不量的存储电荷来表示数据的比特位,这就是写和擦除的来源:

每当你读或写闪存单元一次,这个单元 的周期就消耗一次。读写闪存的时候,状态随之改变,每一个闪存单元只有限的周期,这些周期消耗完之后,状态再也无法改变(无法写入).

一般的SD卡会有10万次写和擦除周期,相对于数码相机来算是很多了,不过相对于日志文件系统就显得不足了,日志文件系统会非常频繁地往SD卡内写入少量的数据。除此外,每当系统更新文凭或目录时,也会往磁盘写数据,所以,10万次的周期是远远不够用的,因此,我们要关闭自动更新文件存取时间的功能,关闭自动更新文件存取时间的功能可以通过以下两种方式实现:

1. 第一个是noatime选项,它会禁止更新文件存取时间,这对闪存单元来说是好事,但是对用户来说并不是好事,比如说你想知道你的文件的时间戳,又比如有些应用程序依赖于文件的存时间戳。

2. 为了在两个极端中取一个平衡点,可以使用relatime挂载选项,relatime选项只有当最新修改时间比当前存取时间新的时候才会更新文件时间。这个选项减少了大量的闪存单元写操作,用户可以编辑/etc/fstab文件启用这个选项将你的根文件系统(/)以及启动文件系统(/boot)的挂载选项修改成如下所示的样子:

/dev/mmcblkop1 / auto defaults,relatime 1 1

/dev/mmcblkop1 /boot auto defaults,relatime 1 2

首先重新挂载每个文件系统:

#mount –o remount / && mount –oremount /boot

然后使用mount命令检查relatime是否启用:

#mount
它会显示所有挂载的文件系统经以及它他们的挂载选项。

树莓派上的软件安装和卸载命令汇总

基础命令

安装软件 apt-get install softname1 softname2 softname3……
卸载软件 apt-get remove softname1 softname2 softname3……
卸载并清除配置 apt-get remove –purge softname1
更新软件信息数据库 apt-get update
进行系统升级 apt-get upgrade
搜索软件包 apt-cache search softname1 softname2 softname3……

安装deb软件包 dpkg -i xxx.deb
删除软件包 dpkg -r xxx.deb
连同配置文件一起删除 dpkg -r –purge xxx.deb
查看软件包信息 dpkg -info xxx.deb
查看文件拷贝详情 dpkg -L xxx.deb
查看系统中已安装软件包信息 dpkg -l
重新配置软件包 dpkg-reconfigure xxx

清除所有已删除包的残馀配置文件

dpkg -l |grep ^rc|awk ‘{print $2}’ |sudo xargs dpkg -P

如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。
dpkg: –purge needs at least one package name argument

dpkg安裝的可以用apt卸載,反之亦可。

aptitude 命令

aptitude 与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具。与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些。举例来说,aptitude 在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。以下是笔者总结的一些常用 aptitude 命令,仅供参考。

aptitude update 更新可用的包列表
aptitude upgrade 升级可用的包
aptitude dist-upgrade 将系统升级到新的发行版
aptitude install pkgname 安装包
aptitude remove pkgname 删除包
aptitude purge pkgname 删除包及其配置文件
aptitude search string 搜索包
aptitude show pkgname 显示包的详细信息
aptitude clean 删除下载的包文件
aptitude autoclean 仅删除过期的包文件

当然,你也可以在文本界面模式中使用 aptitude。

常用apt命令列表

apt-cache search # ——(package 搜索包)
apt-cache show #——(package 获取包的相关信息,如说明、大小、版本等)
sudo apt-get install # ——(package 安装包)
sudo apt-get install # —–(package – – reinstall 重新安装包)
sudo apt-get -f install # —–(强制安装?#”-f = –fix-missing”当是修复安装吧…)
sudo apt-get remove #—–(package 删除包)
sudo apt-get remove – – purge # ——(package 删除包,包括删除配置文件等)
sudo apt-get autoremove –purge # —-(package 删除包及其依赖的软件包+配置文件等(只对6.10有效,强烈推荐))
sudo apt-get update #——更新源
sudo apt-get upgrade #——更新已安装的包
sudo apt-get dist-upgrade # ———升级系统
sudo apt-get dselect-upgrade #——使用 dselect 升级
apt-cache depends #——-(package 了解使用依赖)
apt-cache rdepends # ——(package 了解某个具体的依赖?#当是查看该包被哪些包依赖吧…)
sudo apt-get build-dep # ——(package 安装相关的编译环境)
apt-get source #——(package 下载该包的源代码)
sudo apt-get clean && sudo apt-get autoclean # ——–清理下载文件的存档 && 只清理过时的包
sudo apt-get check #——-检查是否有损坏的依赖

本文来自:树莓派实验室

容器操作系统HypriotOS在树莓派3上的安装

HyproitOS是一款容器操作系统,可以在任何支持Raspberry Pi系列的设备上运行,能让你在五分钟内从0到Docker。

选择HypriotOS的原因是因为其对Docker的支持已经很完善,且有丰富参考资料减少了很多弯路。前期在使用cubieboard进行测试时发现自带镜像文件内核版本太低需要自行编译,后期才找到一个第三方的安装地址,有时间另行介绍。

镜像文件

访问:https://blog.hypriot.com/downloads/ 下载最新版本的镜像文件。

也可以通过我的分享来下载:

http://pan.baidu.com/s/1nvEwhkP
密码:vip6

读卡器一个
镜像写入软件
Windows下的Win32 Disk Imager软件(上面共享盘里有)
Linux、Mac下flash tools安装(推荐)

curl -O https://raw.githubusercontent.com/hypriot/flash/master/$(uname -s)/flash

chmod +x flash

sudo mv flash /usr/local/bin/flash

使用

写入镜像后将内存卡放入树莓派并重启。用户名:pirate 密码:hypriot

如果你是用flash写入的话在可以在写入命令行前加入 –hostname 这样就不需要显示器了,或者像有的资料介绍的通过nmap或其它扫描工具来发现设备。仅需要执行如下命令就可以直接连接设备。

比如我写入的命令如下:

#注意下载的ZIP包不要解压
flash –hostname pi0 hypriotos-rpi-v1.1.3.img.zip

由于我设置的hostname为pi0,那么我的ssh登录命令如下:

#这里的pirate用户为hypriotos默认登录用户
#此登录方式要登录设备与树莓派在一个网段

ssh pirate@pi0.local

通过上面的ssh命令不需要知道IP的情况下即可登录。

更新系统

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get dis-upgrade -y

以上通过更新对系统打补丁及安装各软件最新版本,然后通过安装rasip-config可以用图形化界面进行配置。

sudo apt-get install raspi-config

Docker安装

sudo apt-get install docker.io

测试

docker run -d -p 80:80 hypriot/rpi-busybox-httpd

如果国内访问不正常,可以这样。

wget http://soft.sunsl.net/dev/armhf/rpi-busybox-httpd.tar
docker load -i rpi-busybox-httpd.tar

成功后你应该能通过浏览器访问到如下界面:

作者:forrestsun
來源:https://www.jianshu.com/p/3e2a901e66b7

想要更多,请关注“IoT前哨站”微博或微信公众号