如何在OpenWrt软路由中增加一个新功能
为了在OpenWrt中增加一个新的功能并使其支持 UCI 配置我们可以创建一个简单的C语言服务例如一个简单的日志服务。此服务将记录到日志文件中并支持通过 UCI 配置启用或禁用日志功能。以下是详细的步骤和代码示例。1 创建服务代码1.1 创建服务的源代码 (logservice.c)这个服务将检查 UCI 配置根据配置决定是否写入日志c #include stdio.h #include stdlib.h #include unistd.h #include uci.h void log_message(const char *message) { FILE *file fopen(/tmp/logservice.log, a); if (file) { fprintf(file, %s\n, message); fclose(file); } } int main(void) { struct uci_context *c; struct uci_ptr ptr; char *enabled; c uci_alloc_context(); if (uci_lookup_ptr(c, ptr, logservice.global.enabled, true) UCI_OK) { enabled ptr.o-v.string; if (strcmp(enabled, 1) 0) { while (1) { log_message(Log service is active.); sleep(60); // Log every minute } } } uci_free_context(c); return 0; }1.2 创建 Makefile来编译这个服务makefile CCgcc CFLAGS-I. DEPS uci.h OBJ logservice.o %.o: %.c $(DEPS) $(CC) -c -o $ $ $(CFLAGS) logservice: $(OBJ) $(CC) -o $ $^ $(CFLAGS) -luci clean: rm -f *.o logservice2 为 OpenWrt 创建软件包2.1 创建 OpenWrt 包目录结构在 OpenWrt 构建环境中的 package 目录下创建一个新目录 logservice。mkdir -p package/logservice cd package/logservice2.2 创建控制文件(Makefile)这个文件定义了包的元数据和如何编译和安装它makefile include $(TOPDIR)/rules.mk PKG_NAME:logservice PKG_RELEASE:1 PKG_VERSION:1.0.0 include $(INCLUDE_DIR)/package.mk define Package/logservice SECTION:utils CATEGORY:Utilities TITLE:Simple Log Service DEPENDS:libuci endef define Package/logservice/description A simple service that logs messages to a file based on UCI configuration. endef define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ endef define Build/Compile $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS) endef define Package/logservice/install $(INSTALL_DIR) $(1)/usr/sbin $(INSTALL_BIN) $(PKG_BUILD_DIR)/logservice $(1)/usr/sbin/ $(INSTALL_DIR) $(1)/etc/init.d $(INSTALL_BIN) ./files/logservice.init $(1)/etc/init.d/logservice $(INSTALL_DIR) $(1)/etc/config $(INSTALL_DATA) ./files/logservice.config $(1)/etc/config/logservice endef $(eval $(call BuildPackage,logservice))控制文件通常指的是用于描述和控制软件包编译和安装过程的 Makefile。这个 Makefile 与传统的 Linux/Unix 系统中用于编译程序的 Makefile 相似但它专门为 OpenWrt 的包管理系统设计用来定义软件包的元数据、构建和安装行为。通常包含以下部分包的定义和元数据PKG_NAME定义软件包的名称。PKG_VERSION定义软件包的版本号。PKG_RELEASE软件包的发布次数通常用于修订号或当相同版本号的包被修改时递增。PKG_SOURCE、PKG_SOURCE_URL、PKG_HASH可选定义软件包源代码的位置、下载 URL 和源码的哈希值用于验证。包含 OpenWrt 构建系统的规则和宏定义include $(TOPDIR)/rules.mk包含了 OpenWrt 主目录下的通用规则文件。include $(INCLUDE_DIR)/package.mk包含处理软件包的核心功能和定义的文件。软件包定义区域define Package/开始定义一个软件包其中 是软件包的名称通常与 PKG_NAME 相同。SECTION、CATEGORY软件包的分类和子分类。TITLE软件包的简短描述或标题。DEPENDS定义软件包的依赖如依赖其他库或软件包。包描述define Package//description提供软件包的详细描述。准备构建环境define Build/Prepare准备构建目录通常包括解压源码、应用补丁等步骤。配置软件包define Build/Configure可选如果软件包需要特殊的配置步骤可以在这里定义。编译软件包define Build/Compile定义编译软件包的命令和步骤。安装软件包define Package//install定义如何安装编译后的软件到目标目录通常包括拷贝可执行文件、配置文件等到相应的安装目录。注册软件包$(eval $(call BuildPackage,))这是一个宏调用用于注册软件包使得构建系统能够识别和处理它。2.3 创建 UCI 配置文件和初始化脚本UCI 配置(logservice.config):config logservice global option enabled 1初始化脚本(logservice.init):#!/bin/sh /etc/rc.common START99 start() { /usr/sbin/logservice } stop() { killall logservice }在 OpenWrt 或其他使用 init.d 脚本的 Unix-like 系统中logservice.init 脚本的作用是控制 logservice 服务的启动、停止以及其他管理操作。这个脚本通常被称为 init 脚本或服务脚本并且是服务管理的核心组成部分。logservice.init 脚本主要提供以下功能启动服务start当系统启动或手动启动服务时该脚本将被调用以启动 logservice 程序。通常这涉及到运行主服务程序并可能还包括设置必要的环境或运行前的配置。停止服务stop当系统关闭或需要手动停止服务时该脚本用于安全地停止 logservice 程序。这通常涉及到发送终止信号给服务进程或执行其他清理步骤。重启服务restart这通常是通过停止后再启动服务来实现有时是为了应用新的配置更改或恢复服务的正常状态。查看服务状态status尽管在给出的脚本示例中没有直接实现但许多服务脚本还支持检查并报告服务是否正在运行以及运行状态。启动顺序START在 logservice.init 脚本中定义的 START99 表示此服务在系统启动过程中的启动顺序。数值越大启动越晚允许它在其他服务之后启动。logservice.init 脚本是服务生命周期管理的关键工具它允许系统管理员和系统本身在适当的时间以适当的方式启动和停止服务。在 OpenWrt 这样的嵌入式系统中这种脚本是管理后台服务不可或缺的部分确保了服务的可控性和稳定性。3 编译和安装将软件包添加到 OpenWrt 构建系统返回到 OpenWrt 的根目录并运行 make menuconfig。在 Utilities 菜单下选择 logservice 包进行编译。编译 OpenWrt 镜像make package/logservice/compile Vsmake Vs刷写固件并测试服务安装生成的固件到你的设备上并测试 logservice 是否根据 UCI 配置正确运行。这个例子展示了如何为 OpenWrt 添加一个简单的 C 语言编写的服务使其支持 UCI 配置。4 OpenWrt NFC功能的例子代码包括两个部分一个是 OpenWrt 的启动脚本用于管理 NFC 服务的启动和停止另一个是 Makefile用于编译 NFC 相关的 C 代码。4.1 启动脚本init.d解释#!/bin/sh /etc/rc.commonUSE_PROCD1START46STOP99SERVICE_USE_PID1USE_PROCD1PROG/usr/bin/topsw_nfc这是一个 shell 脚本用于控制 NFC 服务 (topsw_nfc) 的启动和停止。USE_PROCD1启用 procd 支持procd 是 OpenWrt 的进程管理守护程序。START46和STOP99定义了服务启动和停止的优先级。数字越小启动优先级越高停止时则相反。SERVICE_USE_PID1表明该服务使用 PID 文件。PROG/usr/bin/topsw_nfc定义了 NFC 程序的路径。start_service(){procd_open_instance procd_set_param stdout1procd_set_param stderr1procd_set_paramcommand$PROGprocd_set_param respawn procd_close_instance}start_service函数用于配置和启动服务。procd_open_instance开启一个新的服务实例。procd_set_param设置服务参数如标准输出、错误输出、启动命令和重启参数。procd_close_instance关闭实例配置启动服务。reload_service(){restart}reload_service定义重启服务的功能使用restart命令重启服务。4.2 Makefile解释PROGS topsw_nfc定义要编译的程序名称。SOURCES $(wildcard ./src/*.c) OBJS $(patsubst %.c,%.o,$(SOURCES))SOURCES获取src目录下所有的.c文件。OBJS将源文件名从.c转换为.o。$(OBJS): %.o : %.c $(CC) -c $(CFLAGS) $(CFLAGS) $^ -o $规则说明如何从.c文件生成.o文件。$(PROGS): $(OBJS)最终链接生成可执行文件的规则。4.3 NFC添加到系统中的步骤编译使用 Makefile 编译 NFC 相关的 C 代码生成可执行文件topsw_nfc。部署将编译好的程序部署到/usr/bin/topsw_nfc路径下。服务管理通过 OpenWrt 的启动脚本管理 NFC 服务的启动、停止和重启配置启动配置脚本确保在系统启动时NFC 服务按指定的优先级启动并在停止时按相反的优先级停止。在 OpenWrt 及类似的构建系统中系统能够知道存在topsw_nfc这个包并允许在图形界面中进行选择主要是通过以下几个关键步骤实现的包定义文件Makefile每个可选的软件包在 OpenWrt 的源代码目录中通常都有一个对应的包定义文件即一个 Makefile。这个 Makefile 不仅定义了如何下载、配置、编译、安装、清理该软件包还包含了软件包的描述、依赖关系和配置选项等元数据。包目录结构在 OpenWrt 的源代码中通常有一个package目录其中每个子目录或文件夹代表一个包。例如topsw_nfc包可能位于package/network/services/topsw_nfc目录下。Makefile 内容此 Makefile 将包含如下关键信息Package定义用于设置包名和描述。define Package/topsw_nfc其中包括描述、版本、分类等。编译和安装指令指明如何构建和安装包。可能还包括Config.in或config段落用于定义配置界面中的选项。配置系统集成OpenWrt 使用 Kconfig 系统这是从 Linux 内核借鉴的配置工具用于在图形界面 (make menuconfig) 中显示和选择配置选项。Kconfig 与 Makefile包的 Makefile 中通常包括指向 Kconfig 文件的引用这使得构建系统在运行make menuconfig时可以解析并显示所有可用的包选项。配置选项在 Kconfig 文件或 Makefile 中定义的配置选项决定了包是否可以被选中以及它依赖哪些条件。图形界面中的显示当运行make menuconfig时OpenWrt 的构建系统会扫描所有包的 Makefile 和 Kconfig 文件将它们的信息汇总到配置界面中。用户交互在图形界面中用户可以浏览各种类别的软件包选择需要编译进固件的包。依赖解析如果topsw_nfc包依赖其他库或包这些依赖也会在图形界面中显示用户必须先解决依赖问题才能启用该包。系统的响应选择了topsw_nfc包并保存配置后这些选择被写入.config文件这是构建系统在后续构建过程中读取的配置文件。总结来说系统通过预定义的包描述文件Makefile、Kconfig 集成以及图形配置界面menuconfig相结合的方式使得用户可以选择特定的软件包如topsw_nfc进行编译和安装。这种方法保证了构建系统的灵活性和可扩展性允许用户根据需要定制自己的固件。

