把站台上的电子提示牌建到桌边

一般轻轨和火车的站台上都会有电子提示牌,提醒乘客当前时间、下一班车还要等多久以及该班车的始发站和终点站等等。

那类似的电子提示牌用到了哪些东西?我们能不能自己做一个?

用树莓派Zero、OLED显示器和3D打印的小盒子就可以搞定。它会涉及一些软件,一点焊接工作,还有一些3D打印材料。

引言

不久前,我看到克里斯·哈钦森(Chris Hutchinson)发布的帖子。

Pretty hyped about my most recent @Raspberry_Pi project — a realistic, real-time, train departure board

I’ve open sourced the software over at: 
https://t.co/vGQzagsSpi

Next step: find a case and make it a permanent fixture! 
pic.twitter.com/HEXgzdH8TS— Chris Hutchinson (@chrishutchinson) June 6, 2019

他从交通网站的API中提取数据,并在一个小型OLED上实时显示列车发车信息,以模仿英国列车站台上的那些电子提示牌。

我很欣赏他的项目,所以决定自己也做一个。主要是打算改变软件工作的方式,使其在 balendCloud 上运行,这样部署和配置会更加容易。

此外,我重新设计了显示布局,以实现字体的1:1像素映射。避免任何缩放,以便看起来更像真正的点阵显示。

至此,我已大功告成,并对结果感到满意。你可以按照本教程做一个类似的版本。

列车信息来源

https://www.transportapi.com/

硬件需求

这个项目的硬件需求不多,主要就是下面这几项。

·树莓派Zero W
·8G容量的SD卡
·USB电缆(用于电源)
·SSD1322 OLED显示器

如果你想自己做外壳,那还需要一台3D打印机或3D打印服务。

软件需求

该项目构建在 balenaCloud 上的 Docker 容器中运行,这意味着你只需几步就可以部署项目,从而节省任何耗时的手动包安装或配置。

所以你需要:

• 从GitHub下载项目

https://github.com/IoToutpost/UK-Train-Departure-Display

• 准备好刷系统的工具
• 一个免费的 balenaCloud 账户,用于设置和管理Pi下载并安装balena CLI工具——安装在你的计算机上,允许你在树莓派上安装项目代码。

组合在一起

第一个任务是将显示器连接到树莓派的GPIO头。

我用的是树莓派Zero W,它没有引脚针。虽然可以把它放在一个小得多的空间,但这意味着我必须自己焊接跳线。

我已经在下面列出了2.8英寸显示器(从AliExpress买来的)的引脚分配。

其他基于 SSD1322 的显示器应该也是可以的,你只需要留意一下引脚,并在上电前仔细检查它们是否连接正确。

无论你是否把线焊接到Raspberry Pi,都肯定要将线焊接到显示器上。

设置软件

用 balenaCloud & Docker 大大简化了软件的设置过程。

这意味着你不必手动安装或配置软件包,只需设置应用程序,添加设备并刷写SD卡,然后用 balena CLI 工具从计算机推送代码。我不会在这里详细介绍这个过程,你可以访问以下链接查看相关文档。

https://www.balena.io/docs/learn/deploy/deployment/

• 设置balenaCloud应用程序

首先你要有一个balenaCloud账户。然后添加一个新的应用程序,确保为正在使用的设备选择匹配的硬件类型。

接下来,向应用程序添加一个新设备,配置网络并下载balenaOS映像。

• 给设备刷写SD卡并接通电源

用Etcher或其他工具把下载好的操作系统刷入SD卡。
将SD卡插入树莓派并启动设备。几分钟内,它应该会出现在balenaCloud仪表板上。

• 推送App代码

这一步是将代码推送到balenaCloud,之后它会将其分发到你刚才添加的树莓派。具体步骤:

从GitHub下载代码(本文前面提到的链接),然后在你的计算机上安装 balena CLI 工具,进入项目目录,执行 balena push <appName> ,其中 <appName> 是你之前在 balenaCloud 仪表板中创建的应用程序的名称。例如:balena push TrainDepartureDisplay。

如果一切顺利,你将看到balena 独角兽吉祥物,并且你刚刚推送的代码将自动分发到设备上。

