first commit for opensource
first commit for opensource
This commit is contained in:
20
tools/Mini_Program/iotexplorer_mp_demo/README.md
Normal file
20
tools/Mini_Program/iotexplorer_mp_demo/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
### 智能灯小程序DEMO
|
||||
1. 说明
|
||||
本示例小程序配合TencentOS_tiny智能灯数据模板示例使用:TencentOS_tiny/examples/tencent_cloud_sdk_data_template
|
||||
[腾讯云侧接入文档参见: 智能灯接入指引](https://cloud.tencent.com/document/product/1081/34744)
|
||||
|
||||
2. tencent_cloud_sdk_data_template 接入腾讯云explorer后,在 app.js 中修改以下字段即可使用
|
||||
````
|
||||
globalData: {
|
||||
// 腾讯云物联网开发平台explorer中获取 产品ID和设备名称
|
||||
productId: "XXXX", // 产品ID
|
||||
deviceName: "XXXX", // 设备名称
|
||||
// 腾讯云控制台-访问管理-访问密钥-API密钥管理中获取 SecretId, secretKey
|
||||
secretId: "XXXX",
|
||||
secretKey: "XXXX",
|
||||
},
|
||||
````
|
||||
|
||||
3. 测试通过后,如果需要发布小程序,则还需要在小程序管理后台进行服务器域名配置
|
||||
[微信小程序添加服务器端就接口域名](https://jingyan.baidu.com/article/ce09321bb6e9c12bff858f92.html)
|
||||
进入微信公众平台小程序后台 - 开发 - 开发设置 - 服务器域名 - 输入域名: iotexplorer.tencentcloudapi.com
|
14
tools/Mini_Program/iotexplorer_mp_demo/app.js
Normal file
14
tools/Mini_Program/iotexplorer_mp_demo/app.js
Normal file
@@ -0,0 +1,14 @@
|
||||
//app.js
|
||||
App({
|
||||
globalData: {
|
||||
// 腾讯云物联网开发平台explorer中获取 产品ID和设备名称
|
||||
productId: "", // 产品ID
|
||||
deviceName: "", // 设备名称
|
||||
// 腾讯云控制台-访问管理-访问密钥-API密钥管理中获取 SecretId, secretKey
|
||||
secretId: "",
|
||||
secretKey: "",
|
||||
},
|
||||
onLaunch: function(options) {
|
||||
console.log("onLaunch")
|
||||
},
|
||||
})
|
17
tools/Mini_Program/iotexplorer_mp_demo/app.json
Normal file
17
tools/Mini_Program/iotexplorer_mp_demo/app.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"pages": [
|
||||
"pages/index/index"
|
||||
],
|
||||
"window": {
|
||||
"navigationBarBackgroundColor": "#FAFAFA",
|
||||
"navigationBarTitleText": "智能灯 Demo",
|
||||
"navigationBarTextStyle": "black",
|
||||
"backgroundTextStyle": "dark",
|
||||
"backgroundColor": "#f9f9f9"
|
||||
},
|
||||
"networkTimeout": {
|
||||
"request": 10000,
|
||||
"downloadFile": 10000
|
||||
},
|
||||
"sitemapLocation": "sitemap.json"
|
||||
}
|
4
tools/Mini_Program/iotexplorer_mp_demo/app.wxss
Normal file
4
tools/Mini_Program/iotexplorer_mp_demo/app.wxss
Normal file
@@ -0,0 +1,4 @@
|
||||
/**app.wxss**/
|
||||
page{
|
||||
background: #f9f9f9;
|
||||
}
|
BIN
tools/Mini_Program/iotexplorer_mp_demo/images/led.png
Normal file
BIN
tools/Mini_Program/iotexplorer_mp_demo/images/led.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.8 KiB |
@@ -0,0 +1,5 @@
|
||||
### NOTE
|
||||
|
||||
感谢halenhuang适配的iotexplorer小程序js接口iotclient_for_miniprogram
|
||||
|
||||
注意:iotclient_for_miniprogram非iotexplorer官方小程序SDK,仅用于方便开发者调试TencentOS tiny示例。
|
@@ -0,0 +1,272 @@
|
||||
/*
|
||||
* Copyright (c) 2018 THL A29 Limited, a Tencent company. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
const models = require("./iotmodel.js");
|
||||
const AbstractClient = require('./iotclientbase.js');
|
||||
const DescribeProjectResponse = models.DescribeProjectResponse;
|
||||
const ControlDeviceDataResponse = models.ControlDeviceDataResponse;
|
||||
const DescribeDeviceDataHistoryRequest = models.DescribeDeviceDataHistoryRequest;
|
||||
const DescribeStudioProductRequest = models.DescribeStudioProductRequest;
|
||||
const DeleteProjectRequest = models.DeleteProjectRequest;
|
||||
const DeviceDataHistoryItem = models.DeviceDataHistoryItem;
|
||||
const ProductEntry = models.ProductEntry;
|
||||
const GetStudioProductListResponse = models.GetStudioProductListResponse;
|
||||
const DescribeModelDefinitionResponse = models.DescribeModelDefinitionResponse;
|
||||
const ProjectEntryEx = models.ProjectEntryEx;
|
||||
const GetProjectListRequest = models.GetProjectListRequest;
|
||||
const DeleteStudioProductResponse = models.DeleteStudioProductResponse;
|
||||
const ModifyStudioProductResponse = models.ModifyStudioProductResponse;
|
||||
const ControlDeviceDataRequest = models.ControlDeviceDataRequest;
|
||||
const SearchStudioProductRequest = models.SearchStudioProductRequest;
|
||||
const ReleaseStudioProductResponse = models.ReleaseStudioProductResponse;
|
||||
const ProjectEntry = models.ProjectEntry;
|
||||
const ModifyProjectResponse = models.ModifyProjectResponse;
|
||||
const ModifyModelDefinitionRequest = models.ModifyModelDefinitionRequest;
|
||||
const CreateStudioProductResponse = models.CreateStudioProductResponse;
|
||||
const DeleteStudioProductRequest = models.DeleteStudioProductRequest;
|
||||
const ModifyProjectRequest = models.ModifyProjectRequest;
|
||||
const ModifyStudioProductRequest = models.ModifyStudioProductRequest;
|
||||
const DescribeDeviceDataHistoryResponse = models.DescribeDeviceDataHistoryResponse;
|
||||
const CreateStudioProductRequest = models.CreateStudioProductRequest;
|
||||
const ProductModelDefinition = models.ProductModelDefinition;
|
||||
const CreateProjectResponse = models.CreateProjectResponse;
|
||||
const ReleaseStudioProductRequest = models.ReleaseStudioProductRequest;
|
||||
const DescribeModelDefinitionRequest = models.DescribeModelDefinitionRequest;
|
||||
const DeleteProjectResponse = models.DeleteProjectResponse;
|
||||
const GetProjectListResponse = models.GetProjectListResponse;
|
||||
const DescribeDeviceDataResponse = models.DescribeDeviceDataResponse;
|
||||
const SearchStudioProductResponse = models.SearchStudioProductResponse;
|
||||
const DescribeProjectRequest = models.DescribeProjectRequest;
|
||||
const GetStudioProductListRequest = models.GetStudioProductListRequest;
|
||||
const DescribeDeviceDataRequest = models.DescribeDeviceDataRequest;
|
||||
const ModifyModelDefinitionResponse = models.ModifyModelDefinitionResponse;
|
||||
const CreateProjectRequest = models.CreateProjectRequest;
|
||||
const DescribeStudioProductResponse = models.DescribeStudioProductResponse;
|
||||
|
||||
|
||||
/**
|
||||
* iotexplorer client
|
||||
* @class
|
||||
*/
|
||||
class IotexplorerClient extends AbstractClient {
|
||||
|
||||
constructor( secretid, secretkey) {
|
||||
super( secretid, secretkey);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供修改产品的名称和描述等信息的能力
|
||||
* @param {ModifyStudioProductRequest} req
|
||||
* @param {function(string, ModifyStudioProductResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
ModifyStudioProduct(req, cb) {
|
||||
let resp = new ModifyStudioProductResponse();
|
||||
this.request("ModifyStudioProduct", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供删除某个项目下产品的能力
|
||||
* @param {DeleteStudioProductRequest} req
|
||||
* @param {function(string, DeleteStudioProductResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DeleteStudioProduct(req, cb) {
|
||||
let resp = new DeleteStudioProductResponse();
|
||||
this.request("DeleteStudioProduct", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据设备产品ID、设备名称,获取设备上报的属性数据。
|
||||
* @param {DescribeDeviceDataRequest} req
|
||||
* @param {function(string, DescribeDeviceDataResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DescribeDeviceData(req, cb) {
|
||||
let resp = new DescribeDeviceDataResponse();
|
||||
this.request("DescribeDeviceData", req, resp, cb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据设备产品ID、设备名称,获取设备数据。
|
||||
* @param {DescribeDeviceRequest} req
|
||||
* @param {function(string, DescribeDeviceResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DescribeDevice(req, cb) {
|
||||
let resp = new DescribeDeviceDataResponse();
|
||||
this.request("DescribeDevice", req, resp, cb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 提供根据产品名称查找产品的能力
|
||||
* @param {SearchStudioProductRequest} req
|
||||
* @param {function(string, SearchStudioProductResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
SearchStudioProduct(req, cb) {
|
||||
let resp = new SearchStudioProductResponse();
|
||||
this.request("SearchStudioProduct", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询项目详情
|
||||
* @param {DescribeProjectRequest} req
|
||||
* @param {function(string, DescribeProjectResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DescribeProject(req, cb) {
|
||||
let resp = new DescribeProjectResponse();
|
||||
this.request("DescribeProject", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询产品配置的数据模板信息
|
||||
* @param {DescribeModelDefinitionRequest} req
|
||||
* @param {function(string, DescribeModelDefinitionResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DescribeModelDefinition(req, cb) {
|
||||
let resp = new DescribeModelDefinitionResponse();
|
||||
this.request("DescribeModelDefinition", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供修改产品的数据模板的能力
|
||||
* @param {ModifyModelDefinitionRequest} req
|
||||
* @param {function(string, ModifyModelDefinitionResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
ModifyModelDefinition(req, cb) {
|
||||
let resp = new ModifyModelDefinitionResponse();
|
||||
this.request("ModifyModelDefinition", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 产品开发完成并测试通过后,通过发布产品将产品设置为发布状态
|
||||
* @param {ReleaseStudioProductRequest} req
|
||||
* @param {function(string, ReleaseStudioProductResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
ReleaseStudioProduct(req, cb) {
|
||||
let resp = new ReleaseStudioProductResponse();
|
||||
this.request("ReleaseStudioProduct", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为用户提供新建项目的能力,用于集中管理产品和应用。
|
||||
* @param {CreateProjectRequest} req
|
||||
* @param {function(string, CreateProjectResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
CreateProject(req, cb) {
|
||||
let resp = new CreateProjectResponse();
|
||||
this.request("CreateProject", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 为用户提供新建产品的能力,用于管理用户的设备
|
||||
* @param {CreateStudioProductRequest} req
|
||||
* @param {function(string, CreateStudioProductResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
CreateStudioProduct(req, cb) {
|
||||
let resp = new CreateStudioProductResponse();
|
||||
this.request("CreateStudioProduct", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供查询用户所创建的项目列表查询功能。
|
||||
* @param {GetProjectListRequest} req
|
||||
* @param {function(string, GetProjectListResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
GetProjectList(req, cb) {
|
||||
let resp = new GetProjectListResponse();
|
||||
this.request("GetProjectList", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取设备在指定时间范围内上报的历史数据。
|
||||
* @param {DescribeDeviceDataHistoryRequest} req
|
||||
* @param {function(string, DescribeDeviceDataHistoryResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DescribeDeviceDataHistory(req, cb) {
|
||||
let resp = new DescribeDeviceDataHistoryResponse();
|
||||
this.request("DescribeDeviceDataHistory", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供删除某个项目的能力
|
||||
* @param {DeleteProjectRequest} req
|
||||
* @param {function(string, DeleteProjectResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DeleteProject(req, cb) {
|
||||
let resp = new DeleteProjectResponse();
|
||||
this.request("DeleteProject", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供查看茶品详细信息的能力,包括产品的ID、数据协议、认证类型等重要参数
|
||||
* @param {DescribeStudioProductRequest} req
|
||||
* @param {function(string, DescribeStudioProductResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
DescribeStudioProduct(req, cb) {
|
||||
let resp = new DescribeStudioProductResponse();
|
||||
this.request("DescribeStudioProduct", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据设备产品ID、设备名称,设置控制设备的属性数据。
|
||||
* @param {ControlDeviceDataRequest} req
|
||||
* @param {function(string, ControlDeviceDataResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
ControlDeviceData(req, cb) {
|
||||
let resp = new ControlDeviceDataResponse();
|
||||
this.request("ControlDeviceData", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 提供查询某个项目下所有产品信息的能力。
|
||||
* @param {GetStudioProductListRequest} req
|
||||
* @param {function(string, GetStudioProductListResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
GetStudioProductList(req, cb) {
|
||||
let resp = new GetStudioProductListResponse();
|
||||
this.request("GetStudioProductList", req, resp, cb);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改项目
|
||||
* @param {ModifyProjectRequest} req
|
||||
* @param {function(string, ModifyProjectResponse):void} cb
|
||||
* @public
|
||||
*/
|
||||
ModifyProject(req, cb) {
|
||||
let resp = new ModifyProjectResponse();
|
||||
this.request("ModifyProject", req, resp, cb);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
module.exports = IotexplorerClient;
|
@@ -0,0 +1,169 @@
|
||||
const Sign = require("./sign.js");
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
class AbstractClient {
|
||||
|
||||
/**
|
||||
* 实例化client对象
|
||||
* @param {string} productid 产品ID
|
||||
*/
|
||||
constructor( secretid,secretkey) {
|
||||
|
||||
this.endpoint = "iotexplorer.tencentcloudapi.com";
|
||||
this.path = "/";
|
||||
this.method = "GET";
|
||||
this.apiVersion = "2019-04-23";
|
||||
this.region = "ap-guangzhou";
|
||||
|
||||
this.secretid = secretid;
|
||||
this.secretkey = secretkey;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
succRequest(resp, cb, data) {
|
||||
resp.deserialize(data);
|
||||
cb(null, resp);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
failRequest(err, cb) {
|
||||
cb(err, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
//request(action, req, resp, cb) {
|
||||
// this.doRequest(action, req).then(data => this.succRequest(resp, cb, data), error => this.failRequest(error, cb));
|
||||
//}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
request(action, req, resp, cb) {
|
||||
let params = this.mergeData(req);
|
||||
params = this.formatRequestData(action, params);
|
||||
var fullurl = this.formatFullUrl(params);
|
||||
var thisclient = this;
|
||||
|
||||
console.log(fullurl);
|
||||
|
||||
//test only
|
||||
//fullurl = "https://iotexplorer.tencentcloudapi.com/?MinTime=1565143200000&Version=2019-04-23&Limit=5&Signature=f7XvqSPaZVEvm7wh7QTpJMvZR0k%3D&Action=DescribeDeviceDataHistory&MaxTime=1565172000000&ProductId=NCW38M7KGT&Nonce=11171&DeviceName=dev001&Timestamp=1565235840&SecretId=AKIDzjBSUzl3f18yXpiGaOxGH2WtzWmlLv63&FieldName=color";
|
||||
|
||||
wx.request({
|
||||
url: fullurl,
|
||||
header: {
|
||||
'content-type': 'application/json' // 默认值
|
||||
},
|
||||
success(res) {
|
||||
console.log("statusCode", res.statusCode)
|
||||
// console.log("header", res.header)
|
||||
console.log("data", res.data)
|
||||
if(res.statusCode != 200){
|
||||
thisclient.failRequest(res.statusCode, cb);
|
||||
}
|
||||
else {
|
||||
//data = JSON.parse(res.data);
|
||||
var data = res.data;
|
||||
if (data.Response.Error) {
|
||||
thisclient.failRequest(data.Response.Error.Message, cb);
|
||||
return;
|
||||
}
|
||||
thisclient.succRequest(resp, cb, data.Response);
|
||||
}
|
||||
},
|
||||
fail(res){
|
||||
console.log("fail res", res)
|
||||
if (!res.statusCode) {
|
||||
res.statusCode = res.errMsg
|
||||
}
|
||||
thisclient.failRequest(res.statusCode, cb);
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
mergeData(data, prefix = "") {
|
||||
let ret = {};
|
||||
for (let k in data) {
|
||||
if (data[k] === null) {
|
||||
continue;
|
||||
}
|
||||
if (data[k] instanceof Array || data[k] instanceof Object) {
|
||||
Object.assign(ret, this.mergeData(data[k], prefix + k + "."));
|
||||
} else {
|
||||
ret[prefix + k] = data[k];
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
formatRequestData(action, params) {
|
||||
params.Action = action;
|
||||
params.Nonce = Math.round(Math.random() * 65535);
|
||||
params.Timestamp = Math.round(Date.now() / 1000);
|
||||
params.Version = this.apiVersion;
|
||||
|
||||
if (this.secretid) {
|
||||
params.SecretId = this.secretid;
|
||||
}
|
||||
|
||||
if (this.region) {
|
||||
params.Region = this.region;
|
||||
}
|
||||
|
||||
let signStr = this.formatSignString(params);
|
||||
params.Signature = encodeURIComponent(Sign.sign(this.secretkey, signStr));
|
||||
return params;
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
formatSignString(params) {
|
||||
let strParam = "";
|
||||
let keys = Object.keys(params);
|
||||
keys.sort();
|
||||
for (let k in keys) {
|
||||
//k = k.replace(/_/g, '.');
|
||||
strParam += ("&" + keys[k] + "=" + params[keys[k]]);
|
||||
}
|
||||
|
||||
//签名原文串的拼接规则为: 请求方法 + 请求主机 +请求路径 + ? + 请求字符串
|
||||
let strSign = this.method + this.endpoint + this.path + "?" + strParam.slice(1);
|
||||
return strSign;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
formatFullUrl(params) {
|
||||
let strParam = "";
|
||||
let keys = Object.keys(params);
|
||||
//keys.sort();
|
||||
for (let k in keys) {
|
||||
//k = k.replace(/_/g, '.');
|
||||
strParam += ("&" + keys[k] + "=" + params[keys[k]]);
|
||||
}
|
||||
let strUrl = "https://" + this.endpoint + this.path + "?" + strParam.slice(1);
|
||||
return strUrl;
|
||||
}
|
||||
}
|
||||
module.exports = AbstractClient;
|
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,32 @@
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
class AbstractModel {
|
||||
constructor() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
deserialize(params) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 将object转化为json格式的string
|
||||
* @return {string}
|
||||
*/
|
||||
to_json_string() {
|
||||
return JSON.stringify(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将json格式的string转化为object
|
||||
* @param {string} dataString
|
||||
*/
|
||||
from_json_string(dataString) {
|
||||
let params = JSON.parse(dataString);
|
||||
this.deserialize(params);
|
||||
}
|
||||
}
|
||||
module.exports = AbstractModel;
|
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
|
||||
* in FIPS PUB 180-1
|
||||
* Version 2.1a Copyright Paul Johnston 2000 - 2002.
|
||||
* Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
|
||||
* Distributed under the BSD License
|
||||
* See http://pajhome.org.uk/crypt/md5 for details.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Configurable variables. You may need to tweak these to be compatible with
|
||||
* the server-side, but the defaults work in most cases.
|
||||
*/
|
||||
var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */
|
||||
var b64pad = "="; /* base-64 pad character. "=" for strict RFC compliance */
|
||||
var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */
|
||||
|
||||
/*
|
||||
* These are the functions you'll usually want to call
|
||||
* They take string arguments and return either hex or base-64 encoded strings
|
||||
*/
|
||||
function hex_sha1(s) { return binb2hex(core_sha1(str2binb(s), s.length * chrsz)); }
|
||||
function b64_sha1(s) { return binb2b64(core_sha1(str2binb(s), s.length * chrsz)); }
|
||||
function str_sha1(s) { return binb2str(core_sha1(str2binb(s), s.length * chrsz)); }
|
||||
function hex_hmac_sha1(key, data) { return binb2hex(core_hmac_sha1(key, data)); }
|
||||
function b64_hmac_sha1(key, data) { return binb2b64(core_hmac_sha1(key, data)); }
|
||||
function str_hmac_sha1(key, data) { return binb2str(core_hmac_sha1(key, data)); }
|
||||
|
||||
/*
|
||||
* Perform a simple self-test to see if the VM is working
|
||||
*/
|
||||
function sha1_vm_test() {
|
||||
return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the SHA-1 of an array of big-endian words, and a bit length
|
||||
*/
|
||||
function core_sha1(x, len) {
|
||||
/* append padding */
|
||||
x[len >> 5] |= 0x80 << (24 - len % 32);
|
||||
x[((len + 64 >> 9) << 4) + 15] = len;
|
||||
|
||||
var w = Array(80);
|
||||
var a = 1732584193;
|
||||
var b = -271733879;
|
||||
var c = -1732584194;
|
||||
var d = 271733878;
|
||||
var e = -1009589776;
|
||||
|
||||
for (var i = 0; i < x.length; i += 16) {
|
||||
var olda = a;
|
||||
var oldb = b;
|
||||
var oldc = c;
|
||||
var oldd = d;
|
||||
var olde = e;
|
||||
|
||||
for (var j = 0; j < 80; j++) {
|
||||
if (j < 16) w[j] = x[i + j];
|
||||
else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
|
||||
var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)),
|
||||
safe_add(safe_add(e, w[j]), sha1_kt(j)));
|
||||
e = d;
|
||||
d = c;
|
||||
c = rol(b, 30);
|
||||
b = a;
|
||||
a = t;
|
||||
}
|
||||
|
||||
a = safe_add(a, olda);
|
||||
b = safe_add(b, oldb);
|
||||
c = safe_add(c, oldc);
|
||||
d = safe_add(d, oldd);
|
||||
e = safe_add(e, olde);
|
||||
}
|
||||
return Array(a, b, c, d, e);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* Perform the appropriate triplet combination function for the current
|
||||
* iteration
|
||||
*/
|
||||
function sha1_ft(t, b, c, d) {
|
||||
if (t < 20) return (b & c) | ((~b) & d);
|
||||
if (t < 40) return b ^ c ^ d;
|
||||
if (t < 60) return (b & c) | (b & d) | (c & d);
|
||||
return b ^ c ^ d;
|
||||
}
|
||||
|
||||
/*
|
||||
* Determine the appropriate additive constant for the current iteration
|
||||
*/
|
||||
function sha1_kt(t) {
|
||||
return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
|
||||
(t < 60) ? -1894007588 : -899497514;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the HMAC-SHA1 of a key and some data
|
||||
*/
|
||||
function core_hmac_sha1(key, data) {
|
||||
var bkey = str2binb(key);
|
||||
if (bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz);
|
||||
|
||||
var ipad = Array(16), opad = Array(16);
|
||||
for (var i = 0; i < 16; i++) {
|
||||
ipad[i] = bkey[i] ^ 0x36363636;
|
||||
opad[i] = bkey[i] ^ 0x5C5C5C5C;
|
||||
}
|
||||
|
||||
var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz);
|
||||
return core_sha1(opad.concat(hash), 512 + 160);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add integers, wrapping at 2^32. This uses 16-bit operations internally
|
||||
* to work around bugs in some JS interpreters.
|
||||
*/
|
||||
function safe_add(x, y) {
|
||||
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
|
||||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||||
return (msw << 16) | (lsw & 0xFFFF);
|
||||
}
|
||||
|
||||
/*
|
||||
* Bitwise rotate a 32-bit number to the left.
|
||||
*/
|
||||
function rol(num, cnt) {
|
||||
return (num << cnt) | (num >>> (32 - cnt));
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an 8-bit or 16-bit string to an array of big-endian words
|
||||
* In 8-bit function, characters >255 have their hi-byte silently ignored.
|
||||
*/
|
||||
function str2binb(str) {
|
||||
var bin = Array();
|
||||
var mask = (1 << chrsz) - 1;
|
||||
for (var i = 0; i < str.length * chrsz; i += chrsz)
|
||||
bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i % 32);
|
||||
return bin;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an array of big-endian words to a string
|
||||
*/
|
||||
function binb2str(bin) {
|
||||
var str = "";
|
||||
var mask = (1 << chrsz) - 1;
|
||||
for (var i = 0; i < bin.length * 32; i += chrsz)
|
||||
str += String.fromCharCode((bin[i >> 5] >>> (32 - chrsz - i % 32)) & mask);
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an array of big-endian words to a hex string.
|
||||
*/
|
||||
function binb2hex(binarray) {
|
||||
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
|
||||
var str = "";
|
||||
for (var i = 0; i < binarray.length * 4; i++) {
|
||||
str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) +
|
||||
hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert an array of big-endian words to a base-64 string
|
||||
*/
|
||||
function binb2b64(binarray) {
|
||||
var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
var str = "";
|
||||
for (var i = 0; i < binarray.length * 4; i += 3) {
|
||||
var triplet = (((binarray[i >> 2] >> 8 * (3 - i % 4)) & 0xFF) << 16)
|
||||
| (((binarray[i + 1 >> 2] >> 8 * (3 - (i + 1) % 4)) & 0xFF) << 8)
|
||||
| ((binarray[i + 2 >> 2] >> 8 * (3 - (i + 2) % 4)) & 0xFF);
|
||||
for (var j = 0; j < 4; j++) {
|
||||
if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
|
||||
else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
|
||||
}
|
||||
}
|
||||
return str;
|
||||
}
|
||||
|
||||
/* Main function: returns a hex string representing the SHA256 value of the
|
||||
given data */
|
||||
function sha1_digest(key,data) {
|
||||
return b64_hmac_sha1(key,data);
|
||||
}
|
||||
|
||||
|
||||
module.exports = {
|
||||
sha1_digest: sha1_digest
|
||||
}
|
@@ -0,0 +1,250 @@
|
||||
/*
|
||||
* A JavaScript implementation of the SHA256 hash function.
|
||||
*
|
||||
* FILE: sha256.js
|
||||
* VERSION: 0.8
|
||||
* AUTHOR: Christoph Bichlmeier <informatik@zombiearena.de>
|
||||
*
|
||||
* NOTE: This version is not tested thoroughly!
|
||||
*
|
||||
* Copyright (c) 2003, Christoph Bichlmeier
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the copyright holder nor the names of contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* ======================================================================
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
|
||||
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
|
||||
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* SHA256 logical functions */
|
||||
function rotateRight(n, x) {
|
||||
return ((x >>> n) | (x << (32 - n)));
|
||||
}
|
||||
function choice(x, y, z) {
|
||||
return ((x & y) ^ (~x & z));
|
||||
}
|
||||
function majority(x, y, z) {
|
||||
return ((x & y) ^ (x & z) ^ (y & z));
|
||||
}
|
||||
function sha256_Sigma0(x) {
|
||||
return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x));
|
||||
}
|
||||
function sha256_Sigma1(x) {
|
||||
return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x));
|
||||
}
|
||||
function sha256_sigma0(x) {
|
||||
return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3));
|
||||
}
|
||||
function sha256_sigma1(x) {
|
||||
return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10));
|
||||
}
|
||||
function sha256_expand(W, j) {
|
||||
return (W[j & 0x0f] += sha256_sigma1(W[(j + 14) & 0x0f]) + W[(j + 9) & 0x0f] +
|
||||
sha256_sigma0(W[(j + 1) & 0x0f]));
|
||||
}
|
||||
|
||||
/* Hash constant words K: */
|
||||
var K256 = new Array(
|
||||
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
|
||||
0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
||||
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
|
||||
0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
||||
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
|
||||
0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
||||
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
|
||||
0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
||||
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
|
||||
0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
||||
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
|
||||
0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
||||
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
|
||||
0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
||||
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
|
||||
0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
|
||||
);
|
||||
|
||||
/* global arrays */
|
||||
var ihash, count, buffer;
|
||||
var sha256_hex_digits = "0123456789abcdef";
|
||||
|
||||
/* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters:
|
||||
overflow) */
|
||||
function safe_add(x, y) {
|
||||
var lsw = (x & 0xffff) + (y & 0xffff);
|
||||
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
|
||||
return (msw << 16) | (lsw & 0xffff);
|
||||
}
|
||||
|
||||
/* Initialise the SHA256 computation */
|
||||
function sha256_init() {
|
||||
ihash = new Array(8);
|
||||
count = new Array(2);
|
||||
buffer = new Array(64);
|
||||
count[0] = count[1] = 0;
|
||||
ihash[0] = 0x6a09e667;
|
||||
ihash[1] = 0xbb67ae85;
|
||||
ihash[2] = 0x3c6ef372;
|
||||
ihash[3] = 0xa54ff53a;
|
||||
ihash[4] = 0x510e527f;
|
||||
ihash[5] = 0x9b05688c;
|
||||
ihash[6] = 0x1f83d9ab;
|
||||
ihash[7] = 0x5be0cd19;
|
||||
}
|
||||
|
||||
/* Transform a 512-bit message block */
|
||||
function sha256_transform() {
|
||||
var a, b, c, d, e, f, g, h, T1, T2;
|
||||
var W = new Array(16);
|
||||
|
||||
/* Initialize registers with the previous intermediate value */
|
||||
a = ihash[0];
|
||||
b = ihash[1];
|
||||
c = ihash[2];
|
||||
d = ihash[3];
|
||||
e = ihash[4];
|
||||
f = ihash[5];
|
||||
g = ihash[6];
|
||||
h = ihash[7];
|
||||
|
||||
/* make 32-bit words */
|
||||
for (var i = 0; i < 16; i++)
|
||||
W[i] = ((buffer[(i << 2) + 3]) | (buffer[(i << 2) + 2] << 8) | (buffer[(i << 2) + 1]
|
||||
<< 16) | (buffer[i << 2] << 24));
|
||||
|
||||
for (var j = 0; j < 64; j++) {
|
||||
T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j];
|
||||
if (j < 16) T1 += W[j];
|
||||
else T1 += sha256_expand(W, j);
|
||||
T2 = sha256_Sigma0(a) + majority(a, b, c);
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = safe_add(d, T1);
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = safe_add(T1, T2);
|
||||
}
|
||||
|
||||
/* Compute the current intermediate hash value */
|
||||
ihash[0] += a;
|
||||
ihash[1] += b;
|
||||
ihash[2] += c;
|
||||
ihash[3] += d;
|
||||
ihash[4] += e;
|
||||
ihash[5] += f;
|
||||
ihash[6] += g;
|
||||
ihash[7] += h;
|
||||
}
|
||||
|
||||
/* Read the next chunk of data and update the SHA256 computation */
|
||||
function sha256_update(data, inputLen) {
|
||||
var i, index, curpos = 0;
|
||||
/* Compute number of bytes mod 64 */
|
||||
index = ((count[0] >> 3) & 0x3f);
|
||||
var remainder = (inputLen & 0x3f);
|
||||
|
||||
/* Update number of bits */
|
||||
if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++;
|
||||
count[1] += (inputLen >> 29);
|
||||
|
||||
/* Transform as many times as possible */
|
||||
for (i = 0; i + 63 < inputLen; i += 64) {
|
||||
for (var j = index; j < 64; j++)
|
||||
buffer[j] = data.charCodeAt(curpos++);
|
||||
sha256_transform();
|
||||
index = 0;
|
||||
}
|
||||
|
||||
/* Buffer remaining input */
|
||||
for (var j = 0; j < remainder; j++)
|
||||
buffer[j] = data.charCodeAt(curpos++);
|
||||
}
|
||||
|
||||
/* Finish the computation by operations such as padding */
|
||||
function sha256_final() {
|
||||
var index = ((count[0] >> 3) & 0x3f);
|
||||
buffer[index++] = 0x80;
|
||||
if (index <= 56) {
|
||||
for (var i = index; i < 56; i++)
|
||||
buffer[i] = 0;
|
||||
} else {
|
||||
for (var i = index; i < 64; i++)
|
||||
buffer[i] = 0;
|
||||
sha256_transform();
|
||||
for (var i = 0; i < 56; i++)
|
||||
buffer[i] = 0;
|
||||
}
|
||||
buffer[56] = (count[1] >>> 24) & 0xff;
|
||||
buffer[57] = (count[1] >>> 16) & 0xff;
|
||||
buffer[58] = (count[1] >>> 8) & 0xff;
|
||||
buffer[59] = count[1] & 0xff;
|
||||
buffer[60] = (count[0] >>> 24) & 0xff;
|
||||
buffer[61] = (count[0] >>> 16) & 0xff;
|
||||
buffer[62] = (count[0] >>> 8) & 0xff;
|
||||
buffer[63] = count[0] & 0xff;
|
||||
sha256_transform();
|
||||
}
|
||||
|
||||
/* Split the internal hash values into an array of bytes */
|
||||
function sha256_encode_bytes() {
|
||||
var j = 0;
|
||||
var output = new Array(32);
|
||||
for (var i = 0; i < 8; i++) {
|
||||
output[j++] = ((ihash[i] >>> 24) & 0xff);
|
||||
output[j++] = ((ihash[i] >>> 16) & 0xff);
|
||||
output[j++] = ((ihash[i] >>> 8) & 0xff);
|
||||
output[j++] = (ihash[i] & 0xff);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/* Get the internal hash as a hex string */
|
||||
function sha256_encode_hex() {
|
||||
var output = new String();
|
||||
for (var i = 0; i < 8; i++) {
|
||||
for (var j = 28; j >= 0; j -= 4)
|
||||
output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f);
|
||||
}
|
||||
return output;
|
||||
}
|
||||
|
||||
/* Main function: returns a hex string representing the SHA256 value of the
|
||||
given data */
|
||||
function sha256_digest(data) {
|
||||
sha256_init();
|
||||
sha256_update(data, data.length);
|
||||
sha256_final();
|
||||
return sha256_encode_hex();
|
||||
}
|
||||
|
||||
/* test if the JS-interpreter is working properly */
|
||||
function sha256_self_test() {
|
||||
return sha256_digest("message digest") ==
|
||||
"f7846f55cf23e14eebeab5b4e1550cad5b509e3348fbc4efa3a1413d393cb650";
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
sha256_digest: sha256_digest
|
||||
}
|
@@ -0,0 +1,24 @@
|
||||
const crypto = require('./sha1.js');
|
||||
|
||||
/**
|
||||
* @inner
|
||||
*/
|
||||
class Sign {
|
||||
|
||||
static sign(secretKey, signStr) {
|
||||
// let signMethodMap = {
|
||||
// HmacSHA1: "sha1",
|
||||
// HmacSHA256: "sha256"
|
||||
// };
|
||||
|
||||
// if (!signMethodMap.hasOwnProperty(signMethod)) {
|
||||
// throw new Exception("signMethod invalid, signMethod only support (HmacSHA1, HmacSHA256)");
|
||||
// }
|
||||
// let hmac = crypto.createHmac(signMethodMap[signMethod], secretKey || "");
|
||||
// return hmac.update(Buffer.from(signStr, 'utf8')).digest('base64')
|
||||
// let test = crypto.sha1_digest("12345678", "87654321");
|
||||
let hmac = crypto.sha1_digest(secretKey,signStr);
|
||||
return hmac;
|
||||
}
|
||||
}
|
||||
module.exports = Sign;
|
@@ -0,0 +1,101 @@
|
||||
const iotclient = require('./iotclient.js')
|
||||
const iotmodel = require('./iotmodel.js')
|
||||
|
||||
const SECRETID = "AKIDxZ2LTTi84eaR3OfS8hnfxd4JHzQatFpF";
|
||||
const SECRETKEY = "UigMrA9rJXUCeoiBQP8dsJuJ6sYzmNjs";
|
||||
const PRODUCTID = "U2LPAXBT2C";
|
||||
const DEVICENAME = "royye_light";
|
||||
|
||||
|
||||
function test(cb) {
|
||||
//testGetDeviceHistory(cb);
|
||||
testGetDeviceData(cb);
|
||||
// testGetDeviceStatus(cb);
|
||||
}
|
||||
|
||||
|
||||
function testGetDeviceStatus(cb) {
|
||||
|
||||
// 实例化要请求产品的client对象
|
||||
let client = new iotclient(SECRETID,SECRETKEY);
|
||||
|
||||
|
||||
// 实例化一个请求对象
|
||||
let req = new iotmodel.DescribeDeviceDataRequest();
|
||||
req.DeviceName = DEVICENAME;
|
||||
req.ProductId = PRODUCTID;
|
||||
|
||||
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
|
||||
client.DescribeDevice(req, function (err, response) {
|
||||
// 请求异常返回,打印异常信息
|
||||
if (err) {
|
||||
console.log(err);
|
||||
cb("failed:" + err);
|
||||
return;
|
||||
}
|
||||
// 请求正常返回,打印response对象
|
||||
console.log(response.to_json_string());
|
||||
cb("GetDeviceStatus success");
|
||||
});
|
||||
}
|
||||
|
||||
function testGetDeviceData(cb) {
|
||||
|
||||
// 实例化要请求产品的client对象
|
||||
let client = new iotclient(SECRETID, SECRETKEY);
|
||||
|
||||
|
||||
// 实例化一个请求对象
|
||||
let req = new iotmodel.DescribeDeviceDataRequest();
|
||||
req.DeviceName = DEVICENAME;
|
||||
req.ProductId = PRODUCTID;
|
||||
|
||||
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
|
||||
client.DescribeDeviceData(req, function (err, response) {
|
||||
// 请求异常返回,打印异常信息
|
||||
if (err) {
|
||||
console.log(err);
|
||||
cb("failed:" + err);
|
||||
return;
|
||||
}
|
||||
// 请求正常返回,打印response对象
|
||||
console.log(response.to_json_string());
|
||||
cb("GetDeviceData success");
|
||||
});
|
||||
}
|
||||
|
||||
function testGetDeviceHistory(cb) {
|
||||
|
||||
// 实例化要请求产品的client对象
|
||||
let client = new iotclient(SECRETID, SECRETKEY);
|
||||
|
||||
|
||||
// 实例化一个请求对象
|
||||
let req = new iotmodel.DescribeDeviceDataHistoryRequest();
|
||||
req.MinTime = Math.round(Date.parse('2019-08-07T10:00:00.875+08:00'));
|
||||
req.MaxTime = Math.round(Date.parse('2019-08-07T18:00:00.875+08:00'));
|
||||
req.FieldName = "color";
|
||||
req.Limit = 5;
|
||||
req.DeviceName = DEVICENAME;
|
||||
req.ProductId = PRODUCTID;
|
||||
|
||||
//var tt = req.to_json_string();
|
||||
|
||||
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
|
||||
client.DescribeDeviceDataHistory(req, function (err, response) {
|
||||
// 请求异常返回,打印异常信息
|
||||
if (err) {
|
||||
console.log(err);
|
||||
cb("failed:"+err);
|
||||
return;
|
||||
}
|
||||
// 请求正常返回,打印response对象
|
||||
console.log(response.to_json_string());
|
||||
cb("DescribeDeviceDataHistory success:"+response.Results.length);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
test: test
|
||||
}
|
@@ -0,0 +1,19 @@
|
||||
const formatTime = date => {
|
||||
const year = date.getFullYear()
|
||||
const month = date.getMonth() + 1
|
||||
const day = date.getDate()
|
||||
const hour = date.getHours()
|
||||
const minute = date.getMinutes()
|
||||
const second = date.getSeconds()
|
||||
|
||||
return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
|
||||
}
|
||||
|
||||
const formatNumber = n => {
|
||||
n = n.toString()
|
||||
return n[1] ? n : '0' + n
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
formatTime: formatTime
|
||||
}
|
126
tools/Mini_Program/iotexplorer_mp_demo/pages/index/index.js
Normal file
126
tools/Mini_Program/iotexplorer_mp_demo/pages/index/index.js
Normal file
@@ -0,0 +1,126 @@
|
||||
const app = getApp()
|
||||
const iotmodel = require("../../iotclient_for_miniprogram/iotmodel.js");
|
||||
import IotexplorerClient from '../../iotclient_for_miniprogram/iotclient.js';
|
||||
|
||||
Page({
|
||||
data: {
|
||||
client: null,
|
||||
deviceData: {},
|
||||
items: [
|
||||
{ name: '红色', value: 0, color: "red"},
|
||||
{ name: '绿色', value: 1, color: "green" },
|
||||
{ name: '蓝色', value: 2, color: "blue" },
|
||||
]
|
||||
},
|
||||
onLoad: function (options) {
|
||||
console.log("index onLoad")
|
||||
if (!app.globalData.productId) {
|
||||
wx.showToast({
|
||||
title: "产品ID不能为空",
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
return
|
||||
} else if (!app.globalData.deviceName) {
|
||||
wx.showToast({
|
||||
title: "设备名称不能为空",
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
return
|
||||
} else if (!app.globalData.secretId) {
|
||||
wx.showToast({
|
||||
title: "访问密钥SecretId不能为空",
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
return
|
||||
} else if (!app.globalData.secretKey) {
|
||||
wx.showToast({
|
||||
title: "访问密钥SecretKey不能为空",
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
this.setData({
|
||||
productId: app.globalData.productId,
|
||||
deviceName: app.globalData.deviceName,
|
||||
})
|
||||
|
||||
// 实例化要请求产品的client对象
|
||||
this.data.client = new IotexplorerClient(app.globalData.secretId, app.globalData.secretKey)
|
||||
this.queryDeviceData()
|
||||
},
|
||||
queryDeviceData()
|
||||
{
|
||||
let that = this
|
||||
wx.showLoading()
|
||||
|
||||
// 实例化一个请求对象
|
||||
let req = new iotmodel.DescribeDeviceDataRequest();
|
||||
req.DeviceName = app.globalData.deviceName;
|
||||
req.ProductId = app.globalData.productId;
|
||||
|
||||
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
|
||||
this.data.client.DescribeDeviceData(req, function (err, response) {
|
||||
if (err) {
|
||||
console.log("err:", err);
|
||||
wx.showToast({
|
||||
title: "查询失败 " + err,
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
return;
|
||||
}
|
||||
wx.showToast({
|
||||
title: "查询成功",
|
||||
icon: 'none',
|
||||
duration: 1000
|
||||
})
|
||||
let deviceData = JSON.parse(response.Data)
|
||||
that.setData({
|
||||
deviceData: deviceData
|
||||
})
|
||||
console.log(that.data.deviceData);
|
||||
});
|
||||
},
|
||||
controlDeviceData(e) {
|
||||
let that = this
|
||||
wx.showLoading()
|
||||
|
||||
let data = e.detail.value
|
||||
if (data.power_switch == true) {
|
||||
data.power_switch = 1
|
||||
} else {
|
||||
data.power_switch = 0
|
||||
}
|
||||
console.log('form data:', e.detail.value)
|
||||
|
||||
// 实例化一个请求对象
|
||||
let req = new iotmodel.ControlDeviceDataRequest();
|
||||
req.DeviceName = app.globalData.deviceName;
|
||||
req.ProductId = app.globalData.productId;
|
||||
req.Data = JSON.stringify(data);
|
||||
|
||||
// 通过client对象调用想要访问的接口,需要传入请求对象以及响应回调函数
|
||||
this.data.client.ControlDeviceData(req, function (err, response) {
|
||||
if (err) {
|
||||
console.log(err);
|
||||
wx.showToast({
|
||||
title: "操作失败 " + err,
|
||||
icon: 'none',
|
||||
duration: 3000
|
||||
})
|
||||
return;
|
||||
}
|
||||
console.log(err)
|
||||
wx.showToast({
|
||||
title: "操作成功",
|
||||
icon: 'none',
|
||||
duration: 1000
|
||||
})
|
||||
});
|
||||
},
|
||||
})
|
@@ -0,0 +1 @@
|
||||
{}
|
@@ -0,0 +1,57 @@
|
||||
<view style="display:flex; flex-direction:column; align-items:center;">
|
||||
<image style="width:80px; height:80px;" src="../../images/led.png" mode="cover"></image>
|
||||
</view>
|
||||
|
||||
<view class="body">
|
||||
<view style="font-weight: bold;">
|
||||
设备信息
|
||||
</view>
|
||||
<view class="box">
|
||||
<view class="cell">
|
||||
<view class="status-left">产品ID</view>
|
||||
<view class="status-right">{{productId}}</view>
|
||||
</view>
|
||||
<view class="cell">
|
||||
<view class="status-left">设备名称</view>
|
||||
<view class="status-right">{{deviceName}}</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<text>\n</text>
|
||||
|
||||
<form bindsubmit="controlDeviceData">
|
||||
<view style="display:flex; flex-direction:row; justify-content: space-between;">
|
||||
<view style="font-weight: bold;">
|
||||
智能灯 Demo
|
||||
</view>
|
||||
<view>
|
||||
<button type="primary" size="mini" bindtap="queryDeviceData">查询</button>
|
||||
<button style="margin-left:20rpx" type="primary" size="mini" form-type="submit">发送</button>
|
||||
</view>
|
||||
</view>
|
||||
<view class="box">
|
||||
<view class="cell">
|
||||
<view>开关</view>
|
||||
<view>
|
||||
<switch name="power_switch" checked="{{deviceData.power_switch.Value}}" />
|
||||
</view>
|
||||
</view>
|
||||
<view class="cell">
|
||||
<view>颜色</view>
|
||||
<view>
|
||||
<radio-group name="color">
|
||||
<label style="color:{{item.color}}" class="radio" wx:for="{{items}}" wx:key="unique" wx:for-index="idx">
|
||||
<radio color="{{item.color}}" value="{{item.value}}" checked="{{idx == deviceData.color.Value}}" />{{item.name}}
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
</view>
|
||||
<view class="cell">
|
||||
<view>亮度</view>
|
||||
<view style="width:80%">
|
||||
<slider name="brightness" min="0" max="100" value="{{deviceData.brightness.Value}}" show-value/>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</form>
|
||||
</view>
|
@@ -0,0 +1,16 @@
|
||||
.body {
|
||||
margin: 10rpx 20rpx;
|
||||
}
|
||||
|
||||
.box {
|
||||
padding: 0rpx 20rpx;
|
||||
border-top: 2px solid #000;
|
||||
}
|
||||
|
||||
.cell {
|
||||
margin-top: 10rpx;
|
||||
margin-bottom: 40rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
55
tools/Mini_Program/iotexplorer_mp_demo/project.config.json
Normal file
55
tools/Mini_Program/iotexplorer_mp_demo/project.config.json
Normal file
@@ -0,0 +1,55 @@
|
||||
{
|
||||
"description": "项目配置文件",
|
||||
"packOptions": {
|
||||
"ignore": []
|
||||
},
|
||||
"setting": {
|
||||
"urlCheck": false,
|
||||
"es6": true,
|
||||
"postcss": true,
|
||||
"minified": true,
|
||||
"newFeature": true,
|
||||
"coverView": true,
|
||||
"autoAudits": false,
|
||||
"checkInvalidKey": true,
|
||||
"checkSiteMap": true,
|
||||
"uploadWithSourceMap": true,
|
||||
"babelSetting": {
|
||||
"ignore": [],
|
||||
"disablePlugins": [],
|
||||
"outputPath": ""
|
||||
}
|
||||
},
|
||||
"compileType": "miniprogram",
|
||||
"libVersion": "2.4.0",
|
||||
"appid": "wx7152cd841f66c30b",
|
||||
"projectname": "iotexplorer_mp_demo",
|
||||
"debugOptions": {
|
||||
"hidedInDevtools": []
|
||||
},
|
||||
"isGameTourist": false,
|
||||
"simulatorType": "wechat",
|
||||
"simulatorPluginLibVersion": {},
|
||||
"condition": {
|
||||
"search": {
|
||||
"current": -1,
|
||||
"list": []
|
||||
},
|
||||
"conversation": {
|
||||
"current": -1,
|
||||
"list": []
|
||||
},
|
||||
"plugin": {
|
||||
"current": -1,
|
||||
"list": []
|
||||
},
|
||||
"game": {
|
||||
"currentL": -1,
|
||||
"list": []
|
||||
},
|
||||
"miniprogram": {
|
||||
"current": -1,
|
||||
"list": []
|
||||
}
|
||||
}
|
||||
}
|
7
tools/Mini_Program/iotexplorer_mp_demo/sitemap.json
Normal file
7
tools/Mini_Program/iotexplorer_mp_demo/sitemap.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
|
||||
"rules": [{
|
||||
"action": "allow",
|
||||
"page": "*"
|
||||
}]
|
||||
}
|
Reference in New Issue
Block a user