相关新闻

从 WinForms 到 Vue:我为什么决定在 Web 上重做一套完整的 GUI 框架

从 WinForms 到 Vue:我为什么决定在 Web 上重做一套完整的 GUI 框架

从 WinForms 到 Vue:我为什么决定在 Web 上重做一套完整的 GUI 框架 引言:一次跨越十年的技术觉醒十年前,我在一家传统软件公司用 WinForms 写桌面应用。那时候,拖拽控件、绑定事件、处理状态机,一切看似顺理成章。直到…

2026/7/23 18:24:58阅读更多 →
论文各章节AIGC风险地图:为什么文献综述全是红的,实验数据却是绿的?

论文各章节AIGC风险地图:为什么文献综述全是红的,实验数据却是绿的?

一个让人崩溃的场景 你花了两周写完初稿,上传到AIGC检测。报告出来了—— 文献综述整个章节全红。绪论一大片标黄。理论框架部分像被血洗过一样。但实验数据分析和结果讨论那块,几乎全是绿的。 同一篇论文,同一个作者,为什么不…

2026/7/23 18:24:58阅读更多 →
滞回运放电路仿真和分析

滞回运放电路仿真和分析

滞回比较电路分析 目录滞回比较电路分析过零滞回比较电路仿真分析波形图改进的波形图滞回比较电路仿真过零滞回比较电路仿真 正反馈运放电路构成比较器电路,由于运放本身就具有很大的开环增益,所有即便是带正反馈也并不会有什么影响,此处的正…

