• 解放重复劳动丨华为云IoT API Explorer对接小程序实现系统化应用


    摘要:《物联网平台接口调用实验》详细讲解了API Explorer的应用,根据提供的接口,结合真实案例,制作了一个小程序,真正的把它应用起来,解放重复劳动,小程序是一个很好的平台,作为应用侧应用作为快速App环境。

    本文分享自华为云社区《华为云IoT API Explorer对接小程序实现系统化应用》,作者: 神龙居市 。

    《物联网平台接口调用实验》详细讲解了API Explorer的应用,根据提供的接口,结合真实案例,制作了一个小程序,真正的把它应用起来,解放重复劳动,小程序是一个很好的平台,作为应用侧应用作为快速App环境。

    准备资料:

    1、华为云账号,并开通IoTDA控制台,选择北京四区域,创建好资源空间。

    2、小熊派Bearpi-HM Nano开发板,和E53_IA1扩展版,

    3、微信小程序账号,如果没有认证,也可以用开发临时账号运行。

    4、小熊派其中一个案例,并导出Profile文件。Profile文件和API 接口数据字段有差异可以批量替换

    工作原理和使用到的API Explorer接口。

    工作流程和调用接口关系如图:

    接口调用封装代码

    1、首先是登陆接口,需要在北京四区域开通IoT平台的资源空间权限

    //请求Token的json数据格式
    var tokenReq = require('../jsons/reqJson/tokenReq.js');
    // 认证得到Token
    //X-Auth-Token
    //token.project.id
    export function authToken(params) {
      var data = tokenReq.reqTokenJson;
      data.auth.identity.password.user.name = params.iamAccount
      data.auth.identity.password.user.password = params.iamPassword
      data.auth.identity.password.user.domain.name = params.account
      console.log("auth_data", data)
      return request({
        url: `${global.IAMEndpoint}/v3/auth/tokens`,
        method: 'post',
        data: data
      })
    }
    //从token中获得project_id,作为全局数据,以备后用
    wx.setStorageSync('project_id', res.token.project.id)

    2、查找和初始化资源,如果project_id对应的指定名称的资源空间是否存在,否则创建资源空间

    //检查资源产品
    let params ={ 'project_id': global.project_id }
    init(params, res => {
    global.products = res;
    wx.navigateTo({
            url: '../home/index',
        })
    })
    export function init(params, func) {
      getAppSpace({
        "project_id": params.project_id
      }).then(res => {
        var app_name = global.app_name;
        var applications = res.applications;
        for (var item of applications) {
          if (item.app_name == app_name) {
            global.app_id = item.app_id
            break;
          }
        }
        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_id
            console.log('app_id', global.app_id);
            func(true)
          })
        }
      });
    }

    3、添加设备是中选定产品后添加,所以在添加设备的同时,先检查产品是否存在,不存在先创建产品。我这里的产品是通过Profile编辑的,说到这里要吐槽一下,通过IoTDA平台编辑导出的Profile文件和API Explorer接口不一致,json结构是一致的,但是字段名称不一致。对此我也在平台上反应过,已经被采纳,但是还没有实现。IOT的APIExplorer接口CreateProduct参数与Profile不一致_建议反馈_开发者中心-华为云 (huaweicloud.com)

     addOrGetDevice: function (func) {
        //检查输入
        var json = deviceCreate.deviceCreateJson;
        json.node_id = this.data.device_name
        json.device_name = this.data.device_name
        // json.project_id = global.project_id
        json.product_id = global.product_id
        json.app_id = global.app_id
    
        //产品是否存在
        this.checkProduct(this.data.selectedProduct, product => {
          //检查设备,创建设备
          var has = this.data.devices.filter((x) => {
            return x.device_name == this.data.device_name;
          });
          if (has == false) {
            var params = {
              "deviceCreateJson": {
                "node_id": this.data.device_name,
                "device_name": this.data.device_name,
                "product_id": product.product_id,
                "app_id": product.app_id,
                "description": "XXXXXX device"
              },
              "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属性而来。设备属性值不能直接通过设备读取,这里读取的设备影子数据

    //影子属性
    export function getDeviceProperties(params) {
      if (!params) params = {}
      let project_id = params.project_id || global.project_id || wx.getStorageSync('project_id')
      let device_id = params.device_id
      return request({
        url: `${global.IOTDAEndpoint}/v5/iot/${project_id}/devices/${device_id}/shadow`,
        method: 'get'
      })
    }

    小程序的相关界面

     

    点击关注,第一时间了解华为云新鲜技术~

  • 相关阅读:
    [Give a try | Multithreading]The Practical Guide to Multithreading
    [SOLID]The Principles of OOD
    Mixing Native and Managed Types in C++
    [转载]关于大型软件重构的一些想法
    Mixed mode programming is the absolute power of C++/CLI
    Sample: Mixing Unmanaged C++, C++/CLI, and C# code
    添加删除虚函数带来的问题及解决办法
    如何阅读code base的组内讨论的总结
    如何快速定位一个函数的返回点(c/c++ Only)
    DirextX Training笔记
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/15527630.html
Copyright © 2020-2023  润新知