准备好硬件并部署代码后,下一步是配置运行应用程序所需的环境变量。

添加配置信息

不需要手动编辑配置文件,你可以用 balloud 仪表板来设置并随时更改任何变量。如果需要的话,你可以看看如何设置环境变量的文档。

https://github.com/balena-io-playground/UK-Train-Departure-Display#configuration

在获得传输API的密钥和应用ID之前,你需要在 Transport API 上注册一个帐户。这样你才能知道列车目的地和到站时间等信息。

一个基础帐户是免费的,每天只能有1000个请求,但是对于这个项目来说已经足够了。

如果前面工作都没问题,整个系统应该可以运行了,你第一眼看到的画面应该是这样。

做个外壳

接下来要把这个电子提示牌做的更真实一些,至少在外观方面。

我设计了一个外壳来装显示器和树莓派。这样可以把所有的东西紧密地放在一起,不会浪费太多的空间。

然后用Autodesk Fusion 360和Creality Ender 3(通过Cura)将其打印出来。这个外壳的模型可以在balena Thingiverse页面上找到。

将 Raspberry Pi Zero 放进壳中,然后熔化少许卡槽以便将其固定。

然后,用四个2.6毫米螺丝封住后盖。

我的电脑显示屏背面有USB接口,所以我剪了一条旧的USB电缆来供电。用细电线做这样的连接时,两根导线外侧可以加上热收缩管。给它们加热后,会形成一个坚固的接头。

供电线通过外壳顶部引出,以获得清爽的外观,然后用双面胶将我们的成品固定在电脑显示屏的下面。

后记

非常感谢Chris Hutchinson,是他最初启动这个项目,并促使我做进一步的开发。Blake也做了一些改进,这个项目就是他那里 fork 出来的。

Blake的项目地址:
https://github.com/ghostseven/UK-Train-Departure-Display

本项目用到的字体:
https://github.com/DanielHartUK/Dot-Matrix-Typeface

来自:Balena.io

作者:Chris Crocker-White

译者:王文文,前51CTO安全频道主编,Redhat认证工程师,华为HCIP-IoT认证工程师。

在命令行下构建“过期即焚”的临时网盘

前一阵子,Mozilla宣布推出免费的共享服务Firefox Send,不但同时支持多平台,还分别可以用浏览器和命令行操作。

除了使用端到端加密保护,还允许用户将要共享的文件设置为一次性下载或24小时下载有效。

使用方法则和百度网盘类似,把生成的链接和密码告诉要下载的人即可。简单的说,你可以把它当作临时网盘使用。

用浏览器操作的话相信大家都会了,这次我将在Fedora系统上用命令行操作。以便程序可以后台执行,或者跟其他程序做集成。

首先在系统中安装 Firefox Send 的命令行工具 ffsend。

1、如果你是Fedora的桌面/服务器版,该工具已经在源站了。

你只需执行:

sudo dnf install ffsend

2、如果你和我一样用的是Fedora IoT版,可以执行:

sudo rpm-ostree install ffsend

该工具的基本操作就两个:上传和下载。

ffsend upload 文件名
ffsend download 链接地址

但扩展参数还不少。

这里将本地的test.go文件上传并分享,链接密码为1234。

顺便打开浏览器看一下,OK。

用命令查看文件是否存在:

ffsend exists 链接地址

查看文件完整信息,比如还有多久过期:

ffsend info 链接地址

如果时间没到24小时,又想取消分享怎么办?

ffsend delete 链接地址

怎么样,是不是很灵活?

大家顺便可以想想,多文件共享的时候怎么快捷实现并确认状态。

注:目前该服务最高支持 2.5GB 文件,相关程序也已经开源。

地址:https://gitlab.com/timvisee/ffsend

作者:王文文

WebThings Gateway附加组件:扩展网关的功能

除了常规功能以外,WebThings Gateway还有一个附加组件系统。你可以用它来扩展网关的功能。

默认情况下已安装Web Thing、Zigbee和Z-Wave等组件,足以支持大量的商业设备。但是,如果有其他不同类型的设备要加进来。你会需要附加组件来增强对它们的支持。

根据需要找到并安装更多附加组件:

从“设置”菜单中选择“附加组件”。

如果首屏没看到你想要的组件,请单击右下角的“(+)”按钮浏览附加组件列表,然后选择“+ Add”以启用任何附加组件。

例如,你家里有TP-Link或HomeKit兼容的设备,你可以安装它们的附加组件,然后发现这些设备,并且配对。以便它们由你的IoT网关管理。

有些附加组件需要配置才能正常工作(例如Pulse、Weather、ONVIF)。另一些则在添加后立即工作(例如Virtual Things)。

适配器

适配器页面显示当前安装并激活了哪些插件。转到“附加组件”页面,你可以添加或删除系统中适配器。

新的组件将继续被开发,以便能管控更多新的设备。因此请定期检查以扫描列表中的附加组件。你可以在网关开发站点的issues选项卡中提交对额外设备支持的请求。

实验中的功能

你可以在“experiments”选项中启用智能助手和日志记录等实验中的功能。

从“设置”菜单中选择“实验”,然后勾选“启用智能助手”和“日志”。

使用智能助手

一旦启用,智能助手页面就会在主菜单中出现。它允许你用语音和消息命令来控制家里的设备。无论你是使用语音还是输入文本,都可以达到同样的效果。

Web页面会显示你最近发出的打字和语音命令,以及命令的结果。如果你所说的命令被误解或者没说全,请再试一次。记得对麦克风大声清晰地说话。

你可以给它一些指令,比如“打开厨房的灯”。它会回应你,并确认你的动作。到目前为止,它能够理解一组基本的命令来打开和关闭设备、设置级别,设置颜色和色温。

当你第一次点击麦克风图标时,你的浏览器将请求允许使用麦克风。在弹出对话框中,点击“记住这个决定”复选框,然后选择“允许”。

注意,在0.8网关版本中,基于浏览器的语音命令调用的是谷歌语音API,因此音频是在云端处理的。如果你在智能助手的文本框中输入一个命令,那将直接在本地处理,不需要连接到谷歌。

使用日志

一旦启用,日志页面将在主菜单中可见。单击右下角的加号图标,选择要记录的设备、属性以及要存储(日志数据)的持续时间。任何已连接的智能设备都能被记录,并在配置屏幕上可见。

好了,Webthings Gateway的高级功能差不多就到这里。其他的功能大家可以自行探索。

素材:iot.mozilla.org

编译:王文文

WebThings Gateway平面图:让智能家居的位置一目了然

在使用 WebThings Gateway 管控家里的智能设备以后,大家是不是觉得生活比以前方便一些了?

如果你设备少,或者房间不多。那倒是能记得各个设备的不同位置。

但要部署的智能设备和房间很多,怎么直观的区分它们在哪些房间呢?

我们来看一下 WebThings Gateway 的“Floorplan”,平面图功能。

该功能可以让你家中的所有智能设备位置,完全反映到 WebThings Gateway 页面上,你可以看到你家智能家居的整体布局,以及各区域设备的开关状态。你仍然可以单击图标来操作它们,或者查看该对象的详细视图。

创建一个平面布置图

首先你要先绘制屋子的平面图,并保存为数字图像。你可以用手画一个,然后给它拍照,或者使用illustrator工具(如果你用智能手机拍摄平面图,你可以直接从手机的浏览器把图片上传到你的网关上) 。

提示:使用 Inkscape 或 Sketch 之类的工具可将数字绘图保存为带有白线和透明背景的svg文件,以获得极简外观。

点击“平面图”页面右下角的铅笔图标进入编辑模式。将会出现一个“上载文件”按钮,选择要上载的平面图。

在平面图上传完成后,确保你仍然处于编辑模式,然后将插座和灯泡等图标从页面顶部拖到平面图上。单击右下角的勾号,搞定。

这下房间再多也不用担心了。设备在什么位置,是否在工作,一目了然。

素材:iot.mozilla.org

编译:王文文

怎样用WebThings Gateway管控你的智能家居

普通计算机联网要普通网关,物联网设备联网要用物联网网关。

物联网网关,作为一个新的名词,在物联网时代将会扮演非常重要的角色,它将成为连接感知网络与传统通信网络的纽带。作为网关设备,它可以感知网络与通信网络,以及不同类型感知网络之间的协议转换.既可以实现广域互联.也可以实现局域互联。

