#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "mongoose.h" #include #include #define SERIAL_PORT "/dev/ttyS0" #define BAUD_RATE B115200 #define FILE_PWD "/etc/DeviceID" char hexData[1024]; int get_return(int serialPort) { usleep(10000); ssize_t size; unsigned char ch; char buffer[1024]; hexData[1024]={0}; size = read(serialPort, buffer, sizeof(buffer)); if (size > 0){ std::vector byteArray; int i; for (i = 0; i < size; i++) { snprintf(&hexData[i * 2], sizeof(hexData) - i * 2, "%02X", buffer[i]); byteArray.push_back(static_cast(buffer[i])); } printf("Received result: %s\n", hexData); for (unsigned char c : byteArray) { std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(c) << " "; } std::cout << std::endl; return 0; }else{ return -1; } } // 用于处理GET请求的事件处理函数 static void get_handler_10000(struct mg_connection *nc, int ev, void *ev_data) { if (ev == MG_EV_HTTP_REQUEST) { struct http_message *hm = (struct http_message *) ev_data; // 检查HTTP请求方法是否为POST if (mg_vcmp(&hm->method, "GET") == 0) { // 解析POST请求的参数 struct mg_str param_str = hm->query_string; // printf("param: %.*s\n", (int) hm->query_string.len, hm->query_string.p); char value_buf[256]; int result = mg_get_http_var(¶m_str, "DeviceID", value_buf, sizeof(value_buf)); if (result > 0) { // 参数找到并存储在 value_buf 中 printf("DeviceID: %.*s\n", result, value_buf); std::string data = value_buf; FILE *file = fopen(FILE_PWD, "wb"); // 使用二进制模式打开文件 // 检查文件是否成功打开 if (file) { // 将数据写入文件 size_t bytes_written = fwrite(value_buf, 1, strlen(value_buf), file); // 检查写入是否成功 if (bytes_written == data.length()) { printf("Data written to %s successfully.\n", FILE_PWD); } else { printf("Error writing data to %s.\n", FILE_PWD); } // 关闭文件 fclose(file); } else { printf("Error opening file %s for writing.\n", FILE_PWD); } } else { // 参数未找到 mg_http_send_error(nc, 405, "Parameter Not Allowed"); printf("Parameter not found\n"); } // // 提取POST请求的数据 // char post_data[1024]; // 假设数据大小不超过 1024 字节 // memcpy(post_data, hm->body.p, hm->body.len); // post_data[hm->body.len] = '\0'; // 添加字符串结束符 // // 处理POST请求数据,这里可以根据需要进行处理 // printf("Received POST data: %s\n", post_data); // 发送HTTP响应 mg_printf(nc, "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" "Content-Length: %d\r\n\r\n" "POST data received and processed\r\n", (int) strlen("POST data received and processed")); nc->flags |= MG_F_SEND_AND_CLOSE; // 关闭连接 } else { // 如果不是POST请求,可以返回错误响应 mg_http_send_error(nc, 405, "Method Not Allowed"); } } } // 用于处理GET请求的事件处理函数 气压计 static void get_handler_11000(struct mg_connection *nc, int ev, void *ev_data) { if (ev == MG_EV_HTTP_REQUEST) { sem_t *my_semaphore = sem_open("/my_semaphore", O_CREAT, 0644, 1); struct timespec abs_timeout; clock_gettime(CLOCK_REALTIME, &abs_timeout); abs_timeout.tv_sec += 5; // 增加 5 秒的超时时间 int serialPort = open(SERIAL_PORT, O_RDWR | O_NOCTTY | O_NDELAY); if (serialPort == -1) { printf("Failed to open serial port: %s\n", SERIAL_PORT); } struct termios tty; memset(&tty, 0, sizeof(tty)); if (tcgetattr(serialPort, &tty) != 0) { printf("Failed to get serial port attributes\n"); close(serialPort); } cfsetospeed(&tty, BAUD_RATE); cfsetispeed(&tty, BAUD_RATE); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; tty.c_cflag &= ~(PARENB | PARODD); tty.c_cflag &= ~CSTOPB; tty.c_cflag |= CREAD | CLOCAL; tty.c_iflag = IGNPAR; tty.c_oflag = 0; tty.c_lflag = 0; if (tcsetattr(serialPort, TCSANOW, &tty) != 0) { printf("Failed to set serial port attributes\n"); close(serialPort); } char buffer[300]; ssize_t bytesRead; struct http_message *hm = (struct http_message *) ev_data; // 检查HTTP请求方法是否为POST if (mg_vcmp(&hm->method, "GET") == 0) { // 解析POST请求的参数 struct mg_str param_str = hm->query_string; // printf("param: %.*s\n", (int) hm->query_string.len, hm->query_string.p); char value_buf[256]; int result = mg_get_http_var(¶m_str, "barometer", value_buf, sizeof(value_buf)); if (result > 0) { // 参数找到并存储在 value_buf 中 printf("barometer: %.*s\n", result, value_buf); } else { // 参数未找到 mg_http_send_error(nc, 405, "Parameter Not Allowed"); printf("Parameter not found\n"); } // 转换成16进制 std::string hex_string = value_buf; std::vector response; // 使用std::stringstream来解析整个16进制字符串 std::stringstream ss(hex_string); for (int i = 0; i < hex_string.length(); i += 2){ char byte_str[3]; // 两个字符表示一个字节 ss.read(byte_str, 2); byte_str[2] = '\0'; // 添加字符串终止符 unsigned int byte; std::stringstream(byte_str) >> std::hex >> byte; response.push_back(static_cast(byte)); } // 打印转换后的结果 std::cout << "转换后的结果:" << std::endl; for (const auto &byte : response) { std::cout << std::hex << std::setw(2) << std::setfill('0') << static_cast(byte) << " "; } std::cout << std::endl; if (sem_timedwait(my_semaphore, &abs_timeout) == -1) { if (errno == ETIMEDOUT) { // 在这里处理等待超时的情况 printf("等待超时\n"); mg_http_send_error(nc, 406, "写入超时,请稍后再试"); } else { perror("sem_timedwait"); mg_http_send_error(nc, 407, "未知错误"); } }else{ write(serialPort, response.data(), response.size()); int read_limit = 0; int res = -1; do { res = get_return(serialPort); read_limit++; printf("res: %d i=%d\n",res,read_limit); } while ((res != 0) && (read_limit < 100)); sem_post(my_semaphore); // 发送HTTP响应 mg_printf(nc, "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain\r\n" "Content-Length: %d\r\n\r\n" "%s\r\n", (int) strlen(hexData),hexData); nc->flags |= MG_F_SEND_AND_CLOSE; // 关闭连接 } } else { // 如果不是POST请求,可以返回错误响应 mg_http_send_error(nc, 405, "Method Not Allowed"); } close(serialPort); } } int main(void) { struct mg_mgr mgr; struct mg_connection *nc1,*nc2; mg_mgr_init(&mgr, NULL); nc1 = mg_bind(&mgr, "10000", get_handler_10000); // 用于接收设备id nc2 = mg_bind(&mgr, "11000", get_handler_11000); // 用于接收设备id // 设置HTTP和WebSocket协议 mg_set_protocol_http_websocket(nc1); mg_set_protocol_http_websocket(nc2); printf("Starting web server on port 10000 and 11000\n"); for (;;) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); return 0; } // #include "mongoose.h" // static void handle_multipart(struct mg_connection *nc, struct http_message *hm) { // char var_name[256]; // char file_name[256]; // const char *data; // size_t data_len; // size_t pos = mg_parse_multipart( // hm->body.p, hm->body.len, var_name, sizeof(var_name), // file_name, sizeof(file_name), &data, &data_len // ); // // 遍历各个部分,处理每个字段的数据 // while (pos > 0) { // // 在这里处理字段数据 // // printf("File Name: %s\n", file_name); // printf("Field Name: %s\n", var_name); // printf("Field Data: %.*s\n", (int) data_len, data); // FILE *file = fopen(var_name, "wb"); // 使用二进制模式打开文件 // // 检查文件是否成功打开 // if (file) { // // 将数据写入文件 // size_t bytes_written = fwrite(data, 1, data_len, file); // // 检查写入是否成功 // if (bytes_written == data_len) { // printf("Data written to %s successfully.\n", var_name); // } else { // printf("Error writing data to %s.\n", var_name); // } // // 关闭文件 // fclose(file); // } else { // printf("Error opening file %s for writing.\n", var_name); // } // // 继续解析下一个部分 // pos = mg_parse_multipart( // hm->body.p + pos, hm->body.len - pos, var_name, sizeof(var_name), // file_name, sizeof(file_name), &data, &data_len // ); // } // } // static void ev_handler(struct mg_connection *nc, int ev, void *ev_data) { // if (ev == MG_EV_HTTP_REQUEST) { // struct http_message *hm = (struct http_message *)ev_data; // // 检查Content-Type是否为multipart/form-data // // if (mg_vcmp(&hm->header.content_type, "multipart/form-data") == 0) { // // 调用处理multipart请求的函数 // handle_multipart(nc, hm); // // } else { // // mg_http_send_error(nc, 400, "Bad Request"); // // } // mg_printf(nc, "HTTP/1.1 200 OK\r\n" // "Content-Type: text/plain\r\n" // "Content-Length: %d\r\n\r\n" // "POST data received and processed\r\n", // (int) strlen("POST data received and processed")); // nc->flags |= MG_F_SEND_AND_CLOSE; // 关闭连接 // } // } // int main(void) { // struct mg_mgr mgr; // struct mg_connection *nc; // mg_mgr_init(&mgr, NULL); // nc = mg_bind(&mgr, "8080", ev_handler); // mg_set_protocol_http_websocket(nc); // printf("Starting web server on port 8080\n"); // for (;;) { // mg_mgr_poll(&mgr, 1000); // } // mg_mgr_free(&mgr); // return 0; // }