文章导航:
微信小程序连接阿里云物联网平台操控设备(IOT)一 设备上云
微信小程序连接阿里云物联网平台操控设备(IOT)二 微信小程序开发(一)
微信小程序连接阿里云物联网平台操控设备(IOT)三 微信小程序开发(二)

微信小程序连接阿里云物联网平台操控设备(IOT)二

  • 微信小程序开发(一)
    • 请求API公共参数
    • uuid帮助工具类
    • 创建项目
    • 编写sdk

上一篇我们成功将设备上云,这一篇我们来了解如何通过阿里云物联网平台的云端API来控制设备。阿里云物联网平台提供云端管理产品、设备、分组、Topic、规则、设备影子等API接口,和从云端发布消息的API接口。使用云端SDK,向API的服务端地址发送HTTPS/HTTP GET或POST请求,并按照API接口说明,在请求中加入相应请求参数来调用API。物联网平台根据请求的处理情况,返回处理结果。

微信小程序开发(一)

请求API公共参数

首先我们需要先了解一下访问阿里云物联网平台云端API,需要哪些公共参数,我们需要解决哪些问题。
1.公共参数

其中大部分很好生成,需要注意的只有2个。一个是需要生成唯一随机数,有很多uuid的生成方法。另一个就是签名。我们需要具体了解一下阿里的签名机制。

2.签名机制
签名时,需在控制台 AccessKey 管理页面查看您的阿里云账号的AccessKeyId和AccessKeySecret,这个之前在上一篇已经让大家准备好了,然后进行对称加密。其中,AccessKeyId用于标识访问者身份;AccessKeySecret是用于加密签名字符串和服务器端验证签名字符串的密钥,必须严格保密。
签名机制篇幅较大,具体签名方法请大家看阿里云官方文档。
其中计算签名需要计算HMAC值还需要SHA1算法,最后需要Base64编码。我选择使用cryptoJs。但是找到的一些版本对微信小程序的支持都不尽人意。后来发现有一版对微信小程序支持比较好。但是有一些问题存在,比如不支持Base64编码返回结果,我稍微做了一些改动。如需下载此版本cryptojs资源,请点击此链接

uuid帮助工具类

用于生成SignatureNonce唯一随机数,这里提供一个uuid生成工具模块。

var CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');const uuid = (len, radix) => {var chars = CHARS,uuid = [],i;radix = radix || chars.length;if (len) {for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random() * radix];} else {var r;uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';uuid[14] = '4';for (i = 0; i < 36; i++) {if (!uuid[i]) {r = 0 | Math.random() * 16;uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}}return uuid.join('');
};const uuidFast = () => {var chars = CHARS,uuid = new Array(36),rnd = 0,r;for (var i = 0; i < 36; i++) {if (i == 8 || i == 13 || i == 18 || i == 23) {uuid[i] = '-';} else if (i == 14) {uuid[i] = '4';} else {if (rnd <= 0x02) rnd = 0x2000000 + (Math.random() * 0x1000000) | 0;r = rnd & 0xf;rnd = rnd >> 4;uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];}}return uuid.join('');
};const uuidCompact = () => {return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {var r = Math.random() * 16 | 0,v = c == 'x' ? r : (r & 0x3 | 0x8);return v.toString(16);});
};module.exports = {uuid: uuid,uuidFast: uuidFast,uuidCompact: uuidCompact
}

创建项目

1.创建项目,导入所需工具模块

2.因为是通过访问云端API控制设备,登录微信公众平台小程序配置request合法域名。目前阿里云物联网平台服务器地域国内只有上海站,所以暂时Region只写cn-shanghai。

编写sdk

除了研究官方给的签名机制,还参考了官方给的nodejs-sdk。
1.引用模块,因为我将一些信息放在app的全局变量globalData中,所以除了刚才的uuid和cryptojs还要引用app。

var crypto = require("/cryptojs-master/cryptojs.js").Crypto
var uuid = require("/uuid.js")
const app = getApp()


2.按照公共参数的描述和签名机制编写相关方法。