2026/7/23 18:22:58阅读更多 →
深入解析TI C2000 eCAP模块:捕获与APWM双模实战指南

深入解析TI C2000 eCAP模块:捕获与APWM双模实战指南

1. eCAP模块:嵌入式系统里的“时间侦探”与“波形雕刻师”在嵌入式系统,尤其是实时控制领域里,时间就是一切。无论是测量电机编码器脉冲的间隔来推算转速,还是生成一个精准的PWM信号去控制LED亮度或电机扭矩,背后都需要…

2026/7/23 19:43:17阅读更多 →
DecoTV与LunaTV深度对比:为什么选择这款二次开发的播放神器

DecoTV与LunaTV深度对比:为什么选择这款二次开发的播放神器

DecoTV与LunaTV深度对比:为什么选择这款二次开发的播放神器 【免费下载链接】DecoTV 基于最新版LunaTV二次开发的一个开箱即用的、跨平台的影视聚合播放站。【原KatelyaTV】 项目地址: https://gitcode.com/gh_mirrors/de/DecoTV DecoTV是基于最新版LunaTV二…

2026/7/23 19:43:17阅读更多 →
AI Agent技术架构与核心实现解析

AI Agent技术架构与核心实现解析

1. AI Agent技术全景解析AI Agent(人工智能代理)本质上是一个能够感知环境、自主决策并执行行动的智能系统。不同于传统程序化的"if-then"规则,现代AI Agent通过机器学习模型实现认知、规划和行动三大核心能力。典型的AI Agent架构…