我们这次就在树莓派上搭一个物联网网关。

WebThings Gateway是一款面向智能家居的物联网网关,来自国际知名的Web浏览器厂商Mozilla。

安装所需要的核心零件:

1、 树莓派

2、SD卡

3、支持ZigBee或Z-Wave协议的USB适配器

WebThings Gateway 镜像地址:

https://github.com/mozilla-iot/gateway/releases/download/0.8.1/gateway-0.8.1.img.zip

安装步骤:

1、刷卡

2、插入USB适配器

3、通电

注:第一次启动可能要等2-3分钟,后面会快一些。

启动系统后,你会在Wi-Fi连接中看到一个名为 “WebThings Gateway XXXX” 的SSID,连上去。

此时会自动跳转到网关的Web管理页面,如果没有自动跳转,就在浏览器里输入“http://192.168.2.1”

然后你必须再次设置Wi-Fi连接,以便物联网网关能接到你家无线路由器上。

将Webthings联网后,系统会问你要不要创建个子域名。

下一步就是添加设备的环节了。

你可以把家里的智能灯泡、插座、门锁……都加进去。

一般的添加过程:

选择要添加的设备,并为其配对。这方面Zigbee和Z-Wave的都差不多。

灯泡拧入(配对时应点亮灯泡),插头插好。

电池驱动的设备,如门/窗传感器、运动探测器、按钮、调光开关、检漏器、温度传感器等等,也都要先通电。

远程控制和规则设置:

添加完相关智能设备后,你可以在手机或平板电脑上直接控制它们。在浏览器中输入WebThings的域名或IP,然后用你设置的用户名密码登录即可。

也可以在“规则”栏里面做设置,比如你想让卧室灯在晚上10点后自动熄灭。

当然,你也可以随时删除它们。

好了,开始享受物联网时代的智能家居生活吧!下一篇文章我再给大家讲WebThings的高级用法。

作者:王文文

用LAKKA和树莓派做复古游戏机

树莓派可以做复古游戏机和街机,想必大家都已经听说过了。

包括RetroPie、Recalbox和Lakka在内的几个游戏机系统,在业内都是小有名气。

我们这次就用 树莓派3b+ 和 Lakka 来做一台。

Lakka在树莓派3b+上的安装

在树莓派3b+上安装 Lakka 非常简单。安装过程与以前的 Lakka 版本完全相同。只需前往官方的 Lakka 网站,下载合适的镜像,并将其安装到 microSD 卡。然后用安装好的 microSD 卡插入树莓派3b+。

Lakka for 树莓派2/3版本下载地址:

http://le.builds.lakka.tv/RPi2.arm/Lakka-RPi2.arm-2.2.2.img.gz

Lakka启动后的界面:

如果你们在屏幕上看到如下画面,基本就算装成功了。第一件事,先进“设置区”把 Wi-Fi 连上。看到自己 SSID 边上有个“Online”就是连成功了。

注:如果想查看 IP 什么的可以进“System Information”菜单。

添加游戏

首先要进“Services”菜单把 Samba 启用,不然你没法往里面拷游戏。

生效之后就可以往里面拷游戏了,在 Windows 网上邻居里找到它的共享目录。

找到 ROMs 目录,然后把你能找到的游戏镜像拷贝进去。接着,你要回到游戏机操作界面,选择“Scan This Directory”。让 Lakka 知道你的游戏镜像对应的是哪些模拟器。屏幕底部会提示你扫描的进度。

然后你就可以“load content”加载游戏了,系统会自己调用相关模拟器解析。完成后,您将在菜单的右端看到一个新选项卡。

开始玩吧

转到刚刚创建的选项卡,你会在列表中看到装好的游戏。

选择并运行,看到画面出来的一刻。也就意味着你的游戏机已经做好了。

目前测下来是 红白机镜像 的识别和运行还不错,FB Alpha 类的稍差。

关于 Lakka 背景颜色和语言环境都可以自己调,比如我自己用的是一个蓝色背景的中文环境。

关于一般操作,键盘就够了。但如果想玩的开心,还是去买两个手柄吧, Xbox 和 PS 的都可以。

附注:

