Bläddra i källkod

南瑞网关备份

xhj 1 månad sedan
förälder
incheckning
42dd4aca42
4 ändrade filer med 369 tillägg och 415 borttagningar
  1. BIN
      .ninja_deps
  2. 14 0
      .ninja_log
  3. 2 2
      Testing/Temporary/LastTest.log
  4. 353 413
      modules/gateway-scheduler/src/tcp_server/TcpServer.cpp

BIN
.ninja_deps


+ 14 - 0
.ninja_log

@@ -141,3 +141,17 @@
 7834	9100	7726074204270162	deploy/bin/gateway-scheduler	c90563d061dbec8d
 83	8456	7726087408301884	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
 8458	9820	7726087492052829	deploy/bin/gateway-scheduler	c90563d061dbec8d
+96	7780	7727758019514187	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+7781	8979	7727758096357330	deploy/bin/gateway-scheduler	c90563d061dbec8d
+74	7091	7729529801569994	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+7092	8273	7729529871752258	deploy/bin/gateway-scheduler	c90563d061dbec8d
+55	7828	7729531708395979	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+7831	9038	7729531786173204	deploy/bin/gateway-scheduler	c90563d061dbec8d
+52	7962	7729532129738239	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+7965	9192	7729532208861542	deploy/bin/gateway-scheduler	c90563d061dbec8d
+52	6947	7729536897285531	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+6949	8079	7729536966247412	deploy/bin/gateway-scheduler	c90563d061dbec8d
+54	7352	7729539108870658	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+7354	8478	7729539181873181	deploy/bin/gateway-scheduler	c90563d061dbec8d
+49	6866	7729543992649734	modules/gateway-scheduler/CMakeFiles/gateway-scheduler.dir/src/tcp_server/TcpServer.cpp.o	a1f99320b3b8c883
+6868	7972	7729544060835295	deploy/bin/gateway-scheduler	c90563d061dbec8d

+ 2 - 2
Testing/Temporary/LastTest.log

@@ -1,3 +1,3 @@
-Start testing: Jun 26 10:39 中国标准时间
+Start testing: Jun 30 10:40 中国标准时间
 ----------------------------------------------------------
-End testing: Jun 26 10:39 中国标准时间
+End testing: Jun 30 10:40 中国标准时间

+ 353 - 413
modules/gateway-scheduler/src/tcp_server/TcpServer.cpp

@@ -148,7 +148,8 @@ void TcpServer::start_server() {
             }
 
             // Create a new thread to handle the client
-            threads.emplace_back(&TcpServer::handle_client, this, new_socket);
+//            threads.emplace_back(&TcpServer::handle_client, this, new_socket);
+            std::thread(&TcpServer::handle_client, this, new_socket).detach();
         }
     });
     accept_thread.detach();  // 让接受线程独立运行