2026/7/23 19:43:17阅读更多 →
C2000 eQEP模块深度解析:从编码器脉冲到精准位置与速度控制

C2000 eQEP模块深度解析:从编码器脉冲到精准位置与速度控制

1. 从脉冲到位置:eQEP模块的核心价值与设计哲学 在伺服电机、机器人关节或者任何需要精确知道“自己在哪里”的运动控制场景里,正交编码器(Quadrature Encoder)是工程师最信赖的“眼睛”。它输出的两路相位差90度的方波信号&#…

2026/7/23 19:43:17阅读更多 →
加粗标题:人活得舒心通透的几种活法,读懂少走半生弯路

加粗标题:人活得舒心通透的几种活法,读懂少走半生弯路

开头引入 很多人常年被焦虑、内耗裹挟,总在迎合他人、追逐不属于自己的标准,身心长期紧绷,很难感受到松弛与安稳。人人都渴望自在舒服的人生,可舒服从不是躺平摆烂,而是找准和自己、世界相处的平衡方式。结合普通人真实…

2026/7/23 19:43:17阅读更多 →
Python计算机毕设之基于 Python 的校园二手社交交易平台实现校园二手物品问答互动与交易系统设计 (完整前后端代码+说明文档+LW,调试定制等)

Python计算机毕设之基于 Python 的校园二手社交交易平台实现校园二手物品问答互动与交易系统设计 (完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/23 19:41:16阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →