first commit for opensource

first commit for opensource
This commit is contained in:
supowang
2019-09-16 13:19:50 +08:00
parent 08ab013b8e
commit edb2879617
6303 changed files with 5472815 additions and 23 deletions

View 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

View 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")
},
})

View 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"
}

View File

@@ -0,0 +1,4 @@
/**app.wxss**/
page{
background: #f9f9f9;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@@ -0,0 +1,5 @@
### NOTE
感谢halenhuang适配的iotexplorer小程序js接口iotclient_for_miniprogram
注意iotclient_for_miniprogram非iotexplorer官方小程序SDK仅用于方便开发者调试TencentOS tiny示例。

View File

@@ -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;

View File

@@ -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

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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;

View File

@@ -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
}

View File

@@ -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
}

View 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
})
});
},
})

View File

@@ -0,0 +1 @@
{}

View File

@@ -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>

View File

@@ -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;
}

View 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": []
}
}
}

View File

@@ -0,0 +1,7 @@
{
"desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
"rules": [{
"action": "allow",
"page": "*"
}]
}