在上一章中,我们从IOT云平台向下发展,完成了硬件侧到IOT平台的对接,从这一章开始我们从IOT云平台向自己的服务侧发展。我们采用基于Javascript的uniCloud作为服务侧。
1. 准备工具
- HBuilderX (HBuilderX-高效极客技巧 (dcloud.io))
2. IOT平台API
我们的云空间与IOT云平台通过云端API建立连接。
先以QueryDevice为例,该接口可查询指定产品下的所有设备列表。
进入网页后,我们进入调试平台,也可以进入推荐的API开发者门户调试。在SDK示例中,选择使用原版SDK,选择与云空间相同语言的Node.js。页面左侧可以填写请求参数,参数的介绍都在API文档里有介绍,
- endpoint(服务地址):对于公共实例一定是华东2(上海);
- ProductKey:在左侧栏中,我们填写此项必填项,可以看到右侧的params对象中多了一条属性,也就是说调用一条API所需要传的参数都为params的属性,传递给client.request();
- 分页参数:PageSize 指定返回结果中每页显示的记录数量,最大值是50,默认值是10;CurrentPage指定显示返回结果中的第几页的内容,默认值是 1。
- IotInstanceId:公共实例无需填写。
在页面右侧代码中可以看到,还有两项需要我们填写,accessKeyId和accessKeySecret,可以单机链接“获取AK”。对于阿里云,还可以悬停在右上角的用户图标,进入AccessKey管理页面,新建一个即可。AccessKey对应着用户的管理权限,要妥善保管,对于不同的项目成员,可以创建子用户,分配较低的权限共同管理项目。
在我们现在所处的API调试平台无需填入AK,可以直接调用,填完参数之后直接运行示例,下方的shell就绪后输入回车,就可以看到我们的产品下属的设备了。
在调用API后,IOT云平台会返回数据,我们重点关注Data这个数组,里面包含了我们需要请求的具体数据,如果数据较多,要考虑分页(Page)问题,具体的返回结构同样可以通过API文档查阅。
常用的API有:
QueryDevice:首先获取指定产品中的所有设备,接着使用以下的API遍历设备
- GetDeviceStatus:查看指定设备是否上线
- QueryDeviceProp:获取指定设备上报的属性
3. 配置uniCloud
现在我们知道可以通过IOT平台提供的API获取相应的数据,现在使用云空间调用API,并将数据记录在数据库,并向客户端提供查询能力。云空间可通过官方文档快速建立,注意使用阿里云服务器即可,创建一个云空间,并与该项目相关联,我们直接跳到编写云函数这一步。
我们在./uniCloud/cloudfunctions目录下右击,新建云函数,我们来看云函数结构,console.log()可以向页面控制台发送调试信息,函数通过return返回值,我们将使用uniapp调用云函数,获取这个event返回值。也就是说,我们通过云函数调用IOT云平台API获取数据,再返回这些数据至客户端。
exports.main = async (event, context) => {
//event为客户端上传的参数
console.log('event : ', event)
//返回数据给客户端
return event
};
回到API开发者门户,选择一个API,在这里仍以QueryDevice为例,复制原版SDK,Node.js代码,代码的此部分返回调用API后的返回对象的Data部分,同时打印整个API调用的返回结果,如shell中所示。
client.request('QueryDevice', params, requestOption).then((result) => {
console.log(JSON.stringify(result));
return result.Data
}, (ex) => {
console.log(ex);
return "Err!"
})
应用到云函数就是,云函数返回引用库返回的调用API返回的结果。
'use strict';
// 配置库
const Core = require('@alicloud/pop-core');
var client = new Core({
accessKeyId: 'LTAI4G7tduj5XzDK-----',
accessKeySecret: '2WtE7kvP53CNmvLM4xU5yV-------',
endpoint: 'https://iot.cn-shanghai.aliyuncs.com',
apiVersion: '2018-01-20'
});
// 配置API参数
var params = {
"ProductKey": "----"
}
// API请求方法(POST或GET)
var requestOption = {
method: 'POST'
};
exports.main = async (event, context) => {
return client.request('QueryDevice', params, requestOption).then((result) => {
console.log(JSON.stringify(result));
return result.Data
}, (ex) => {
console.log(ex);
return "Err!"
})
};
在运行云函数之前,记得在manifest.json-基础配置-uni-app应用标识中重新获取AppID。在云函数上右击“上传并运行”,可以看到控制台的日志,日志返回的是result,即API返回的整个结果,可以直接打印result.Data,也即云函数实际返回的结果。
通过uniCloud还可以快速建立云函数库,在云函数中将调用IOT平台API返回的数据直接存储到数据库,云函数具备定时器触发的功能,可以定时抓取来自IOT平台的数据,并建立自己的物联网设备信息数据库。