如何在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
CC=gcc
CFLAGS=-I.
DEPS = uci.h
OBJ = logservice.o%.o: %.c $(DEPS)$(CC) -c -o $@ $< $(CFLAGS)logservice: $(OBJ)$(CC) -o $@ $^ $(CFLAGS) -luciclean:rm -f *.o logservice

2 為 OpenWrt 創建軟件包

2.1 創建 OpenWrt 包目錄結構

在 OpenWrt 構建環境中的 package 目錄下創建一個新目錄 logservice。

mkdir -p package/logservice
cd package/logservice

2.2 創建控制文件(Makefile)

這個文件定義了包的元數據和如何編譯和安裝它:

makefile
include $(TOPDIR)/rules.mkPKG_NAME:=logservice
PKG_RELEASE:=1
PKG_VERSION:=1.0.0include $(INCLUDE_DIR)/package.mkdefine Package/logserviceSECTION:=utilsCATEGORY:=UtilitiesTITLE:=Simple Log ServiceDEPENDS:=+libuci
endefdefine Package/logservice/descriptionA simple service that logs messages to a file based on UCI configuration.
endefdefine Build/Preparemkdir -p $(PKG_BUILD_DIR)$(CP) ./src/* $(PKG_BUILD_DIR)/
endefdefine Build/Compile$(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)
endefdefine 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.commonSTART=99start() {/usr/sbin/logservice &}stop() {killall logservice}
    

在 OpenWrt 或其他使用 init.d 腳本的 Unix-like 系統中,logservice.init 腳本的作用是控制 logservice 服務的啟動、停止以及其他管理操作。這個腳本通常被稱為 init 腳本或服務腳本,并且是服務管理的核心組成部分。logservice.init 腳本主要提供以下功能:

  1. 啟動服務(start)

    • 當系統啟動或手動啟動服務時,該腳本將被調用以啟動 logservice 程序。通常,這涉及到運行主服務程序,并可能還包括設置必要的環境或運行前的配置。
  2. 停止服務(stop)

    • 當系統關閉或需要手動停止服務時,該腳本用于安全地停止 logservice 程序。這通常涉及到發送終止信號給服務進程或執行其他清理步驟。
  3. 重啟服務(restart)

    • 這通常是通過停止后再啟動服務來實現,有時是為了應用新的配置更改或恢復服務的正常狀態。
  4. 查看服務狀態(status)

    • 盡管在給出的腳本示例中沒有直接實現,但許多服務腳本還支持檢查并報告服務是否正在運行以及運行狀態。
  5. 啟動順序(START)

    • 在 logservice.init 腳本中定義的 START=99 表示此服務在系統啟動過程中的啟動順序。數值越大,啟動越晚,允許它在其他服務之后啟動。

logservice.init 腳本是服務生命周期管理的關鍵工具,它允許系統管理員和系統本身在適當的時間以適當的方式啟動和停止服務。在 OpenWrt 這樣的嵌入式系統中,這種腳本是管理后臺服務不可或缺的部分,確保了服務的可控性和穩定性。

3 編譯和安裝

  1. 將軟件包添加到 OpenWrt 構建系統

    返回到 OpenWrt 的根目錄并運行 make menuconfig。在 Utilities 菜單下選擇 logservice 包進行編譯。

  2. 編譯 OpenWrt 鏡像

    make package/logservice/compile V=s
    make V=s

  3. 刷寫固件并測試服務

    安裝生成的固件到你的設備上,并測試 logservice 是否根據 UCI 配置正確運行。

這個例子展示了如何為 OpenWrt 添加一個簡單的 C 語言編寫的服務,使其支持 UCI 配置。

4 OpenWrt NFC功能的例子

代碼包括兩個部分:一個是 OpenWrt 的啟動腳本,用于管理 NFC 服務的啟動和停止;另一個是 Makefile,用于編譯 NFC 相關的 C 代碼。

4.1 啟動腳本init.d解釋

#!/bin/sh /etc/rc.common
USE_PROCD=1
START=46
STOP=99
SERVICE_USE_PID=1
USE_PROCD=1
PROG=/usr/bin/topsw_nfc
  • 這是一個 shell 腳本,用于控制 NFC 服務 (topsw_nfc) 的啟動和停止。
  • USE_PROCD=1:啟用 procd 支持,procd 是 OpenWrt 的進程管理守護程序。
  • START=46STOP=99:定義了服務啟動和停止的優先級。數字越小,啟動優先級越高;停止時則相反。
  • SERVICE_USE_PID=1:表明該服務使用 PID 文件。
  • PROG=/usr/bin/topsw_nfc:定義了 NFC 程序的路徑。
start_service() {procd_open_instanceprocd_set_param stdout 1procd_set_param stderr 1procd_set_param command "$PROG"procd_set_param respawnprocd_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添加到系統中的步驟

  1. 編譯:使用 Makefile 編譯 NFC 相關的 C 代碼生成可執行文件 topsw_nfc
  2. 部署:將編譯好的程序部署到 /usr/bin/topsw_nfc 路徑下。
  3. 服務管理:通過 OpenWrt 的啟動腳本管理 NFC 服務的啟動、停止和重啟
  4. 配置啟動:配置腳本確保在系統啟動時,NFC 服務按指定的優先級啟動,并在停止時按相反的優先級停止。

在 OpenWrt 及類似的構建系統中,系統能夠知道存在 topsw_nfc 這個包,并允許在圖形界面中進行選擇,主要是通過以下幾個關鍵步驟實現的:

  1. 包定義文件(Makefile)

每個可選的軟件包在 OpenWrt 的源代碼目錄中通常都有一個對應的包定義文件,即一個 Makefile。這個 Makefile 不僅定義了如何下載、配置、編譯、安裝、清理該軟件包,還包含了軟件包的描述、依賴關系和配置選項等元數據。

  • 包目錄結構:在 OpenWrt 的源代碼中,通常有一個 package 目錄,其中每個子目錄或文件夾代表一個包。例如,topsw_nfc 包可能位于 package/network/services/topsw_nfc 目錄下。
  • Makefile 內容:此 Makefile 將包含如下關鍵信息:
    • Package 定義,用于設置包名和描述。
    • define Package/topsw_nfc,其中包括描述、版本、分類等。
    • 編譯和安裝指令,指明如何構建和安裝包。
    • 可能還包括 Config.inconfig 段落,用于定義配置界面中的選項。
  1. 配置系統集成

OpenWrt 使用 Kconfig 系統,這是從 Linux 內核借鑒的配置工具,用于在圖形界面 (make menuconfig) 中顯示和選擇配置選項。

  • Kconfig 與 Makefile:包的 Makefile 中通常包括指向 Kconfig 文件的引用,這使得構建系統在運行 make menuconfig 時可以解析并顯示所有可用的包選項。
  • 配置選項:在 Kconfig 文件或 Makefile 中定義的配置選項決定了包是否可以被選中,以及它依賴哪些條件。
  1. 圖形界面中的顯示

當運行 make menuconfig 時,OpenWrt 的構建系統會掃描所有包的 Makefile 和 Kconfig 文件,將它們的信息匯總到配置界面中。

  • 用戶交互:在圖形界面中,用戶可以瀏覽各種類別的軟件包,選擇需要編譯進固件的包。
  • 依賴解析:如果 topsw_nfc 包依賴其他庫或包,這些依賴也會在圖形界面中顯示,用戶必須先解決依賴問題,才能啟用該包。
  1. 系統的響應

選擇了 topsw_nfc 包并保存配置后,這些選擇被寫入 .config 文件,這是構建系統在后續構建過程中讀取的配置文件。

總結來說,系統通過預定義的包描述文件(Makefile)、Kconfig 集成以及圖形配置界面(menuconfig)相結合的方式,使得用戶可以選擇特定的軟件包,如 topsw_nfc,進行編譯和安裝。這種方法保證了構建系統的靈活性和可擴展性,允許用戶根據需要定制自己的固件。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/9967.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/9967.shtml
英文地址,請注明出處:http://en.pswp.cn/web/9967.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

K8S三 K8S部署微服務應用

一 用k8s部署微服務應用 以我們之前用docker部署過的eureka應用為例&#xff0c;首先添加配置文件eureka-app-deployment.yaml用于創建Deployment apiVersion: apps/v1 kind: Deployment metadata:name: eureka-app-deployment # deployment名字labels:app: eureka-app spec:…

【C++】CentOS環境搭建-升級CMAKE

【C】CentOS環境搭建-升級CMAKE CMAKE報錯CMake 3.12 or higher is required. You are running version 2.8.12.2升級步驟1.移除當前的cmake2.安裝必要的構建工具和庫3.下載最新的cmake源碼并解壓5.編譯和安裝6.驗證安裝 CMAKE報錯CMake 3.12 or higher is required. You are r…

oraclesql中刪除表中重復行的方法

在Oracle SQL中&#xff0c;刪除表中的重復行有幾種常見的方法。以下是其中的三種&#xff1a; 使用ROWID: 通過比較ROWID&#xff0c;你可以找到并刪除重復的行。這是因為ROWID是Oracle數據庫為每一行數據分配的唯一標識符。 sql DELETE FROM persons p1 WHERE ROWID NOT…

MySQL存儲引擎詳解

存儲引擎 MySQL體系結構 連接層&#xff1a;與客戶端連接&#xff0c;權限校驗、連接池服務層&#xff1a;SQL接口和解析、查詢優化、緩存、函數引擎層&#xff1a;索引、存儲引擎存儲層&#xff1a;系統文件、日志&#xff08;Redo、Undo等&#xff09; 存儲引擎介紹 不同的…

SSH:安全遠程訪問的基石

SSH&#xff1a;安全遠程訪問的基石 一、引言 在當今這個數字化、網絡化的時代&#xff0c;遠程訪問和管理計算機資源已成為日常工作的重要組成部分。然而&#xff0c;如何在不安全的網絡環境中確保數據傳輸的機密性、完整性和可靠性&#xff0c;成為了一個亟待解決的問題。S…

前端測試策略與實踐:單元測試、E2E測試與可訪問性審計

前端測試策略是確保Web應用程序質量、性能和用戶體驗的關鍵組成部分。有效的測試策略通常包括單元測試、端到端&#xff08;E2E&#xff09;測試以及可訪問性審計等多個層面。以下是關于這三類測試的策略與實踐建議&#xff1a; 單元測試 定義與目的&#xff1a; 單元測試是針…

P2622 關燈問題

小小注解&#xff1a; 1. vis&#xff1a;表示到達該狀態的步數&#xff08;min&#xff09;1&#xff0c; 因為我們是從開始狀態 窮舉&#xff0c;所以每次到一個新狀態&#xff08;之前沒有到過的狀態&#xff09;就是最小步數。 如何判斷是否是一個新狀態呢&#xff0c…

axios常用配置

Axios 是一個基于 promise 的 HTTP 庫&#xff0c;廣泛用于瀏覽器和 node.js 中。以下是一些 Axios 常用的配置選項&#xff1a; url: 字符串&#xff0c;請求的服務器URL&#xff0c;是必填項。method: 請求方法&#xff0c;如 ‘get’, ‘post’, ‘put’, ‘delete’ 等&am…

免費遠程控制軟件哪個好用

免費遠程控制軟件哪個好用 在現今高度信息化的社會&#xff0c;遠程控制軟件已成為許多用戶進行遠程辦公、技術支持和教育培訓的重要工具。市面上有許多免費的遠程控制軟件&#xff0c;但哪款才是最好用的呢&#xff1f;本文將為您介紹幾款熱門的免費遠程控制軟件&#xff0c;…

Tab菜單與下拉式菜單

Tab菜單 利用CSS隱藏或顯示欄目中的部分內容&#xff0c;實際Tab面板包含的全部內容都已下載到客戶端瀏覽器當中。一般Tab面板僅顯示一個Tab菜單項&#xff0c;當用戶點選對應的菜單選項之后&#xff0c;才會顯示對應的內容。 <!DOCTYPE html> <html><head>…

Matlab: ode45解微分方程——以彈簧振子模型為例

簡介&#xff1a; 在科學和工程中&#xff0c;我們經常遇到描述事物變化的微分方程。這些方程可以幫助我們理解從行星運動到藥物在體內的擴散等各種現象。但是&#xff0c;很多微分方程非常復雜&#xff0c;手動求解幾乎不可能。這時&#xff0c;我們就可以使用像 ode45這樣的…

【DL】FocalLoss的PyTorch實現

【DL】FocalLoss的PyTorch實現 此篇不介紹FocalLoss的原理&#xff0c;僅展示PyTorch實現FocalLoss的兩種方式。個人認為相關原理已在文章《FocalLoss原理通俗解釋及其二分類和多分類場景下的原理與實現》中講得很清晰&#xff0c;故此篇不再介紹。 方式一 同時計算一個batc…

【iOS】frame與bounds區別

文章目錄 前言framebounds兩者區別size的區別總結 前言 在學習響應者鏈的過程中用到了frame與bounds的混用&#xff0c;這兩個屬性經常出現在我們的開發中&#xff0c;特別撰寫一篇博客分析區別 首先&#xff0c;我們來看一下iOS特有的坐標系&#xff0c;在iOS坐標系中以左上…

C語言如何查看進程中環境變量中所有的值

示例代碼&#xff1a;查看進程中環境變量中所有的值。 #include <stdio.h>int main(){extern char** environ;for (char** pp environ; *pp; pp){printf("%s\n", *pp);}return 0; }輸出結果&#xff1a; SHELL/bin/bash WSL2_GUI_APPS_ENABLED1 WSL_DISTRO_…

【debug】如何使用pycharm對代碼調試

后續會將所有debug中遇到的知識放入&#xff0c;建議關注收藏 本站友情鏈接&#xff1a; 基本理論專欄&#xff08;當前更新好的debug所有內容都在這里&#xff09; 【debug】報錯解決方法&#xff08;CondaHTTPError&#xff1a;HTTP 000 connection failed for url&#xff…

【回溯 狀態壓縮 深度優先】37. 解數獨

本文涉及知識點 回溯 狀態壓縮 深度優先 LeetCode37. 解數獨 編寫一個程序&#xff0c;通過填充空格來解決數獨問題。 數獨的解法需 遵循如下規則&#xff1a; 數字 1-9 在每一行只能出現一次。 數字 1-9 在每一列只能出現一次。 數字 1-9 在每一個以粗實線分隔的 3x3 宮內只…

leetCode刷題記錄4-面試經典150題-2

文章目錄 不要擺&#xff0c;沒事干就刷題&#xff0c;只有好處&#xff0c;沒有壞處&#xff0c;實在不行&#xff0c;看看競賽題面試經典 150 題 - 2210. 課程表 II 不要擺&#xff0c;沒事干就刷題&#xff0c;只有好處&#xff0c;沒有壞處&#xff0c;實在不行&#xff0c…

[C++核心編程-06]----C++類和對象之對象模型和this指針

&#x1f3a9; 歡迎來到技術探索的奇幻世界&#x1f468;?&#x1f4bb; &#x1f4dc; 個人主頁&#xff1a;一倫明悅-CSDN博客 ?&#x1f3fb; 作者簡介&#xff1a; C軟件開發、Python機器學習愛好者 &#x1f5e3;? 互動與支持&#xff1a;&#x1f4ac;評論 &…

Microsoft 365 for Mac v16.84 office365全套辦公軟件

Microsoft 365 for Mac是一款功能豐富的辦公軟件套件&#xff0c;為Mac用戶提供了豐富的功能和工具&#xff0c;提高了工作效率和協作能力。Microsoft 365 for Mac是一款專為Mac用戶設計的訂閱式辦公軟件套件&#xff0c;旨在提高生產力和效率。 Microsoft 365 for Mac v16.84正…

數據賦能(83)——數據要素:數據要素管理與數據管理

數據要素管理則更關注數據作為生產性資源在創造經濟價值中的作用&#xff1b;數據管理更側重于數據在整個生命周期中的控制、保護和價值提升。 數據要素管理是對數據作為關鍵生產要素進行系統性管理的過程。它聚焦于數據在經濟和社會活動中的價值創造和貢獻&#xff0c;將數據…