解放重復勞動丨華為雲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'
  })
}

小程序的相關界面

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM