From 0b31be01af4247244e1b6285d6c537c2894acea9 Mon Sep 17 00:00:00 2001
From: wangrong <wangrong@shsening.com>
Date: 星期二, 28 六月 2022 14:32:46 +0800
Subject: [PATCH] 添加socket.io taskshchedule等

---
 src/app/modules/business/entity/periodicsetting.ts           |    3 
 src/app/modules/business/controller/admin/taskmonitor.ts     |   30 +
 src/app/modules/business/controller/admin/taskimmediately.ts |   76 +++
 src/socket/socketHandle.ts                                   |   85 +++
 src/configuration.ts                                         |   16 
 src/app/modules/base/utils/axiosutil.ts                      |   56 ++
 src/app/modules/base/utils/dateutil.ts                       |    6 
 src/config/config.default.ts                                 |   17 
 src/app/modules/business/controller/admin/colletmeta.ts      |   27 +
 src/schedule/taskSchedule.js                                 |  181 ++++++++
 src/socket/chatUser.ts                                       |   32 +
 src/app/modules/base/service/dataapi/rpcservice.ts           |  115 +++++
 src/schedule/aerial.proto                                    |  294 +++++++++++++
 package.json                                                 |    6 
 src/app/modules/business/service/taskimmediately.ts          |   51 ++
 src/app/comm/aerial.proto                                    |  294 +++++++++++++
 bootstrap.js                                                 |   10 
 src/schedule/helloCorn                                       |   19 
 18 files changed, 1,300 insertions(+), 18 deletions(-)

diff --git a/bootstrap.js b/bootstrap.js
index abb687a..a42516e 100644
--- a/bootstrap.js
+++ b/bootstrap.js
@@ -1,7 +1,17 @@
 const WebFramework = require('@midwayjs/web').Framework;
+const { SocketFramework, createRedisAdapter} = require('@cool-midway/socket');
 const web = new WebFramework().configure({
   port: 8001,
 });
 
+// // 鍒濆鍖� socket.io 妗嗘灦
+// const socketFramework = new SocketFramework().configure({
+//   port: 3000,
+//   // adapter: createRedisAdapter({ host: '192.168.1.2', port: 6379}),
+// });
+
 const { Bootstrap } = require('@midwayjs/bootstrap');
 Bootstrap.load(web).run();
+
+const schedule_ = require("./src/schedule/taskSchedule.js");
+schedule_.job_();
\ No newline at end of file
diff --git a/package.json b/package.json
index e4ff29d..e36a2df 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "cool-admin",
   "version": "4.0.0",
-  "description": "cool-admin 涓�涓緢閰风殑閫氱敤鍚庡彴绠$悊绯荤粺",
+  "description": "涓�涓緢閰风殑閫氱敤鍚庡彴绠$悊绯荤粺",
   "private": true,
   "dependencies": {
     "@cool-midway/alipay": "^4.0.4",
@@ -17,9 +17,11 @@
     "@midwayjs/core": "^2.14.0",
     "@midwayjs/decorator": "^2.14.0",
     "@midwayjs/orm": "^2.14.0",
+    "@midwayjs/socketio": "^3.3.5",
     "@midwayjs/swagger": "^1.3.0",
     "@midwayjs/view-nunjucks": "^2.14.0",
     "@midwayjs/web": "^2.13.4",
+    "axios": "^0.27.2",
     "egg": "^2.33.1",
     "egg-cors": "^2.2.3",
     "egg-scripts": "^2.15.2",
@@ -29,7 +31,9 @@
     "md5": "^2.3.0",
     "mini-svg-data-uri": "^1.4.3",
     "mysql2": "^2.3.3",
+    "node-schedule": "^2.1.0",
     "node-xlsx": "^0.17.2",
+    "protobufjs": "^6.11.3",
     "svg-captcha": "^1.4.0",
     "typeorm": "^0.2.41"
   },
diff --git a/src/app/comm/aerial.proto b/src/app/comm/aerial.proto
new file mode 100644
index 0000000..14fa4e0
--- /dev/null
+++ b/src/app/comm/aerial.proto
@@ -0,0 +1,294 @@
+syntax = "proto3";
+
+// enum SysCommand {
+//   UNKOWN_COMMAND     = 0;   // 鏈煡鍛戒护
+//   SYS_COMMAND        = 1;   // 绯荤粺鍛戒护
+//   SENSOR_COMMAND     = 2;   // 浼犳劅鍣ㄥ懡浠�
+//   FIVE_G_COMMAND     = 3;   // 閫氳5G妯″潡鍛戒护
+//   CAMERA_COMMAND     = 4;   // 鎽勫儚澶村弬鏁板懡浠�
+//   IO_COMMAND         = 5;   // 澶栬IO鍙f搷浣滃懡浠�
+//   SYS_PARAMS_COMMAND = 6;   // 绯荤粺鍙傛暟鑾峰彇
+//   WIFI_COMMAND       = 7;   // 璁惧WIFI鍙傛暟璁剧疆
+//   KERNEL_COMMAND     = 8;   // 鏍稿績璁$畻鍙傛暟璁�
+//   DEVICE_COMMAND     = 9;   // 宸ヤ綔璁惧鍙傛暟璁剧疆
+//   MICRO_WAVE_COMMAND = 10;  // 姣背娉�
+// }
+
+// enum SubCommand {
+//   option allow_alias = true;
+   
+//   UNKOWN_SUB_COMMAND   = 0;                   // 鏈煡瀛愬懡浠�
+
+//   // 绯荤粺鍛戒护
+//   POWER_ON_SUB_COMMAND = 1;                   // 寮�鏈�
+//   POWER_OFF_SUB_COMMAND = 2;                  // 鍏虫満
+
+//   // 浼犳劅鍣ㄥ懡浠�
+//   SENSOR_INIT_SUB_COMMAND = 1;                // 浼犳劅鍣ㄥ垵濮嬪寲
+//   SENSOR_REQURE_SUB_COMMAND = 2;              // 浼犳劅鍣ㄥ弬鏁拌幏鍙�
+//   RTK_SETTING_SUB_COMMAND = 3;                // RTK澶栬鍙傛暟璁剧疆
+//   RTK_REQURE_SUB_COMMAND = 4;                 // RTK澶栬鏁版嵁鑾峰彇
+
+//   // 閫氳5G妯″潡鍛戒护
+//   FIVE_G_INIT_SUB_COMMAND = 1;                // 5G妯″潡鍙傛暟鍒濆鍖�
+//   FIVE_G_SEND_IMAGE_SUB_COMMAND = 2;          // 5G閫氳鍥惧儚鏁版嵁鍙戦��
+//   FIVE_G_REQURE_SUB_COMMAND = 3;              // 5G閫氳鎺ユ敹
+
+//   // 鎽勫儚澶村弬鏁板懡浠�
+//   CAMERA_NUMBER_SUB_COMMAND = 1;              // 璁惧鎽勫儚澶翠釜鏁�  
+//   CAMERA_RESOLUTION_SUB_COMMAND = 2;          // 璁惧鎽勫儚澶村伐浣滃垎杈ㄧ巼
+//   CAMERA_FRAME_RATE_SUB_COMMAND = 3;          // 鎽勫儚澶村伐浣滃抚鐜�
+//   CAMERA_OTHER_PARAMS_SUB_COMMAND = 4;        // 鎽勫儚澶村伐浣滃叾浠栧弬鏁�
+
+//   // 澶栬IO鍙f搷浣滃懡浠�
+//   CAMERA_DUST_REMOVAL_START_SUB_COMMAND = 1;  // 鎽勫儚澶撮櫎灏樺惎鍔�
+//   CAMERA_CONTROL_START_SUB_COMMAND = 2;       // 澶栬鎺у埗鏁版嵁鍚姩锛�18璺帶鍒讹級
+
+//   // 绯荤粺鍙傛暟鑾峰彇
+//   CPU_FREQUENCY_SUB_COMMAND = 1;              // CPU涓婚宸ヤ綔鏁版嵁
+//   CPU_KERNAL_TEMP_SUB_COMMAND = 2;            // CPU鏍稿績娓╁害鏁版嵁
+//   CPU_BETTERY_DATA_SUB_COMMAND = 3;           // 鐢垫睜渚涚數鐢甸噺鏁版嵁
+
+//   // 璁惧WIFI鍙傛暟璁剧疆
+//   WIFI_HOTSPOT_SETTING_SUB_COMMAND = 1;       // WIFI鐑偣璁剧疆
+//   WIFI_HOTSPOT_START_STOP_SUB_COMMAND = 2;    // WIFI鐑偣寮�鍚拰鍏抽棴
+
+//   // 鏍稿績璁$畻鍙傛暟璁剧疆
+//   POINT_CLOUD_ACCURACY_SUB_COMMAND = 1;       // 鐐逛簯璁$畻绮惧害
+//   SPLICING_PARAMS_SUB_COMMAND = 2;            // 鎷兼帴鍙傛暟
+//   MAP_INTERFACE_PLATFORM_SUB_COMMAND = 3;     // 鍦板浘鎺ュ彛骞冲彴
+//   DATA_STORE_BACKUP_SUB_COMMAND = 4;          // 鏁版嵁瀛樺偍澶囦唤
+
+//   // 宸ヤ綔璁惧鍙傛暟璁剧疆
+//   SYSTEM_TIMER_SUB_COMMAND = 1;               // 绯荤粺宸ヤ綔瀹氭椂
+//   SYSTEM_COORD_HEIGHT_SUB_COMMAND = 2;        // 宸ヤ綔鍖哄煙鍧愭爣涓庨珮搴�
+//   TRIGGER_CONDITION_SUB_COMMAND = 3;          // 宸ヤ綔瑙﹀彂鏉′欢
+//   GRAVITY_FAILURE_SUB_COMMAND = 4;            // 閲嶅姏鍔犻�熷害澶辨晥鍙傛暟
+//   NINE_AXIS_FAILURE_SUB_COMMAND = 5;          // 涔濊酱鍔犻�熷害澶辨晥鍙傛暟
+
+//   // 姣背娉�
+//   MICRO_WAVE_SUB_COMMAND = 1;                 // 姣背娉�
+// }
+
+// message DataField {
+//   int32 length = 1;                           // 鏁版嵁闀垮害
+//   bytes data = 2;                            // 鏁版嵁鍐呭
+//   int32 checksum = 3;                        // 鏍¢獙鐮�
+// }
+
+// message CapturedData {
+//   int64 capture_time = 1;                     // 閲囬泦鏃堕棿
+//   string capture_device =2;                   // 閲囬泦璁惧
+//   int32 capture_port = 3;                     // 閲囬泦璁惧搴忓彿
+//   DataField DataField = 4;
+//   string data_type = 5;                         // 鏁版嵁绫诲瀷 image udp
+// }
+
+// message DataMessage{
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CapturedData CapturedData = 5;
+// }
+
+// message StateData {
+//  int64 state_time = 1;
+//  string state_device = 2;
+//  DataField DataField = 4;
+// }
+
+// message StateMessage {
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CapturedData StatedData = 5;
+// }
+
+// message CommandData {
+//   SysCommand SysCommand = 1;
+//   SubCommand SubCommand = 2;
+// }
+
+// message CommandMessage {
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CommandData CommandData =4;
+// }
+
+enum SysCommand{
+  UNKOWN_COMMAND     = 0;
+  CAMERA_COMMAND     = 1;
+  MICROWAVE_COMMAND   = 2;
+  DUSTCLEANER_COMMAND   = 3;
+
+}
+
+enum SubCommand{
+  UNKOWN_SUBCOMMAND     = 0;
+
+  // camera params
+  ONE_TIME_CAPTURE      = 1;
+
+  // microwave params
+  ONE_CIRCLE_SCAN       = 2;
+
+  // dust cleaner params
+  ONE_CLEAN_SCAN        = 4;
+
+}
+
+
+message CommandMessage{
+  string source = 1;
+  string generatetime = 2;
+  SysCommand syscommand = 3;
+  SubCommand subcommand = 4;
+  string targetclient = 5;
+  string returnserver = 6;
+  string taskuuid = 7;
+}
+
+message LogsMessage{
+  string source = 1;
+  string timestamp = 2;
+  string context = 3;
+  optional string taskuuid = 4;
+}
+
+
+message ImagesMessage
+{
+  string source = 1;
+  string timestamp = 2;
+
+  message ImageItems
+  {
+    int32 length = 1;                           // 鏁版嵁闀垮害
+    bytes data = 2;                            // 鏁版嵁鍐呭 
+  }
+
+  repeated ImageItems Image = 3;
+  optional string taskuuid = 4;
+}
+
+
+
+message PlysMessage
+{
+  string source = 1;
+  string timestamp = 2;
+
+  message PointCloudItem
+  {
+    int32 length = 1;
+    int32 rows = 2;
+    int32 cols = 3;
+    string order = 4;
+    string dtype = 5;
+    bytes data = 6;
+    
+  }
+
+  repeated PointCloudItem Plydata = 3;
+  optional string taskuuid = 4;
+
+  // enum ref_system
+  // {
+  //   MICROWAVE_SYSTEM = 0;
+  //   DEVICE_SYSTEM = 1;
+  // }
+
+  // ref_system reference = 4
+}
+
+
+
+
+
+
+
+// message MicroWaveMessage
+// {
+//   int32 length = 1;                           // 鏁版嵁闀垮害
+//   bytes data = 2;                            // 鏁版嵁鍐呭
+// }
+
+// message CommandRequest{
+
+// }
+
+// message StateMessage{
+//   string message_type = 1;
+//   int64 generatetime = 2;
+//   string generate_device = 3;
+//   string target_device = 4;
+//   string message_uuid = 5;
+//   string str_body = 6;
+// }
+
+
+
+
+
+
+// message RequestCommand {
+//   int32 sync_word = 1;              // 鍚屾瀛�
+//   string device_id = 2;             // 璁惧ID
+//   SysCommand sys_command = 3;       // 鍛戒护1
+//   SubCommand sub_command = 4;       // 鍛戒护2
+//   DataField data1 = 5;              // 鏁版嵁1
+//   DataField data2 = 6;              // 鏁版嵁2
+//   int32 checksum = 7;               // 鏍¢獙鐮�
+// }
+
+// enum ResponseState
+// {
+//   SUCCESS = 0;                  // 鎴愬姛
+//   FAILURE = 1;                  // 澶辫触
+//   ABNORMAL = 2;                 // 寮傚父
+//   INFICIENT_POWER = 3;          // 鐢甸噺涓嶈冻
+//   OTHER = 4;                    // 鍏朵粬
+// }
+
+// message ResponseCommand
+// {
+//     string device_id = 1;        // 璁惧ID
+//     SysCommand sys_command = 2;  // 鍛戒护1
+//     SubCommand sub_command = 3;  // 鍛戒护2
+//     ResponseState state = 4;     // 鍝嶅簲鐘舵��
+//     int32 data_length = 5;       // 鏁版嵁闀垮害
+//     bytes data = 6;              // 鏁版嵁
+//     int32 checksum = 7;          // 鏍¢獙鐮�
+// }
+
+
+// // 鏈嶅姟绔悜閲囬泦绔彂閫佺殑涓绘寚浠�
+// enum ControlSysCommand {
+//   DUST_CLEANER_COMMAND = 0;
+// }
+
+// // 鏈嶅姟绔悜閲囬泦绔彂閫佺殑瀛愬懡浠�
+// enum ControlSubCommand {
+//   // dust cleaner sub commands
+//   DUST_CLEANER_ONETIME_CLEAN_SELF         = 0;
+//   DUST_CLEANER_ONETIME_CLEAN_CAMERA       = 1;
+//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_SELF    = 2;
+//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_CAMERA  = 3;
+//   DUST_CLEANER_PERIOD_CLEAN_SELF          = 4;
+//   DUST_CLEANER_PERIOD_CLEAN_CAMERA        = 5;
+// }
+
+// // dust cleaner command message
+// message DustCleanerMessage  {
+//   uint32 period = 1;
+// }
+
+// // 鎺у埗涓婁綅鏈烘秷鎭�
+// message ControllMessage {
+//   int32 sync_word = 1;                // 鍚屾瀛�
+//   ControlSysCommand sys_command = 3;  // 涓诲懡浠�
+//   ControlSubCommand sub_command = 4;  // 瀛愬懡浠�
+//   DataField data = 5;                 // 鏁版嵁
+//   int32 checksum = 7;                 // 鏍¢獙鐮�
+// }
diff --git a/src/app/modules/base/service/dataapi/rpcservice.ts b/src/app/modules/base/service/dataapi/rpcservice.ts
new file mode 100644
index 0000000..d5a9012
--- /dev/null
+++ b/src/app/modules/base/service/dataapi/rpcservice.ts
@@ -0,0 +1,115 @@
+import { Inject, Provide } from '@midwayjs/decorator';
+import { BaseService, ICoolCache, } from '@cool-midway/core';
+import * as _ from 'lodash';
+import { MysqlUtil } from '../../utils/mysqlutil';
+import { DateUtil } from '../../utils/dateutil';
+import { AxiosUtil } from '../../utils/axiosutil';
+
+// 寮曞叆璇诲啓鏍稿績妯″潡
+
+
+/**
+ * 绯荤粺鐢ㄦ埛
+ */
+@Provide()
+export class RpcService extends BaseService {
+
+    @Inject('cool:cache')
+    coolCache: ICoolCache;
+
+    @Inject()
+    mysqlUtil: MysqlUtil;
+
+    rpc_url: "http://192.168.1.4:5000/api";
+
+    @Inject()
+    dateUtil: DateUtil;
+
+    @Inject()
+    axios: AxiosUtil;
+
+    /**
+   * 杩滅▼璋冪敤璁惧锛屽惎鍔ㄤ换鍔℃墽琛�
+   * @param query
+   */
+    async remoteCall(url, query) {
+        if (url == null) {
+            url = this.rpc_url;
+        }
+        let stattime = this.dateUtil.getCurretTimeStr()
+        console.log('---------------------------------------------send msg  to device-----------------------------------------')
+        console.log(query)
+        // let res = await this.axios.httpPostBuffer(url, query)
+        console.log('---------------------------------------receive the reply msg from device-----------------------------------')
+        this.axios.httpPostBuffer(url, query).then(res => {
+            console.log(res)
+            const bidsql = `insert into t_config_interface_record (interface_direct,start_time,end_time,request_type,createTime,remark,status,params,result) 
+                values ('${url}','${stattime}','${this.dateUtil.getCurretTimeStr()}','post',now(),'ok',200,'${JSON.stringify(query)}','${res}') `;
+            this.nativeQuery(bidsql);
+            return res
+        }).catch((error) => {
+            console.log(error)
+            return error
+        })
+
+    }
+
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     */
+    async getData(query) {
+        // const { keyWord, status, departmentIds = [] } = query;
+        // const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
+        //   this.ctx.admin.userId
+        // ); // 閮ㄩ棬鏉冮檺
+        const bidsql = `select * from t_sys_business_config where id_='${query.bid}' limit 0,1`;
+        const bid_obj_ = await this.nativeQuery(bidsql);
+        console.log(bid_obj_)
+        let sqlObj = this.mysqlUtil.create_sql(bid_obj_[0], query?.pageindex || null, query?.pagesize || null, query);
+        if (sqlObj?.status == 0) {
+            return sqlObj?.msg;
+        }
+        return this.nativeQuery(sqlObj?.sql, query);
+    }
+
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     */
+    async getDataByNative(query) {
+        // const { keyWord, status, departmentIds = [] } = query;
+        // const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
+        //   this.ctx.admin.userId
+        // ); // 閮ㄩ棬鏉冮檺
+        const bidsql = `select * from t_sys_business_config where id_='${query.bid}' limit 0,1`;
+        const bid_obj_ = await this.nativeQuery(bidsql);
+        console.log(bid_obj_)
+        let sqlObj = this.mysqlUtil.create_sql(bid_obj_[0], query?.pageindex || null, query?.pagesize || null, query);
+        if (sqlObj?.status == 0) {
+            return sqlObj?.msg;
+        }
+        return this.nativeQuery(sqlObj?.sql)
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     */
+    async updateData(query) {
+        // const { keyWord, status, departmentIds = [] } = query;
+        // const permsDepartmentArr = await this.baseSysPermsService.departmentIds(
+        //   this.ctx.admin.userId
+        // ); // 閮ㄩ棬鏉冮檺
+        const bidsql = `select * from t_sys_business_config where id_='${query.bid}' limit 0,1`;
+        const bid_obj_ = await this.nativeQuery(bidsql);
+        let sqlObj = this.mysqlUtil.create_sql(bid_obj_[0], query?.pageindex || null, query?.pagesize || null, query);
+        if (sqlObj?.status == 0) {
+            return sqlObj?.msg;
+        }
+        return this.sqlRenderPage(sqlObj?.sql, query);
+    }
+
+}
diff --git a/src/app/modules/base/utils/axiosutil.ts b/src/app/modules/base/utils/axiosutil.ts
new file mode 100644
index 0000000..046ee52
--- /dev/null
+++ b/src/app/modules/base/utils/axiosutil.ts
@@ -0,0 +1,56 @@
+import { Provide } from "@midwayjs/decorator"
+const axios = require('axios');
+
+/**
+ * 绯荤粺鐢ㄦ埛
+ */
+@Provide()
+export class AxiosUtil {
+
+    async httpGet(uri) {
+        console.log(uri);
+        axios.get(uri).then(response => {
+            console.log(response.data);
+            return response;
+        }).catch(error => {
+            console.log(error);
+            return error
+        });
+    }
+    
+    async httpPost(uri, postdata) {
+        // let data = {
+        //     name: 'John Doe',
+        //     job: 'Content Writer'
+        // };
+        axios.post(uri, postdata).then((res) => {
+            console.log(`Status: ${res.status}`);
+            console.log('Body: ', res.data);
+            return res;
+        }).catch((err) => {
+            console.error(err);
+            return err
+        });
+    }
+
+    async httpPostBuffer(uri,postdata) {
+        axios({
+            method: 'post',
+            url: uri,
+            data: postdata,
+            headers: {
+                'Content-Type': 'application/octet-stream', // 鍏抽敭
+            },
+        }).then(res => {
+            console.log(res)
+            return res
+        }).catch((error) => {
+            console.log(error)
+            return error
+        })
+    }
+
+
+
+}
+
diff --git a/src/app/modules/base/utils/dateutil.ts b/src/app/modules/base/utils/dateutil.ts
index b06330b..70b110b 100644
--- a/src/app/modules/base/utils/dateutil.ts
+++ b/src/app/modules/base/utils/dateutil.ts
@@ -6,7 +6,6 @@
 @Provide()
 export class DateUtil {
 
-    
     date_format(date_str, format) {
         // = 'YY-MM-DD hh:mm:ss'
         let date = new Date(date_str)
@@ -49,4 +48,9 @@
         return result
     }
 
+    getCurretTimeStr() {
+        let currtime = this.date_format(new Date(), 'YY-MM-DD hh:mm:ss')
+        return currtime
+    }
+
 }
diff --git a/src/app/modules/business/controller/admin/colletmeta.ts b/src/app/modules/business/controller/admin/colletmeta.ts
index a10b38c..813eb83 100644
--- a/src/app/modules/business/controller/admin/colletmeta.ts
+++ b/src/app/modules/business/controller/admin/colletmeta.ts
@@ -1,8 +1,10 @@
 import { ALL, Body, Get, Inject, Post, Provide, Query } from '@midwayjs/decorator';
 import { CoolController, BaseController } from '@cool-midway/core';
 import { Colletmeta } from '../../entity/colletmeta';
-// import { ColletmetaService } from '../../service/colletmeta';
+// import { ColletmetaService } from '../../service/';
 import { DataController } from '../../../base/controller/dataController';
+import { SocketHandler } from '../../../../../socket/socketHandle';
+import { RpcService } from '../../../base/service/dataapi/rpcservice';
 /**
         * 鐩戞祴鍏冩暟鎹�
         */
@@ -15,6 +17,22 @@
 export class ColletmetaController extends DataController {
   //  聽@Inject()
   //  聽colletmetaService: ColletmetaService;
+
+
+  @Inject()
+  socketHandler: SocketHandler
+
+  @Inject()
+  rpcService: RpcService
+
+  /**
+  * 鎺ユ敹璁惧鐩戞帶娑堟伅
+  */
+  @Post('/getDeviceMsg', { summary: '鎺ユ敹璁惧娑堟伅' })
+  async getDeviceMsg(@Query(ALL) params: any) {
+    this.dealMessage(params)
+    return this.ok();
+  }
 
   /**
   * 鑾峰緱鏁版嵁
@@ -30,4 +48,11 @@
   async postData(@Query(ALL) params: any) {
     return this.ok(await this.dataService.getData(params));
   }
+
+
+  async dealMessage(params: any) {
+    // this.socketHandler.connection
+    console.log(params);
+  }
+
 }
\ No newline at end of file
diff --git a/src/app/modules/business/controller/admin/taskimmediately.ts b/src/app/modules/business/controller/admin/taskimmediately.ts
index 1e9f008..7a50129 100644
--- a/src/app/modules/business/controller/admin/taskimmediately.ts
+++ b/src/app/modules/business/controller/admin/taskimmediately.ts
@@ -1,20 +1,61 @@
 import { ALL, Body, Get, Inject, Post, Provide, Query } from '@midwayjs/decorator';
 import { CoolController, BaseController } from '@cool-midway/core';
 import { Taskimmediately } from '../../entity/taskimmediately';
-// import { TaskimmediatelyService } from '../../service/taskimmediately';
+import { TaskimmediatelyService } from '../../../business/service/taskimmediately';
 import { DataController } from '../../../base/controller/dataController';
+import { SocketHandler } from '../../../../../socket/socketHandle';
+import { RpcService } from '../../../base/service/dataapi/rpcservice';
+import { randomUUID } from 'crypto';
+
+const ProtoBufJs = require("protobufjs");
+const root = ProtoBufJs.loadSync("D:/21-dljc/road-env-server/server/models/aerial.proto");
+const CommandMessage = root.lookupType("CommandMessage");
+const command_req = CommandMessage.create();
+// const SYScommand = root.lookupType("SysCommand");
+// const SUBcommand = root.lookupType("SubCommand");
+
 /**
         * 鍗虫椂浠诲姟璁板綍
         */
 @Provide()
 @CoolController({
-  api: ['add', 'delete', 'update', 'list', 'page', 'info'],
+  api: ['delete', 'update', 'list', 'page', 'info'],
   entity: Taskimmediately,
-  //  聽service: TaskimmediatelyService,
+  // service: TaskimmediatelyService,
 })
 export class TaskimmediatelyController extends DataController {
-  //  聽@Inject()
-  //  聽taskimmediatelyService: TaskimmediatelyService;
+
+  @Inject()
+  taskimmediatelyService: TaskimmediatelyService;
+
+  @Inject()
+  socketHandler: SocketHandler
+
+  @Inject()
+  rpcService: RpcService
+
+  private colletServiceUrl = "http://192.168.1.4:5000/api";
+
+  /**
+  * 涓嬪彂璁惧鎸囦护娑堟伅
+  */
+  @Post('/sendMsgToDevice', { summary: '涓嬪彂璁惧鎸囦护娑堟伅' })
+  async sendMsgToDevice(@Query(ALL) params: any) {
+
+    console.log(params);
+    return this.ok(await this.rpcService.remoteCall(this.colletServiceUrl, this.createCommand(params)))
+  }
+
+  /**
+  * 涓嬪彂璁惧鎸囦护娑堟伅
+  */
+   @Get('/sendMsgToDevice', { summary: '涓嬪彂璁惧鎸囦护娑堟伅' })
+   async sendMsg2Device(@Query(ALL) params: any) {
+     // this.socketHandler.connection
+     console.log(params);
+     return this.ok(await this.rpcService.remoteCall(this.colletServiceUrl, this.createCommand(params)))
+     // this.rpcService.remoteCall("http://192.168.1.4:5000/api", params);
+   }
 
   /**
   * 鑾峰緱鏁版嵁
@@ -30,4 +71,29 @@
   async postData(@Query(ALL) params: any) {
     return this.ok(await this.dataService.getData(params));
   }
+
+  createCommand(params: any) {
+
+    command_req.source = "testcommand"
+    command_req.generatetime = "2"
+    command_req.syscommand = root.SysCommand.CAMERA_COMMAND
+    command_req.subcommand = root.SubCommand.ONE_TIME_CAPTURE
+    command_req.targetclient = "bunker0.block0.device0"
+    command_req.returnserver = "server0"
+    command_req.taskuuid = randomUUID()
+    console.log(JSON.stringify(command_req))
+
+    // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
+    let errMsg = CommandMessage.verify(command_req);
+    if (errMsg)
+      throw Error(errMsg);
+
+    // let buffer = Buffer.from(command_req)
+    let buffer_ = CommandMessage.encode(command_req).finish();
+    // let msg_ = CommandMessage.decode(buffer_);
+    return buffer_;
+
+  }
+
+
 }
\ No newline at end of file
diff --git a/src/app/modules/business/controller/admin/taskmonitor.ts b/src/app/modules/business/controller/admin/taskmonitor.ts
index 63e6f79..6f26494 100644
--- a/src/app/modules/business/controller/admin/taskmonitor.ts
+++ b/src/app/modules/business/controller/admin/taskmonitor.ts
@@ -3,6 +3,8 @@
 import { Taskmonitor } from '../../entity/taskmonitor';
 // import { TaskmonitorService } from '../../service/taskmonitor';
 import { DataController } from '../../../base/controller/dataController';
+import { SocketHandler } from '../../../../../socket/socketHandle';
+import { RpcService } from '../../../base/service/dataapi/rpcservice';
 /**
         * 鐩戞祴浠诲姟
         */
@@ -10,17 +12,39 @@
 @CoolController({
   api: ['add', 'delete', 'update', 'list', 'page', 'info'],
   entity: Taskmonitor,
+  service: RpcService,
   //  聽service: TaskmonitorService,
 })
 export class TaskmonitorController extends DataController {
   //  聽@Inject()
   //  聽taskmonitorService: TaskmonitorService;
 
+  @Inject()
+  socketHandler: SocketHandler
+
+  @Inject()
+  rpcService: RpcService
+
+
+
+  /**
+  * 浠诲姟涓嬪彂
+  */
+  @Get('/add', { summary: '涓嬪彂浠诲姟' })
+  async add(@Query(ALL) params: any) {  // 杩欎釜io瀵硅薄瀵瑰簲 SocketHandler鐨勫懡鍚嶇┖闂�
+    // this.socketHandler.connection
+    this.socketHandler.clients.get("").emit('device is offline');
+    this.rpcService.remoteCall(null,"");
+    
+  }
+
   /**
   * 鑾峰緱鏁版嵁
   */
   @Get('/getdata', { summary: '鏁版嵁鎺ュ彛' })
-  async getData(@Query(ALL) params: any) {
+  async getData(@Query(ALL) params: any) {  // 杩欎釜io瀵硅薄瀵瑰簲 SocketHandler鐨勫懡鍚嶇┖闂�
+    // this.socketHandler.connection
+    this.socketHandler.clients.get("").emit('device is offline');
     return this.ok(await this.dataService.getData(params));
   }
   /**
@@ -30,4 +54,8 @@
   async postData(@Query(ALL) params: any) {
     return this.ok(await this.dataService.getData(params));
   }
+
+
+
+
 }
\ No newline at end of file
diff --git a/src/app/modules/business/entity/periodicsetting.ts b/src/app/modules/business/entity/periodicsetting.ts
index dce098f..a5b8c25 100644
--- a/src/app/modules/business/entity/periodicsetting.ts
+++ b/src/app/modules/business/entity/periodicsetting.ts
@@ -9,6 +9,9 @@
   @Column({ comment: '鍛ㄦ湡浠诲姟', type: 'varchar', default: '', length: 255 })
   crontab_rule: string;
 
+  @Column({ comment: '浠诲姟寮�濮嬫椂闂�', type: 'datetime' })
+  start_time: Date;
+
   @Column({ comment: '浠诲姟缁撴潫鏃堕棿', type: 'datetime' })
   end_time: Date;
 
diff --git a/src/app/modules/business/service/taskimmediately.ts b/src/app/modules/business/service/taskimmediately.ts
new file mode 100644
index 0000000..13427aa
--- /dev/null
+++ b/src/app/modules/business/service/taskimmediately.ts
@@ -0,0 +1,51 @@
+import { Provide } from '@midwayjs/decorator';
+import { BaseService } from '@cool-midway/core';
+import { InjectEntityModel } from '@midwayjs/orm';
+import { Repository } from 'typeorm';
+import { Basedeviceinfo } from '../entity/basedeviceinfo';
+import { Devicegroup } from '../entity/devicegroup';
+
+/**
+ * 鎻忚堪
+ */
+@Provide()
+export class TaskimmediatelyService extends BaseService {
+  @InjectEntityModel(Basedeviceinfo)
+  Basedeviceinfo: Repository<Basedeviceinfo>;
+  @InjectEntityModel(Devicegroup)
+  Devicegroup: Repository<Devicegroup>;
+
+  /**
+   * 鎻忚堪
+   */
+  // async add(param: any) {
+  //   console.log(param, "dddddddd")
+  //   const { logic_id } = param
+  //   const devicegroup = this.Devicegroup
+  //   await this.Devicegroup.insert(param)
+  //   return await super.add(param)
+  // }
+
+
+  async delete(logic_id: any) {
+    console.log(this.ctx, "ddd")
+    await this.nativeQuery(
+      'DELETE t_base_deviceinfo,t_base_device_group FROM t_base_deviceinfo,t_base_device_group WHERE t_base_deviceinfo.logic_id = t_base_device_group.logic_id AND t_base_deviceinfo.id in (?)',
+      [logic_id]
+    );
+    await this.Basedeviceinfo.delete(logic_id)
+
+  }
+
+
+  async page(query) {
+
+    // const { keyWord, status, departmentIds = [] } = query;
+    // const permsDepartmentArr = await this.Basedeviceinfo.id(
+    //   this.ctx.admin.userId
+    // ); // 閮ㄩ棬鏉冮檺
+    const sql = `
+        SELECT a.*,b.configurator FROM t_base_deviceinfo a,t_base_device_group b WHERE 1 = 1`;
+    return this.sqlRenderPage(sql, query);
+  }
+}
diff --git a/src/config/config.default.ts b/src/config/config.default.ts
index c9c4d15..909f250 100644
--- a/src/config/config.default.ts
+++ b/src/config/config.default.ts
@@ -74,8 +74,21 @@
     // 鏂囦欢涓婁紶
     file: {
       // 鏂囦欢璺緞鍓嶇紑 鏈湴涓婁紶妯″紡涓� 鏈夋晥
-      // domain: 'http://127.0.0.1:8001',
-      domain: 'http://112.74.77.127:9100/hn',
+      domain: 'http://127.0.0.1:8001',
+    },
+    // redis涓烘彃浠跺悕绉�
+    redis: {
+      host: "127.0.0.1",
+      password: "",
+      port: 6379,
+      db: 0
+    },
+    socket: {
+      cors: {
+        // 杩欓噷鍙互鍐欏叿浣撶殑鍦板潃濡傦細http://127.0.0.1:8080
+        origin: '*',
+        methods: ['GET', 'POST'],
+      },
     },
   } as CoolConfig;
 
diff --git a/src/configuration.ts b/src/configuration.ts
index ed46ab5..d178fd0 100644
--- a/src/configuration.ts
+++ b/src/configuration.ts
@@ -7,12 +7,14 @@
 import * as swagger from '@midwayjs/swagger';
 // import * as wxpay from '@cool-midway/wxpay';
 // import * as oss from '@cool-midway/oss';
-// import * as redis from '@cool-midway/redis';
-// import * as queue from '@cool-midway/queue';
+import * as redis from '@cool-midway/redis';
+import * as queue from '@cool-midway/queue';
 // import * as alipay from '@cool-midway/alipay';
-// import * as socket from '@cool-midway/socket';
+import * as socket from '@cool-midway/socket';
 
 @Configuration({
+
+
   // 娉ㄦ剰缁勪欢椤哄簭 cool 鏈変緷璧杘rm缁勪欢锛� 鎵�浠ュ繀椤绘斁鍦紝orm缁勪欢涔嬪悗 cool鐨勫叾浠栫粍浠跺繀椤绘斁鍦╟ool 鏍稿績缁勪欢涔嬪悗
   imports: [
     // 妯℃澘娓叉煋
@@ -29,15 +31,15 @@
     // oss鎻掍欢锛岄渶瑕佸埌鍚庡彴閰嶇疆涔嬪悗鎵嶆湁鐢紝榛樿鏄湰鍦颁笂浼�
     // oss,
     // 灏嗙紦瀛樻浛鎹㈡垚redis
-    // redis,
-    // // 闃熷垪
-    // queue,
+    redis,
+    // 闃熷垪
+    queue,
     // 寰俊鏀粯
     //wxpay,
     // 鏀粯瀹濇敮浠�
     // alipay,
     // socket
-    //socket,
+    socket,
     // file,
   ],
 })
diff --git a/src/schedule/aerial.proto b/src/schedule/aerial.proto
new file mode 100644
index 0000000..94a99db
--- /dev/null
+++ b/src/schedule/aerial.proto
@@ -0,0 +1,294 @@
+syntax = "proto3";
+
+// enum SysCommand {
+//   UNKOWN_COMMAND     = 0;   // 鏈煡鍛戒护
+//   SYS_COMMAND        = 1;   // 绯荤粺鍛戒护
+//   SENSOR_COMMAND     = 2;   // 浼犳劅鍣ㄥ懡浠�
+//   FIVE_G_COMMAND     = 3;   // 閫氳5G妯″潡鍛戒护
+//   CAMERA_COMMAND     = 4;   // 鎽勫儚澶村弬鏁板懡浠�
+//   IO_COMMAND         = 5;   // 澶栬IO鍙f搷浣滃懡浠�
+//   SYS_PARAMS_COMMAND = 6;   // 绯荤粺鍙傛暟鑾峰彇
+//   WIFI_COMMAND       = 7;   // 璁惧WIFI鍙傛暟璁剧疆
+//   KERNEL_COMMAND     = 8;   // 鏍稿績璁$畻鍙傛暟璁�
+//   DEVICE_COMMAND     = 9;   // 宸ヤ綔璁惧鍙傛暟璁剧疆
+//   MICRO_WAVE_COMMAND = 10;  // 姣背娉�
+// }
+
+// enum SubCommand {
+//   option allow_alias = true;
+   
+//   UNKOWN_SUB_COMMAND   = 0;                   // 鏈煡瀛愬懡浠�
+
+//   // 绯荤粺鍛戒护
+//   POWER_ON_SUB_COMMAND = 1;                   // 寮�鏈�
+//   POWER_OFF_SUB_COMMAND = 2;                  // 鍏虫満
+
+//   // 浼犳劅鍣ㄥ懡浠�
+//   SENSOR_INIT_SUB_COMMAND = 1;                // 浼犳劅鍣ㄥ垵濮嬪寲
+//   SENSOR_REQURE_SUB_COMMAND = 2;              // 浼犳劅鍣ㄥ弬鏁拌幏鍙�
+//   RTK_SETTING_SUB_COMMAND = 3;                // RTK澶栬鍙傛暟璁剧疆
+//   RTK_REQURE_SUB_COMMAND = 4;                 // RTK澶栬鏁版嵁鑾峰彇
+
+//   // 閫氳5G妯″潡鍛戒护
+//   FIVE_G_INIT_SUB_COMMAND = 1;                // 5G妯″潡鍙傛暟鍒濆鍖�
+//   FIVE_G_SEND_IMAGE_SUB_COMMAND = 2;          // 5G閫氳鍥惧儚鏁版嵁鍙戦��
+//   FIVE_G_REQURE_SUB_COMMAND = 3;              // 5G閫氳鎺ユ敹
+
+//   // 鎽勫儚澶村弬鏁板懡浠�
+//   CAMERA_NUMBER_SUB_COMMAND = 1;              // 璁惧鎽勫儚澶翠釜鏁�  
+//   CAMERA_RESOLUTION_SUB_COMMAND = 2;          // 璁惧鎽勫儚澶村伐浣滃垎杈ㄧ巼
+//   CAMERA_FRAME_RATE_SUB_COMMAND = 3;          // 鎽勫儚澶村伐浣滃抚鐜�
+//   CAMERA_OTHER_PARAMS_SUB_COMMAND = 4;        // 鎽勫儚澶村伐浣滃叾浠栧弬鏁�
+
+//   // 澶栬IO鍙f搷浣滃懡浠�
+//   CAMERA_DUST_REMOVAL_START_SUB_COMMAND = 1;  // 鎽勫儚澶撮櫎灏樺惎鍔�
+//   CAMERA_CONTROL_START_SUB_COMMAND = 2;       // 澶栬鎺у埗鏁版嵁鍚姩锛�18璺帶鍒讹級
+
+//   // 绯荤粺鍙傛暟鑾峰彇
+//   CPU_FREQUENCY_SUB_COMMAND = 1;              // CPU涓婚宸ヤ綔鏁版嵁
+//   CPU_KERNAL_TEMP_SUB_COMMAND = 2;            // CPU鏍稿績娓╁害鏁版嵁
+//   CPU_BETTERY_DATA_SUB_COMMAND = 3;           // 鐢垫睜渚涚數鐢甸噺鏁版嵁
+
+//   // 璁惧WIFI鍙傛暟璁剧疆
+//   WIFI_HOTSPOT_SETTING_SUB_COMMAND = 1;       // WIFI鐑偣璁剧疆
+//   WIFI_HOTSPOT_START_STOP_SUB_COMMAND = 2;    // WIFI鐑偣寮�鍚拰鍏抽棴
+
+//   // 鏍稿績璁$畻鍙傛暟璁剧疆
+//   POINT_CLOUD_ACCURACY_SUB_COMMAND = 1;       // 鐐逛簯璁$畻绮惧害
+//   SPLICING_PARAMS_SUB_COMMAND = 2;            // 鎷兼帴鍙傛暟
+//   MAP_INTERFACE_PLATFORM_SUB_COMMAND = 3;     // 鍦板浘鎺ュ彛骞冲彴
+//   DATA_STORE_BACKUP_SUB_COMMAND = 4;          // 鏁版嵁瀛樺偍澶囦唤
+
+//   // 宸ヤ綔璁惧鍙傛暟璁剧疆
+//   SYSTEM_TIMER_SUB_COMMAND = 1;               // 绯荤粺宸ヤ綔瀹氭椂
+//   SYSTEM_COORD_HEIGHT_SUB_COMMAND = 2;        // 宸ヤ綔鍖哄煙鍧愭爣涓庨珮搴�
+//   TRIGGER_CONDITION_SUB_COMMAND = 3;          // 宸ヤ綔瑙﹀彂鏉′欢
+//   GRAVITY_FAILURE_SUB_COMMAND = 4;            // 閲嶅姏鍔犻�熷害澶辨晥鍙傛暟
+//   NINE_AXIS_FAILURE_SUB_COMMAND = 5;          // 涔濊酱鍔犻�熷害澶辨晥鍙傛暟
+
+//   // 姣背娉�
+//   MICRO_WAVE_SUB_COMMAND = 1;                 // 姣背娉�
+// }
+
+// message DataField {
+//   int32 length = 1;                           // 鏁版嵁闀垮害
+//   bytes data = 2;                            // 鏁版嵁鍐呭
+//   int32 checksum = 3;                        // 鏍¢獙鐮�
+// }
+
+// message CapturedData {
+//   int64 capture_time = 1;                     // 閲囬泦鏃堕棿
+//   string capture_device =2;                   // 閲囬泦璁惧
+//   int32 capture_port = 3;                     // 閲囬泦璁惧搴忓彿
+//   DataField DataField = 4;
+//   string data_type = 5;                         // 鏁版嵁绫诲瀷 image udp
+// }
+
+// message DataMessage{
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CapturedData CapturedData = 5;
+// }
+
+// message StateData {
+//  int64 state_time = 1;
+//  string state_device = 2;
+//  DataField DataField = 4;
+// }
+
+// message StateMessage {
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CapturedData StatedData = 5;
+// }
+
+// message CommandData {
+//   SysCommand SysCommand = 1;
+//   SubCommand SubCommand = 2;
+// }
+
+// message CommandMessage {
+//   int64 sending_time = 1;
+//   string sending_device = 2;
+//   string target_device = 3;
+//   CommandData CommandData =4;
+// }
+
+enum SysCommand{
+  UNKOWN_COMMAND     = 0;
+  CAMERA_COMMAND     = 1;
+  MICROWAVE_COMMAND   = 2;
+  DUSTCLEANER_COMMAND   = 3;
+
+}
+
+enum SubCommand{
+  UNKOWN_SUBCOMMAND     = 0;
+
+  // camera params
+  ONE_TIME_CAPTURE      = 1;
+
+  // microwave params
+  ONE_CIRCLE_SCAN       = 2;
+
+  // dust cleaner params
+  ONE_CLEAN_SCAN        = 4;
+
+}
+
+
+message CommandMessage{
+  string source = 1;
+  string generatetime = 2;
+  SysCommand syscommand = 3;
+  SubCommand subcommand = 4;
+  string targetclient = 5;
+  string returnserver = 6;
+  string taskuuid = 7;
+}
+
+message LogsMessage{
+  string source = 1;
+  string timestamp = 2;
+  string context = 3;
+  optional string task_uuid = 4;
+}
+
+
+message ImagesMessage
+{
+  string source = 1;
+  string timestamp = 2;
+
+  message ImageItems
+  {
+    int32 length = 1;                           // 鏁版嵁闀垮害
+    bytes data = 2;                            // 鏁版嵁鍐呭 
+  }
+
+  repeated ImageItems Image = 3;
+  optional string task_uuid = 4;
+}
+
+
+
+message PlysMessage
+{
+  string source = 1;
+  string timestamp = 2;
+
+  message PointCloudItem
+  {
+    int32 length = 1;
+    int32 rows = 2;
+    int32 cols = 3;
+    string order = 4;
+    string dtype = 5;
+    bytes data = 6;
+    
+  }
+
+  repeated PointCloudItem Plydata = 3;
+  optional string task_uuid = 4;
+
+  // enum ref_system
+  // {
+  //   MICROWAVE_SYSTEM = 0;
+  //   DEVICE_SYSTEM = 1;
+  // }
+
+  // ref_system reference = 4
+}
+
+
+
+
+
+
+
+// message MicroWaveMessage
+// {
+//   int32 length = 1;                           // 鏁版嵁闀垮害
+//   bytes data = 2;                            // 鏁版嵁鍐呭
+// }
+
+// message CommandRequest{
+
+// }
+
+// message StateMessage{
+//   string message_type = 1;
+//   int64 generate_time = 2;
+//   string generate_device = 3;
+//   string target_device = 4;
+//   string message_uuid = 5;
+//   string str_body = 6;
+// }
+
+
+
+
+
+
+// message RequestCommand {
+//   int32 sync_word = 1;              // 鍚屾瀛�
+//   string device_id = 2;             // 璁惧ID
+//   SysCommand sys_command = 3;       // 鍛戒护1
+//   SubCommand sub_command = 4;       // 鍛戒护2
+//   DataField data1 = 5;              // 鏁版嵁1
+//   DataField data2 = 6;              // 鏁版嵁2
+//   int32 checksum = 7;               // 鏍¢獙鐮�
+// }
+
+// enum ResponseState
+// {
+//   SUCCESS = 0;                  // 鎴愬姛
+//   FAILURE = 1;                  // 澶辫触
+//   ABNORMAL = 2;                 // 寮傚父
+//   INFICIENT_POWER = 3;          // 鐢甸噺涓嶈冻
+//   OTHER = 4;                    // 鍏朵粬
+// }
+
+// message ResponseCommand
+// {
+//     string device_id = 1;        // 璁惧ID
+//     SysCommand sys_command = 2;  // 鍛戒护1
+//     SubCommand sub_command = 3;  // 鍛戒护2
+//     ResponseState state = 4;     // 鍝嶅簲鐘舵��
+//     int32 data_length = 5;       // 鏁版嵁闀垮害
+//     bytes data = 6;              // 鏁版嵁
+//     int32 checksum = 7;          // 鏍¢獙鐮�
+// }
+
+
+// // 鏈嶅姟绔悜閲囬泦绔彂閫佺殑涓绘寚浠�
+// enum ControlSysCommand {
+//   DUST_CLEANER_COMMAND = 0;
+// }
+
+// // 鏈嶅姟绔悜閲囬泦绔彂閫佺殑瀛愬懡浠�
+// enum ControlSubCommand {
+//   // dust cleaner sub commands
+//   DUST_CLEANER_ONETIME_CLEAN_SELF         = 0;
+//   DUST_CLEANER_ONETIME_CLEAN_CAMERA       = 1;
+//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_SELF    = 2;
+//   DUST_CLEANER_CLOSE_PERIOD_CLEAN_CAMERA  = 3;
+//   DUST_CLEANER_PERIOD_CLEAN_SELF          = 4;
+//   DUST_CLEANER_PERIOD_CLEAN_CAMERA        = 5;
+// }
+
+// // dust cleaner command message
+// message DustCleanerMessage  {
+//   uint32 period = 1;
+// }
+
+// // 鎺у埗涓婁綅鏈烘秷鎭�
+// message ControllMessage {
+//   int32 sync_word = 1;                // 鍚屾瀛�
+//   ControlSysCommand sys_command = 3;  // 涓诲懡浠�
+//   ControlSubCommand sub_command = 4;  // 瀛愬懡浠�
+//   DataField data = 5;                 // 鏁版嵁
+//   int32 checksum = 7;                 // 鏍¢獙鐮�
+// }
diff --git a/src/schedule/helloCorn b/src/schedule/helloCorn
new file mode 100644
index 0000000..b006a14
--- /dev/null
+++ b/src/schedule/helloCorn
@@ -0,0 +1,19 @@
+import { Provide, Inject, Schedule, CommonSchedule } from '@midwayjs/decorator';
+import { Context } from 'egg';
+
+@Provide()
+@Schedule({
+  interval: 2333, // 2.333s 闂撮殧
+  type: 'worker', // 鎸囧畾鏌愪竴涓� worker 鎵ц
+  //cron: '0 0 */3 * * *',
+})
+export class HelloCron implements CommonSchedule {
+  
+  @Inject()
+  ctx: Context;
+
+  // 瀹氭椂鎵ц鐨勫叿浣撲换鍔�
+  async exec() {
+    this.ctx.logger.info(process.pid, 'hello');
+  }
+}
\ No newline at end of file
diff --git a/src/schedule/taskSchedule.js b/src/schedule/taskSchedule.js
new file mode 100644
index 0000000..833fc11
--- /dev/null
+++ b/src/schedule/taskSchedule.js
@@ -0,0 +1,181 @@
+const schedule = require('node-schedule');
+const axios = require('axios');
+
+const ProtoBufJs = require("protobufjs");
+const root = ProtoBufJs.loadSync("D:/22-hn3d/hn3d/src/schedule/aerial.proto");
+const CommandMessage = root.lookupType("CommandMessage");
+const command_req = CommandMessage.create();
+var jsonData = '';//瀛樺偍澶╂皵淇℃伅
+// 瀹氫箟瑙勫垯
+let rule = new schedule.RecurrenceRule();
+// rule.minute = [1,6,11,16,21,26,31,36,41,46,51,56]
+rule.second = [58]; // 姣忛殧 10 绉掓墽琛屼竴娆�
+
+let rule_task = new schedule.RecurrenceRule();
+// rule.minute = [1,6,11,16,21,26,31,36,41,46,51,56]
+rule_task.second = [00]; // 姣忛殧 10 绉掓墽琛屼竴娆�
+
+var periodTasklist = []
+
+var payload = { source: "AwesomeString", syscommand: 1, subcommand: 2, generatetime: "2", targetclient:"111",returnserver:"#server#", taskuuid:"1234" };
+
+// Verify the payload if necessary (i.e. when possibly incomplete or invalid)
+var errMsg = CommandMessage.verify(payload);
+if (errMsg)
+    throw Error(errMsg);
+
+// Create a new message
+var message = CommandMessage.create(payload); // or use .fromObject if conversion is necessary
+
+// let buffer = Buffer.from(command_req)
+// let buffer = CommandMessage.encode(message).finish();
+// let msg = CommandMessage.decode(buffer);
+
+
+module.exports = {
+    async job_() {
+        // schedule.scheduleJob('5 * * * * *', async () => {
+
+        // });
+    },
+
+};
+
+schedule.scheduleJob(rule_task, async () => {//姣忓垎閽熻鍙栧懆鏈熶换鍔� 骞跺皢浠诲姟鍒嗚В鎵ц
+    // let res = httpGet('http://127.0.0.1:8001/admin/business/periodicsetting/getdata?bid=getPeriodTaskList');
+    axios.get('http://127.0.0.1:8001/admin/business/periodicsetting/getdata?bid=getPeriodTaskList').then(response => {
+        periodTasklist = response.data.data;
+        console.log(periodTasklist)
+    }).catch(error => {
+        console.log(error);
+    });
+});
+
+schedule.scheduleJob(rule, async () => {//姣忓垎閽熻鍙栧懆鏈熶换鍔� 骞跺皢浠诲姟鍒嗚В鎵ц
+    //http://192.168.1.4:5000/api
+    // Exemplary payload
+    var payload = { source: "AwesomeString", syscommand: 1, subcommand: 2, generatetime: "2", targetclient:"111",returnserver:"#server#", taskuuid:"1234" };
+
+    // Verify the payload if necessary (i.e. when possibly incomplete or invalid)
+    var errMsg = CommandMessage.verify(payload);
+    if (errMsg)
+        throw Error(errMsg);
+
+    // Create a new message
+    var message = CommandMessage.create(payload); // or use .fromObject if conversion is necessary
+    
+    // let buffer = Buffer.from(command_req)
+    let buffer = CommandMessage.encode(message).finish();
+    let msg = CommandMessage.decode(buffer);
+    console.log('-------step in-------------------------')
+    let urlstr = "http://192.168.1.4:5000/api";
+    axios({
+        method: 'post',
+        url: urlstr,
+        data: buffer,
+        headers: {
+            'Content-Type': 'application/octet-stream', // 鍏抽敭
+        },
+    }).then(res => {
+        console.log(res)
+    }).catch((error) => {
+        console.log(error)
+    })
+
+
+    console.log('-----step over------------------------------------------------')
+
+});
+
+
+
+// schedule.scheduleJob(rule, async () => {//姣忓皬鏃跺畾鏃跺彇澶╂皵鏁版嵁
+//     //https://devapi.heweather.net/v7/weather/now?location=101021700&key=495b433d21c84986a99c4ac52d42fd3b
+//     // 1. 妫�娴嬪綋鍓嶆槸鍚﹀凡鏈夊ぉ姘旀暟鎹�
+//     let sqlstr = `select count(1) as counter from t_d_weather_hour where TO_DAYS(now())=TO_DAYS(posttime) and HOUR(now())=hour(posttime) and posttime> date_sub(now(), interval 1 hour)`;
+//     let lastdata_times = await mysql.query_data(sqlstr, 'master', null);
+//     if( lastdata_times[0].counter > 0 ) { return ;}
+//     // 2.鑻ュ綋鍓嶆棤澶╂皵鏁版嵁锛岄噸鏂版姄鍙�
+//     let urlstr = "https://devapi.heweather.net/v7/weather/now?location=location_code&key=495b433d21c84986a99c4ac52d42fd3b";
+//     sqlstr = `select * from t_s_weather_city order by code`;
+//     let data_rets = await mysql.query_data(sqlstr, 'master', null)
+//     for (let index = 0; index < data_rets.length; index++) {
+//         let element = data_rets[index];
+//         axios.get(urlstr.replace('location_code', element.code)).then(response => {
+//             if(response.data.now) {
+//                 let w = response.data.now;
+//                 let posttime_ = w.obsTime.replace('T',' ').substr(0,13)+ ':00:00';
+//                 let sql_ = `insert into t_d_weather_hour (type,citycode,cityname,posttime,temp,feelsLike,icon,text,wind360,windDir,windScale,windSpeed,humidity,precip,pressure,vis,cloud,dew,responsedata) 
+//                     values ('${element.type}','${element.code}','${element.name}','${posttime_}','${w.temp}','${w.feelsLike}','${w.icon}','${w.text}','${w.wind360}',
+//                     '${w.windDir}','${w.windScale}','${w.windSpeed}','${w.humidity}','${w.precip}','${w.pressure}','${w.vis}','${w.cloud}','${w.dew}','${JSON.stringify(response.data)}'
+//                 )`;
+//                 mysql.query_data(sql_, 'master', null)
+//             }
+//         }).catch(error => {
+//             console.log(error);
+//         });
+//     }
+
+// });
+
+
+// schedule.scheduleJob(rule, async () => {//姣忓ぉ瀹氭椂鏇存柊澶╂皵鏁版嵁
+//     //https://devapi.qweather.com/v7/weather/3d?location=101021700&key=495b433d21c84986a99c4ac52d42fd3b
+//     // 1. 妫�娴嬪綋鍓嶆槸鍚﹀凡鏈夊ぉ姘旀暟鎹�
+//     let sqlstr = `select count(1) as counter from t_d_weather_day where TO_DAYS(now())=TO_DAYS(posttime)`;
+//     let lastdata_times = await mysql.query_data(sqlstr, 'master', null);
+//     if( lastdata_times[0].counter > 0 ) { return ;}
+//     // 2.鑻ュ綋鍓嶆棤澶╂皵鏁版嵁锛岄噸鏂版姄鍙�
+//     let urlstr = "https://devapi.qweather.com/v7/weather/3d?location=location_code&key=495b433d21c84986a99c4ac52d42fd3b";
+//     sqlstr = `select * from t_s_weather_city order by code`;
+//     let data_rets = await mysql.query_data(sqlstr, 'master', null)
+//     for (let index = 0; index < data_rets.length; index++) {
+//         let element = data_rets[index];
+//         axios.get(urlstr.replace('location_code', element.code)).then(response => {
+//             if(response.data.daily) {
+//                 let w = response.data.daily[0];
+//                 let posttime_ = w.fxDate+ ' 00:00:00';
+//                 let sql_ = `insert into t_d_weather_day (type,citycode,cityname,posttime,iconNight,iconDay,humidity,precip,pressure,vis,cloud,
+//                     moonPhase,moonPhaseIcon,moonrise,moonset,sunrise,sunset,tempMax,tempMin,textDay,textNight,uvIndex,
+//                     wind360Day,windDirDay,wind360Night,windDirNight,windScaleDay,windScaleNight,windSpeedDay,windSpeedNight,responsedata) 
+//                     values ('${element.type}','${element.code}','${element.name}','${posttime_}','${w.iconNight}','${w.iconDay}','${w.humidity}','${w.precip}','${w.pressure}','${w.vis}',
+//                     '${w.cloud}','${w.moonPhase}','${w.moonPhaseIcon}','${w.moonrise}','${w.moonset}','${w.sunrise}','${w.sunset}','${w.tempMax}','${w.tempMin}','${w.textDay}','${w.textNight}','${w.uvIndex}',
+//                     '${w.wind360Day}','${w.windDirDay}','${w.wind360Night}','${w.windDirNight}','${w.windScaleDay}','${w.windScaleNight}','${w.windSpeedDay}','${w.windSpeedNight}',
+//                     '${JSON.stringify(response.data)}'
+//                 )`;
+//                 mysql.query_data(sql_, 'master', null)
+//             }
+//         }).catch(error => {
+//             console.log(error);
+//         });
+//     }
+
+// });
+
+
+//  https://devapi.heweather.net/v7/weather/now?location=101021700&key=495b433d21c84986a99c4ac52d42fd3b
+
+
+function httpGet(uri) {
+    console.log(uri);
+    axios.get(uri).then(response => {
+        console.log(response.data);
+        return response.data;
+    }).catch(error => {
+        console.log(error);
+    });
+}
+
+function httpPost(uri, postdata) {
+    // let data = {
+    //     name: 'John Doe',
+    //     job: 'Content Writer'
+    // };
+    axios.post(uri, postdata).then((res) => {
+        return res.data;
+        console.log(`Status: ${res.status}`);
+        console.log('Body: ', res.data);
+    }).catch((err) => {
+        console.error(err);
+    });
+}
\ No newline at end of file
diff --git a/src/socket/chatUser.ts b/src/socket/chatUser.ts
new file mode 100644
index 0000000..9136b4e
--- /dev/null
+++ b/src/socket/chatUser.ts
@@ -0,0 +1,32 @@
+import { EntityModel } from '@midwayjs/orm';
+import { BaseEntity } from '@cool-midway/core';
+import { Column, Index } from 'typeorm';
+
+/**
+ * 绯荤粺鏃ュ織
+ */
+@EntityModel('t_sys_user_chat')
+export class ChatUserEntity extends BaseEntity {
+  @Index()
+  @Column({ comment: '鐢ㄦ埛ID', nullable: true, type: 'bigint' })
+  userId: number;
+
+  @Index()
+  @Column({ comment: '琛屼负', length: 100 })
+  action: string;
+
+  @Index()
+  @Column({ comment: '鍐呭', length: 100 })
+  chatmsg: string;
+
+  @Index()
+  @Column({ comment: 'ip', nullable: true, length: 50 })
+  ip: string;
+
+  @Index()
+  @Column({ comment: 'ip鍦板潃', nullable: true, length: 50 })
+  ipAddr: string;
+
+  @Column({ comment: '鍙傛暟', nullable: true, type: 'text' })
+  params: string;
+}
diff --git a/src/socket/socketHandle.ts b/src/socket/socketHandle.ts
new file mode 100644
index 0000000..c9161d5
--- /dev/null
+++ b/src/socket/socketHandle.ts
@@ -0,0 +1,85 @@
+import { Config, Provide, Scope, ScopeEnum } from '@midwayjs/decorator';
+import { InjectEntityModel } from '@midwayjs/orm';
+import { CoolSocket, SocketEnvent } from '@cool-midway/socket';
+import { Socket } from 'socket.io';
+// import { ChatUserEntity } from '../entity/user';
+import { Repository } from 'typeorm';
+
+import * as jwt from 'jsonwebtoken';
+
+/**
+ * socket鐨勪簨浠�
+ */
+@Provide()
+@Scope(ScopeEnum.Singleton)
+@CoolSocket() // 鏀寔璁剧疆鍛藉悕绌洪棿 濡傦細@CoolSocket('/test') 
+export class SocketHandler {
+  // 鑾峰緱妯″潡鐨勯厤缃俊鎭�
+  @Config('module.chat.jwt')
+  jwtConfig;
+
+  public clients: Map<String, Socket>;
+
+//   @InjectEntityModel(ChatUserEntity)
+//   chatUserEntity: Repository<ChatUserEntity>;
+
+  /**
+   * 杩炴帴鎴愬姛
+   * @param data
+   */
+  @SocketEnvent()
+  async connection(socket: Socket) {
+    // console.log('socket浜嬩欢', socket.id, socket.handshake.query);
+    // console.log('socket浜嬩欢', socket.id, socket.handshake);
+    console.log(socket);
+    this.clients.set(socket.id, socket)
+    const { token } = socket.handshake.query;
+    console.log('-----------------------------------------------------------------------------------------------------------------------')
+    console.log(token)
+    // let tokenInfo;
+    // try {
+    //   // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+    //   // @ts-ignore
+    //   tokenInfo = jwt.verify(token, this.jwtConfig.secret);
+    // } catch (error) {
+    //   // 濡傛灉楠岃瘉涓嶉�氳繃鍒欐柇寮�杩炴帴
+    //   socket.emit('comm', '鏍¢獙澶辨晥');
+    //   socket.disconnect();
+    //   return;
+    // }
+    socket.on('disconnect', eventSocket => {
+      this.clients.delete(socket.id)
+      console.log('鏂紑杩炴帴');
+    });
+
+
+    socket.on('msg', msg => {
+      console.log('瀹㈡埛绔秷鎭�', msg);
+      socket.emit('data', 're:'+msg.op +" "+ msg.deviceid)
+
+    });
+
+    socket.on('devicelog',msg => {
+      //瑙f瀽缁堢涓婃姤鐨勭姸鎬佹秷鎭�
+      
+      //鍏ュ簱
+      
+      //鎺ㄩ�佸埌鍓嶇
+      socket.broadcast.emit('');
+    });
+
+  }
+
+  /**
+   * 杩炴帴鎴愬姛
+   * @param data
+   */
+   @SocketEnvent()
+   async broadcast(socket: Socket) {
+       
+       //鎺ㄩ�佸埌鍓嶇
+       socket.broadcast.emit('');
+ 
+   }
+
+}
\ No newline at end of file

--
Gitblit v1.9.1