|
@@ -148,7 +148,8 @@ void TcpServer::start_server() {
|
|
}
|
|
}
|
|
|
|
|
|
// Create a new thread to handle the client
|
|
// 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(); // 让接受线程独立运行
|
|
accept_thread.detach(); // 让接受线程独立运行
|
|
@@ -164,424 +165,370 @@ std::vector<ClientAddr> TcpServer::get_connected_clients() {
|
|
void TcpServer::handle_client(int client_socket) {
|
|
void TcpServer::handle_client(int client_socket) {
|
|
uint8_t buffer[BUFFER_SIZE];
|
|
uint8_t buffer[BUFFER_SIZE];
|
|
while (true) {
|
|
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;
|
|
json_save["device_id"] = dev_addr;
|
|
|
|
|
|
- // 氧气浓度
|
|
|
|
|
|
+ // 温度对象
|
|
nlohmann::json temp_data;
|
|
nlohmann::json temp_data;
|
|
- temp_data["name"] = "氧气浓度";
|
|
|
|
|
|
+ temp_data["name"] = "温度";
|
|
temp_data["value"] = ((buffer[7] << 8) + buffer[8])/10.0;
|
|
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);
|
|
json_save["data"].push_back(temp_data);
|
|
|
|
|
|
- // SF6浓度
|
|
|
|
|
|
+ // 湿度对象
|
|
nlohmann::json humidity_data;
|
|
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);
|
|
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;
|
|
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;
|
|
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] = {};
|
|
char time[30] = {};
|
|
@@ -606,20 +553,13 @@ void TcpServer::handle_client(int client_socket) {
|
|
// 清理语句
|
|
// 清理语句
|
|
sqlite3_finalize(stmt);
|
|
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;
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|