diff --git a/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo.c b/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo.c
index b7998e5c..28de363d 100644
--- a/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo.c
+++ b/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo.c
@@ -79,7 +79,8 @@ int parse_data(uint8_t *data) {
printf("motor=%d\n", motor);
if(motor == 1) {
//power on relay
- motor_control(OPEN);
+ turnon_fan();
+ // motor_control(OPEN);
} else if(motor == 0) {
//power off relay
motor_control(CLOSE);
@@ -154,8 +155,9 @@ int network_init() {
extern int esp8266_sal_init(hal_uart_port_t uart_port);
extern int esp8266_join_ap(const char *ssid, const char *pwd);
esp8266_sal_init(HAL_UART_PORT_0);
- // int ret = esp8266_join_ap("royye", "Gch626262");
- int ret = esp8266_join_ap("iottest", "iot12345");
+ int ret = esp8266_join_ap("Tencent-StaffWiFi", "");
+ //int ret = esp8266_join_ap("Tencent-StaffWiFi", "");
+ //int ret = esp8266_join_ap("Tencent-GuestWiFi", "252901");
return ret;
#endif
}
@@ -204,7 +206,7 @@ int mqtt_subscribe(void) {
}
void qcloud_agent(void) {
- // 网络初始化
+ // 通过通信模组实现网络连接
int ret = network_init();
if (ret < 0) {
printf("network_init fail\n");
@@ -218,7 +220,7 @@ void qcloud_agent(void) {
return;
}
- // 订阅设备主题
+ // 订阅设备主题,用于接收下行消息
ret = mqtt_subscribe();
if (ret < 0) {
printf("mqtt_subscribe fail\n");
@@ -228,9 +230,9 @@ void qcloud_agent(void) {
sensor_init();
while(1) {
sensor_read();
- // 发布传感器数据
+ // 上报传感器数据
publish_data();
- // 接收控制消息
+ // 接收下行控制消息
receive_data();
osDelay(1000);
}
@@ -263,9 +265,11 @@ void monitor_task(void) {
// 光照强度太低 => 打开补光灯
if (light_intensity_low()) {
turnon_light();
+ turnon_fan();
// 光照强度过高 => 关闭补光灯
} else if (light_intensity_high()) {
turnoff_light();
+ turnoff_fan();
}
osDelay(100);
}
@@ -281,10 +285,7 @@ void normal_task() {
void network_test_task() {
// 初始化WiFi模组,连接AP
- extern int esp8266_sal_init(hal_uart_port_t uart_port);
- extern int esp8266_join_ap(const char *ssid, const char *pwd);
- esp8266_sal_init(HAL_UART_PORT_0);
- int ret = esp8266_join_ap("iottest", "iot12345");
+ int ret = network_init();
if (ret < 0) {
printf("network_init fail\n");
return;
@@ -320,31 +321,6 @@ void network_test_task() {
}
}
-void entry_task1(void *arg)
-{
- while (K_TRUE) {
- printf("entry_task1\n");
- tos_task_delay(1000);
- }
-}
-
-void entry_task2(void *arg)
-{
- while (K_TRUE) {
- printf("entry_task2\n");
- osDelay(2000);
- }
-}
-
-void entry_task1(void *arg);
-#define TASK1_STK_SIZE 512
-k_stack_t stack_task1[TASK1_STK_SIZE];
-k_task_t task1;
-
-#define TASK2_STK_SIZE 512
-void entry_task2(void *arg);
-osThreadDef(entry_task2, osPriorityNormal, 1, TASK2_STK_SIZE);
-
// 联网测试
osThreadDef(network_test_task, osPriorityNormal, 1, 1024);
@@ -362,24 +338,24 @@ osThreadDef(monitor_task, osPriorityHigh, 1, MONITOR_STK_SIZE);
#define NORMAL_STK_SIZE 512
osThreadDef(normal_task, osPriorityNormal, 1, NORMAL_STK_SIZE);
-void application_entry(void *arg) {
- // 端云对接
- osThreadCreate(osThread(qcloud_agent), NULL);
+void helloworld(void *arg)
+{
+ while(1) {
+ printf("helloworld\n");
+ osDelay(1000);
+ }
+}
+
+#define TASK2_STK_SIZE 512
+osThreadDef(helloworld, osPriorityNormal, 1, TASK2_STK_SIZE);
+
+void application_entry(void *arg) {
+ osThreadCreate(osThread(helloworld), NULL);
}
/*
-// tos_task_create 创建任务1
-(void)tos_task_create(&task1,
- "task1", // 任务名称
- entry_task1, // 任务入口
- NULL, // 任务参数
- 4, // 优先级
- stack_task1, // 任务栈空间
- TASK1_STK_SIZE,// 任务栈大小
- 0); // 时间片
-
-// cmsis api 创建任务2
-osThreadCreate(osThread(entry_task2), NULL);
+// 创建任务
+osThreadCreate(osThread(helloworld), NULL);
// 大循环的方式
sensor_init();
@@ -411,7 +387,7 @@ osThreadCreate(osThread(normal_task), NULL);
osThreadCreate(osThread(network_test_task), NULL);
// 端云对接
-osThreadCreate(osThread(agent_task), NULL);
+osThreadCreate(osThread(qcloud_agent), NULL);
*/
diff --git a/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo_config.h b/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo_config.h
index 4038c105..7a3d2cc3 100644
--- a/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo_config.h
+++ b/examples/sensor_e53_ia1_e2e_demo/e53_ia1_e2e_demo_config.h
@@ -6,7 +6,7 @@
#define MQTT_CLIENT_ID "U1BZWHF7F9dev_01"
#define MQTT_USR_NAME "U1BZWHF7F9dev_01;12010126;O3I57;1611533066"
#define MQTT_PASSWORD "6ebcf20c9f7f725b5bcf18a85cc7a49479f489eea65946f92ba18a51a135c89e;hmacsha256"
-#define MQTT_SUBSCRIBE_TOPIC "U1BZWHF7F9/dev_01/data"
+#define MQTT_SUBSCRIBE_TOPIC "U1BZWHF7F9/dev_01/data"
#define MQTT_PUBLISH_TOPIC "$shadow/operation/U1BZWHF7F9/dev_01"
#endif
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/README.md b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/README.md
new file mode 100644
index 00000000..55eb8c11
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/README.md
@@ -0,0 +1,29 @@
+### 智能灯小程序云开发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: "U2LPAXBT2C", // 产品ID
+ deviceName: "royye_light", // 设备名称
+ // 腾讯云控制台-访问管理-访问密钥-API密钥管理中获取 SecretId, secretKey
+ secretId: "AKIDxZ2LTTi84eaR3OfS8hnfxd4JHzQatFpF",
+ secretKey: "UigMrA9rJXUCeoiBQP8dsJuJ6sYzmNjs",
+ // 接口 Region 字段
+ region: "ap-guangzhou",
+ // 云开发的环境名称。此处需要替换为云开发创建的环境名称
+ env: "tos-demo"
+ },
+````
+
+3. 测试通过后,如果需要发布小程序,则还需要在小程序管理后台进行服务器域名配置
+[微信小程序添加服务器端就接口域名](https://jingyan.baidu.com/article/ce09321bb6e9c12bff858f92.html)
+进入微信公众平台小程序后台 - 开发 - 开发设置 - 服务器域名 - 输入域名: iotexplorer.tencentcloudapi.com
+
+### 云开发参考文档
+
+- [云开发文档](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/basis/getting-started.html)
+
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-publish/index.js b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-publish/index.js
new file mode 100644
index 00000000..298668c9
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-publish/index.js
@@ -0,0 +1,36 @@
+const tencentcloud = require("tencentcloud-sdk-nodejs");
+
+const IotcloudClient = tencentcloud.iotcloud.v20180614.Client;
+const models = tencentcloud.iotcloud.v20180614.Models;
+
+const Credential = tencentcloud.common.Credential;
+const ClientProfile = tencentcloud.common.ClientProfile;
+const HttpProfile = tencentcloud.common.HttpProfile;
+
+let cred = new Credential("AKIDxZ2LTTi84eaR3OfS8hnfxd4JHzQatFpF", "UigMrA9rJXUCeoiBQP8dsJuJ6sYzmNjs");
+let httpProfile = new HttpProfile();
+httpProfile.endpoint = "iotcloud.tencentcloudapi.com";
+let clientProfile = new ClientProfile();
+clientProfile.httpProfile = httpProfile;
+let client = new IotcloudClient(cred, "ap-guangzhou", clientProfile);
+
+// 云函数入口函数
+exports.main = async (event, context) => {
+ let req = new models.PublishMessageRequest();
+ req.Topic = "U1BZWHF7F9/dev_01/data";
+ req.DeviceName = "dev_01";
+ req.ProductId = "U1BZWHF7F9";
+ req.Payload = event.Payload;
+
+ return new Promise((resolve, reject)=>{
+ client.PublishMessage(req, function (errMsg, response) {
+ if (errMsg) {
+ console.log(errMsg);
+ reject(errMsg)
+ return;
+ }
+ console.log(response.to_json_string());
+ resolve(response)
+ });
+ })
+}
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-publish/package.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-publish/package.json
new file mode 100644
index 00000000..80f0014c
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-publish/package.json
@@ -0,0 +1,14 @@
+{
+ "name": "iothub-publish",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "wx-server-sdk": "latest"
+ }
+}
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-shadow-query/index.js b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-shadow-query/index.js
new file mode 100644
index 00000000..4a7dc6b8
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-shadow-query/index.js
@@ -0,0 +1,36 @@
+const tencentcloud = require("tencentcloud-sdk-nodejs");
+
+const IotcloudClient = tencentcloud.iotcloud.v20180614.Client;
+const models = tencentcloud.iotcloud.v20180614.Models;
+
+const Credential = tencentcloud.common.Credential;
+const ClientProfile = tencentcloud.common.ClientProfile;
+const HttpProfile = tencentcloud.common.HttpProfile;
+
+let cred = new Credential("AKIDxZ2LTTi84eaR3OfS8hnfxd4JHzQatFpF", "UigMrA9rJXUCeoiBQP8dsJuJ6sYzmNjs");
+let httpProfile = new HttpProfile();
+httpProfile.endpoint = "iotcloud.tencentcloudapi.com";
+let clientProfile = new ClientProfile();
+clientProfile.httpProfile = httpProfile;
+let client = new IotcloudClient(cred, "ap-guangzhou", clientProfile);
+
+let req = new models.DescribeDeviceShadowRequest();
+
+let params = '{"ProductId":"U1BZWHF7F9","DeviceName":"dev_01"}'
+req.from_json_string(params);
+
+exports.main = async (event, context) => {
+ return new Promise((resolve, reject)=>{
+ client.DescribeDeviceShadow(req, function (errMsg, response) {
+
+ if (errMsg) {
+ console.log(errMsg);
+ reject(errMsg)
+ return;
+ }
+
+ console.log(response.to_json_string());
+ resolve(response)
+ });
+ })
+}
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-shadow-query/package.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-shadow-query/package.json
new file mode 100644
index 00000000..f346ef44
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/iothub-shadow-query/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "iotexplorer",
+ "version": "1.0.0",
+ "description": "",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "author": "",
+ "license": "ISC",
+ "dependencies": {
+ "tencentcloud-sdk-nodejs": "^3.0.77",
+ "wx-server-sdk": "latest"
+ }
+}
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/package-lock.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/package-lock.json
new file mode 100644
index 00000000..9113190b
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/cloudfunctions/package-lock.json
@@ -0,0 +1,549 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@cloudbase/database": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npm.taobao.org/@cloudbase/database/download/@cloudbase/database-0.1.1.tgz",
+ "integrity": "sha1-yf/JK3HhkAVxljkL6odpZ3f/l/8=",
+ "requires": {
+ "bson": "^4.0.2"
+ }
+ },
+ "@protobufjs/aspromise": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/aspromise/download/@protobufjs/aspromise-1.1.2.tgz",
+ "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78="
+ },
+ "@protobufjs/base64": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/base64/download/@protobufjs/base64-1.1.2.tgz",
+ "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU="
+ },
+ "@protobufjs/codegen": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/codegen/download/@protobufjs/codegen-2.0.4.tgz",
+ "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs="
+ },
+ "@protobufjs/eventemitter": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/eventemitter/download/@protobufjs/eventemitter-1.1.0.tgz",
+ "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A="
+ },
+ "@protobufjs/fetch": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/fetch/download/@protobufjs/fetch-1.1.0.tgz",
+ "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.1",
+ "@protobufjs/inquire": "^1.1.0"
+ }
+ },
+ "@protobufjs/float": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/float/download/@protobufjs/float-1.0.2.tgz",
+ "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E="
+ },
+ "@protobufjs/inquire": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/inquire/download/@protobufjs/inquire-1.1.0.tgz",
+ "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik="
+ },
+ "@protobufjs/path": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/path/download/@protobufjs/path-1.1.2.tgz",
+ "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0="
+ },
+ "@protobufjs/pool": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/pool/download/@protobufjs/pool-1.1.0.tgz",
+ "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q="
+ },
+ "@protobufjs/utf8": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npm.taobao.org/@protobufjs/utf8/download/@protobufjs/utf8-1.1.0.tgz",
+ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA="
+ },
+ "@types/long": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npm.taobao.org/@types/long/download/@types/long-4.0.0.tgz",
+ "integrity": "sha1-cZVR0jUtMBrIuB23Mqy2vcKNve8="
+ },
+ "@types/node": {
+ "version": "10.14.13",
+ "resolved": "https://registry.npm.taobao.org/@types/node/download/@types/node-10.14.13.tgz?cache=0&sync_timestamp=1563391049881&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40types%2Fnode%2Fdownload%2F%40types%2Fnode-10.14.13.tgz",
+ "integrity": "sha1-rHhtYjhgrfOaP1HWKUgKrNam7sc="
+ },
+ "ajv": {
+ "version": "6.10.2",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/ajv/-/ajv-6.10.2.tgz",
+ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "http://registry.npm.taobao.org/asn1/download/asn1-0.2.4.tgz",
+ "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=",
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "http://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "http://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "http://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "http://registry.npm.taobao.org/aws4/download/aws4-1.8.0.tgz",
+ "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8="
+ },
+ "base64-js": {
+ "version": "1.3.0",
+ "resolved": "http://registry.npm.taobao.org/base64-js/download/base64-js-1.3.0.tgz",
+ "integrity": "sha1-yrHmEY8FEJXli1KBrqjBzSK/wOM="
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "bson": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npm.taobao.org/bson/download/bson-4.0.2.tgz",
+ "integrity": "sha1-KSn9/tGhRbHDYZCKK5UKbPS+0sI=",
+ "requires": {
+ "buffer": "^5.1.0",
+ "long": "^4.0.0"
+ }
+ },
+ "buffer": {
+ "version": "5.2.1",
+ "resolved": "http://registry.npm.taobao.org/buffer/download/buffer-5.2.1.tgz",
+ "integrity": "sha1-3Vf6DxCaxZxgJHkETcp7iz0LcdY=",
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "http://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.8.tgz",
+ "integrity": "sha1-w9RaizT9cwYxoRCoolIGgrMdWn8=",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "http://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "http://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "http://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "http://registry.npm.taobao.org/extend/download/extend-3.0.2.tgz",
+ "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo="
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "http://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-2.0.1.tgz?cache=0&sync_timestamp=1562517919182&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffast-deep-equal%2Fdownload%2Ffast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "http://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "http://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.3.tgz?cache=0&sync_timestamp=1562216133657&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fform-data%2Fdownload%2Fform-data-2.3.3.tgz",
+ "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "http://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz",
+ "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0="
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "http://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "http://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "http://registry.npm.taobao.org/has/download/has-1.0.3.tgz",
+ "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=",
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "ieee754": {
+ "version": "1.1.13",
+ "resolved": "http://registry.npm.taobao.org/ieee754/download/ieee754-1.1.13.tgz",
+ "integrity": "sha1-7BaFWOlaoYH9h9N/VcMrvLZwi4Q="
+ },
+ "is-regex": {
+ "version": "1.0.4",
+ "resolved": "http://registry.npm.taobao.org/is-regex/download/is-regex-1.0.4.tgz",
+ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+ "requires": {
+ "has": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "http://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "http://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "http://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "http://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "http://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha1-afaofZUTq4u4/mO9sJecRI5oRmA="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "http://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npm.taobao.org/lodash.merge/download/lodash.merge-4.6.2.tgz",
+ "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo="
+ },
+ "long": {
+ "version": "4.0.0",
+ "resolved": "http://registry.npm.taobao.org/long/download/long-4.0.0.tgz",
+ "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg="
+ },
+ "mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.40.0.tgz",
+ "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI="
+ },
+ "mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.24.tgz",
+ "integrity": "sha1-tvjQs+lR77d97eyhlM/20W9nb4E=",
+ "requires": {
+ "mime-db": "1.40.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "http://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.9.0.tgz",
+ "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "http://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "protobufjs": {
+ "version": "6.8.8",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/protobufjs/-/protobufjs-6.8.8.tgz",
+ "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==",
+ "requires": {
+ "@protobufjs/aspromise": "^1.1.2",
+ "@protobufjs/base64": "^1.1.2",
+ "@protobufjs/codegen": "^2.0.4",
+ "@protobufjs/eventemitter": "^1.1.0",
+ "@protobufjs/fetch": "^1.1.0",
+ "@protobufjs/float": "^1.0.2",
+ "@protobufjs/inquire": "^1.1.0",
+ "@protobufjs/path": "^1.1.2",
+ "@protobufjs/pool": "^1.1.0",
+ "@protobufjs/utf8": "^1.1.0",
+ "@types/long": "^4.0.0",
+ "@types/node": "^10.1.0",
+ "long": "^4.0.0"
+ }
+ },
+ "psl": {
+ "version": "1.2.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/psl/-/psl-1.2.0.tgz",
+ "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA=="
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "http://registry.npm.taobao.org/punycode/download/punycode-2.1.1.tgz",
+ "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew="
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.2.tgz",
+ "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY="
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.2.0.tgz",
+ "integrity": "sha1-t02uxJsRSPiMZLaNSbHoFcHy9Rk="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "http://registry.npm.taobao.org/safer-buffer/download/safer-buffer-2.1.2.tgz",
+ "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "http://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz",
+ "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk="
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "tcb-admin-node": {
+ "version": "1.9.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/tcb-admin-node/-/tcb-admin-node-1.9.0.tgz",
+ "integrity": "sha512-TYoBo66CEIIw1QzgK4Jq43G45zvBE6ZB35LbDV8wwLQvg6CiZHlmOTVZkgj2YZ8O87ELi+ZE3UBVNZM3nFa6lQ==",
+ "requires": {
+ "@cloudbase/database": "0.1.1",
+ "is-regex": "^1.0.4",
+ "lodash.merge": "^4.6.1",
+ "request": "^2.87.0",
+ "xml2js": "^0.4.19"
+ }
+ },
+ "tencentcloud-sdk-nodejs": {
+ "version": "3.0.77",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/tencentcloud-sdk-nodejs/-/tencentcloud-sdk-nodejs-3.0.77.tgz",
+ "integrity": "sha512-DULk7IFdR8BQnvC1iRuj+GrYnuU72Lj3oyIO1U2pubf71GtN9PeZ/9km2T7lsCeySU/J6jCTvwVPZaIhip/H1g==",
+ "requires": {
+ "request": "^2.85.0"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ }
+ }
+ },
+ "tslib": {
+ "version": "1.10.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/tslib/-/tslib-1.10.0.tgz",
+ "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ=="
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "wx-server-sdk": {
+ "version": "0.8.1",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/wx-server-sdk/-/wx-server-sdk-0.8.1.tgz",
+ "integrity": "sha512-mE7O3E7GtRhqk1ukWw2+NiykaO5DaJYiMFCeHrwvekYTVL5Z2nFXnSrUx6nPg/vZ7LWWQbCgQlGOygBjj2+hkQ==",
+ "requires": {
+ "protobufjs": "6.8.8",
+ "tcb-admin-node": "1.9.0",
+ "tslib": "^1.9.3"
+ }
+ },
+ "xml2js": {
+ "version": "0.4.19",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/xml2js/-/xml2js-0.4.19.tgz",
+ "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
+ "requires": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~9.0.1"
+ }
+ },
+ "xmlbuilder": {
+ "version": "9.0.7",
+ "resolved": "http://mirrors.cloud.tencent.com/npm/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
+ "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0="
+ }
+ }
+}
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.js b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.js
new file mode 100644
index 00000000..0e2f6c14
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.js
@@ -0,0 +1,22 @@
+//app.js
+App({
+ globalData: {
+ // 腾讯云物联网通信平台中获取 产品ID和设备名称
+ productId: "U1BZWHF7F9", // 产品ID
+ deviceName: "dev_01", // 设备名称
+ },
+ onLaunch: function () {
+ if (!wx.cloud) {
+ console.error('请使用 2.2.3 或以上的基础库以使用云能力')
+ } else {
+ wx.cloud.init({
+ // env 参数说明:
+ // env 参数决定接下来小程序发起的云开发调用(wx.cloud.xxx)会默认请求到哪个云环境的资源
+ // 此处请填入环境 ID, 环境 ID 可打开云控制台查看
+ // 如不填则使用默认环境(第一个创建的环境)
+ env: "tos-demo",
+ traceUser: true,
+ })
+ }
+ }
+})
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.json
new file mode 100644
index 00000000..07cd9e56
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.json
@@ -0,0 +1,13 @@
+{
+ "pages": [
+ "pages/index/index"
+ ],
+ "window": {
+ "backgroundColor": "#F6F6F6",
+ "backgroundTextStyle": "light",
+ "navigationBarBackgroundColor": "#F6F6F6",
+ "navigationBarTitleText": "智慧农业Demo",
+ "navigationBarTextStyle": "black"
+ },
+ "sitemapLocation": "sitemap.json"
+}
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.wxss b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.wxss
new file mode 100644
index 00000000..82678d67
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/app.wxss
@@ -0,0 +1,156 @@
+/**app.wxss**/
+.container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ box-sizing: border-box;
+}
+
+button {
+ background: initial;
+}
+
+button:focus{
+ outline: 0;
+}
+
+button::after{
+ border: none;
+}
+
+
+page {
+ background: #f6f6f6;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-start;
+}
+
+.userinfo, .uploader, .tunnel {
+ margin-top: 40rpx;
+ height: 140rpx;
+ width: 100%;
+ background: #fff;
+ border: 1px solid rgba(0, 0, 0, 0.1);
+ border-left: none;
+ border-right: none;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ transition: all 300ms ease;
+}
+
+.userinfo-avatar {
+ width: 100rpx;
+ height: 100rpx;
+ margin: 20rpx;
+ border-radius: 50%;
+ background-size: cover;
+ background-color: white;
+}
+
+.userinfo-avatar:after {
+ border: none;
+}
+
+.userinfo-nickname {
+ font-size: 32rpx;
+ color: #007aff;
+ background-color: white;
+ background-size: cover;
+}
+
+.userinfo-nickname::after {
+ border: none;
+}
+
+.uploader, .tunnel {
+ height: auto;
+ padding: 0 0 0 40rpx;
+ flex-direction: column;
+ align-items: flex-start;
+ box-sizing: border-box;
+}
+
+.uploader-text, .tunnel-text {
+ width: 100%;
+ line-height: 52px;
+ font-size: 34rpx;
+ color: #007aff;
+}
+
+.uploader-container {
+ width: 100%;
+ height: 400rpx;
+ padding: 20rpx 20rpx 20rpx 0;
+ display: flex;
+ align-content: center;
+ justify-content: center;
+ box-sizing: border-box;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.uploader-image {
+ width: 100%;
+ height: 360rpx;
+}
+
+.tunnel {
+ padding: 0 0 0 40rpx;
+}
+
+.tunnel-text {
+ position: relative;
+ color: #222;
+ display: flex;
+ flex-direction: row;
+ align-content: center;
+ justify-content: space-between;
+ box-sizing: border-box;
+ border-top: 1px solid rgba(0, 0, 0, 0.1);
+}
+
+.tunnel-text:first-child {
+ border-top: none;
+}
+
+.tunnel-switch {
+ position: absolute;
+ right: 20rpx;
+ top: -2rpx;
+}
+
+.disable {
+ color: #888;
+}
+
+.service {
+ position: fixed;
+ right: 40rpx;
+ bottom: 40rpx;
+ width: 140rpx;
+ height: 140rpx;
+ border-radius: 50%;
+ background: linear-gradient(#007aff, #0063ce);
+ box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+ display: flex;
+ align-content: center;
+ justify-content: center;
+ transition: all 300ms ease;
+}
+
+.service-button {
+ position: absolute;
+ top: 40rpx;
+}
+
+.service:active {
+ box-shadow: none;
+}
+
+.request-text {
+ padding: 20rpx 0;
+ font-size: 24rpx;
+ line-height: 36rpx;
+ word-break: break-all;
+}
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/TencentOS_tiny_log.png b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/TencentOS_tiny_log.png
new file mode 100644
index 00000000..54f21405
Binary files /dev/null and b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/TencentOS_tiny_log.png differ
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/farm.png b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/farm.png
new file mode 100644
index 00000000..9aa88969
Binary files /dev/null and b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/farm.png differ
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/led.png b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/led.png
new file mode 100644
index 00000000..28e5314b
Binary files /dev/null and b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/images/led.png differ
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.js b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.js
new file mode 100644
index 00000000..d4c48f78
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.js
@@ -0,0 +1,90 @@
+const app = getApp()
+
+Page({
+ data: {
+ productId: app.globalData.productId,
+ deviceName: app.globalData.deviceName,
+ stateReported: {},
+ },
+ 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
+ }
+ this.update()
+ },
+ update() {
+ wx.showLoading()
+ wx.cloud.callFunction({
+ name: 'iothub-shadow-query',
+ data: {
+ productId: app.globalData.productId,
+ deviceName: app.globalData.deviceName,
+ },
+ success: res => {
+ wx.showToast({
+ title: '调用成功',
+ })
+ let deviceData = JSON.parse(res.result.Data)
+ this.setData({
+ stateReported: deviceData.payload.state.reported
+ })
+ console.log("result:", deviceData)
+ },
+ fail: err => {
+ wx.showToast({
+ icon: 'none',
+ title: '调用失败',
+ })
+ console.error('[云函数] [iotexplorer] 调用失败:', err)
+ }
+ })
+ },
+ switchChange(e) {
+ let value = 0
+ if (e.detail.value == true) {
+ value = 1
+ }
+ let item = e.currentTarget.dataset.item
+ let obj = {
+ [`${item}`]: value
+ }
+ let payload = JSON.stringify(obj)
+ console.log(payload)
+ wx.showLoading()
+ wx.cloud.callFunction({
+ name: 'iothub-publish',
+ data: {
+ ProductId: app.globalData.productId,
+ DeviceName: app.globalData.deviceName,
+ Topic: "",
+ Payload: payload,
+ },
+ success: res => {
+ wx.showToast({
+ title: '调用成功',
+ })
+ console.log("res:", res)
+ },
+ fail: err => {
+ wx.showToast({
+ icon: 'none',
+ title: '调用失败',
+ })
+ console.error('[云函数] [iotexplorer] 调用失败:', err)
+ }
+ })
+ },
+})
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.json
new file mode 100644
index 00000000..9e26dfee
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.json
@@ -0,0 +1 @@
+{}
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.wxml b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.wxml
new file mode 100644
index 00000000..b7e2eb77
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.wxml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+ 设备信息
+
+
+
+ 产品ID
+ {{productId}}
+
+
+ 设备名称
+ {{deviceName}}
+
+
+
+ \n
+
+
+
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.wxss b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.wxss
new file mode 100644
index 00000000..0cae550d
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/pages/index/index.wxss
@@ -0,0 +1,31 @@
+.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;
+}
+
+.left {
+ width: 50%;
+ text-align: left;
+}
+
+.right {
+ width: 40%;
+ text-align: right;
+}
+
+.unit {
+ width: 10%;
+ text-align: right;
+}
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/sitemap.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/sitemap.json
new file mode 100644
index 00000000..ca02add2
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/miniprogram/sitemap.json
@@ -0,0 +1,7 @@
+{
+ "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
+ "rules": [{
+ "action": "allow",
+ "page": "*"
+ }]
+}
\ No newline at end of file
diff --git a/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/project.config.json b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/project.config.json
new file mode 100644
index 00000000..f80ad225
--- /dev/null
+++ b/tools/Mini_Program/qcloud_iothub_mp_cloudfunctions_farmai/project.config.json
@@ -0,0 +1,47 @@
+{
+ "miniprogramRoot": "miniprogram/",
+ "cloudfunctionRoot": "cloudfunctions/",
+ "setting": {
+ "urlCheck": false,
+ "es6": true,
+ "postcss": true,
+ "minified": true,
+ "newFeature": true,
+ "autoAudits": false,
+ "checkInvalidKey": true,
+ "checkSiteMap": true,
+ "uploadWithSourceMap": true,
+ "babelSetting": {
+ "ignore": [],
+ "disablePlugins": [],
+ "outputPath": ""
+ },
+ "nodeModules": true
+ },
+ "appid": "wx394efa031612f9b5",
+ "projectname": "qcloud_iothub_mp_cloudfunctions_farmai",
+ "libVersion": "2.7.7",
+ "simulatorType": "wechat",
+ "simulatorPluginLibVersion": {},
+ "cloudfunctionTemplateRoot": "cloudfunctionTemplate",
+ "condition": {
+ "search": {
+ "current": -1,
+ "list": []
+ },
+ "conversation": {
+ "current": -1,
+ "list": []
+ },
+ "plugin": {
+ "current": -1,
+ "list": []
+ },
+ "game": {
+ "list": []
+ },
+ "miniprogram": {
+ "current": 0
+ }
+ }
+}
\ No newline at end of file