这是一系列初学者教程,我们将探讨如何将物理设备与iota协议集成。这一次,我们将着眼于使用物联网协议简化和自动化典型的汽车相关服务的支付,如停......借着行业发展的热潮,atis阿蒂斯在市场的表现力也一直很好,给用户带来很多全新的优质体验。
这是一系列初学者教程,我们将探讨如何将物理设备与iota协议集成。这一次,我们将着眼于使用物联网协议简化和自动化典型的汽车相关服务的支付,如停车、收费公路、洗车等。
我决定将此教程分为两部分,因为我认为有多种方法可以解决此用例。每种都有自己的优点和缺点。
在第一个教程中,我们将尝试使用一种通常称为自动车牌识别(a l p r,简称alpr)的技术来解决这个用例。
实践用例
在我们酒店的后面有一个停车场,供酒店客人和员工使用。最近在未支付所需停车费的情况下,使用停车设施的授权人员和未授权人员都出现了问题。我们酒店业主认为,这与目前的人工操作和复杂的停车费处理流程有关。如果有一个自动化系统,可以在不打扰客人或工作人员的情况下收取停车费就好了。
本教程中提出的解决方案基于以下想法:酒店所有者发行iota代币并为其客人和员工管理seeds。在之前的指南中讨论了这个想法,我们在酒店为各种服务付费时考虑使用rfid技术。
组成部分
在开始研究该项目的编码之前,我们应该退后一步,研究一下总体概念和所使用的各种组件。
在上面,您将看到本教程中提议的用于解决用例的各种组件的简单布局。在继续学习代码之前,让我们一一刹车。
超声波传感器
超声波传感器用于检测车辆何时进入或离开停车场。 超声波传感器通过产生和接收声音脉冲来测量距离。 因此,它基本上只是一个扬声器和麦克风,并将一些其他电子设备组合在一起。 通过测量从扬声器发出脉冲到麦克风接收到脉冲之间的时间,我们可以计算出反射的物体(在这种情况下为车辆)的距离(我们知道声速) 脉冲。
我用于该项目的超声波传感器是流行的hc-sr。 您应该能够在上获得其中的几美元。
使用以下电路图将hc-sr连接到r pi。
注意电路中的两个电阻。 电阻用于降低hc-sr的v输出引脚到pi上的. v输入引脚的电压。电路中没有电压电阻器可能会损坏您的r pi。
当然,您可以使用多种技术来检测车辆何时进入或离开停车场。我为此项目使用超声波传感器的唯一原因是,我已经在上一个项目中放置了一个超声波传感器。
请注意,传感器产生的声音脉冲处于人耳无法检测到的频率范围内,因此当传感器处于活动状态时,您将听不到任何声音。
照相机
摄像机用于进入车位区域时对车牌进行拍照。我正在为此项目使用r pi摄像头模块v,但您基本上可以使用任何可以通过p脚本控制的摄像头。 您应该可以从b或从当地的pi商店购买此相机模块。
oalpr
oalpr是一种自动车牌识别(alpr)软件,用于从图片或图像中识别车牌号。您可以选择在内部安装oalpr sdk,也可以使用那里的云服务执行alpr。在本教程中,我们将使用云服务。 请注意oalpr是许可软件,但您可以注册一个免费帐户,该帐户每月最多可免费执行次alpr。
要注册免费的oalpr帐户,请访问://
登录oalpr后,选择c api
在c api页面上,您会找到一个秘密密钥,该秘密密钥会将图像上传到oalpr云服务时将在我们的脚本中使用。
t p/seed db
“p/seed数据库”是对某种类型的集中式存储的引用,其中每个车牌号均与将用作iota价值交易的发送方的iota seed配对。 在本教程中,我将使用一个简单的逗号分隔的文本文件(或csv)文件,该文件存储在r pi的本地文件中。 但是,在任何以安全性为重中之重的现实生活中,seed都应存储在访问受限的某种加密数据库中。
汽车
我们还需要一些代表汽车本身的对象。 从本教程的图像中可以看到,我正在使用在附近跳蚤市场上发现的玩具车。 对于构建和测试,您只需要一个简单的盒子,盒子的一侧印有牌照,如下所示。 甚至更低的温度,使用真实的汽车和车牌在预期的环境中设置系统。
确保在车牌号周围画一个边框,如上所示。 否则,oalpr算法将无法识别车牌在图片中的位置。
怎么运行的
在查看这个项目的p代码之前,让我们一步一步地查看当一辆新车进入酒店停车场时发生的事件。
. 一辆新车进入酒店停车场,挡住了超声波传感器。
. 摄像头拍下了汽车牌照区域的照片。
. 图片被上传到oalpr c服务,该服务以对象的形式返回标识的车牌号。
. 在搜索p / seed db进行匹配之前,我们将车牌号从对象转换为字符串。
. 如果找到匹配项,则使用返回的seed作为交易的发送者,在将有价交易发送到纠结之前,我们将返回相关的iota seed。
以供参考:
这是当汽车进入停车场并阻挡超声传感器时从pi摄像机拍摄的照片。
这是oalpr解码的图片
请注意,oalpr未将开头的两个t识别为车牌号的一部分。 这可能与这是一辆没有有效车牌号语法的玩具车有关。 我使用实际车牌号进行的其他测试似乎运行良好。
所需软件和库
在开始为这个项目编写p代码之前,我们需要确保在r pi上安装了所有必需的软件和库。对于本教程,除了pota本身之外,还需要以下库:
pc库(已与r一起安装)
请求(安装请求)
p代码
这是这个项目的代码。。
# i pota
a
# i oalpr
# icsv db .
# i pc
pc
# s
= pc()
# r
# d
. =
# igpio
rp.gpiogpio
gpio.(gpio.bcm)
# urliota t
n = "://..:"
# h ,
_ = 'gtzuhqspraqctsqbzeemlzpqupaalplgwckfnevkbinxexzracvkkkcypwpkhawlgjhplozzoytalawovsijiyvz'
# p ( iota)
=
# s gpio
trig =
echo =
# v /
_ = f
"d m i p"
# sgpio
gpio.(trig,gpio.out)
gpio.(echo,gpio.in)
# f r pi
_():
_ = "///d/."
("c ...")
._()
.()
.(_)
._()
__(_)
# f id oalpr c api
__(_):
# r oalpr
secret_key = 'pyoalprskh'
(_, '')_:
_ = .(_.())
# s oalpr c
= ':///_?_=&;=&;_=%' % (secret_key)
= .(,= _)
# c
_ = .(.(.(), =))
# sp/seed db
# i , seed
:
''_[''][]:
_ = _[''][]['']
(_)
_(_)
:
('oalpr id')
# f iota
_(_):
_ = f
('.')_:
_ = .(_, =',')
_:
[] == _:
=[]
_ = t
_ == t:
("p db, : " + )
_(_, , _, )
:
("p db")
# f iota
_(_, , _, ):
# d
= .i(n, =)
# c
= .pt(= .a(_),= n,= .t(.ts._(_)),= )
# s
("\s ... p ...")
sb = ._(=,=[], =n, _=n, __=)
# d
("\t ...")
# c (.) ..
:
t:
gpio.(trig, f)
"w f s t s"
.()
gpio.(trig, t)
.(.)
gpio.(trig, f)
gpio.(echo)==:
_ = .()
gpio.(echo)==:
_ = .()
_ = _ - _
# c
= _ *
= (, )
# i
&; :
_ == f:
_()
_ = t
:
_ = f
ki: # i ki ( +),
("c !")
gpio.()
现在,您应该看到脚本开始每秒检查一次传入的汽车。使用超声波传感器。当发现新车时,我们将按照“工作原理”一章中的说明启动序列。随着序列的进行,检查树莓终端的状态。
注意!
在现实生活中,您可能需要某种类型的指示器来告诉车主是否以及何时接受(或不接受)交易/付款。这可以通过将指示灯从红色切换为绿色来完成,甚至可以移除物理屏障。
在我的示例中,当新车进入停车场时,r pi完成了有关创建和签署所需iota价值交易的所有工作。您很快就会注意到,由于pi的资源有限,这是一个相当缓慢的过程。在现实生活中,这可能是不可接受的,我们必须寻找其他选择。一种选择是将这些活动外包给具有有效执行这些活动资源的集中式实体。
下一步是什么?
尽管本教程中提出的解决方案可能适用于某些本地用例。对于其他用例,控制seeds的集中实体(在这种情况下为酒店所有者)的概念将不切实际或不可接受。对于真正的全球性和分散式解决方案,我们可能需要采用其他方法,下次再说。