虽然树莓派3b+的速度比树莓派3快,但性能并没有特别大的增长,主要改进集中在网络方面。

有些游戏系统可能还没支持树莓派3b+,但 Lakka 很早就兼容了。也就是说,上面那个镜像同时支持树莓派2、3、3b+,大家可以放心刷。IoT前哨站已经帮你们挨个试过了。

相关视频讲解(英语):

http://v.qq.com/x/page/n0864t98yof.html

编译:IoT前哨站

素材:Lakka.tv

只要有想象力,打印机都能做游戏

不知道为什么,文本冒险游戏最近频频被人提及。这不,现在又出来一个基于实时打印的文本冒险游戏 —— Quest Smith。

这位脑洞较大的创客名叫 Bekir Dağ ,他用微型打印机和树莓派做出了这个手持游戏设备。

关于文本冒险游戏的背景知识:

1975年左右,程序员兼业余洞穴探险者 威尔·克劳瑟(Will Crowther)编写了第一个文本冒险游戏 —— Adventure。最初名为 ADVENT,因为在他使用的操作系统中,文件名不能超过六个字符,后来被命名为《巨大的洞穴冒险》 —— Giant Cave adventure。

玩家需要阅读周围环境的描述并从一组选项中进行选择,或者输入下一步并希望游戏能够理解玩家提及的内容。

Bekir Dağ 的创新之处是他把一个文本冒险游戏做成实时打印剧情了。玩家用 Yes 和No 两个按钮来决定游戏的走向 。

Quest Smith是个啥?

在柏林的一家游戏博物馆里,Bekir Dağ 看到了一个手持式游戏设备,于是他决定用树莓派 Zero W自己做一个。

他设计了Quest Smith 的躯壳,用3d绘图软件输出了 STL 文件并在
Thingiverse 网站上免费分享。

下载地址:

https://www.thingiverse.com/thing:3471217

树莓派 Zero W 与热敏打印机、电池和各种按钮紧密贴合在一起。由安装在外壳上的太阳能电池板供电,所有组件都连接到 TP4056 板,该板允许电池为树莓派供电。

硬件材料:

1、Raspberry Pi Zero Wireless 一个

2、GOOJPRT 热敏打印机一个

3、五伏电压升压模块 一个

4、 TP4056 板 一个

5、 18650电池 一个

6、瞬时触碰式开关

7、 Micro usb 转大口接头

8、螺钉 3.5 x 20毫米 四个

9、 滑动开关 一个

10、太阳能电池板60 x 60毫米 5.5V

另外要准备热熔枪、电烙铁和3D打印机。

相关的代码:

https://github.com/IoToutpost/quest_smith

1、系统需要安装的组件

sudo apt-get install libpython3-dev libpython3-stdlib libqt5printsupport5 php7.0-mbstring python3-rpi.gpio python-rpi.gpio python-setuptools python-dev build-essential

2、安装composer

步骤在此: https://getcomposer.org/download/

3、安装两个python库

pip install setuptools
pip install locustio

4、拉取代码

mkdir quest_smith
cd quest_smith
git clone git@github.com:bekirdag/quest_smith.git .
composer install

5、 在重新启动时,通过在crontab上添加一行来运行 Quest Smith 脚本

crontab -e
@reboot sudo /usr/bin/screen -dmS story-game /usr/bin/python3 /home/pi/thermal/push3.py

6、 再次向 crontab 添加另一行代码,以便在每次重启时更新软件,这样你的故事就会是最新的。

@reboot sudo cd /home/pi/quest_smith && sudo git pull origin master

Quest Smith 目前仍在开发中。虽然用户现在可以构建并开始玩这个游戏,但作者呼吁社区用户提交他们自己的故事(有好的分支剧情就发过去)。

Bekir Dağ 说:“每个关卡都需要两个版本的故事,这使得可能性呈指数级增长。所以一个人完成整个故事线对我来说是非常困难的。比如为了让玩家达到9级,我们需要编写1023个故事部分。如果你能帮我,那就太好了! ”

如果想看这个设备是怎么玩的点这里:

http://v.qq.com/x/page/y0846fbymnz.html

相关阅读:

Python写文本冒险游戏的要点

https://mp.weixin.qq.com/s/jtxOqDlYLt3VjdsnLXfdAg

