开发者学堂课程【物联网应用开发课程:设备接入】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1055/detail/15308
设备接入
内容介绍:
一、概述
二、安卓设备接入
三、云模组接入
四、资料附录
一、概述
1、设备与平台概览
以下为设备跟物联网平台交互的示意图:
图中左侧是各种各样的设备,从协议的维度来划分,可以划分为就 MQTT、CoAP、HTTPS 等协议的设备。这些设备大多数通过设备端的 SDK 接入,也就是后面要学习到的 LinkSDK。
当设备接入之后,即可使用物联网平台的各种能力,包括消息通信、设备管理、运维监控和数据分析等,用户还可以在物联网平台之外使用阿里云的一些原产品,如MQ、OTS等工具,从物联网平台订阅消息,进行自身的逻辑处理后再利用AOI下发给设备。
2、端侧能力概览
这里重点学习刚才提到的设备端接入工具 LinkSDK。
在工具箱LinkSDK,它是纯软件开发的工具包,有各种语言的实现,包括c语言、安卓、Python等,其中有各种各样的组件,与云端的能力一一对应。
除了是纯软件开发的工具之外,它5还提供了硬件的一种解决方案——云模组,可以划分为wifi模组和4G模组,包括4G-CAT1、4G-CAT4。
今天重点学习其中的安卓SDK接入和wifi模组接入两大部分,还包括资料附录。
二、安卓设备接入
关于安卓设备接入的整体知识架构如下:
安卓设备接入部分分为集成SDK、认证连接、物模型和OTA四大模块,结合典型场景安卓广告屏的场景说明的安卓SDK的使用,因为的很多户外广告大型电视机使用的一般都是安卓系统,再结合电脑上安卓虚拟机运行安卓广告屏的DEMO,加深对安卓接入的理解。
1.原理介绍
(1)工程配置
①配置仓库
要使用安卓SDK,用户需要先引用仓库地址:
maven {
url"https://maven.aliyun.com/nexus/content/repositories/r
eleases/"
}
②引用相应的三个模块
Implementation('com.aliyun.alink.linksdk:iot-linkkit:1.7.2')
implementation('com.aliyun.alink.linksdk:public-channel-c
ore:0.7.7.1')
implementation('com.aliyun.alink.linksdk:iot-device-manager:
1.7.5.0')
③Demo 下载
用户可以直接下载 demo 体验其基础功能,下载链接:Android Link SDK Demo
(2)认证与连接
认证连接是安卓设备接入的第一步。
①认证方式
认证连接有两大类型,一种是一机一密,可简单理解为每个设备都烧录了不同的证书,另外一种是一型一密,即同一产品下的每个设备都烧录相同的证书。这里的证书是产品维度的证书,可以通过device_name(设备的名称)区分不同的设备。
②注册方式
对于一型一密,有两种方式进行注册,一种是预注册,即事先要在物联网平台创建设备,通过调用 API 或直接在控制台手工创建均可,另外一种则不需要事先在控制台创建设备,也就是在设备联云时创建,即免预注册。
本节课的 DEMO 支持以上三种连接方式:
如果一机一密,需要填写productKey、deviceName和deviceSecret,一型一密则需要填写 productKey、deviceName和productSecret,其中productSecret,一型一密额两种注册方式都要填写。registerType是一型一密的类型,一机一密无需填写,一型一密的预注册也不用填,而免预注册的需要填写,只有填写了registerType才知道它实际上是种免预注册类型,主要靠字段来区分两种类型。instanceid对于企业实例用户和新版本公共实例都适用,一型一密用户需要填写。
mqtHost是MQTT接入域名,由于设备分布非常广泛,遍及全球,故将其分为几个区域,国内有上海、北京、深圳,国外有北美、欧洲等一系列区域,每个区域的接入域名不同,由于默认的区域是上海,因此上海区域不用填写,其他的区域都要填写,这部分会在DEMO中进行演示。
(3)物模型
在连接上之后,设备适用物模型能力,因为设备有属性、服务、事件等不同的能力,而这些能力需要通过建模的方式来进行描述,这种描述方式就称为物模型。
这个工具可以极大简化用户描述设备、对设备进行操作的过程。云端配置包括创建产品、配置物模型和创建设备。
这里了解一下创建产品。创建产品的界面比较简洁,如下:
用户可以直接输入产品名称,选择预先定义好的各种品类,也可以自定义品类,如某某灯,节点类型的话,觉得主要用于区分是直联、网关子设备或是网关设备,一般安卓设备以直联设备居多,联网方式一般选Wi-Fi,对连网的力度并不影响。
数据格式较为重要,数据格式,一般推荐使用标准数据格式——ICA标准数据格式,它是一种JSON格式,除非有特殊需要,用户可以选择制自定义方式,但选择自定义数据格式,用户还需要编写特定的脚本解析自定义的数据格式,仅在一些特定的情情景下才要用到。
(4)OTA
OTA主要是指设备的固件升级,对安卓产品来说,就是其APK的升级,其流程分为一下几步:
①设备上报自身的版本号
设备要把自己单行的版本号,如1.0.1,通过API上报到服务台。
②设备订阅OTA相关topic
设备在调用API订阅OTA相应的Topic。
③用户在控制台部署OTA任务
④设备就可以接收的到推送消息,这部分推送消息包括了下载的链接,MD5等
⑤SDK在搜到下载链接之后就开始自动下载、升级,并把进度上报到服务端
⑥完成之后,设备要上报新的版本号,因为控制台只有看到新的版本号才会确认整个升级已经完成
2、结合场景说明
该场景是安卓广告机(安卓电视机用做广告)场景。
首先是广告推送,用户在控制台上下发一条指令,广告器收到指令之后推送指令指定的内容;接下来演示广告商对安卓机进行APK升级的过程。
(1)通过Demo来演示安卓SDK的工作过程
①下载demo
点击下载链接进行下载,利用下载好的演示一些功能。当前下载好的Demo主要用来演示属性下发两项功能,将属性下发与广告下推联系在一起。
②定义安卓广告屏设备
先创建安卓广告产品demoAndroidMachine,选择自定义品类。自定义功能类型为属性,功能名称为advisePush(广告下推),标识符为advisePush,数据类型的有多种,这里通过最简单的整型int32来演示。
即下发1表示推1号广告,下发2表示推2号广告。发布物模型上线,发布该产品。
③创建设备
在发布的产品上创建设备demoAdvDev001。查看设备身份的录入,对deviceinfo信息进行替换,包括productKey、deviceName和deviceSecret。因为该设备创建在实例中,实例的接入点Instanceid(实例ID,可能实例的信息界面拷贝)需要填写(除了上海区域都要填写),mqttHost(在开发配置中)也要填写,并添加上端口号。另外,我们在这里用到了物模型TSLActivity.java,要使用物模型,必须在物模型的InitManage中将事件开关设置为true,表示具备了物模型的能力,可以使用安卓模拟器运行代码验证其连接能力:
显示初始化成功,即该设备成功连云。点击安卓模拟机上的物模型接入示例,成功进入示例,表示物模型已经使用。
接下来分析以下物模型相关的代码,主要在TSLActivity.java中。
属性下发在mCommonHandle中进行处理,云端下发的属性会对下发的值进行区分、处理,getData到下发的值result,是map结构。其key即为属性的idenify,可以判断idenify是否存在,若存在,则要对其进行处理。
现在定义的idenify是advicePush,对其进行判断,如果收到广告下推,就进入页面跳转。
页面跳转的定义已经预先写好了,加载事先写好的页面,可以验证一下。暂停原先的运行过程,重新编译运行。
在控制台进行一些操作,对设备进行广告下发。在“在线调试”的“属性调试”中点击“设置”,安卓模拟机立刻进行跳转,跳转到某广告Demo页面。
(2)通过Demo来演示OTA
找出固件名find. -iname *.apk的路径
①创建OTA任务
在OTA升级中添加升级包“demoAndroidMachine_v1”(末尾加了版本号),安卓设备一般使用升级包模块为默认模块,命名新的升级包版本号1.0.9上传升级包,不使用验证直接升级。
在设备推送升级之前,先让设备订阅相应的OTA的Topic,OTA示例中有相关功能,可以上报当前自己的版本号,开始OTA就可以同时完成上报版本号和OTA订阅。然后在控制台下推部件批量升级,选择设备定向升级。
升级完成后,安卓模拟机显示接收到demo APK推送。还可以在模拟机点击Install安装,还可以在控制台点击进入批次详情,目前显示升级中,在模拟机段上报一个新的版本号1.0.9(与固件中设置的版本号想听)就会结束当前的任务,刷新页面显示升级成功。
三、云模组接入
设备通过云模组接入物联网平台。
在该部分首先做原理性的介绍,介绍一下云模组是一个怎么样的硬件产品、环境如何搭建以及常用的AT指令,接着来结合宠物投食机的案例说明使用云模组组如何跟平台进行交互,最后进行实际操作。
1.原理介绍
(1)云模组简介
云模组是一款低功耗、嵌入式的Wi-Fi+蓝牙的Combo模组,常用交互方式如下:
即MCU通过AT指令控制云模组,而云模组与平台建立MQTT连接进行双向交互,再把云端下发的指令反馈给MCU。而云模组中有LinkSDK,用户使用云模组连接平台会更加容易,指令也更加精简。
(2)硬件环境
串口波特率为115200,Debug波特率为2000000。
(3)WiFi配网
云模组具有多种wifi配网方式,包括蓝牙配网、设备热点配网以及通过AT命令直接下发<ssid><password>给云模组,最终用户可以通过通过save指令选择是否保存<ssid><password>。
(4)连接与认证
以下为设备在连接wifi之后做的认证连接,这涉及到了AT指令。
①设备身份设置方面,一机一密与一型一密配置方式不同。
一机一密:
AT+IMQTTAUTH=<product_key><device_name><device_secret>
仅指定productKey、deviceName、deviceSecret三元组即可。
一型一密:
AT+IMQTTPARA=AUTHMODE1
AT+IMQTTAUTH=<product_key><device_name>,,<product_secret>
指定productKey、deviceName、productSecret,中间的“,,”表示跳过deviceSecret。此外,还需要指定AUTHMODE,如果是免预注册的方式,AUTHMODE指定为2,如果是预注册的方式,AUTHMODE指定为1。而一般情况是预注册的,因此这里之间默认推荐AUTHMOD.1。
②连云
设置设备身份之后,就可以连云了,
推荐使用AT+IDMCONN=<host><port>指令host和pos,如:
AT+IDMCONN=demo.iot-as-mtt.cn-shanghai.aliyuncs.com,443+ID
MSTATE:1
OK
前面的demo主要是produceKey,没有详细展开,若返回状态值1,表示连云成功。
(5)自定义MQTT Topic通信
设备在连云成功之后,可以做消息的上下行动作。
①消息上行:
AT+IMQTTPUB=<topic>,<qos><message>
指定topic、qos、message,就可以将消息发生给服务平台,平台也可以主动下推消息给设备。
②消息下行:
+IMQTTRCVPUB:<topic>,<msg_len><message>
MCU会收到模组以该种格式下推过来的指令,如:
+IMQTTRCVPUB:/gb80RSH2u1U/demo 001/user/get,6,mytext
前面“/gb80RSH2u1U/demo 001/user/get”是topic,“6”是消息长度,“mytext”是消息的内容。
③订阅消息:订阅自定义的topic
平台的topic用户不需要自定义,这些功能已由模组完成
AT+IMQTTSUB=<topic><qos>
用户需要指定自定义topic的topic名称和qos级别
④取消订阅
AT+IMQTTSUB=<topic>
SUB即可实现取消订阅物模型
物模型部分也提供了几个指令
⑤属性上报
AT+IDMPP=<message>,其中message是json格式的payload
通过IDMPP方式就可以把JSON上报,用户需要填入完整的JSON格式,如:
AT+IDMPP=("LightSwitch":1}
②事件上报
AT+IDMEP=<event_id><event_payload>
使用IDMEP上报,前面是event_id,那后面是具体的event_payload
③同步服务下发
+IDMSS:<msg_id,<rrpc_id><service_id><msg_len>,<message>
④异步服务下发
+IDMAS:<msg_id><service_id><message>
对同步和异步两种服务下发的场景都封装了相应的AT指令到用户,用户可以通过两个指令来进行区分
(7)OTA
①控制台部署完升级任务之后,模组一般会收到消息:当前有OTA任务下发,并说明了目标的版本号、尺寸大小等消息,告知MCU
②MCU进行反馈,决定并通知模组是否要进行OTA升级,enable值为1,表示开始升级
③模组开始从云端下拉固件,完成之后,通过指令告知MCU已完成
④MCU查询固件详情,模组会告知MCU其总共分几片,每片多少
⑤MCU一片一片地把固件取下来
⑥MCU确认升级完成之后,通过指令就上报最新的版本到云平台
2、场景说明
以案例的方式说明云模组常见的使用。此处以宠物投食机场景为例。
宠物投食机由云模组和MCU两部分组成,用户在上班期间要想喂养宠物,他通过手机发指令到云平台,云平台收到之后,通过长链接发消息给的云模组,云模组把它转化成AT指令告知MCU当前用户喂食多少。MCU完成动作后再用AT指令把结果反馈给云模组,说明实际投食量,将结果反馈给用户。
以下为该Demo实操:
- 通过AT指令连接Wi-Fi
AT+WIFICONNECT=hot.1234abcd.0
输入ssid password(不保存他的账号密码),点击发送。
- 在平台创建宠物设备
选择企业实例,创建产品demoPetFeeder(宠物投食机),标准品类中没有相应的品类,可以自定义制定标准品类,其他保持不变。定义物模型,定义功能类型为“属性”,定义功能名称为“FeedVolume”(投食量),发布物模型及基于物模型的产品。
创建设备“demofeeder1”,填写productKey、deviceName和deviceSecret信息:
AT+IDMAUTH=gb80L1WAr2M,demoFeeder1,300ec9710511309
1b53861bfc282f50
- 连云
AT+IDMCONN=iot-060a08ql.mqtt.iothub.aliyuncs.com,1883
对于企业实例要提供其接入点,端口号默认时1883或者43。
(4)控制台下发消息
相当于触发喂食动作。动作属性已经存在,设置为1,就可以看到服务端的下发指令已经到达设备,提示当前投时量为1
(5)消息反馈
AT+IDMPP["FeedVolume":1]表示已经收到属性,并且进行相应的动作,且实际喂食量为1,反馈给云端。
且此时控制台物模型的数值显示为1,显示设备,已经完成云端下发的指令,且喂食量确为1。
四、资料附录
包括 SDK 概览、安卓设备接入、云模组接入链接,同时,单独摘录了安卓SDK Demo 的代码,可以自行体验。