1. 程式人生 > >基於OpenWrt新增ubus支援的示例分享

基於OpenWrt新增ubus支援的示例分享

http://blog.csdn.net/hbl0307106015/article/details/48249585

寫作說明

  • 釋出宣告: 本文釋出於2015年9月6日,內容為原創,轉載請說明出處,多謝合作,Linux有GPL協議,那麼部落格應用也類似,希望大家遵循“GPL”開源精神
  • 平臺:OpenWrt 14.07 + 一臺路由器
  • 需求:為一個守護程序新增ubus支援,使之能夠使用ubus call來獲取相關資訊
  • 參考:netifd,ubus原始碼(尤其是examples目錄下的示例)
  • 思路:聽聞ubus有封裝好的API,那麼,一定有某些規則讓我們這些開發者去遵循,帶著這個問題去尋找答案,找到如何從零開始給守護程序新增ubus支援
    的方法。

……經過數日的努力和分析,以下是核心的實現步驟,授人以魚不如授人以漁,我這裡不會貼出完完全全的程式碼,希望讀者能夠根據這些啟示,結合netifd和ubus的原始碼,自己去領會……

方法介紹

  • 第一步:初始化動作
<code class="language-c hljs  has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    uloop_init(); <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">// 初始化</span>

    ubus_path = path;
    ubus_ctx = ubus_connect(path);
    <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!ubus_ctx) {
        <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">fprintf</span>(stderr, <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"failed to connect to ubus\n"</span>);
        <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">return</span> -EIO;
    }

    <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">fprintf</span>(stdout, <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"connect as %08x\n"</span>, ubus_ctx->local_id);
    ubus_ctx->connection_lost = rp_ubus_connection_lost; <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">//新增一個重連機制,可以省略的</span>
    rp_ubus_add_fd();

    rp_ubus_add_object(&sample_object);<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">// 新增物件</span></code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">2</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">3</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">4</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">5</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">6</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">7</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">8</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">9</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">10</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">11</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">12</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">13</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">14</li></ul>
  • 第二步:具體業務邏輯相關
<code class="language-c hljs  has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"><span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">void</span>
rp_ubus_add_object(<span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_object *obj)
{
    <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ret = ubus_add_object(ubus_ctx, obj);<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">// 關鍵部分,新增物件</span>

    <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (ret != <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)
        <span class="hljs-built_in" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102); box-sizing: border-box;">fprintf</span>(stderr, <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"failed to publish object '%s' : %s\n"</span>, obj->name,  ubus_strerror(ret));
}

<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">// 處理函式</span>
<span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">int</span>
rp_handle_hook_status(<span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_context *ctx, <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_object *obj,
                     <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_request_data *req, <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">const</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">char</span> *method,
                     <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> blob_attr *msg)
{
    <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">int</span> ret = -<span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">1</span>;

    blob_buf_init(&b, <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span>);

    blobmsg_add_u32(&b, <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"status"</span>, hs); <span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">/* hook status */</span>
    blobmsg_add_string(&b, <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"account"</span>, usrname);

    ubus_send_reply(ctx, req, b.head);
    <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">return</span> <span class="hljs-number" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102); box-sizing: border-box;">0</span>;
}

<span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_method hook_methods[] = {
    { .name = <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"sample"</span>, .handler = rp_handle_hook_status },<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">// 這是其中一種成員新增的模板,名字叫什麼,處理函式是誰,說清楚來,</span>
};

<span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_object_type hook_object_type =
    UBUS_OBJECT_TYPE(<span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"package.sample"</span>, hook_methods);

<span class="hljs-comment" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0); box-sizing: border-box;">// 這個結構體就是整個框架的縮影</span>
<span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136); box-sizing: border-box;">struct</span> ubus_object hook_object = {
    .name = <span class="hljs-string" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0); box-sizing: border-box;">"package.sample"</span>,
    .type = &hook_object_type,
    .methods = hook_methods,
    .n_methods = ARRAY_SIZE(hook_methods),
};</code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">2</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">3</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">4</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">5</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">6</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">7</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">8</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">9</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">10</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">11</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">12</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">13</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">14</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">15</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">16</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">17</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">18</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">19</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">20</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">21</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">22</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">23</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">24</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">25</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">26</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">27</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">28</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">29</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">30</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">31</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">32</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">33</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">34</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">35</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">36</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">37</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">38</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">39</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">40</li></ul>
  • 第三步:釋放物件動作
<code class="language-c hljs  has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;">    ubus_free(ubus_ctx);
    uloop_done();</code><ul class="pre-numbering" style="margin: 0px; padding: 6px 0px 40px; box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">1</li><li style="margin: 0px; padding: 0px 5px; box-sizing: border-box;">2</li></ul>

依賴的庫

  • libubus
  • libubox
  • libblobmsg_json

作者

[email protected]


相關推薦

基於OpenWrt新增ubus支援示例分享

http://blog.csdn.net/hbl0307106015/article/details/48249585 寫作說明 釋出宣告: 本文釋出於2015年9月6日,內容為原創,轉載請說明出處,多謝合作,Linux有GPL協議,那麼部落格應用也類似,希望大家遵循

OpenWrt新增iptables 支援過濾字串

需要在iptables命令選項中選擇mod filter Network->Firewall->iptables->mod filter Kernel Modules->Ne

[原始碼和文件分享]基於C#實現的支援AI人機博弈的國際象棋遊戲程式

1 背景和意義 1.1 專案意義 該專案的成功推進和完成將達到 AI 比賽過程自動化的目的,有助於比賽的順暢、成功開展以及比賽時間的有效節約 該專案的成果將有助於《人工智慧原理》課程的學生對於自己編寫的 AI 程式的測試 該專案的成果將有助於國際象棋 AI 的後續

