[干货分享] 之二-呕血制作-Lettuce IOT框架-移远BC35G+树莓派+华为OC+SpringBoot后台+微信小程序

上一篇主要介绍一下物联网的大环境和什么是Lettuce IOT框架而这一篇将要讲解华为的IOT平台。

 

华为OceanConnect平台操作一,profile文件与编解码插件的开发


 

思考一下:当今WEB应用都喜欢做成分布式,因为分布式可以将压力平均的分发给下面小的服务器去处理。包括hadoop也是,将碎片化的存储和计算能力集中起来利用。但是这些技术都离不开一个组件,那就是监控管理中心,比如SpringCloud的Eureka服务治理以及hadoop的ZooKeeper服务协调。这样就好比一个班里有一个班长一样,大家都听他一个人。他也负责管理迟到,早退,请假等任务。这样一来,原本涣散的班级从此被拧成一股绳。

在IoT的世界里其实更需要监控管理中心,因为线下硬件不如线上软件。硬件会有非常多一想不到的事情发生,因此更需要有一个去管理他们的平台。

 

以往的硬件管理平台都是我们自己搭建的,简陋粗暴,在时间紧任务重的情况下还没有鉴权机制,成为日后安全的隐患。其实硬件管理平台属于必备品组件,但是做一个简单的很容易。如果做一个功能很完善的,那真的是难上加难,因为涉及的东西实在是太多了。不过刚好,华为的OceanConnect全联接平台(以下将简称OC平台)满足了我们硬件管理平台所有需求。

 

之所以先讲OC平台是因为,这款IOT框架其实由OC平台提供的项目开发思路,也是以OC平台的功能建模。所以OC平台是这个框架的必要组件,也是框架的开发源头。

 

这个就是OC平台的项目开发流程图,我们需要先在OC平台把产品设计出来,比如我们演示的这个项目。

 

 

最后在手机上可以查看设备是否在线,对灯的操作,以及设备完美退出。

鉴于这3个需求我们分析出一套完善的产品出来:

 

产品功能分析完了,接下来我们进入OC平台

 

华为云平台https://www.huaweicloud.com/

产品 -> IoT物联网 -> IoT开发者专区 -> 免费体验 -> 进入开发中心

 

进入平台以后:

只有这几个需要注意,其他随意。

 

 

 

产品设计OK,产品创建OK。接下来是开发阶段:

首先我们再看这个流程图,接下来我们要开发profile配置文件。


思考一下:以前的无线电电报都是靠发送或接受短/长的电信号来传递消息,而不管是发送方还是接受方都需要有一个翻译电码的标准,抗战时期管这个叫密码本。有了这个密码本,无论是谁都可以翻译出电信号的意思,翻出人能看明白的电报。

 

而这个密码本类似于我们要开发的profile文件,这个文件制定的规则,属性名称,命令名称。可以让任何机器都对照profile文件翻译出来。所以不管是设备端,OC平台,服务端都需要以这个文件来理解上行或者下行机器发出的数据是什么意思。

 

OC平台一大特点就是,可以帮助开发者更方便的开发,比如我们要想开发这个profile配置文件,是要写JSON文件的,但是OC平台提供了更直观的开发方式。

Profile的结构:

 

Profile由基础信息和服务能力构成。

服务能力我觉得类似于面向对象开发,每一个服务能力都对应着线下硬件的一个模块。

比如灯有当前状态的属性,属性的数据类型,还有开/关的方法,方法的入参与返回值,因此灯作为一个类的存在,对应着线下灯的模块。

 

这次演示我们提供2个服务能力,一个是灯的,一个是树莓派的。

 

属性名称

数据类型

数据取值

属性描述

status

Int

0/1

灯的状态(0关闭,1开启)

命令名称

命令描述

ON_OFF

对灯开/关的命令操作

命令下发属性

数据类型

数据取值

属性描述

toggleBulb

Int

0/1

灯的状态(0关闭,1开启)

命令响应属性

数据类型

数据取值

属性描述

result

Int

0/1

返回灯的状态(0关闭,1开启)

命令名称

命令描述

QUERY_STATUS

查询当前灯的状态

命令下发属性

数据类型

数据取值

属性描述

issue

Int

1

固定值为1

命令响应属性

数据类型

数据取值

属性描述

result

Int

0/1

返回灯的状态(0关闭,1开启)

 

属性名称

数据类型

数据取值

属性描述

status

Int

0/1

设备的状态(0下线,1在线)

命令名称

命令描述

QUIT_PYTHON

下线操作

命令下发属性

数据类型

数据取值

属性描述

executeQuit

Int

1

固定值为1

命令响应属性

数据类型

数据取值

属性描述

result

Int

0/1

返回设备的状态(0下线,1在线)

 

 

Profile文件定义好了,我们还需要一个“译码员”

这个“译码员”就是下一个要开发的编解码插件,OC平台接收时接到的是二进制数据。编解码插件可以根据Profile文件翻译成我们可以看得懂的json数据。

 

数据来源主要有四种:

 

 

但是在华为OC平台中开发编解码插件,我们将一个操作产生的上下行数据(发送和响应)作为一个编解码消息模板来收发。

一般来说一个编解码消息模板对应一个服务能力的一个或多个属性或是一个服务能力一个命令。比如上面那个profile文件中有2个服务能力,每个服务能力都有属性,那么这就是2个数据上报编解码消息模板。profile文件中有2个服务能力,其中SwitchBulb有2个命令, 而OperationPi 有1个,这就对应着有3个命令下发编解码消息模板。

 

比如说灯的开/关下发指令这个编解码消息模板:

命令下发与响应是对应的,我们看到下发的value属性和响应的result属性对应的是刚才配置Profile文件中的ON_OFF命令下的属性。

 

 

除了Profile文件中的ON_OFF命令下的属性的还有3个字段,分别是messageId以及mid和errcode。

 

思考一下:信通常由地址和收信人组成。比如有两封信都邮到一个学校里,学校都有收发室。自然信会统一放到收发室保管。然后收发室里的人会根据收信人把**到指定人手中。

现在转换过来,地址是你的华为OC平台。需要用messageId来区分是哪个消息模板来解码这条消息。

 

messageId是消息的地址域标识符,用于编解码区分是哪个消息模板。比如SwitchBulb设备上传status消息,和命令下发ON_OFF,这属于2个消息模板。在创建消息模板时需要添加messageId地址域字段,OC平台会自动给这个字段赋值。用于消息进来时,平台自动用哪个消息模板来解码消息。

Mid字段主要是命令下发模板使用的,用于区分是哪个命令下发的响应。比如我们连续用ON_OFF这个消息模板连续下发3条命令。当平台接收到响应时,便可以根据mid来对应是3条的哪一条的响应回值。

Errcode字段主要用于命令下发模板响应时使用的,用来表示执行成功还是失败(0为成功,1为失败)

 

注意:命令下发的messageId和Mid必须要位置要对应。messageId字段序号1就要对应响应的序号1,不然会解码失败。

响应字段必须要有回值字段,作者曾经尝试把result字段去掉,但是平台在接收响应时报无法匹配消息模板的错。

 

这次演示的编解码插件,我们一共创建5个消息模板。

 

分别对应Profile文件的2个服务能力的属性和3个命令。

 

bulb_status

ON_OFF

QUERY_STATUS

pi_status

QUIT_PYTHON

数据上报

命令下发

命令下发

数据上报

命令下发

上传字段

上传字段

上传字段

上传字段

上传字段

messageId

messageId

messageId

messageId

messageId

Status(int8u)

mid

mid

status(int8u)

mid

响应字段

value(int8u)

issue(int8u)

响应字段

executeQuit(int8u)

响应字段

响应字段

响应字段

 

messageId

messageId

 

messageId

 

mid

mid

 

mid

 

errcode

errcode

 

errcode

 

result(int8u)

result(int8u)

 

result(int8u)

因为我们Profile文件中所有属性和命令内属性都是0/1,因此长度设置1即可。

messageId,mid和errcode只需要勾选相应选项即可。

添加完消息模板以后,我们还需要将消息模板手动的与profile文件中的值一一对应。这样编解码插件才会将二进制信息处理为json文件。

将右侧的属性和命令拖拽至相应区域,与消息模板中的字段对应即可。

这样,编解码插件就大功告成了。然后别忘了部署哦。

 

部署好了以后,profile文件与编解码插件的开发就完成了!

下一章节我们来模拟调测一下。

欢迎加入我们的QQ群一起讨论IOT的问题。