|
@@ -20,10 +20,10 @@ static int sql_callback(void *NotUsed, int argc, char **argv, char **azColName)
|
|
|
|
|
|
|
|
|
|
|
|
-uint16_t crc16_table[256];
|
|
|
+static uint16_t crc16_table[256];
|
|
|
|
|
|
|
|
|
-void init_crc16_table() {
|
|
|
+static void init_crc16_table() {
|
|
|
uint16_t polynomial = 0xA001;
|
|
|
for (uint16_t i = 0; i < 256; i++) {
|
|
|
uint16_t crc = i;
|
|
@@ -39,7 +39,7 @@ void init_crc16_table() {
|
|
|
}
|
|
|
|
|
|
|
|
|
-uint16_t calculate_crc16(uint8_t *data, size_t length) {
|
|
|
+static uint16_t calculate_crc16(uint8_t *data, size_t length) {
|
|
|
uint16_t crc = 0xFFFF;
|
|
|
for (size_t i = 0; i < length; i++) {
|
|
|
uint8_t table_index = (crc ^ data[i]) & 0xFF;
|
|
@@ -113,21 +113,34 @@ void TcpServer::start_server() {
|
|
|
init_crc16_table();
|
|
|
|
|
|
|
|
|
+
|
|
|
accept_thread = std::thread([this]() {
|
|
|
while (this->running) {
|
|
|
- int new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
|
|
|
- if (new_socket < 0) {
|
|
|
-
|
|
|
- std::cerr << "Accept failed with error: " << strerror(errno) << std::endl;
|
|
|
- if (errno == EINTR) {
|
|
|
-
|
|
|
- continue;
|
|
|
- } else {
|
|
|
-
|
|
|
- continue;
|
|
|
- }
|
|
|
+ char client_ip[INET_ADDRSTRLEN];
|
|
|
+ int new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen);
|
|
|
+ if (new_socket < 0) {
|
|
|
+
|
|
|
+ std::cerr << "Accept failed with error: " << strerror(errno) << std::endl;
|
|
|
+ if (errno == EINTR) {
|
|
|
+
|
|
|
+ continue;
|
|
|
+ } else {
|
|
|
+
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ inet_ntop(AF_INET, &(address.sin_addr), client_ip, INET_ADDRSTRLEN);
|
|
|
+ int client_port = ntohs(address.sin_port);
|
|
|
+ std::string ip_str(client_ip);
|
|
|
+
|
|
|
+ std::cout << "客户端已连接: " << ip_str << ":" << client_port << std::endl;
|
|
|
+ {
|
|
|
+ std::lock_guard<std::mutex> lock(mtx_client_addrs);
|
|
|
+ client_addrs.push_back({ip_str, client_port, new_socket});
|
|
|
}
|
|
|
- std::cout << "New client connected" << std::endl;
|
|
|
+
|
|
|
{
|
|
|
std::lock_guard<std::mutex> lock(mtx);
|
|
|
this->conn_num++;
|
|
@@ -138,10 +151,14 @@ void TcpServer::start_server() {
|
|
|
threads.emplace_back(&TcpServer::handle_client, this, new_socket);
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
- accept_thread.join();
|
|
|
+ accept_thread.detach();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+std::vector<ClientAddr> TcpServer::get_connected_clients() {
|
|
|
+ std::lock_guard<std::mutex> lock(mtx_client_addrs);
|
|
|
+ return client_addrs;
|
|
|
+}
|
|
|
|
|
|
|
|
|
void TcpServer::handle_client(int client_socket) {
|
|
@@ -173,7 +190,7 @@ void TcpServer::handle_client(int client_socket) {
|
|
|
std::cout << "error crc msg!" << std::endl;
|
|
|
continue;
|
|
|
}
|
|
|
- std::cout << "CRC = " << calculate_crc16(buffer, bytes_received - 2) <<std::endl;
|
|
|
+ std::cout << "CRC = " << CRC <<std::endl;
|
|
|
|
|
|
int dev_addr = buffer[0];
|
|
|
int fun_code = buffer[1];
|
|
@@ -182,6 +199,16 @@ void TcpServer::handle_client(int client_socket) {
|
|
|
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;
|
|
@@ -231,7 +258,6 @@ void TcpServer::handle_client(int client_socket) {
|
|
|
|
|
|
nlohmann::json smoke_data;
|
|
|
smoke_data["name"] = "报警状态";
|
|
|
-
|
|
|
if((buffer[7] << 8) + buffer[8] == 0)
|
|
|
smoke_data["value"] = "正常";
|
|
|
else
|
|
@@ -239,8 +265,7 @@ void TcpServer::handle_client(int client_socket) {
|
|
|
smoke_data["format"] = "";
|
|
|
smoke_data["format_id"] = 0;
|
|
|
json_save["data"].push_back(smoke_data);
|
|
|
- }
|
|
|
- else if (dev_type == 7) {
|
|
|
+ }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;
|
|
@@ -280,42 +305,215 @@ void TcpServer::handle_client(int client_socket) {
|
|
|
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;
|
|
|
|
|
|
-
|
|
|
- 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 ;
|
|
|
- }
|
|
|
+
|
|
|
+ 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;
|
|
|
|
|
|
-
|
|
|
- std::cout << "devaice_name " << dev_name << "json_save "<< json_save.dump(4) << 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 ;
|
|
|
- }
|
|
|
+
|
|
|
+ nlohmann::json switch_data;
|
|
|
+ switch_data["name"] = "开关";
|
|
|
+ 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;
|
|
|
|
|
|
-
|
|
|
- if (reply->type == REDIS_REPLY_STATUS && strcmp(reply->str, "OK") == 0) {
|
|
|
-
|
|
|
- } else {
|
|
|
-
|
|
|
- }
|
|
|
+
|
|
|
+ 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;
|
|
|
|
|
|
-
|
|
|
- freeReplyObject(reply);
|
|
|
+
|
|
|
+ nlohmann::json switch_data;
|
|
|
+ switch_data["name"] = "门状态";
|
|
|
+ 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"] = "门控制";
|
|
|
+ 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);
|
|
|
+ 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.1%";
|
|
|
+ temp_data["format_id"] = 0;
|
|
|
+ json_save["data"].push_back(temp_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;
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+ 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;
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
- redisFree(context);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ std::cout << "devaice_name " << dev_name << "json_save "<< json_save.dump(1) << std::endl;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
|
|
|
|
|
|
|