root@H500:/mnt/sd_card/A1_B2_C3_D4_E5_F6# [1018 19:24:02][Error] mqttCloud: [mqtt_matter_device.c:416][mqtt_matter_controller_liveness_check_tmo] controller die[2]!!!
[1018 19:24:02][Error] mediacenter: [worker.c:6059][tpsocket_event_worker_listen_cb] WORKERC: 192.168.137.1:62006 connected
[1018 19:24:02][Error] mediacenter: [worker.c:3792][worker_file_log_read_handle] mac: A1_B2_C3_D4_E5_F6
[1018 19:24:02][Error] mediacenter: [worker.c:3800][worker_file_log_read_handle] filepath: /mnt/sd_card/A1_B2_C3_D4_E5_F6/log.txt
[1018 19:24:02][Error] mediacenter: [worker.c:3819][worker_file_log_read_handle] [SUCCESS] File opened successfully
[1018 19:24:02][Error] mediacenter: [worker.c:3832][worker_file_log_read_handle] [DEBUG] File size: 2233740 bytes
[1018 19:24:02][Error] mediacenter: [worker.c:3868][worker_file_log_read_handle] [DEBUG] File opened for streaming: 2233740 bytes
[1018 19:24:02][Error] mediacenter: [storage.c:1007][tpsocket_event_filelog_from_hub] sock=0x10ee488, event=TPSOCKET_EVENT_MESSAGE
[1018 19:24:02][Error] mediacenter: [storage.c:1036][tpsocket_event_filelog_from_hub] TPSOCKET_EVENT_MESSAGE
[1018 19:24:02][Error] mediacenter: [storage.c:1062][tpsocket_event_filelog_from_hub] HTTP header sent
[1018 19:24:02][Error] mediacenter: [storage.c:1064][tpsocket_event_filelog_from_hub] Start sent body
[1018 19:24:02][Error] mediacenter: [storage.c:1080][tpsocket_event_filelog_from_hub] Sent entire file: 2233740 bytes
[1018 19:24:02][Error] mediacenter: [storage.c:1083][tpsocket_event_filelog_from_hub] File transfer completed
[1018 19:24:02][Error] mediacenter: [storage.c:1007][tpsocket_event_filelog_from_hub] sock=0x10ee488, event=TPSOCKET_EVENT_WRITABLE
bool tpsocket_event_filelog_to_hub(struct tpsocket_handler *handler, struct list_head *buf, int event)
{
//debug_show_tpbuf_list(buf, "TEST", 3);
struct tpsocket_fd *sock = container_of(handler, struct tpsocket_fd, handler);
FileLogSession *session = handler->priv;
if (event != TPSOCKET_EVENT_STREAM) {
DBG_ERR("sock=%p, event=%s\n", sock, tpsocket_event_name(event));
}
switch(event) {
case TPSOCKET_EVENT_LISTEN:
DBG_ERR("TPSOCKET_EVENT_LISTEN: %s:%s Listen\n", sock->addr, sock->port);
break;
case TPSOCKET_EVENT_SHUTDOWN:
DBG_ERR("TPSOCKET_EVENT_LISTEN: %s:%s Shutdown\n", sock->addr, sock->port);
break;
case TPSOCKET_EVENT_ACCEPT:
DBG_ERR("TPSOCKET_EVENT_LISTEN: %s:%s Accepted\n", sock->addr, sock->port);
break;
case TPSOCKET_EVENT_CONNECTED:
DBG_ERR("TPSOCKET_EVENT_LISTEN: %s:%s connected\n", sock->addr, sock->port);
break;
case TPSOCKET_EVENT_REQ_HEAD:
DBG_ERR("TPSOCKET_EVENT_LISTEN: %s Requested path: %s\n", sock->path, sock->parser.http.url);
break;
case TPSOCKET_EVENT_RSP_HEAD:
break;
case TPSOCKET_EVENT_SUB_HEAD:
DBG_ERR("TPSOCKET_EVENT_LISTEN: %s:%s connected\n", sock->addr, sock->port);
break;
case TPSOCKET_EVENT_UPGRADE:
break;
case TPSOCKET_EVENT_STREAM:
if (!session || !session->fp) {
DBG_ERR("Invalid session during write\n");
return false; // 导致连接异常关闭
}
case TPSOCKET_EVENT_MESSAGE:
if (!session || !session->fp) {
DBG_ERR("Invalid session during write\n");
return false;
}
struct tpsocket_buf *chunk;
bool error = false;
list_for_each_entry(chunk, buf, list) {
size_t to_write = chunk->len;
if (session->remaining <= 0)
{
DBG_ERR("Early termination: remaining=0\n");
break;
}
if (to_write > session->remaining) {
DBG_ERR("Data overflow: %zu > %zu\n", to_write, session->remaining);
to_write = session->remaining;
}
if (fwrite(chunk->data, 1, to_write, session->fp) < to_write) {
DBG_ERR("File write error: %s\n", strerror(errno));
error = true;
break;
}
session->remaining -= to_write;
DBG_ERR("session->remaining: %d\n", session->remaining);
if (session->remaining <= 0) break;
}
// 传输完成处理
if (session->remaining <= 0 || error) {
fclose(session->fp);
session->fp = NULL;
// fclose(session->fp);
const char *resp = error ? "HTTP/1.1 500 Internal Error\r\nConnection: close\r\n\r\n"
: "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\nContent-Length: %zu\r\nConnection: keep-alive\r\n\r\n";
struct tpsocket_buf *resp_buf = tpbuf_snprintf(strlen(resp)+1, resp);
if (resp_buf) tpsocket_write(sock, resp_buf);
// tpsocket_close(sock);
// 资源释放
if (error) unlink(session->filepath);
free(session);
handler->priv = NULL;
}
break;
case TPSOCKET_EVENT_RESET:
break;
case TPSOCKET_EVENT_TIMEOUT:
break;
case TPSOCKET_EVENT_CLOSED:
if (session) {
// 异常关闭时清理资源
if (session->fp) fclose(session->fp);
unlink(session->filepath);
free(session);
handler->priv = NULL;
}
break;
case TPSOCKET_EVENT_ERROR:
default:
break;
}
tpsocket_free_buf(buf, tpsocket_event_name(event), 0);
return true;
}
bool tpsocket_event_filelog_from_hub(struct tpsocket_handler *handler, struct list_head *buf, int event) {
struct tpsocket_fd *sock = container_of(handler, struct tpsocket_fd, handler);
ReadLogSession *session = handler->priv;
if (event != TPSOCKET_EVENT_STREAM) {
DBG_ERR("sock=%p, event=%s\n", sock, tpsocket_event_name(event));
}
#define CHUNK_SIZE 4096
static char buffer[CHUNK_SIZE];
switch(event) {
case TPSOCKET_EVENT_LISTEN:
DBG_ERR("TPSOCKET_EVENT_LISTEN");
break;
case TPSOCKET_EVENT_SHUTDOWN:
DBG_ERR("TPSOCKET_EVENT_SHUTDOWN");
break;
case TPSOCKET_EVENT_ACCEPT:
DBG_ERR("TPSOCKET_EVENT_ACCEPT");
break;
case TPSOCKET_EVENT_CONNECTED:
DBG_ERR("TPSOCKET_EVENT_CONNECTED");
break;
case TPSOCKET_EVENT_REQ_HEAD:
DBG_ERR("TPSOCKET_EVENT_REQ_HEAD");
break;
case TPSOCKET_EVENT_RSP_HEAD:
DBG_ERR("TPSOCKET_EVENT_RSP_HEAD");
break;
case TPSOCKET_EVENT_SUB_HEAD:
break;
case TPSOCKET_EVENT_UPGRADE:
break;
case TPSOCKET_EVENT_STREAM:
case TPSOCKET_EVENT_MESSAGE:
DBG_ERR("TPSOCKET_EVENT_MESSAGE");
if (!session || !session->fp) {
DBG_ERR("Invalid session during transfer\n");
return false;
}
// 1. 发送HTTP头
if (!session->header_sent) {
char header[512];
int header_len = snprintf(header, sizeof(header),
"HTTP/1.1 200 OK\r\n"
"Content-Type: text/plain\r\n"
"Content-Length: %zu\r\n"
"Connection: keep-alive\r\n\r\n",
session->file_size);
if (header_len <= 0) {
DBG_ERR("Header generation failed\n");
return false;
}
struct tpsocket_buf *header_buf = tpbuf_snprintf(header_len + 1, header);
if (!header_buf || !tpsocket_write(sock, header_buf)) {
DBG_ERR("Failed to send header\n");
return false;
}
session->header_sent = true;
DBG_ERR("HTTP header sent\n");
}
DBG_ERR("Start sent body\n");
// 2. 一次性发送整个文件内容(移除分块发送逻辑)
size_t bytes_read = fread(buffer, 1, session->file_size, session->fp);
if (bytes_read != session->file_size) {
DBG_ERR("File read error: expected %zu, got %zu\n", session->file_size, bytes_read);
tpsocket_close(sock);
return false;
}
struct tpsocket_buf *file_buf = tpbuf_snprintf(bytes_read, buffer);
if (!file_buf || !tpsocket_write(sock, file_buf)) {
DBG_ERR("Socket write failed\n");
return false;
}
session->sent_bytes = bytes_read;
DBG_ERR("Sent entire file: %zu bytes\n", bytes_read);
// 3. 文件发送完成
DBG_ERR("File transfer completed\n");
// tpsocket_close(sock);
break;
case TPSOCKET_EVENT_CLOSED:
// 清理资源
if (session) {
if (session->fp) fclose(session->fp);
free(session);
handler->priv = NULL;
}
break;
case TPSOCKET_EVENT_ERROR:
default:
break;
}
return true;
}
最新发布