《物联网平台接口调用实验》详细讲解了API Explorer的应用,根据提供的接口,结合真实案例,制作了一个小程序,真正的把它应用起来,解放重复劳动,小程序是一个很好的平台,作为应用侧应用作为快速App环境。
准备资料:
1、华为云账号,并开通IoTDA控制台,选择北京四区域,创建好资源空间。
2、小熊派Bearpi-HM Nano开发板,和E53_IA1扩展版。
3、微信小程序账号,如果没有认证,也可以用开发临时账号运行。
4、小熊派其中一个案例,并导出Profile文件。Profile文件和API 接口数据字段有差异可以批量替换
工作原理和使用到的API Explorer接口。
工作流程和调用接口关系如图:
接口调用封装代码
1、首先是登陆接口,需要在北京四区域开通IoT平台的资源空间权限
//请求Token的json数据格式vartokenReq=require('../jsons/reqJson/tokenReq.js');//认证得到Token//X-Auth-Token//token.project.idexportfunctionauthToken(params){vardata=tokenReq.reqTokenJson;data.auth.identity.password.user.name=params.iamAccountdata.auth.identity.password.user.password=params.iamPassworddata.auth.identity.password.user.domain.name=params.accountconsole.log("auth_data",data)returnrequest({url:`${global.IAMEndpoint}/v3/auth/tokens`,method:'post',data:data})}//从token中获得project_id,作为全局数据,以备后用wx.setStorageSync('project_id',res.token.project.id)
2、查找和初始化资源,如果project_id对应的指定名称的资源空间是否存在,否则创建资源空间
//检查资源产品letparams={'project_id':global.project_id}init(params,res=>{global.products=res;wx.navigateTo({url:'../home/index',})})exportfunctioninit(params,func){getAppSpace({"project_id":params.project_id}).then(res=>{varapp_name=global.app_name;varapplications=res.applications;for(varitemofapplications){if(item.app_name==app_name){global.app_id=item.app_idbreak;}}if(global.app_id){console.log('app_id',global.app_id);func(true)}else{addAppSpace({'project_id':global.project_id||wx.getStorageSync('project_id')}).then(res=>{global.app_id=res.app_idconsole.log('app_id',global.app_id);func(true)})}});}
3、添加设备是中选定产品后添加,所以在添加设备的同时,先检查产品是否存在,不存在先创建产品。我这里的产品是通过Profile编辑的,说到这里要吐槽一下,通过IoTDA平台编辑导出的Profile文件和API Explorer接口不一致,json结构是一致的,但是字段名称不一致。对此我也在平台上反应过,已经被采纳,但是还没有实现。IOT的APIExplorer接口CreateProduct参数与Profile不一致_建议反馈_开发者中心-华为云 (huaweicloud.com)
addOrGetDevice:function(func){//检查输入varjson=deviceCreate.deviceCreateJson;json.node_id=this.data.device_namejson.device_name=this.data.device_name//json.project_id=global.project_idjson.product_id=global.product_idjson.app_id=global.app_id//产品是否存在this.checkProduct(this.data.selectedProduct,product=>{//检查设备,创建设备varhas=this.data.devices.filter((x)=>{returnx.device_name==this.data.device_name;});if(has==false){varparams={"deviceCreateJson":{"node_id":this.data.device_name,"device_name":this.data.device_name,"product_id":product.product_id,"app_id":product.app_id,"description":"XXXXXXdevice"},"project_id":global.project_id}addDevice(params).then(device=>{if(device.device_id){this.setData({showAddDevice:false})func({device_id:device.device_id,secret:device.auth_info.secret},{ssid:this.data.wifiSSID,pwd:this.data.wifiPwd})}else{wx.showModal({title:'创建设备失败',content:`${res.error_msg}`,showCancel:false})}})}else{func(null,{ssid:this.data.wifiSSID,pwd:this.data.wifiPwd})}})}
4、设备的动态展示,根据产品的Profile属性而来。设备属性值不能直接通过设备读取,这里读取的设备影子数据
//影子属性exportfunctiongetDeviceProperties(params){if(!params)params={}letproject_id=params.project_id||global.project_id||wx.getStorageSync('project_id')letdevice_id=params.device_idreturnrequest({url:`${global.IOTDAEndpoint}/v5/iot/${project_id}/devices/${device_id}/shadow`,method:'get'})}
小程序的相关界面
本文分享自华为云社区,作者: 神龙居市 。