新手可以在研究这篇文章的同时学会面向对象编程。

来自:Raspberrypi.org

编译:王文文

用一行命令把树莓派变成视频后视镜

大家在冬季骑行的时候少不了要穿一堆厚衣服,戴上帽子围巾什么把自己裹得紧紧的。

比如像这样

这样暖和是暖和了,但安全问题来了 —— 不方便回头看背后是否有车或行人靠近,万一有车在加速,你又正好在转弯,那可就惨了。

能不能给自行车装一个视频后视镜?这样不用回头也能知道后方发生的一切。

一个叫 Alex Eames 的外国人就是这么做的。 他戏称冬天的自己戴着“忍者”模式的巴拉克拉瓦帽和自行车头盔让他看起来像个“山雀”。

某天他出门的时候,有辆车差点和他撞上。幸好他们都及时刹住了车,但离得已经很近了。

原本他买了一面小镜子,但效果不太理想。于是想到了摄像头和显示屏的组合,这样不但可以实时看到车况,而且还能当记录仪用。

他先是在亚马逊上看了一些产品,但要么不合适,要么价格太贵(200英镑以上)。而他的需求主要就是能实时了解车前后的状况(主要是后面)。而且他对GPS之类的功能并无需求,最多也就是希望能拍到野生兔子路过这种有趣的镜头。

那基于树莓派的项目如何呢?

在重新发明轮子之前,看看别人已经做了什么是个好主意。

