开发者学堂课程【云上能力本地化之边缘计算:边缘网关树莓派最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/559/detail/7674
边缘网关树莓派最佳实践
内容介绍:
一、 网关
二、 子设备
三、 边缘实例部署
四、 代码
五、 配置
树莓派边缘实例包含三部分,其实任何一个边缘实例它最基础的也应该是包括这三部分。
一,网关
网关承担的作用就是设备记录,函数计算、规则计算,还有抑制服务的一些核心功能。
然后驱动承担着接入设备的作用。他把设备上报的一些数据,比如说是属性和事件,把他上报的这些属性和事件转换成符合物模型要求的一个格式,然后再上报给云端,还有就是把云端下发给子设备的数据转化成一定的协议格式要求,然后发给子设备。
再一个就是消息路由,消息路由就是消息转发把消息在各个模块之间进行路由转发,让各个模块对这些数据进行处理,可以由设备到设备,也可以由设备到函数计算。我们这边的话由设备到 IoT hub 就是让这些数据能够在云端看到。
我们这边网关用的树莓派,再次 gpio4 和 gpio17,还有 gpio6。
二,子设备
这边子设备我们有三个子设备,就是LED灯,还有是声音传感器,还有是温湿度传感器。
1,LED灯
我们使用的是ky-016这个型号,我们这边写了一个驱动包,pi_led.zip。这边他用到的引脚,一个是接地的引脚,然后是gpio6给他控制这个灯的量和面我们这个模块它还有RGB三种颜色的灯,我们只需要控制它绿色灯就好。
2,声音传感器
同样的我们有驱动CPU包,pi_sound.zip,这边也是它有三个引脚。gplo17作为树莓派声音的一个输入。下面这个是温湿度传感器,它也是三个引脚,一个接5伏直流电源,一个是接地在一个是gplo4来作为把温度和湿度的一些数据,输入给gplo4,我们需要配置消息路由,子设备到iot-hub。
3,子设备概览
这边是一个子设备的概览,包括这里说明了它是子设备有哪些属性,你这引脚怎么接?
LED 模块这边信号是 ky-016,引脚我们这些 gpio6,然后它这边有一个属性是status,属性,数据类型是 enum,零表示 close,一表示 open。还有声音传感器的 sound-01。然后声音传感器只有 sound 事件。它有一个参数是 alarm。
那 alarm 的数据类型是 enum,0是 sound0,1是 sound1,我们这边到时候代码里面,如果说传感器检测到有声音。他就是间隔的上报这么一个事件,就是这一次上报0,下一次上报1。
然后下面这个是温湿度传感器,DT11,然后Pi(GPIO4),这边温湿度传感器有两个属性,一个是温湿度的标识符 humidity。然后是它的类型是 float,另一个标识符是温度 temperature,数据类型也是 float,他们的不仅都是0.01,还有数据类型的话是 float。
三,边缘实例部署
在这个云端怎么去去创建这么一个边缘实例,然后把边缘实例部署,首先我们创建先把这几个驱动给创建好,新的驱动,语言类型是 Python,驱动名称创建pi_led_driver,把这个上传,我这边已经创建了已经有重复的驱动了。
再创建一遍,新增驱动,然后自己要说明一下,这个驱动设备包它的一个要求是打包的时候,不能说再给他套一个目录,而是直接把几个文件直接给打包,不然的话再套一个目录的话,这个驱动会运行不起来,然后在创建 sound 的驱动。
接下来是温湿度传感器,一样具体的思路。
创建的时候好之后,再来创建产品,先建一个网关就好,Igetaway,然后再创建一个 LED 灯的产品,进入网关,创建声音传感器。
最后是温湿度传感器产品名称等,我们把这个动态注册也打开,不然的话会注册不上,上不了线,产品创建好了之后,我们再创建设备,然后再创建一个 LED 灯的设备,接着创建一个网关设备,设备创建好之后,我们再创建边缘实例,那么形成一个边缘实例。网关这里需要一个网关。
点进去,在这里添加子设备,声音的是 LED 灯,然后我们还要配置一下设备的驱动。
LED 灯的驱动,自定义不用填声音传感器的驱动,温湿度传感器的驱动,分配好子设备之后再最后一个是设置消息路由设备,全部产品,消息主题过滤选全部。
消息目标选 IoT hub,服务级别选一,这样的话保证消息能够到达云端,创建好实例之后,我们就下一步先启动这个边缘网关,在其中边缘网关之前的话有一些准备的动作 官网有一个帮助文档,指导文档的话在官网这个地方,产品里面物联网边缘计算,物联网边缘计算,点进去,然后是产品文档,虽然有个最佳实践,树莓派最佳实践,配置网关设备,他这边写了一些树莓派,其中我们编制网关的一些准备操作,我这边的话都已经配好了,所以我们直接跳到下面一步,用这个脚本去启动我们的边缘网关。
这个是我们镜像的版本号是v1.6,我后面跟着是网关的三元组,网关的三元组怎么找?
就是设备详情里。我们的边缘网关都可以起来了。然后我们先进入 docker,但是我们可以看到我们边缘实例这边,这个网关已经在线了,在线之后我们这个设备他还没有在线,因为我们没有部署,所以的话我们这边还要先网关上线之后我们再点部署,让这些设备把云端的配置下发到边缘端,然后设备上线,能够把这消息能够上云,可以看部署详情,部署的过程大概要30秒。刷新一下,看子设备都已经在线了。
四,代码
驱动的代码它是怎么实现的
rpi_led_device_init()
app_callback=Demo_device()
RPiLed=rpi_led_login(app_callback)
rpi_led_main_loop(RPiLed)
def handler(event
,
context):
return'led'
先看 LED灯,这边先给他初始化 LED灯设备,
怎么做先获取一下我们用户配置的一个最佳客户。
如果这个用户没有配置的话,我们就使用默认的初始化,如果说有设置的话,只有用户配置的 gpio初始化,它使用的是第六个引脚,然后再我们要创建一个设备的对象设备的对象是怎么实现的?
设备的类是继承了lethingaccesssdk,我们可以在我们就网边看到,这个模块里面它包含了两个类,一个是适应callback的一个类,还有一个是thingaccessclient。
三个函数,一个是服务调用,一个是获取属性,还有一个是设置属性。我们这边用到的是you just add online.还有一个是report properties,再一个是reportEvent,回过来看我们 LED,它类设备的一个实验,然后他是继承,然后我们要把这几个call这几个回调给它实现。
因为这个LED灯的话它没有服务,所以我们不需要给他定义,然后他没有需要给他获取属性和设置属性这两个接口给他实现。
获取属性它的 input_ value它是一个列表,我们可以看到Call back 的定义,它的一个列表,那我们返回的是一个code和一个援助或者是节省对象。在这里status属性在它的一个输入里面,我们返回我们一个code的0,表示成功了。
status后面是它的值援助范围。 set properties 它的输入是一个原组,然后属性在 input的范围里面,我们获取到它的一个值,并且把它写入设备设备对象创建好之后,我们还要创建我们一个设备接入客户端,并且把这个设备注册和上线。
他这个设备是怎么注册,并且上注册上线了,先指出他我们从有没有环境变量里面取出驱动的一个配置。对驱动的配置,我们回到网关。
五,配置
这个配置是云端下发的,所以我们看到可以从这个当中可以看到这个是led就是配置文件,我们用工具给大家解析一下,看得清楚一点。
这就是我们要获取到的是,取出来之后我们再找 deviceList,在配置里面,并且这个长度是大于0的,deviceList 列表它的长度大于0的,
我们指出这个设备,能取出第一个设备就好。因为我们驱动我们自己连接一个设备,所以他就连接一个设备。
然后我们取出来其实就是是一个元素。包含 product 和 defense name 的一个元素。
然后调用设备接入 SDK 里面的 ThingAccessclient,然后去创建这么一个对象,创建好之后再让它这个识别接入客户端的函数,注册并且上线,再然后是一个循环,这个循环的作用就是我们检测它属性变更状态,如果变更了,属性变更了,我们就上报一次属性。
这是 bak status,不等于当前的 switch_led。Switch LED我就给他创造一个字典,创建好之后,创建好然后上报属性。
上报属性是在设备接入客户端里面是有的,自定义的。它的参数是一个字典类型的。然后下面这个是 handler 是固定的,我们每个驱动包里面都要包含什么?都是要包含这么一个函数定义。因为我们当前这个驱动的话是以 fce 的形式来实现的。
然后驱动框架它会调用到 handler,这个 handler 它只要返回一个自助,就这个算的话是代表这个 FC 驱动模块的一个名称,只要各个模块名称保持唯一性的话,就是先初始化一下声音设备,这个声音设备给它传入一个上报事件的函数,也是一样获取用户定义的 GPA 库。这里返回的是 now。
如果说你这边要改端口的话,直接这里写端口号就好。就写 Gpio 口的话就好。然后我们使用默认值,用默认初始化,我们使用的时机,平常时期先清理一下,就是防止 gpio 被占用。
然后这个是把上报事件的函数关掉注册进去,检测到有事件的时候他会要触发回调。
看一下这个回调是怎么实现的。
创建一个支点了,最开始的时候是只要 num 取不等于0,num 的值是一,然后这个取如果说等于0的话 alarm 等于0。
然后调视为客户它的一个函数,这个函数去上报。再下来,这个是创建一个回调设备,设备回调,就是设备对象。这个跟前面 LED 灯是一样的,只不过是他这边的话没有属性也没有服务,所以的话都不需要去从定义,然后是要创建一个设备接入客户端的一个对象,并且把这个设备上线注册,和 LED 那边是一样的,只不过是它里面参数名称可能要要改一下。
然后就是一个循环。这是我们这里睡眠一秒钟,然后下面就这个 handler 要定义了叫做 sound_sensor。
最后面是温湿度传感器也是先初始化一下,先获取用户定义 ppl。那么我们使用默认值默认用的是4,然后再是创建设备对象,温湿度传感器它有属性,没有服务,所以服务不需要。
然后它这边有一个属性,它的属性它是只读的,我们只需要实现这个 get,不需要去从定义这个 set,getproperties 的话是这样在如果说这个 humanity 在说 input value 里面会有,并且 temperature 也在这里面,我们就是先获取一下它的温度和湿度值,然后返回一个的 code0。
这是一个支点,给他返回这个支点,然后下面创建设备接入客户端,注册上线也是一样,跟前面都是一样的,然后再下面也是一个循环,我们循环实现5秒钟间隔上报,因此温湿度值,获取它的属性,获取它的温湿度值,然后构造数据,把它构造成一个字典类型,然后上报。
在下面也是一个 hundler.,这里是 temp_hum_sensor。
这个设备它现在一个运行状态,可以点查看,运行状态这里,那么这个功能定义忘提交了,他的状态是 status,属性名称叫 status。然后参数值0。读写属性。然后再是这个声音传感器功能定义。
他这边是事件,sound。是温湿度传感器,默认定义,这应该是自定义的功能,一个是温度。Temperature,取值是-150到150,补上0.01。单位是摄氏度。再加一个湿度。取值范围为0~100,步长是0.01,单位是百分比,只读。
看一下它实例,里面这设备的一个运行状态。可能要重启一下网关才看到这个声音,看看有没有。事件这边已经有很多事件了,它是0和1交替上报的。
然后再看一下温湿度传感器,这边已经有数据上报上来,我们在看在回到LED灯上可以这么操作,先给他设置,我们在云端可以给他设置在线调试这里。
方法是设置,设置为1,直接整数,这样的话他应该会有一个状态的返回了。这边它变成一了,可以把实时刷新打开。当然这里不会变的,我们程序里面写的没有主动去变更这个状态。