file-type

深入解析OpenWrt系统编译框架:以TP-LINK为例

ZIP文件

下载需积分: 5 | 2.07MB | 更新于2024-10-18 | 10 浏览量 | 4 评论 | 6 下载量 举报 收藏
download 立即下载
OpenWrt的设计理念是提供一个完全可写的文件系统,能够安装额外的软件包,使得开发者可以根据需要定制设备的功能。它为嵌入式设备提供了更高级别的灵活性和可扩展性。OpenWrt的编译框架是一个复杂的构建系统,它允许开发者编译整个固件或单独的软件包,并且可以自定义各种组件。 在对OpenWrt系统编译框架进行分析时,特别提及了针对TP-LINK设备的特定情况。TP-LINK是一家专注于网络设备制造的公司,其产品广泛应用于家庭和小型办公室。OpenWrt通过其编译框架,为TP-LINK设备提供定制化的固件编译选项,使得用户能够对TP-LINK路由器进行个性化和功能增强。 OpenWrt的编译框架主要包含了以下几个关键部分: 1. **构建系统(Build System)**:这是整个编译过程的核心,负责下载源代码、应用补丁、编译软件包以及生成固件映像。OpenWrt使用了基于Makefile的构建系统,通常在一个配置好的交叉编译环境中运行。 2. **软件包管理系统**:OpenWrt系统支持一个丰富的软件包集合,可以编译安装额外的软件包来扩展设备的功能。通过opkg包管理器,用户可以安装、更新和移除软件包。 3. **配置与定制选项**:OpenWrt提供了多种配置选项,包括但不限于网络设置、系统服务、安全增强等,这些都可以通过图形用户界面LuCI或命令行界面进行配置。 4. **编译过程详解**: - **选择目标平台**:首先,用户需要确定编译的目标平台和设备型号,以确保所有依赖和配置都是正确的。 - **获取源代码**:通过`./scripts/feeds update`和`./scripts/feeds install`命令获取并安装软件包的源代码。 - **配置固件**:使用`make menuconfig`命令进行图形化配置,选择需要的软件包和配置选项。 - **编译固件**:执行`make`命令开始编译过程,编译过程中会自动下载依赖、编译内核以及软件包,并最终生成固件映像。 5. **TP-LINK特定的编译**:针对TP-LINK设备的编译,需要特别关注设备的硬件架构和官方固件中的特定配置。TP-LINK的某些设备可能需要特定的内核版本或驱动程序。开发者在编译时需要选择正确的硬件架构和对应的配置文件。 6. **测试与验证**:编译完成后,生成的固件需要在TP-LINK设备上进行测试,确保所有功能正常,没有出现硬件兼容性问题或系统稳定性问题。 7. **版本管理与社区支持**:OpenWrt项目采用版本控制工具(如git)来管理代码库,并且拥有活跃的社区支持。开发者和用户可以参与到版本控制中,提交补丁、报告问题,或者通过社区资源进行学习和交流。 总结来说,OpenWrt针对TP-LINK设备的编译框架为用户提供了强大的定制化能力。通过这个框架,用户不仅能构建出功能全面的固件,还能深入学习和掌握Linux系统的构建和维护过程。这对于技术爱好者和专业人员来说,都是一个极具吸引力的特性。"

相关推荐

filetype

/** Copyright© 2022-2025 TP-LINK Technologies CO.LTD. All rights reserved. @file main.c \brief This source file is for testing code. \author zhaoyunlong [email protected] \version 1.0.0 \date 06/8/2025 \history \arg 1.0.0, 06/8/2025, zhaoyunlong, Create file. */ // /* INCLUDE_FILES */ // #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/shm.h> #include <sys/sem.h> #include <time.h> #include <stdint.h> #include <fcntl.h> // /* DEFINES */ // /* 定义三种IPC实现方式 */ #define IPC_MODE_PIPE 1 #define IPC_MODE_MSG 2 #define IPC_MODE_SHM 3 /* 当前IPC模式 */ #define CURRENT_IPC_MODE IPC_MODE_SHM /* 单次通信最大数据大小 / #define MAX_DATA_SIZE 1024 / 通信次数 / #define NUM_MESSAGES 5 / 通信间隔(s) */ #define INTERVAL_MESSAGES 1 // /* VARIABLES */ // /* CRC32校验表 */ static uint32_t crc32_table[256]; // /* LOCAL_FUNCTIONS */ // /** @fn void init_crc32_table() @brief 初始化CRC32表 @param[in] none @return void */ void init_crc32_table() { uint32_t c; for (int i = 0; i < 256; i++) { c = i; for (int j = 0; j < 8; j++) { c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1); } crc32_table[i] = c; } } /* 计算CRC32校验值 */ uint32_t crc32(const void *data, size_t len) { uint32_t crc = 0xFFFFFFFF; const uint8_t *bytes = (const uint8_t *)data; for (size_t i = 0; i < len; i++) { crc = crc32_table[(crc ^ bytes[i]) & 0xFF] ^ (crc >> 8); } return crc ^ 0xFFFFFFFF; } /* 发送数据结构定义 / typedef struct { uint32_t size; / 数据大小 / uint32_t crc; / CRC32校验值 / uint32_t seq; / 序列号 / char data[MAX_DATA_SIZE]; / 数据部分 */ } ipc_packet; /* 接收数据结构定义 / typedef struct { uint32_t seq; / 序列号 / char result[128]; / 结果描述 */ } ipc_response; /* 统计结构 / typedef struct { size_t total_bytes_send; / 总发送数据量 / size_t total_bytes_recv; / 总接收数据量 / int cout_send; / 发送次数 / int cout_recv; / 接收次数 / int cout_fail; / 错误次数 */ } ipc_stats; /** @fn void sem_lock(int semid) @brief Locks a semaphore @param[in] semid Semaphore ID @return void */ void sem_lock(int semid, int sem_num) { struct sembuf sb = {sem_num, -1, SEM_UNDO}; if (semop(semid, &sb, 1) == -1) { perror(“信号量锁定失败”); exit(EXIT_FAILURE); } } /** @fn void sem_unlock(int semid) @brief Unlocks a semaphore @param[in] semid Semaphore ID @return void */ void sem_unlock(int semid, int sem_num) { struct sembuf sb = {sem_num, 1, SEM_UNDO}; if (semop(semid, &sb, 1) == -1) { perror(“信号量解锁失败”); exit(EXIT_FAILURE); } } void get_current_time(char *buf, size_t buf_size) { time_t now = time(NULL); struct tm *tm = localtime(&now); strftime(buf, 20, “%H:%M:%S”, tm); } /* 打印统计结果 */ void print_stats(const ipc_stats *stats) { printf(“\n========= IPC通信统计 =\n"); printf(“发送总字节数: %zu bytes\n”, stats->total_bytes_send); printf(“接收总字节数: %zu bytes\n”, stats->total_bytes_recv); printf(“发送数据包总数: %d\n”, stats->cout_send); printf(“接收数据包总数: %d\n”, stats->cout_recv); printf(“失败验证次数: %d\n”, stats->cout_fail); printf("=======================\n”); } /* 共享内存结构 / typedef struct { ipc_packet data; / 数据区域 / ipc_response resp; / 响应区域 / ipc_stats stats; / 统计区域 */ } shared_memory; int main() { // 初始化CRC32表 init_crc32_table(); /* 创建共享内存 */ int shmid = shmget(IPC_PRIVATE, sizeof(shared_memory), IPC_CREAT | 0666); if (shmid < 0) { perror("共享内存创建失败"); exit(EXIT_FAILURE); } /* 附加共享内存 */ shared_memory *shm_ptr = shmat(shmid, NULL, 0); if (shm_ptr == (void *)-1) { perror("共享内存附加失败"); exit(EXIT_FAILURE); } /* 初始化共享内存状态 */ memset(shm_ptr, 0, sizeof(shared_memory)); /* 创建信号量集(0:互斥锁, 1:数据项, 2:响应项) */ int semid = semget(IPC_PRIVATE, 3, IPC_CREAT | 0666); if (semid < 0) { perror("信号量创建失败"); exit(EXIT_FAILURE); } /* 初始化信号量 */ unsigned short init_values[3] = { 1, /* SEM_MUTEX: 初始为1 (解锁状态) */ 0, /* SEM_DATA_READY: 初始为0 (数据未就绪) */ 0 /* SEM_RESP_READY: 初始为0 (响应未就绪) */ }; if (semctl(semid, 0, SETALL, init_values) == -1) { perror("信号量初始化失败"); exit(EXIT_FAILURE); } /* 创建子进程 */ pid_t pid = fork(); if (pid < 0) { perror("fork失败"); exit(EXIT_FAILURE); } /* 父进程 - 进程A (发送方) */ if (pid > 0) { /* 初始化随机数生成器 */ srand(time(NULL)); /* 模拟多次数据传输 */ for (int i = 0; i < NUM_MESSAGES; i++) { /* 准备数据包 */ uint32_t data_size = (i == 0) ? 100 : 200; char data_buffer[MAX_DATA_SIZE]; for (uint32_t j = 0; j < data_size; j++) { data_buffer[j] = rand() % 256; } /* 计算CRC校验值 */ uint32_t crc_value = crc32(data_buffer, data_size); /* 第二次传输故意制造错误 */ if (i % 2 == 1) { data_buffer[0] ^= 0xFF; } /* 加锁共享内存 */ sem_lock(semid, 0); /* 写入数据到共享内存 */ shm_ptr->data.size = data_size; shm_ptr->data.seq = i + 1; shm_ptr->data.crc = crc_value; memcpy(shm_ptr->data.data, data_buffer, data_size); /* 更新发送统计 */ shm_ptr->stats.total_bytes_send += data_size; shm_ptr->stats.cout_send++; /* 解锁共享内存 */ sem_unlock(semid, 0); /* 通知接收方数据就绪 */ sem_unlock(semid, 1); /* 打印发送信息 */ char time_buf[20]; get_current_time(time_buf, sizeof(time_buf)); printf("[%s] A: 发送了%d字节数据给B (序列号:%d)\n", time_buf, data_size, i + 1); /* 等待响应就绪 */ sem_lock(semid, 2); /* 读取响应 */ sem_lock(semid, 0); uint32_t resp_seq = shm_ptr->resp.seq; char resp_msg[128]; strncpy(resp_msg, shm_ptr->resp.result, sizeof(resp_msg)); sem_unlock(semid, 0); /* 打印响应信息 */ get_current_time(time_buf, sizeof(time_buf)); printf("[%s] A: B告诉我%s (序列号:%d)\n\n", time_buf, resp_msg, resp_seq); /* 通信间隔 */ sleep(INTERVAL_MESSAGES); } /* 等待子进程结束 */ wait(NULL); /* 打印最终统计 */ print_stats(&shm_ptr->stats); /* 资源清理 */ shmdt(shm_ptr); shmctl(shmid, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, 0); } /* 子进程 - 进程B (接收方) */ else { for (int i = 0; i < NUM_MESSAGES; i++) { /* 等待数据就绪 */ sem_lock(semid, 1); /* 加锁共享内存 */ sem_lock(semid, 0); /* 读取数据 */ uint32_t data_size = shm_ptr->data.size; uint32_t seq_num = shm_ptr->data.seq; uint32_t stored_crc = shm_ptr->data.crc; char data_buffer[MAX_DATA_SIZE]; memcpy(data_buffer, shm_ptr->data.data, data_size); /* 解锁共享内存 */ sem_unlock(semid, 0); /* 验证数据完整性 */ uint32_t calc_crc = crc32(data_buffer, data_size); int crc_match = (calc_crc == stored_crc); /* 准备响应消息 */ char result_msg[128]; if (crc_match) { snprintf(result_msg, sizeof(result_msg), "收到了%d字节数据, 校验正确", data_size); } else { snprintf(result_msg, sizeof(result_msg), "收到了%d字节数据, 但校验失败", data_size); } /* 打印接收信息 */ char time_buf[20]; get_current_time(time_buf, sizeof(time_buf)); printf("[%s] B: %s (序列号:%d)\n", time_buf, result_msg, seq_num); /* 加锁共享内存 */ sem_lock(semid, 0); /* 写入响应 */ shm_ptr->resp.seq = seq_num; strncpy(shm_ptr->resp.result, result_msg, sizeof(shm_ptr->resp.result)); /* 更新接收统计 */ shm_ptr->stats.total_bytes_recv += data_size; shm_ptr->stats.cout_recv++; if (!crc_match) { shm_ptr->stats.cout_fail++; } /* 解锁共享内存 */ sem_unlock(semid, 0); /* 通知发送方响应就绪 */ sem_unlock(semid, 2); } /* 分离共享内存 */ shmdt(shm_ptr); exit(EXIT_SUCCESS); } return 0; } 我现在的代码是上面这样的,请按照下面题目的要求,帮我写成设计文档。设计文档的格式是从需求开始,需求就是下面这段话(可以直接放进去),后面再写总体的,然后划分细节部分。请你多写点文字过渡一下,我自己放进去代码贴图就行(你不用放代码)。 一、openwrt环境搭建【必须】 参考附件openwrt环境搭建的指南,搭建openwrt环境,并成功运行helloworld程序。 二、熟悉进程间通信方式(IPC)【必须】 流程示例: 第n秒: A:我发送了M字节数据给B B:我从A接收了M字节数据,校验正确,通知A接收了M字节数据,校验正确。 A:B告诉我收到了M字节数据,校验正确 第2n秒: A:我发送了N字节数据给B B:我从A接收了N字节数据,校验错误,通知A接收了N字节数据,校验错误。 A:B告诉我收到了N字节数据,但校验失败 要求: 进程间通信方式、数据结构、校验方式(CRC、MD5等均可)不限,如果感兴趣可以考虑基于openwrt ubus实现进程间通信的方式。 打印统计结果(收发数据或者程序退出时),包括每次收发数据的时间、次数、大小、校验结果以及最终收发的数据总大小等。 提供源码、设计文档。

filetype

/** Copyright(c) 2022-2025 TP-LINK Technologies CO.LTD. * All rights reserved. * * @file main.c * \brief This source file is for testing code. * * \author zhaoyunlong <[email protected]> * \version 1.0.0 * \date 06/8/2025 * * \history \arg 1.0.0, 06/8/2025, zhaoyunlong, Create file. */ /**************************************************************************************************/ /* INCLUDE_FILES */ /**************************************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/shm.h> #include <sys/sem.h> #include <time.h> #include <stdint.h> #include <fcntl.h> /**************************************************************************************************/ /* DEFINES */ /**************************************************************************************************/ /* 定义三种IPC实现方式 */ #define IPC_MODE_PIPE 1 #define IPC_MODE_MSG 2 #define IPC_MODE_SHM 3 /* 当前IPC模式 */ #define CURRENT_IPC_MODE IPC_MODE_SHM /* 单次通信最大数据大小 */ #define MAX_DATA_SIZE 1024 /* 通信次数 */ #define NUM_MESSAGES 5 /* 通信间隔(s) */ #define INTERVAL_MESSAGES 1 /**************************************************************************************************/ /* VARIABLES */ /**************************************************************************************************/ /* CRC32校验表 */ static uint32_t crc32_table[256]; /**************************************************************************************************/ /* LOCAL_FUNCTIONS */ /**************************************************************************************************/ /** * @fn void init_crc32_table() * @brief 初始化CRC32表 * * @param[in] none * * @return void * */ void init_crc32_table() { uint32_t c; for (int i = 0; i < 256; i++) { c = i; for (int j = 0; j < 8; j++) { c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1); } crc32_table[i] = c; } } /* 计算CRC32校验值 */ uint32_t crc32(const void *data, size_t len) { uint32_t crc = 0xFFFFFFFF; const uint8_t *bytes = (const uint8_t *)data; for (size_t i = 0; i < len; i++) { crc = crc32_table[(crc ^ bytes[i]) & 0xFF] ^ (crc >> 8); } return crc ^ 0xFFFFFFFF; } /* 发送数据结构定义 */ typedef struct { uint32_t size; /* 数据大小 */ uint32_t crc; /* CRC32校验值 */ uint32_t seq; /* 序列号 */ char data[MAX_DATA_SIZE]; /* 数据部分 */ } ipc_packet; /* 接收数据结构定义 */ typedef struct { uint32_t seq; /* 序列号 */ char result[128]; /* 结果描述 */ } ipc_response; /* 统计结构 */ typedef struct { size_t total_bytes_send; /* 总发送数据量 */ size_t total_bytes_recv; /* 总接收数据量 */ int cout_send; /* 发送次数 */ int cout_recv; /* 接收次数 */ int cout_fail; /* 错误次数 */ } ipc_stats; /** * @fn void sem_lock(int semid) * @brief Locks a semaphore * @param[in] semid Semaphore ID * * @return void * */ void sem_lock(int semid, int sem_num) { struct sembuf sb = {sem_num, -1, SEM_UNDO}; if (semop(semid, &sb, 1) == -1) { perror("信号量锁定失败"); exit(EXIT_FAILURE); } } /** * @fn void sem_unlock(int semid) * @brief Unlocks a semaphore * @param[in] semid Semaphore ID * * @return void * */ void sem_unlock(int semid, int sem_num) { struct sembuf sb = {sem_num, 1, SEM_UNDO}; if (semop(semid, &sb, 1) == -1) { perror("信号量解锁失败"); exit(EXIT_FAILURE); } } void get_current_time(char *buf, size_t buf_size) { time_t now = time(NULL); struct tm *tm = localtime(&now); strftime(buf, 20, "%H:%M:%S", tm); } /* 打印统计结果 */ void print_stats(const ipc_stats *stats) { printf("\n========= IPC通信统计 =========\n"); printf("发送总字节数: %zu bytes\n", stats->total_bytes_send); printf("接收总字节数: %zu bytes\n", stats->total_bytes_recv); printf("发送数据包总数: %d\n", stats->cout_send); printf("接收数据包总数: %d\n", stats->cout_recv); printf("失败验证次数: %d\n", stats->cout_fail); printf("===============================\n"); } /* 共享内存结构 */ typedef struct { ipc_packet data; /* 数据区域 */ ipc_response resp; /* 响应区域 */ ipc_stats stats; /* 统计区域 */ } shared_memory; int main() { // 初始化CRC32表 init_crc32_table(); /* 创建共享内存 */ int shmid = shmget(IPC_PRIVATE, sizeof(shared_memory), IPC_CREAT | 0666); if (shmid < 0) { perror("共享内存创建失败"); exit(EXIT_FAILURE); } /* 附加共享内存 */ shared_memory *shm_ptr = shmat(shmid, NULL, 0); if (shm_ptr == (void *)-1) { perror("共享内存附加失败"); exit(EXIT_FAILURE); } /* 初始化共享内存状态 */ memset(shm_ptr, 0, sizeof(shared_memory)); /* 创建信号量集(0:互斥锁, 1:数据项, 2:响应项) */ int semid = semget(IPC_PRIVATE, 3, IPC_CREAT | 0666); if (semid < 0) { perror("信号量创建失败"); exit(EXIT_FAILURE); } /* 初始化信号量 */ unsigned short init_values[3] = { 1, /* SEM_MUTEX: 初始为1 (解锁状态) */ 0, /* SEM_DATA_READY: 初始为0 (数据未就绪) */ 0 /* SEM_RESP_READY: 初始为0 (响应未就绪) */ }; if (semctl(semid, 0, SETALL, init_values) == -1) { perror("信号量初始化失败"); exit(EXIT_FAILURE); } /* 创建子进程 */ pid_t pid = fork(); if (pid < 0) { perror("fork失败"); exit(EXIT_FAILURE); } /* 父进程 - 进程A (发送方) */ if (pid > 0) { /* 初始化随机数生成器 */ srand(time(NULL)); /* 模拟多次数据传输 */ for (int i = 0; i < NUM_MESSAGES; i++) { /* 准备数据包 */ uint32_t data_size = (i == 0) ? 100 : 200; char data_buffer[MAX_DATA_SIZE]; for (uint32_t j = 0; j < data_size; j++) { data_buffer[j] = rand() % 256; } /* 计算CRC校验值 */ uint32_t crc_value = crc32(data_buffer, data_size); /* 第二次传输故意制造错误 */ if (i % 2 == 1) { data_buffer[0] ^= 0xFF; } /* 加锁共享内存 */ sem_lock(semid, 0); /* 写入数据到共享内存 */ shm_ptr->data.size = data_size; shm_ptr->data.seq = i + 1; shm_ptr->data.crc = crc_value; memcpy(shm_ptr->data.data, data_buffer, data_size); /* 更新发送统计 */ shm_ptr->stats.total_bytes_send += data_size; shm_ptr->stats.cout_send++; /* 解锁共享内存 */ sem_unlock(semid, 0); /* 通知接收方数据就绪 */ sem_unlock(semid, 1); /* 打印发送信息 */ char time_buf[20]; get_current_time(time_buf, sizeof(time_buf)); printf("[%s] A: 发送了%d字节数据给B (序列号:%d)\n", time_buf, data_size, i + 1); /* 等待响应就绪 */ sem_lock(semid, 2); /* 读取响应 */ sem_lock(semid, 0); uint32_t resp_seq = shm_ptr->resp.seq; char resp_msg[128]; strncpy(resp_msg, shm_ptr->resp.result, sizeof(resp_msg)); sem_unlock(semid, 0); /* 打印响应信息 */ get_current_time(time_buf, sizeof(time_buf)); printf("[%s] A: B告诉我%s (序列号:%d)\n\n", time_buf, resp_msg, resp_seq); /* 通信间隔 */ sleep(INTERVAL_MESSAGES); } /* 等待子进程结束 */ wait(NULL); /* 打印最终统计 */ print_stats(&shm_ptr->stats); /* 资源清理 */ shmdt(shm_ptr); shmctl(shmid, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, 0); } /* 子进程 - 进程B (接收方) */ else { for (int i = 0; i < NUM_MESSAGES; i++) { /* 等待数据就绪 */ sem_lock(semid, 1); /* 加锁共享内存 */ sem_lock(semid, 0); /* 读取数据 */ uint32_t data_size = shm_ptr->data.size; uint32_t seq_num = shm_ptr->data.seq; uint32_t stored_crc = shm_ptr->data.crc; char data_buffer[MAX_DATA_SIZE]; memcpy(data_buffer, shm_ptr->data.data, data_size); /* 解锁共享内存 */ sem_unlock(semid, 0); /* 验证数据完整性 */ uint32_t calc_crc = crc32(data_buffer, data_size); int crc_match = (calc_crc == stored_crc); /* 准备响应消息 */ char result_msg[128]; if (crc_match) { snprintf(result_msg, sizeof(result_msg), "收到了%d字节数据, 校验正确", data_size); } else { snprintf(result_msg, sizeof(result_msg), "收到了%d字节数据, 但校验失败", data_size); } /* 打印接收信息 */ char time_buf[20]; get_current_time(time_buf, sizeof(time_buf)); printf("[%s] B: %s (序列号:%d)\n", time_buf, result_msg, seq_num); /* 加锁共享内存 */ sem_lock(semid, 0); /* 写入响应 */ shm_ptr->resp.seq = seq_num; strncpy(shm_ptr->resp.result, result_msg, sizeof(shm_ptr->resp.result)); /* 更新接收统计 */ shm_ptr->stats.total_bytes_recv += data_size; shm_ptr->stats.cout_recv++; if (!crc_match) { shm_ptr->stats.cout_fail++; } /* 解锁共享内存 */ sem_unlock(semid, 0); /* 通知发送方响应就绪 */ sem_unlock(semid, 2); } /* 分离共享内存 */ shmdt(shm_ptr); exit(EXIT_SUCCESS); } return 0; } 我现在的代码是这样的,请按照下面题目的要,帮我写成设计文档。 一、openwrt环境搭建【必须】 参考附件openwrt环境搭建的指南,搭建openwrt环境,并成功运行helloworld程序。 二、熟悉进程间通信方式(IPC)【必须】 流程示例: 第n秒: A:我发送了M字节数据给B B:我从A接收了M字节数据,校验正确,通知A接收了M字节数据,校验正确。 A:B告诉我收到了M字节数据,校验正确 第2n秒: A:我发送了N字节数据给B B:我从A接收了N字节数据,校验错误,通知A接收了N字节数据,校验错误。 A:B告诉我收到了N字节数据,但校验失败 要求: 1. 进程间通信方式、数据结构、校验方式(CRC、MD5等均可)不限,如果感兴趣可以考虑基于openwrt ubus实现进程间通信的方式。 2. 打印统计结果(收发数据或者程序退出时),包括每次收发数据的时间、次数、大小、校验结果以及最终收发的数据总大小等。 3. 提供源码、设计文档。

filetype

为什么这个makefile文件可以在/usr/lib文件下生成.so文件?include $(TOPDIR)/rules.mk PKG_NAME:=libtpsocket PKG_RELEASE:=1 PKG_VERSION:=1.0 PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION) include $(INCLUDE_DIR)/package.mk define Package/$(PKG_NAME) SECTION:=TP-Link CATEGORY:=TP-Link iplatform apps MAINTAINER:=Jinfu Chen DEPENDS:=+libubox +zlib +libpthread +librt +TPSOCKET_MBEDTLS:libmbedtls \ +TPSOCKET_OPENSSL:libopenssl +TPSOCKET_WOLFSSL:libcyassl TITLE:=LibTPSocket endef define Package/$(PKG_NAME)/config menu "Configuration" choice prompt "ssl lib version" default TPSOCKET_MBEDTLS help Select ssl lib version. config TPSOCKET_MBEDTLS bool "use mbedtls lib" config TPSOCKET_OPENSSL bool "use openssl lib" config TPSOCKET_WOLFSSL bool "use wolfssl lib" config TPSOCKET_NOSSL bool "use no ssl lib" endchoice endmenu endef ifeq ($(CONFIG_TPSOCKET_WOLFSSL),y) TARGET_CFLAGS += -DTPSOCKET_USE_WOLFSSL=1 -lcyassl SSL_SETTING_DEFINE=\#define TPSOCKET_USE_WOLFSSL 1 endif ifeq ($(CONFIG_TPSOCKET_OPENSSL),y) TARGET_CFLAGS += -DTPSOCKET_USE_OPENSSL=1 -lssl -lcrypto SSL_SETTING_DEFINE=\#define TPSOCKET_USE_OPENSSL 1 endif ifeq ($(CONFIG_TPSOCKET_MBEDTLS),y) ifeq ($(CONFIG_PACKAGE_mbedtls_version),2) TARGET_CFLAGS += -DMBEDTLS_VERSION_TWO endif TARGET_CFLAGS += -DTPSOCKET_USE_MBEDTLS=1 -lmbedtls -lmbedx509 -lmbedcrypto SSL_SETTING_DEFINE=\#define TPSOCKET_USE_MBEDTLS 1 endif ifeq ($(CONFIG_TPSOCKET_NOSSL),y) TARGET_CFLAGS += -DTPSOCKET_USE_NOSSL=1 SSL_SETTING_DEFINE=\#define TPSOCKET_USE_NOSSL 1 endif ifeq ($(CONFIG_HTTP_HMAC_HKDF_SUPPORT),y) TARGET_CFLAGS += -DHTTP_HMAC_HKDF_SUPPORT endif define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ mkdir -p $(STAGING_DIR)/usr/include/$(PKG_NAME)/ $(CP) ./src/*.h $(STAGING_DIR)/usr/include/$(PKG_NAME)/ echo "$(SSL_SETTING_DEFINE)" > $(STAGING_DIR)/usr/include/$(PKG_NAME)/tpsocket_ssl_setting.h endef define Package/$(PKG_NAME)/install $(INSTALL_DIR) $(1)/usr/lib $(INSTALL_BIN) $(PKG_BUILD_DIR)/libtpsocket.so $(1)/usr/lib $(INSTALL_DIR) $(STAGING_DIR)/usr/lib/ $(INSTALL_BIN) $(PKG_BUILD_DIR)/libtpsocket.so $(STAGING_DIR)/usr/lib/ #$(INSTALL_DIR) $(1)/usr/bin #$(INSTALL_BIN) $(PKG_BUILD_DIR)/testsocket $(1)/usr/bin $(CP) -rf ./filesystem/* $(1)/ endef $(eval $(call BuildPackage,$(PKG_NAME)))

资源评论
用户头像
本本纲目
2025.09.06
内容简明,适合对 OpenWRT 编译有一定了解的开发者阅读🍘
用户头像
半清斋
2025.06.05
针对 TPLINK 的编译框架分析,实用性强,值得收藏🎊
用户头像
番皂泡
2025.05.10
一篇详细分析 OpenWRT 编译框架的文章,对 TPLINK 设备有参考价值😀
用户头像
顾露
2025.04.22
对于想深入了解 OpenWRT 编译机制的人来说,这篇文档很有帮助
巴啦啦小魔仙变身
  • 粉丝: 338
上传资源 快速赚钱