//格式化数字
const formatNumber = n => {n = n.toString()return n[1] ? n : '0' + n
}//首字母大写
const firstLetterUpper = str => {return str.slice(0, 1).toUpperCase() + str.slice(1);
}//格式化参数
const formatParams = params => {var keys = Object.keys(params)var newParams = {}for (var i = 0; i < keys.length; i++) {var key = keys[i]newParams[firstLetterUpper(key)] = params[key]}return newParams;
}//参数排序
const sortParams = params => {var keys = Object.keys(params).sort()var newParams = {}for (var i = 0; i < keys.length; i++) {var key = keys[i]newParams[key] = params[key]}return newParams;
}//生成规定时间格式
const timestamp = () => {var date = new Date();var YYYY = date.getUTCFullYear();var MM = formatNumber(date.getUTCMonth() + 1);var DD = formatNumber(date.getUTCDate());var HH = formatNumber(date.getUTCHours());var mm = formatNumber(date.getUTCMinutes());var ss = formatNumber(date.getUTCSeconds());// 删除掉毫秒部分return `${YYYY}-${MM}-${DD}T${HH}:${mm}:${ss}Z`;
}//url编码
const encode = (str) => {var result = encodeURIComponent(str);return result.replace(/\!/g, '%21').replace(/\'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A');
}//将数组参数格式化成url传参方式
const replaceRepeatList = (target, key, repeat) => {for (var i = 0; i < repeat.length; i++) {var item = repeat[i];if (item && typeof item === 'object') {const keys = Object.keys(item);for (var j = 0; j < keys.length; j++) {target[`${key}.${i + 1}.${keys[j]}`] = item[keys[j]];}} else {target[`${key}.${i + 1}`] = item;}}
}//将所有数组参数展开
const flatParams = (params) => {var target = {};var keys = Object.keys(params);for (let i = 0; i < keys.length; i++) {var key = keys[i];var value = params[key];if (Array.isArray(value)) {replaceRepeatList(target, key, value);} else {target[key] = value;}}return target;
}//按传参名首字母顺序将所有参数以特定格式放进数组中
const normalize = (params) => {var list = [];var flated = flatParams(params);var keys = Object.keys(flated).sort();for (let i = 0; i < keys.length; i++) {var key = keys[i];var value = flated[key];list.push([encode(key), encode(value)]); }return list;
}//将数组格式的参数转化为url传参格式
const canonicalize = (normalized) => {var fields = [];for (var i = 0; i < normalized.length; i++) {var [key, value] = normalized[i];fields.push(key + '=' + value);}return fields.join('&');
}//构建公共参数
const _buildParams = () => {var defaultParams = {Format: 'JSON',SignatureMethod: 'HMAC-SHA1',SignatureNonce: uuid.uuid(),SignatureVersion: '1.0',Timestamp: timestamp(),AccessKeyId: app.globalData.ai,Version: app.globalData.apiVersion,RegionId: "cn-shanghai"};return defaultParams;
}

3.封装小程序request,请求时加入公共参数

const request = (params, opts, success, fail, complete) => {params = formatParams(params)params.Action = firstLetterUpper(params.Action)var defaultParams = _buildParams()params = Object.assign(defaultParams, params)var method = (opts.method || 'GET').toUpperCase()var normalized = normalize(params)var canonicalized = canonicalize(normalized)var stringToSign = `${method}&${encode('/')}&${encode(canonicalized)}`const key = app.globalData.as + '&'var signature = crypto.HMAC(crypto.SHA1, stringToSign, key, {asBase64: true})normalized.push(['Signature', encode(signature)])const url = method === 'POST' ? `${app.globalData.endpoint}/` : `${app.globalData.endpoint}/?${canonicalize(normalized)}`if (method === 'POST') {opts.headers = opts.headers || {};opts.headers['content-type'] = 'application/x-www-form-urlencoded'opts.data = canonicalize(normalized)}wx.request({url: url,data: opts.data ? opts.data : {},header: opts.headers,method: method,dataType: 'json',responseType: 'text',success: function(res) {if (typeof success === 'function')success(res)elseconsole.log("success is not a function")},fail: function(res) {if (typeof fail === 'function')fail(res)elseconsole.log("fail is not a function")},complete: function(res) {if (typeof complete === 'function')complete()elseconsole.log("complete is not a function")}})
}

4.最后模块向外暴露封装好的request

module.exports = {request: request
}

这一篇我们了解了请求阿里云物联网平台云端API所需要的公共参数和签名机制,并进行了sdk编写。下一篇就将编写小程序使用我们编写好的sdk调用云端API,实现获取已经上云的设备数据,并给设备下发指令。

文章导航:
微信小程序连接阿里云物联网平台操控设备(IOT)一 设备上云
微信小程序连接阿里云物联网平台操控设备(IOT)二 微信小程序开发(一)
微信小程序连接阿里云物联网平台操控设备(IOT)三 微信小程序开发(二)