在(http://pidashcam.blogspot.com)上有一个很好的“双摄像头行车记录仪”实现,该项目使用了一个树莓派II代,Pi摄像头和USB摄像头。

看起来很棒,但 Alex Eames 不想在这个阶段使用GPS,只需要一个屏幕来实时查看他身后的情况,另外还想使用一些自己买过的零件。

两年前他在ebay上花20英镑买了一个Keidei HDMI 3.5英寸屏幕,可以通过HDMI连接树莓派。而且有电阻触控。

3.5英寸KeDei屏幕背面
3.5英寸可触控Kedei屏幕正面(带HDMI接口)

“如果要追求效果,我可以升级显示屏以便拥有更高的分辨率。然后用一个全新的Pi 3A+,配上Pi摄像头在前面。再弄一个Pi Zero W带摄像头在后面。” Alex Eames 说道。

测试中

前面的树莓派将作为无线接入点和后面的Pi Zero W连起来。

这两个树莓派都将被设置为开机后自动运行。后方的Pi Zero W将其视频传输到端口8090。然后前面的Pi将抓取视频流并显示它,此处可以使用vlc。这样他就能在屏幕上看到身后的东西了。

装好树莓派后视镜的自行车

好了,最关键的一招是怎么实现的呢?一句命令就可以搞定,那就是:

raspivid -o – -t 0 | tee test_video.h264 |
cvlc -v stream:///dev/stdin –sout ‘#standard{access=http,mux=ts,dest=:8090}’ :demux=h264

如果你有冬季骑行的习惯,不妨也给自己也做个树莓后视镜吧。有相关技术问题欢迎在“IoT前哨站”公众号上给我私信。

相关素材来自:Raspi.tv

编译:王文文,前51CTO安全频道主编,阿里巴巴资深安全工程师,现供职UCloud技术市场,IoT前哨站创始人。

用树莓派实现网站访客LED闪亮提醒

用树莓派实现网站访客LED闪亮提醒,每当有用户访问你博客时LED就会闪一下,闪得频率越快访问者越多。

以下是清单列表:

LED 1个、公/母杜邦线2条、220欧姆电阻1个、面包版1个。
首先我们先来安装WiringPi(通过它我们可以用php来控制GPIO)

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git-core
git clone git://git.drogon.net/wiringPi
cd wiringPi
git pull origin
./build

下面我们开始链接LED到GPIO,直接看图就好,你可以连接到任何一个绿色的借口,我们这里连接的是GPIO.0(LED正负极我就不讲了自己百度吧),PS,图不是我画的如果严谨点GND应该用黑线。

好了接下来我们来写点PHP代码,可以直接嵌入到网站的PHP页面内。

<? php
exec(“gpio mode 0 out”);/*mode 0就是蓝线插入的针脚,可以使用0-7*/
exec(“gpio write 0 1”);/*点亮led*/
exec(“gpio write 0 0”);/*关闭led*/
? >

到这里我们的游客提醒功能就完成了,各位还可以发挥想象力,比如用三(绿,黄,红)显示剩余内存,CPU使用率等等。

怎么用 Fio 来测试树莓派的磁盘性能

为了测试系统IO性能的高低,在实际开发中,需要使用IO性能测试工具进行测试。

这里要介绍一款经典神器 —— Fio(Flexible I/O Tester)。

这是一款由 Jens Axboe 开发的用于测评和压力/硬件验证的开源软件。

它支持 19 种不同类型的 I/O 引擎 (sync、mmap、libaio、posixaio、SG v3、splice、null、network、 syslet、guasi、solarisaio,以及更多), I/O 优先级(针对较新的 Linux 内核),I/O 速度,fork 的任务或线程任务等等。它能够在块设备和文件上工作。

Fio被广泛的应用在非常多的地方,包括测评、QA,以及验证用途。它支持 Linux、BSD、OS X、Android 以及 Windows。

简单来说,Fio是用来测试系统IO性能的工具,它的强大之处在与提供了一套测试框架,能够支持多线程多进程的IO测试,用户只需进行参数的配置,便能够方便地定制不同的IO行为(顺序读写,随机读写等),并对其性能进行监测。

对于Debian/Raspbian来说,Fio的安装很容易。

执行 sudo apt-get install fio 即可。

一般的参数和说明:

bs : 设置IO请求的块大小,可以给出上下限
支持对read,write,trim分别进行设置,以逗号隔开
比如:bs=1k-2k,3k-4k,5k-6k
size : 文件请求的大小,控制job结束
rw : 控制读写类型: read/write/rw/randread/randwrite/randrw
direct : 1表示绕过buffer,直接作用于设备
ioengine: io引擎:libaio(异步IO),syslet等
iodepth : 异步IO情况下,IO队列的长度
runtime : 执行时间限制,控制job结束
filename: 输出文件或者设备名,eg:/dev/sba

例子:

bs=4k:单次io的块文件大小为4k
ioengine=libaio:IO引擎使用libaio方式
direct=1: 测试过程绕过机器自带的buffer,使得测试结果更真实,等效于buffered=0
runtime=7200:运行时间设置7200s
size=20G :设置本次测试的空间为20G
filename=/dev/sdb20 :被测裸盘的盘符
group_reporting=1:汇总每一个进程的信息
rate_iops=5000 : rate_iops设置额定的iops,一般测试不需要设置
time_based :设置测试基于时间,注:虽然设置了runtime为7200s,如果没有设置time_based,在空间写满之后停止。
write_iops_log=w-4kb-7200s-numjobs4-iodepth128-ssd:表示将iops写入到一个在fio目录下名叫4kb-7200s-numjobs4-iodepth128.iops.1.log的文件中,注:如果numjobs设置为多线程,则每一个线程的iops写入到一个log文件中。
log_avg_msec=1000: 每隔1000ms往log中写一次数据
rw=randwrite : 测试方式随机写

numjobs=4:设置测试线程数
iodepth=128:io 深度设置为128

实际操作:

随机写入的性能测试:

sudo fio –name=randwrite –ioengine=libaio –iodepth=1 –rw=randwrite –bs=4k –direct=0 –size=512M –numjobs=2 –runtime=240 –group_reporting

输出的结果:

随机读取的测试:

sudo fio –name=randread –ioengine=libaio –iodepth=16 –rw=randread –bs=4k –direct=0 –size=512M –numjobs=2 –runtime=240 –group_reporting

输出的结果:

结果里面包含吞吐量和时间。io=表示总共完成的IO量。在基于容量的测试中,这个值能匹配size参数。aggrb是所有进程/设备的汇总带宽。minb/maxb表示测量到的最小/最大带宽。mint/maxt表示测试的最短和最长耗时。和io=参数类似,时间值对于基于时间的测试应该能匹配runtime参数,对于基于容量的测试是一个变量。

如果对相关参数搞不明白可以看帮助:

好了,IoT前哨站希望大家熟练掌握这个性能检测工具。