@@ -164,424 +165,370 @@ std::vector<ClientAddr> TcpServer::get_connected_clients() {
 void TcpServer::handle_client(int client_socket) {
     uint8_t buffer[BUFFER_SIZE];
     while (true) {
-        memset(buffer, 0, BUFFER_SIZE);
-        int bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
-        if (bytes_received <= 0) {
-            // Client disconnected or error
-            std::cout << "Client disconnected or error occurred. bytes_received = " << bytes_received << std::endl;
-            close(client_socket);
-            this->conn_num --;
-            std::cout << "Current connection count: " << this->conn_num << std::endl;
-            break;
-        }
-        std::cout << "Received from client, size = " << bytes_received << " data = ";
-        for(int i = 0;i < bytes_received; i++){
-            printf("0x%02x ", buffer[i]);
-        }
-        printf("\n");
-        if(bytes_received < 11){
-            std::cout << "too short msg!" << std::endl;
-            continue;
-        }
-
-        // if(calculate_crc16(buffer, bytes_received - 2)){
-        uint16_t CRC = calculate_crc16(buffer, bytes_received - 2);
-        if(((buffer[bytes_received - 1]<<8) !=  (CRC&(0xff<<8))) || (buffer[bytes_received - 2] != (CRC&0xff))){
-            std::cout << "error crc msg!" << std::endl;
-            continue;
-        }
-        std::cout << "CRC = " <<  CRC <<std::endl;
-
-        int dev_addr = buffer[0];
-        int fun_code = buffer[1];
-        int data_len = buffer[2];
-        int dev_type = buffer[6];
-        std::string device_name;
-
-        nlohmann::json json_save;
-
-        if(dev_type == 9) {
-          std::cout << "门锁" << std::endl;
-        }
-        if(dev_type == 10) {
-          std::cout << "噪声" << std::endl;
-        }
-        if(dev_type == 12) {
-          std::cout << "蓄电池" << std::endl;
-        }
-        // 公共字段
-        json_save["status"] = "run";
-        json_save["gateway_id"] = 0;
-        std::string dev_name = "device_" + std::to_string(dev_addr);
-        if (dev_type == 1) { // 温湿度
-            device_name = "温湿度-" + std::to_string(dev_addr);
-            json_save["device_name"] = "温湿度-" + std::to_string(dev_addr);
-            json_save["device_id"] = dev_addr;
-
-            // 温度对象
-            nlohmann::json temp_data;
-            temp_data["name"] = "温度";
-            temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
-            temp_data["format"] = "℃";
-            temp_data["format_id"] = 40;
-            json_save["data"].push_back(temp_data);
-
-            // 湿度对象
-            nlohmann::json humidity_data;
-            humidity_data["name"] = "湿度";
-            humidity_data["value"] = ((buffer[9] << 8) + buffer[10]);
-            humidity_data["format"] = "%RH";
-            humidity_data["format_id"] = 40;
-            json_save["data"].push_back(humidity_data);
-        } else if (dev_type == 2) { // 水浸
-            device_name = "水浸-" + std::to_string(dev_addr);
-            json_save["device_name"] = "水浸-" + std::to_string(dev_addr);
-            json_save["device_id"] = dev_addr;
-
-            // 水浸对象
-            nlohmann::json water_data;
-            water_data["name"] = "水浸状态";
-//            water_data["value"] = ((buffer[7] << 8) + buffer[8]); // 0 表示无水浸,1 表示有水浸
-            if((buffer[7] << 8) + buffer[8] == 0)
-              water_data["value"] = "正常";
-            else
-              water_data["value"] = "告警";
-            water_data["format"] = "";
-            water_data["format_id"] = 0;
-            json_save["data"].push_back(water_data);
-
-        } else if (dev_type == 3) { // 烟感
-            device_name = "烟感-" + std::to_string(dev_addr);
-            json_save["device_name"] = "烟感-" + std::to_string(dev_addr);
-            json_save["device_id"] = dev_addr;
-
-            // 烟感对象
-            nlohmann::json smoke_data;
-            smoke_data["name"] = "报警状态";
-            if((buffer[7] << 8) + buffer[8] == 0)
-              smoke_data["value"] = "正常";
-            else
-              smoke_data["value"] = "告警";
-            smoke_data["format"] = "";
-            smoke_data["format_id"] = 0;
-            json_save["data"].push_back(smoke_data);
-        }else if (dev_type == 7) {
-          device_name = "空调-" + std::to_string(dev_addr);
-          json_save["device_name"] = "空调-" + std::to_string(dev_addr);
-          json_save["device_id"] = dev_addr;
-
-          // 开关对象
-          nlohmann::json switch_data;
-          switch_data["name"] = "开关";
-          switch_data["value"] = ((buffer[7] << 8) + buffer[8]);
-          switch_data["format"] = "";
-          switch_data["format_id"] = 0;
-          json_save["data"].push_back(switch_data);
-          // 模式对象
-          nlohmann::json mode_data;
-          mode_data["name"] = "模式";
-          mode_data["value"] = ((buffer[9] << 8) + buffer[10]);
-          mode_data["format"] = "";
-          mode_data["format_id"] = 0;
-          json_save["data"].push_back(mode_data);
-          // 模式对象
-          nlohmann::json set_temperature_data;
-          set_temperature_data["name"] = "设定温度";
-          set_temperature_data["value"] = ((buffer[11] << 8) + buffer[12]);
-          set_temperature_data["format"] = "℃";
-          set_temperature_data["format_id"] = 40;
-          json_save["data"].push_back(set_temperature_data);
-          // 模式对象
-          nlohmann::json wind_speed_data;
-          wind_speed_data["name"] = "风速";
-          wind_speed_data["value"] = ((buffer[13] << 8) + buffer[14]);
-          wind_speed_data["format"] = "";
-          wind_speed_data["format_id"] = 40;
-          json_save["data"].push_back(wind_speed_data);
-          // 模式对象
-          nlohmann::json wind_direction_data;
-          wind_direction_data["name"] = "风向";
-          wind_direction_data["value"] = ((buffer[15] << 8) + buffer[16]);
-          wind_direction_data["format"] = "";
-          wind_direction_data["format_id"] = 0;
-          json_save["data"].push_back(wind_direction_data);
-        }else if (dev_type == 6) { // 照明
-          device_name = "照明-" + std::to_string(dev_addr);
-          json_save["device_name"] = "照明-" + std::to_string(dev_addr);
-          json_save["device_id"] = dev_addr;
-
-          //开关
-          nlohmann::json switch_data;
-          switch_data["name"] = "开关";
-          switch_data["value"] = (buffer[7] << 8) + buffer[8];
-//          if((buffer[7] << 8) + buffer[8] == 0)
-//            switch_data["value"] = "关闭";
-//          else
-//            switch_data["value"] = "开启";
-          switch_data["format"] = "";
-          switch_data["format_id"] = 0;
-          json_save["data"].push_back(switch_data);
-        }else if (dev_type == 8) { // 门磁
-          device_name = "门磁-" + std::to_string(dev_addr);
-          json_save["device_name"] = "门磁-" + std::to_string(dev_addr);
-          json_save["device_id"] = dev_addr;
-
-          //开关
-          nlohmann::json switch_data;
-          switch_data["name"] = "开关";
-          switch_data["value"]  = (buffer[7] << 8) + buffer[8];
-//          if((buffer[7] << 8) + buffer[8] == 0)
-//            switch_data["value"] = "关闭";
-//          else
-//            switch_data["value"] = "开启";
-          switch_data["format"] = "";
-          switch_data["format_id"] = 0;
-          json_save["data"].push_back(switch_data);
-        }else if (dev_type == 5) { // 风机
-          device_name = "风机-" + std::to_string(dev_addr);
-          json_save["device_name"] = "风机-" + std::to_string(dev_addr);
-          json_save["device_id"] = dev_addr;
-
-          //开关
-          nlohmann::json switch_data;
-          switch_data["name"] = "开关";
-          switch_data["value"] = (buffer[7] << 8) + buffer[8];
-//          if((buffer[7] << 8) + buffer[8] == 0)
-//            switch_data["value"] = "关闭";
-//          else
-//            switch_data["value"] = "开启";
-          switch_data["format"] = "";
-          switch_data["format_id"] = 0;
-          json_save["data"].push_back(switch_data);
-        }else if (dev_type == 9) { // 智能门锁
-          device_name = "智能门锁-" + std::to_string(dev_addr);
-          json_save["device_name"] = "智能门锁-" + std::to_string(dev_addr);
-          json_save["device_id"] = dev_addr;
-
-          //开关
-          nlohmann::json switch_data;
-          switch_data["name"] = "门状态";
-          switch_data["value"] = (buffer[9] << 8) + buffer[10];
-//          if((buffer[7] << 8) + buffer[8] == 0)
-//            switch_data["value"] = "关闭";
-//          else
-//            switch_data["value"] = "开启";
-          switch_data["format"] = "";
-          switch_data["format_id"] = 0;
-          json_save["data"].push_back(switch_data);
-
-          switch_data["name"] = "门控制";
-          switch_data["value"] = (buffer[9] << 8) + buffer[10];
-//          if((buffer[9] << 8) + buffer[10] == 0)
-//            switch_data["value"] = "关闭";
-//          else
-//            switch_data["value"] = "开启";
-          switch_data["format"] = "";
-          switch_data["format_id"] = 0;
-          json_save["data"].push_back(switch_data);
-        }else if (dev_type == 4) { // 双气
-          device_name = "双气-" + std::to_string(dev_addr);
-          json_save["device_name"] = "双气-" + std::to_string(dev_addr);
+      memset(buffer, 0, BUFFER_SIZE);
+      int bytes_received = recv(client_socket, buffer, BUFFER_SIZE, 0);
+      if (bytes_received <= 0) {
+          // Client disconnected or error
+          std::cout << "Client disconnected or error occurred. bytes_received = " << bytes_received << std::endl;
+          close(client_socket);
+          this->conn_num --;
+          std::cout << "Current connection count: " << this->conn_num << std::endl;
+          break;
+      }
+      std::cout << "Received from client, size = " << bytes_received << " data = ";
+      for(int i = 0;i < bytes_received; i++){
+          printf("0x%02x ", buffer[i]);
+      }
+      printf("\n");
+      if(bytes_received < 11){
+          std::cout << "too short msg!" << std::endl;
+          continue;
+      }
+
+      // if(calculate_crc16(buffer, bytes_received - 2)){
+      uint16_t CRC = calculate_crc16(buffer, bytes_received - 2);
+      if(((buffer[bytes_received - 1]<<8) !=  (CRC&(0xff<<8))) || (buffer[bytes_received - 2] != (CRC&0xff))){
+          std::cout << "error crc msg!" << std::endl;
+          continue;
+      }
+      std::cout << "CRC = " <<  CRC <<std::endl;
+
+      int dev_addr = buffer[0];
+      int fun_code = buffer[1];
+      int data_len = buffer[2];
+      int dev_type = buffer[6];
+      std::string device_name;
+
+      nlohmann::json json_save;
+
+      if(dev_type == 9) {
+        std::cout << "门锁" << std::endl;
+      }
+      if(dev_type == 10) {
+        std::cout << "噪声" << std::endl;
+      }
+      if(dev_type == 12) {
+        std::cout << "蓄电池" << std::endl;
+      }
+      // 公共字段
+      json_save["status"] = "run";
+      json_save["gateway_id"] = 0;
+      std::string dev_name = "device_" + std::to_string(dev_addr);
+      if (dev_type == 1) { // 温湿度
+          device_name = "温湿度-" + std::to_string(dev_addr);
+          json_save["device_name"] = "温湿度-" + std::to_string(dev_addr);
           json_save["device_id"] = dev_addr;
 
-          // 氧气浓度
+          // 温度对象
           nlohmann::json temp_data;
-          temp_data["name"] = "氧气浓度";
+          temp_data["name"] = "温度";
           temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
-          temp_data["format"] = "%";
-          temp_data["format_id"] = 0;
+          temp_data["format"] = "℃";
+          temp_data["format_id"] = 40;
           json_save["data"].push_back(temp_data);
 
-          // SF6浓度
+          // 湿度对象
           nlohmann::json humidity_data;
-          humidity_data["name"] = "SF6浓度";
-          humidity_data["value"] = ((buffer[9] << 8) + buffer[10])/10.0;
-          humidity_data["format"] = "ppm";
-          humidity_data["format_id"] = 0;
+          humidity_data["name"] = "湿度";
+          humidity_data["value"] = ((buffer[9] << 8) + buffer[10]);
+          humidity_data["format"] = "%RH";
+          humidity_data["format_id"] = 40;
           json_save["data"].push_back(humidity_data);
-        }else if (dev_type == 10) { // 噪声
-          device_name = "噪声-" + std::to_string(dev_addr);
-          json_save["device_name"] = "噪声-" + std::to_string(dev_addr);
+      } else if (dev_type == 2) { // 水浸
+          device_name = "水浸-" + std::to_string(dev_addr);
+          json_save["device_name"] = "水浸-" + std::to_string(dev_addr);
           json_save["device_id"] = dev_addr;
 
-          // 噪声值
-          nlohmann::json temp_data;
-          temp_data["name"] = "噪声值";
-          temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
-          temp_data["format"] = "db";
-          temp_data["format_id"] = 40;
-          json_save["data"].push_back(temp_data);
-        }else if (dev_type == 11) { // 噪声
-          device_name = "臭氧-" + std::to_string(dev_addr);
-          json_save["device_name"] = "臭氧-" + std::to_string(dev_addr);
-          json_save["device_id"] = dev_addr;
-
-          // 臭氧浓度
-          nlohmann::json temp_data;
-          temp_data["name"] = "臭氧浓度";
-          temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
-          temp_data["format"] = "0.1ppm";
-          temp_data["format_id"] = 40;
-          json_save["data"].push_back(temp_data);
-        }else if (dev_type == 12) { // 蓄电池
-          device_name = "蓄电池-" + std::to_string(dev_addr);
-          json_save["device_name"] = "蓄电池-" + std::to_string(dev_addr);
+          // 水浸对象
+          nlohmann::json water_data;
+          water_data["name"] = "水浸状态";
+  //            water_data["value"] = ((buffer[7] << 8) + buffer[8]); // 0 表示无水浸,1 表示有水浸
+          if((buffer[7] << 8) + buffer[8] == 0)
+            water_data["value"] = "正常";
+          else
+            water_data["value"] = "告警";
+          water_data["format"] = "";
+          water_data["format_id"] = 0;
+          json_save["data"].push_back(water_data);
+
+      } else if (dev_type == 3) { // 烟感
+          device_name = "烟感-" + std::to_string(dev_addr);
+          json_save["device_name"] = "烟感-" + std::to_string(dev_addr);
           json_save["device_id"] = dev_addr;
 
-          // 开关对象
-          nlohmann::json group_voltage;
-          group_voltage["name"] = "组电压";
-          group_voltage["value"] = (((buffer[7] << 8) + buffer[8]))/10.0;
-          group_voltage["format"] = "V";
-          group_voltage["format_id"] = 0;
-          json_save["data"].push_back(group_voltage);
-          // 模式对象
-          nlohmann::json group_current;
-          group_current["name"] = "组电流";
-          group_current["value"] = ((buffer[9] << 8) + buffer[10]) / 100.0;
-          group_current["format"] = "A";
-          group_current["format_id"] = 0;
-          json_save["data"].push_back(group_current);
-
-          for(int i = 0; i <= 8; i++) {
-            nlohmann::json sigle_voltage;
-            sigle_voltage["name"] = "电池-" + std::to_string(i+1) + " 电压";
-            sigle_voltage["value"] = ((buffer[11 + i * 2] << 8) + buffer[12 + i * 2]) / 1000.0;
-            sigle_voltage["format"] = "V";
-            sigle_voltage["format_id"] = 40;
-            json_save["data"].push_back(sigle_voltage);
-          }
-          // 模式对象
-          for(int i = 0; i <= 8; i++) {
-            nlohmann::json sigle_temp;
-            sigle_temp["name"] = "电池-" + std::to_string(i+1) + " 温度";
-            sigle_temp["value"] = ((buffer[29 + i * 2] << 8) + buffer[30 + i * 2]) / 100.0;
-            sigle_temp["format"] = "℃";
-            sigle_temp["format_id"] = 40;
-            json_save["data"].push_back(sigle_temp);
-          }
-          // 模式对象
-          for(int i = 0; i <= 8; i++) {
-            nlohmann::json sigle_resistance;
-            sigle_resistance["name"] = "电池-" + std::to_string(i+1) + " 内阻";
-            sigle_resistance["value"] = ((buffer[47 + i * 2] << 8) + buffer[48 + i * 2]) / 1000.0;
-            sigle_resistance["format"] = "mΩ";
-            sigle_resistance["format_id"] = 0;
-            json_save["data"].push_back(sigle_resistance);
-          }
-
-          for(int i = 0; i <= 8; i++) {
-            nlohmann::json sigle_volumn;
-            sigle_volumn["name"] = "电池-" + std::to_string(i+1) + " 容量";
-            sigle_volumn["value"] = ((buffer[65 + i * 2] << 8) + buffer[66 + i * 2]) / 100.0;
-            sigle_volumn["format"] = "";
-            sigle_volumn["format_id"] = 0;
-            json_save["data"].push_back(sigle_volumn);
-          }
-        }else{
-          std::cout << "未知设备类型: " << dev_type << std::endl;
-          return;
+          // 烟感对象
+          nlohmann::json smoke_data;
+          smoke_data["name"] = "报警状态";
+          if((buffer[7] << 8) + buffer[8] == 0)
+            smoke_data["value"] = "正常";
+          else
+            smoke_data["value"] = "告警";
+          smoke_data["format"] = "";
+          smoke_data["format_id"] = 0;
+          json_save["data"].push_back(smoke_data);
+      }else if (dev_type == 7) {
+        device_name = "空调-" + std::to_string(dev_addr);
+        json_save["device_name"] = "空调-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        // 开关对象
+        nlohmann::json switch_data;
+        switch_data["name"] = "开关";
+        switch_data["value"] = ((buffer[7] << 8) + buffer[8]);
+        switch_data["format"] = "";
+        switch_data["format_id"] = 0;
+        json_save["data"].push_back(switch_data);
+        // 模式对象
+        nlohmann::json mode_data;
+        mode_data["name"] = "模式";
+        mode_data["value"] = ((buffer[9] << 8) + buffer[10]);
+        mode_data["format"] = "";
+        mode_data["format_id"] = 0;
+        json_save["data"].push_back(mode_data);
+        // 模式对象
+        nlohmann::json set_temperature_data;
+        set_temperature_data["name"] = "设定温度";
+        set_temperature_data["value"] = ((buffer[11] << 8) + buffer[12]);
+        set_temperature_data["format"] = "℃";
+        set_temperature_data["format_id"] = 40;
+        json_save["data"].push_back(set_temperature_data);
+        // 模式对象
+        nlohmann::json wind_speed_data;
+        wind_speed_data["name"] = "风速";
+        wind_speed_data["value"] = ((buffer[13] << 8) + buffer[14]);
+        wind_speed_data["format"] = "";
+        wind_speed_data["format_id"] = 40;
+        json_save["data"].push_back(wind_speed_data);
+        // 模式对象
+        nlohmann::json wind_direction_data;
+        wind_direction_data["name"] = "风向";
+        wind_direction_data["value"] = ((buffer[15] << 8) + buffer[16]);
+        wind_direction_data["format"] = "";
+        wind_direction_data["format_id"] = 0;
+        json_save["data"].push_back(wind_direction_data);
+      }else if (dev_type == 6) { // 照明
+        device_name = "照明-" + std::to_string(dev_addr);
+        json_save["device_name"] = "照明-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        //开关
+        nlohmann::json switch_data;
+        switch_data["name"] = "开关";
+        switch_data["value"] = (buffer[7] << 8) + buffer[8];
+        switch_data["format"] = "";
+        switch_data["format_id"] = 0;
+        json_save["data"].push_back(switch_data);
+      }else if (dev_type == 8) { // 门磁
+        device_name = "门磁-" + std::to_string(dev_addr);
+        json_save["device_name"] = "门磁-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        //开关
+        nlohmann::json switch_data;
+        switch_data["name"] = "开关";
+        switch_data["value"]  = (buffer[7] << 8) + buffer[8];
+        switch_data["format"] = "";
+        switch_data["format_id"] = 0;
+        json_save["data"].push_back(switch_data);
+      }else if (dev_type == 5) { // 风机
+        device_name = "风机-" + std::to_string(dev_addr);
+        json_save["device_name"] = "风机-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        //开关
+        nlohmann::json switch_data;
+        switch_data["name"] = "开关";
+        switch_data["value"] = (buffer[7] << 8) + buffer[8];
+        switch_data["format"] = "";
+        switch_data["format_id"] = 0;
+        json_save["data"].push_back(switch_data);
+      }else if (dev_type == 9) { // 智能门锁
+        device_name = "智能门锁-" + std::to_string(dev_addr);
+        json_save["device_name"] = "智能门锁-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        //开关
+        nlohmann::json switch_data;
+        switch_data["name"] = "门状态";
+        switch_data["value"] = (buffer[9] << 8) + buffer[10];
+        switch_data["format"] = "";
+        switch_data["format_id"] = 0;
+        json_save["data"].push_back(switch_data);
+
+        switch_data["name"] = "门控制";
+        switch_data["value"] = (buffer[9] << 8) + buffer[10];
+        switch_data["format"] = "";
+        switch_data["format_id"] = 0;
+        json_save["data"].push_back(switch_data);
+      }else if (dev_type == 4) { // 双气
+        device_name = "双气-" + std::to_string(dev_addr);
+        json_save["device_name"] = "双气-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        // 氧气浓度
+        nlohmann::json temp_data;
+        temp_data["name"] = "氧气浓度";
+        temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
+        temp_data["format"] = "%";
+        temp_data["format_id"] = 0;
+        json_save["data"].push_back(temp_data);
+
+        // SF6浓度
+        nlohmann::json humidity_data;
+        humidity_data["name"] = "SF6浓度";
+        humidity_data["value"] = ((buffer[9] << 8) + buffer[10])/10.0;
+        humidity_data["format"] = "ppm";
+        humidity_data["format_id"] = 0;
+        json_save["data"].push_back(humidity_data);
+      }else if (dev_type == 10) { // 噪声
+        device_name = "噪声-" + std::to_string(dev_addr);
+        json_save["device_name"] = "噪声-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        // 噪声值
+        nlohmann::json temp_data;
+        temp_data["name"] = "噪声值";
+        temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
+        temp_data["format"] = "db";
+        temp_data["format_id"] = 40;
+        json_save["data"].push_back(temp_data);
+      }else if (dev_type == 11) { // 噪声
+        device_name = "臭氧-" + std::to_string(dev_addr);
+        json_save["device_name"] = "臭氧-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        // 臭氧浓度
+        nlohmann::json temp_data;
+        temp_data["name"] = "臭氧浓度";
+        temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
+        temp_data["format"] = "0.1ppm";
+        temp_data["format_id"] = 40;
+        json_save["data"].push_back(temp_data);
+      }else if (dev_type == 12) { // 蓄电池
+        device_name = "蓄电池-" + std::to_string(dev_addr);
+        json_save["device_name"] = "蓄电池-" + std::to_string(dev_addr);
+        json_save["device_id"] = dev_addr;
+
+        // 开关对象
+        nlohmann::json group_voltage;
+        group_voltage["name"] = "组电压";
+        group_voltage["value"] = (((buffer[7] << 8) + buffer[8]))/10.0;
+        group_voltage["format"] = "V";
+        group_voltage["format_id"] = 0;
+        json_save["data"].push_back(group_voltage);
+        // 模式对象
+        nlohmann::json group_current;
+        group_current["name"] = "组电流";
+        group_current["value"] = ((buffer[9] << 8) + buffer[10]) / 100.0;
+        group_current["format"] = "A";
+        group_current["format_id"] = 0;
+        json_save["data"].push_back(group_current);
+
+        for(int i = 0; i <= 8; i++) {
+          nlohmann::json sigle_voltage;
+          sigle_voltage["name"] = "电池-" + std::to_string(i+1) + " 电压";
+          sigle_voltage["value"] = ((buffer[11 + i * 2] << 8) + buffer[12 + i * 2]) / 1000.0;
+          sigle_voltage["format"] = "V";
+          sigle_voltage["format_id"] = 40;
+          json_save["data"].push_back(sigle_voltage);
         }
-
-//        // 创建 Redis 连接
-//        redisContext *context = redisConnect("127.0.0.1", 6379);
-//        if (context == NULL || context->err) {
-//            if (context) {
-//                printf("Error: %s\n", context->errstr);
-//                redisFree(context);
-//            } else {
-//                printf("Can't allocate redis context\n");
-//            }
-//            return ;
-//        }
-//
-//        // 设置键值对
-        std::cout << "devaice_name  " << dev_name << "json_save "<< json_save.dump(1) << std::endl;
-//        std::string out = json_save.dump(0);
-//        redisReply *reply = (redisReply *)redisCommand(context, "SET %s %s", dev_name.c_str(), out.c_str());
-//        if (reply == NULL) {
-//            printf("Error: %s\n", context->errstr);
-//            redisFree(context);
-//            return ;
-//        }
-//
-//        // 检查 SET 命令的返回值
-//        if (reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0) {
-//            // printf("Key '%s' set to value '%s'\n", key, value);
-//        } else {
-//            // printf("Failed to set key '%s'\n", key);
-//        }
-//
-//        // 释放 reply 结构
-//        freeReplyObject(reply);
-//
-//        // 断开 Redis 连接
-//        redisFree(context);
-
-
-
-        sqlite3 *db;
-        char *zErrMsg = 0;
-        int rc;
-
-        // 打开数据库连接
-        rc = sqlite3_open("/usr/local/bin/database/sqlite/history_data.db", &db);
-        if (rc) {
-            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
-            sqlite3_close(db);
-            return;
+        // 模式对象
+        for(int i = 0; i <= 8; i++) {
+          nlohmann::json sigle_temp;
+          sigle_temp["name"] = "电池-" + std::to_string(i+1) + " 温度";
+          sigle_temp["value"] = ((buffer[29 + i * 2] << 8) + buffer[30 + i * 2]) / 100.0;
+          sigle_temp["format"] = "℃";
+          sigle_temp["format_id"] = 40;
+          json_save["data"].push_back(sigle_temp);
         }
-
-        // 创建表
-        const char *sql_create_table = 
-            "CREATE TABLE IF NOT EXISTS history_data ("
-            "id INTEGER PRIMARY KEY AUTOINCREMENT,"
-            "data TEXT NOT NULL,"
-            "time TEXT NOT NULL,"
-            "device_id INTEGER NOT NULL,"
-            "device_name TEXT NOT NULL,"
-            "gateway_id INTEGER NOT NULL,"
-            "status TEXT NOT NULL);";
-
-        rc = sqlite3_exec(db, sql_create_table, sql_callback, 0, &zErrMsg);
-        if (rc != SQLITE_OK) {
-            fprintf(stderr, "SQL error: %s\n", zErrMsg);
-            sqlite3_free(zErrMsg);
-        } else {
-            printf("Table created successfully\n");
+        // 模式对象
+        for(int i = 0; i <= 8; i++) {
+          nlohmann::json sigle_resistance;
+          sigle_resistance["name"] = "电池-" + std::to_string(i+1) + " 内阻";
+          sigle_resistance["value"] = ((buffer[47 + i * 2] << 8) + buffer[48 + i * 2]) / 1000.0;
+          sigle_resistance["format"] = "mΩ";
+          sigle_resistance["format_id"] = 0;
+          json_save["data"].push_back(sigle_resistance);
         }
 
-    // 插入数据
-        const char *sql_insert_data = 
-            "INSERT INTO history_data (data, time, device_id, device_name, gateway_id, status) VALUES (?, ?, ?, ?, ?, ?);";
-
-        // 准备插入语句
-        sqlite3_stmt *stmt;
-        rc = sqlite3_prepare_v2(db, sql_insert_data, -1, &stmt, 0);
-        if (rc != SQLITE_OK) {
-            fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db));
-            sqlite3_close(db);
-            return;
+        for(int i = 0; i <= 8; i++) {
+          nlohmann::json sigle_volumn;
+          sigle_volumn["name"] = "电池-" + std::to_string(i+1) + " 容量";
+          sigle_volumn["value"] = ((buffer[65 + i * 2] << 8) + buffer[66 + i * 2]) / 100.0;
+          sigle_volumn["format"] = "";
+          sigle_volumn["format_id"] = 0;
+          json_save["data"].push_back(sigle_volumn);
         }
-
-        // 定义要插入的数据
-        std::string sql_data = json_save["data"].dump();
-        rc = sqlite3_bind_text(stmt, 1, sql_data.c_str(),  -1, SQLITE_STATIC);
-
-        // 获取当前时间
-        time_t rawtime;
-        struct tm *timeinfo;
-        // 获取当前时间的时间戳
-        time(&rawtime);
-        // 将时间戳转换为本地时间
-        timeinfo = localtime(&rawtime);
-        // 提取年、月、日、时、分、秒
-        int year = 1900 + timeinfo->tm_year;  // tm_year 是从 1900 年开始的年数
-        int month = 1 + timeinfo->tm_mon;     // tm_mon 是从 0 开始的月份(0-11)
-        int day = timeinfo->tm_mday;          // tm_mday 是一个月中的第几天(1-31)
-        int hour = timeinfo->tm_hour;         // tm_hour 是小时(0-23)
-        int minute = timeinfo->tm_min;        // tm_min 是分钟(0-59)
-        int second = timeinfo->tm_sec;        // tm_sec 是秒(0-59)
+      }else{
+        std::cout << "未知设备类型: " << dev_type << std::endl;
+        return;
+      }
+
+      std::cout << "devaice_name  " << dev_name << "json_save "<< json_save.dump(1) << std::endl;
+
+      sqlite3 *db;
+      char *zErrMsg = 0;
+      int rc;
+
+      // 打开数据库连接
+      rc = sqlite3_open("/usr/local/bin/database/sqlite/history_data.db", &db);
+      if (rc) {
+          fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
+          sqlite3_close(db);
+          return;
+      }
+
+      // 创建表
+      const char *sql_create_table =
+          "CREATE TABLE IF NOT EXISTS history_data ("
+          "id INTEGER PRIMARY KEY AUTOINCREMENT,"
+          "data TEXT NOT NULL,"
+          "time TEXT NOT NULL,"
+          "device_id INTEGER NOT NULL,"
+          "device_name TEXT NOT NULL,"
+          "gateway_id INTEGER NOT NULL,"
+          "status TEXT NOT NULL);"
+          "PRAGMA busy_timeout = 5000;";
+
+      rc = sqlite3_exec(db, sql_create_table, sql_callback, 0, &zErrMsg);
+      if (rc != SQLITE_OK) {
+          fprintf(stderr, "SQL error: %s\n", zErrMsg);
+          sqlite3_free(zErrMsg);
+      } else {
+          printf("Table created successfully\n");
+      }
+
+  // 插入数据
+      const char *sql_insert_data =
+          "INSERT INTO history_data (data, time, device_id, device_name, gateway_id, status) VALUES (?, ?, ?, ?, ?, ?);";
+
+      // 准备插入语句
+      sqlite3_stmt *stmt;
+      rc = sqlite3_prepare_v2(db, sql_insert_data, -1, &stmt, 0);
+      if (rc != SQLITE_OK) {
+          fprintf(stderr, "Failed to prepare statement: %s\n", sqlite3_errmsg(db));
+          sqlite3_close(db);
+          return;
+      }
+
+      // 定义要插入的数据
+      std::string sql_data = json_save["data"].dump();
+      rc = sqlite3_bind_text(stmt, 1, sql_data.c_str(),  -1, SQLITE_STATIC);
+
+      // 获取当前时间
+      time_t rawtime;
+      struct tm *timeinfo;
+      // 获取当前时间的时间戳
+      time(&rawtime);
+      // 将时间戳转换为本地时间
+      timeinfo = localtime(&rawtime);
+      // 提取年、月、日、时、分、秒
+      int year = 1900 + timeinfo->tm_year;  // tm_year 是从 1900 年开始的年数
+      int month = 1 + timeinfo->tm_mon;     // tm_mon 是从 0 开始的月份(0-11)
+      int day = timeinfo->tm_mday;          // tm_mday 是一个月中的第几天(1-31)
+      int hour = timeinfo->tm_hour;         // tm_hour 是小时(0-23)
+      int minute = timeinfo->tm_min;        // tm_min 是分钟(0-59)
+      int second = timeinfo->tm_sec;        // tm_sec 是秒(0-59)
 
         // 打印时间信息
         char time[30] = {};
@@ -606,20 +553,13 @@ void TcpServer::handle_client(int client_socket) {
         // 清理语句
         sqlite3_finalize(stmt);
 
-        // 查询数据
-        // const char *sql_select_data = "SELECT * FROM history_data;";
-        // rc = sqlite3_exec(db, sql_select_data, sql_callback, 0, &zErrMsg);
-        // if (rc != SQLITE_OK) {
-        //     fprintf(stderr, "SQL error: %s\n", zErrMsg);
-        //     sqlite3_free(zErrMsg);
-        // }
-
-        // 关闭数据库连接
-        sqlite3_close(db);
-
 
+      // 关闭数据库连接
+      sqlite3_close(db);
 
 
+      this->conn_num--;
+      break;
 
     }
 }