微信小程序连接阿里云物联网平台操控设备(IOT)二相关推荐

  1. 微信小程序连接阿里云物联网平台操控设备(IOT)一

    文章导航: 微信小程序连接阿里云物联网平台操控设备(IOT)一 设备上云 微信小程序连接阿里云物联网平台操控设备(IOT)二 微信小程序开发(一) 微信小程序连接阿里云物联网平台操控设备(IOT)三 ...

  2. 微信小程序连接阿里云物联网平台操控设备(IOT)三

    文章导航: 微信小程序连接阿里云物联网平台操控设备(IOT)一 设备上云 微信小程序连接阿里云物联网平台操控设备(IOT)二 微信小程序开发(一) 微信小程序连接阿里云物联网平台操控设备(IOT)三 ...

  3. 微信小程序连接阿里云物联网平台——物联网远程控制开发1

    博主在尝试使用微信小程序与阿里云物联网平台的topic通信,但有些资源说的不够详细,容易搞懵小白,因此补充一些. 内容框架参考: [物联网]微信小程序接入阿里云物联网平台 微信小程序连接阿里云物联网平 ...

  4. 微信小程序连接阿里云物联网平台 - MQTT协议题

    参考文章:[物联网]微信小程序接入阿里云物联网平台_mxj1428295019的博客-CSDN博客_微信小程序 阿里云物联网 在参考文章中下载源码,然后在微信小程序开发者工具中打开,并且修改下图中这些 ...

  5. esp8266驱动_【直播视频】微信小程序连接阿里云物联网控制esp8266实现rgb调节。...

    前天晚上感谢各位小伙伴的捧场直播:我今年下半年立志会出一档实战视频<微信和支付宝小程序如何控制esp8266>,会第一时间通知大家! 昨晚在遇到一些小问题,耽误了一个小时,开始直播时候喉咙 ...

  6. 微信小程序连接阿里云物联网

    文章目录 添加文件至utils目录 把下面代码粘贴至需要通信的页面的JS中 举例:我放在goExpress.js下 改动 改动1 改动2 测试 发送给阿里云端消息: 添加文件至utils目录 一个是m ...

  7. 基于阿里云物联网平台的设备之间传输十六进制数据

    基于阿里云物联网平台的设备之间传输十六进制数据 文章目录 基于阿里云物联网平台的设备之间传输十六进制数据 1. 创建阿里云物联网产品 1.1 创建新的产品 1.2 为产品创建自定义topic 1.3 ...

  8. 阿里云物联网平台创建设备

    阿里云物联网平台创建设备 阿里云物联网平台创建设备 创建产品 创建设备 在线调试 阿里云物联网平台创建设备 本文演示使用阿里云物联网平台进行产品.设备的创建和使用,模拟调试,观察日志. 创建产品 1. ...

  9. 合宙Air780e+luatos+阿里云物联网平台完成设备通信与控制(属性上报+4G远程点灯)

    一.简介 1.项目介绍 之前发布的文章有采用合宙的4G LTE Cat.1模块,编程语言用的是lua,整体来说代码比较简洁,实现对华为云物联网平台的设备通信与控制,即采用一个变量作为模拟属性定时上报, ...

最新文章

  1. nvidia旧版驱动_N卡用户注意:老版驱动存在5个高危漏洞,赶紧更新
  2. 如何将浮点数很好地格式化为String而没有不必要的十进制0?
  3. NFS PersistentVolume - 每天5分钟玩转 Docker 容器技术(151)
  4. ERROR: Failed to resolve: org.jetbrains.kotlin:kotlin-stdlib-jre7:1.3.10
  5. matlab三角区域积分,关于复杂三角函数的二重积分,matlab该怎么求啊
  6. Hive报错记录——林子雨教材
  7. iperf 安卓 灌包命令_iperf工具测速
  8. 腾讯地图如何根据经纬度获取地址
  9. android 输入法更换_安卓手机怎么更换输入法-安卓手机切换输入法的方法 - 河东软件园...
  10. Jetpack Room基本用法
  11. 【MQ-2 可燃气体和烟雾传感器与 Arduino 配合使用】
  12. 知云文献翻译打不开_知云文献翻译 for mac v1.0.1
  13. type-challenges [medium]
  14. Elasticsearch性能优化技巧
  15. 配音秀今天怎么显示服务器,教你如何玩转配音秀
  16. 蓝桥杯 神犇一生 JAVA
  17. 【Python】从入门到入土2
  18. ads微带双枝短截线长度的解析计算
  19. 从零开始搭建AI应用
  20. sql 查询时间最大的值

热门文章

  1. 《统计学习导论-基于R应用》
  2. 可切割的ADC连接物DBCO-NHS,DBCO-NHS ester,1353016-71-3,DBCO-NHS酯是一种胺反应性构件,用于有机介质中含胺分子的改性。
  3. 想学IT的必看!如何化身BAT面试收割机?终局之战
  4. 互联网项目开发的痛点是什么?
  5. 如何关闭更新升级提醒
  6. 基于自适应无迹卡尔曼滤波算法(AUKF)锂电池SOC估计,噪声系数自适应 Matlab程序
  7. 网络协议之视频直播核心技术讲解
  8. js技术实现图片放大镜功能
  9. oauth2.0与单点登录
  10. 海康、大华IpCamera摄像机 RTSP地址和格式