[原始碼和文件分享]基於VC++實現的支援視訊和圖片的車牌定位與識別系統

1 引言 在建設平安城市的程序中,安全是政府日常管理工作中的重要任務。隨著城市報警和監控系統的建設,對於監控資料的分析也日顯重要。 目前需要對重點街道或路口採集的視訊資料進行分析,主要包括兩點: 對於視訊中過往機動車輛的機動車牌提取出來,生成截圖圖片; 對提取的圖片中機

openwrt新增新平臺支援

大多數時候,與SDK一起提供的核心原始碼並不是很乾淨,而且不是標準的Linux版本,它還具有從核心開發樹的CVS或git倉庫返回的架構特定修復。無論如何,一些零件可以很容易地隔離,並作為一個好的開始,使一個香草核心工作你的硬體。 一些目錄很可能需要進行本地修改,以便在Linux下識別和使用您的硬體。首先

基於jfinal3.2構建的知識分享網[ 2017年08月27日 更新 ]

權限管理 easyui jfinal 知識分享網(51fenxiang.xyz),是基於JFinal3.2+eayui1.5.2等技術構建的一款知識共享服務平臺,該平臺有利於企業和團隊構建碎片化的知識分享平臺,充分利用閑暇時間記憶碎片化的知識,提升企業或團隊整體技能和知識水平。訪問網址: http

史上最簡潔C# 生成條形碼圖片思路及示例分享

else 應用 align current 有一個 += 類別 num namespace 在網上看到一些人寫關於條形碼的代碼都很長,有的甚至拿來賣,所以查了下資料,希望能對大家有幫助。 我的實現原理是: 其實Windows本身就有一個字體是用來顯示條形碼的。 只要將數字

OpenWRT新增自啟指令碼

OpenWRT的啟動指令碼放在 /etc/init.d 目錄下,而系統開機時自動執行/etc/rc.d目錄下的指令碼。所以在rc.d目錄下、有init.d下指令碼的連結檔案。原始碼中init.d位置在:/package/base-files/files/etc/init.d vi p

用Java實現給圖片新增文字水印-原始碼分享

直接上原始碼: 單張瓦片新增單個文字水印、可設定水印文字內容,字型,顏色,旋轉角度,透明度 controller層 import org.springframework.web.bind.annotation.GetMapping; import org.springframewo

Github程式碼新增Cocoapods支援(GitHub Desktop 工具上傳)

一.配置環境 確定電腦安裝的Cocoapods執行正常,最好將Cocoapods升級為最新版本。 確定GitHubDesktop軟體執行正常。(下載地址:https://desktop.github.com) 確定GitHub賬號正常。 二.檢查GitHub上的專案

Springboot專案新增jsp支援部署到tomcat

Springboot專案新增jsp支援部署到tomcat tomcat版本 :9.0.13 1.修改pom.xml,新增以下依賴  修改以下依賴   2.修改application.yml ,新增一下配置  3.在專案的src下新建以

0010-Hive多分隔符支援示例

溫馨提示:要看高清無碼套圖,請使用手機開啟並單擊圖片放大檢視。 1.問題描述 如何將多個字元作為欄位分割符的資料檔案載入到Hive表中,事例資料如下: 欄位分隔符為“@#$” [email protected]#[email protected]#$test2value

[WPF]為舊版本的應用新增觸控支援

之前做WPF開發時曾經遇到這樣一個需求:為一個基於 .NET Framework 3.5開發的老舊WPF程式新增觸控支援,以便於大屏觸控展示。 接手之後發現這是一個大坑。 專案最初的時候完全沒考慮過軟體架構設計,業務邏輯基本都寫在後臺程式碼中,經過兩代程式設計師的開發維護(初代開發者已離職,文件這種東西不

基於openwrt的mqtt的移植

其實mqtt不需要太複雜的流程,進入openwrt,make menuconfig 在lib中選擇mosquitto-nossl,然後make V=99, 編譯出來以後再openwrt\build_dir\target-mipsel_24kec+dsp_uClibc-0.9.33.2\mos

IIS新增WCF支援

    前言     最近在IIS上釋出網站的時候遇到了些問題,具體問題是這樣的:程式碼生成執行都沒有問題,但當在IIS上釋出的時候就不行,而且在其他人的電腦上都能順利的執行,反正到我這就不行了,這樣一來,就一定是我本地IIS的問題了,什麼問題呢

卷積神經網路CNN與基於MNIST的Python程式碼示例

卷積神經網路入門學(1) 原文地址:http://blog.csdn.net/hjimce/article/details/47323463 作者:hjimce 卷積神經網路演算法是n年前就有的演算法,只是近年來因為深度學習相關演算法為多層網路的訓練提供了新方法,然後現在

9、SpringBoot 新增JSP支援

SpringBoot 新增JSP支援 專案結構 在pom.xml檔案新增依賴 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"

Spring Boot 初級入門教程(九) —— 新增 JSP 支援

大多數 WEB 開發,都還是用的 JSP 頁面,所以如何讓 SpringBoot 專案支援 JSP,這篇簡單說一下。 一、需要引入依賴的 jar 包。 檢視 pom.xml 檔案中是否引入下面的 jar 包,如果沒有引用,則需要引用才行。 <!-- 該依賴包提供了MVC、A

Android 基於Retrofit2.0的支援多主機地址的網路請求類的封裝

一、首先在Module級別的build.gradle檔案中新增依賴 implementation 'com.squareup.retrofit2:retrofit:2.3.0' implementation 'com.squareup.retrofit2:adapter-r

Spring Boot 初體驗(11)新增JSP支援

第一步:配置 application.properties ######################################################## ### JSP的支援 ############################################