在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

rt-thread系統運行期改變網卡配置

冬至子 ? 來源:出出啊 ? 作者:出出啊 ? 2023-11-28 17:05 ? 次閱讀

前言

忘記在哪個論壇問題里回答過這個了,rtt 配置 DHCP 或者靜態 ip 是靜態配置的。它只能在 menuconfig 或者 setting 的時候,或選擇 DHCP 編譯或選擇 靜態 ip編譯,系統運行起來以后如果想開啟或關閉 DHCP 就做不到了。

相信每一個做產品的打工人的需求都是動態配置的,需要在系統啟動以后,運行期開啟或關閉 DHCP。

下面簡單講講怎么做。

第一步,配置 lwip 開啟 DHCP

這一步是一定要的,因為這一步是使能 lwip 的dhcp 功能,只有使能了之后,后面才有開啟/關閉 DHCP 的意義。

第二步,定義網絡配置全局變量

首先,定義如下結構體類型(示意代碼):

typedef struct __network_config{
rt_bool_t dhcp_enable;
char *lan_ip;
char *lan_nm;
char *lan_gw;
}NetworkConfig;

然后,定義一個全局變量 NetworkConfig network;。

第三步,修改 “ethernetif.c” 文件

這個文件修改的地方全部和 DHCP 相關,所以,在這個文件里搜索 “LWIP_DHCP” 這個宏,+凡是使用 “LWIP_DHCP” 宏的地方都需要進行修改+。

聲明 NetworkConfig network; 變量

或者 extern 或者 include 頭文件,首先把前邊定義的全局變量在當前文件里聲明一下。

netdev_flags_sync

修改前,

#if LWIP_DHCP
netdev_low_level_set_dhcp_status(netdev, RT_TRUE);
#else
netdev_low_level_set_dhcp_status(netdev, RT_FALSE);
#endif

修改后,

#if LWIP_DHCP
netdev_low_level_set_dhcp_status(netdev, network.dhcp_enable);
#else
netdev_low_level_set_dhcp_status(netdev, RT_FALSE);
#endif

修改后,我們根據全局變量 network 中的配置來決定設置 DHCP 狀態。

eth_netif_device_init

修改前,

#if LWIP_DHCP
/* if this interface uses DHCP, start the DHCP client */
dhcp_start(ethif->netif);
#endif

修改后,

#if LWIP_DHCP
/* if this interface uses DHCP, start the DHCP client */
if (network.dhcp_enable == RT_TRUE) {
dhcp_start(ethif->netif);
}
#endif

修改后,根據全局變量 network 中的配置來決定是否打開 DHCP。

eth_device_init_with_flag

修改前,

#if !LWIP_DHCP
ipaddr.addr = inet_addr(RT_LWIP_IPADDR);
gw.addr = inet_addr(RT_LWIP_GWADDR);
netmask.addr = inet_addr(RT_LWIP_MSKADDR);
#else
IP4_ADDR(&ipaddr, 0, 0, 0, 0);
IP4_ADDR(&gw, 0, 0, 0, 0);
IP4_ADDR(&netmask, 0, 0, 0, 0);
#endif

修改后,

#if !LWIP_DHCP
ipaddr.addr = inet_addr(RT_LWIP_IPADDR);
gw.addr = inet_addr(RT_LWIP_GWADDR);
netmask.addr = inet_addr(RT_LWIP_MSKADDR);
#else
if (network.dhcp_enable != RT_TRUE) {
ipaddr.addr = inet_addr(network.lan_ip);
gw.addr = inet_addr(network.lan_gw);
netmask.addr = inet_addr(network.lan_nm);
} else {
IP4_ADDR(&ipaddr, 0, 0, 0, 0);
IP4_ADDR(&gw, 0, 0, 0, 0);
IP4_ADDR(&netmask, 0, 0, 0, 0);
}
#endif

修改后,根據全局變量 network 中的配置來選擇初始化網卡的 ip 地址。

eth_device_deinit

修改前,

#if LWIP_DHCP
dhcp_stop(netif);
dhcp_cleanup(netif);
#endif

修改后,

#if LWIP_DHCP
if (network.dhcp_enable == RT_TRUE) {
dhcp_stop(netif);
dhcp_cleanup(netif);
}
#endif

卸載網卡設備時,需要根據當前是否開啟了 DHCP 來決定需不需要停止和清理 DHCP。

第四步,應用程序接口

應用程序里,無論使用哪種解數,千方百計修改前文定義的全局變量。之后就剩下打開/關閉 DHCP、修改本地 ip 地址、修改子網掩碼、修改網關 ip 等等常規操作。

通過如下代碼,在系統運行期打開或者關閉 DHCP:

struct netdev *netdev = RT_NULL;
netdev = netdev_get_by_name("e0");
netdev_dhcp_enabled(netdev, (network.dhcp_enable == RT_TRUE));

注:如果關閉 DHCP 之后,想修改 ip 地址為靜態 ip 。需要另行設置。
注:如上代碼只是示意性代碼,并不保證實際使用中包含漏洞。

在系統運行期修改 ip 地址的主要代碼如下:

struct netdev *netdev = RT_NULL;
ip_addr_t addr;
netdev = netdev_get_by_name("e0");
inet_aton(network.lan_ip, &addr);
netdev_set_ipaddr(netdev, &addr);

注:如上代碼只是示意性代碼,并不保證實際使用中包含漏洞。

運行期修改子網掩碼和網關 ip 的過程同上,不同的是調用的函數不一樣。

總結

以上操作已經在項目中得到驗證,目前運行良好。

請自行解決輸入的 ip 地址字符串是否符合格式問題。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 子網掩碼
    +關注

    關注

    2

    文章

    41

    瀏覽量

    11039
  • DHCP
    +關注

    關注

    0

    文章

    105

    瀏覽量

    19731
  • LwIP協議
    +關注

    關注

    0

    文章

    11

    瀏覽量

    8929
  • RT-Thread
    +關注

    關注

    31

    文章

    1293

    瀏覽量

    40230
收藏 人收藏

    評論

    相關推薦

    RT-Thread NUC97x 移植 LVGL

    不涉及 rt-thread 驅動,但是它是 LVGL 和 rt-thread 的接口。LVGL 在 rt-thread運行的基石。
    發表于 07-08 09:37 ?1496次閱讀

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發組(2015-03-31)。RT-Thread做為國內有較大影響力的開源實時操作系統,本文是RT
    發表于 11-26 16:06 ?0次下載

    RT-Thread用戶手冊

    RT-Thread用戶手冊——本書是RT-Thread的編程手冊,用于指導在RT-Thread實時操作系統環境下如何進行編 程。
    發表于 11-26 16:16 ?0次下載

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運行RT-Thread物聯網操作系統平臺上,面向不同應用領域的通用軟件組件 。RT-Thread 同時提供了開放
    的頭像 發表于 05-21 11:29 ?1w次閱讀
    <b class='flag-5'>RT-Thread</b>軟件包定義和使用

    RT-thread】如何將RT-thread系統移植到stm32

    設備,RT-Thread 又能使用在線的軟件包管理工具,配合系統配置工具實現直觀快速的模塊化裁剪,無縫地
    發表于 12-08 11:06 ?21次下載
    【<b class='flag-5'>RT-thread</b>】如何將<b class='flag-5'>RT-thread</b><b class='flag-5'>系統</b>移植到stm32

    RT-Thread STM32 配置系統時鐘(使用外部晶振)

    RT-Thread STM32 配置系統時鐘開發環境芯片:STM32F103RCT6RT-Thread Studio: V1.0.6(現在已經更新到1.1.3,由于本人使用RTT開發已
    發表于 12-14 18:45 ?14次下載
    <b class='flag-5'>RT-Thread</b> STM32 <b class='flag-5'>配置</b><b class='flag-5'>系統</b>時鐘(使用外部晶振)

    RT-Thread Studio驅動SD卡

    RT-Thread Studio驅動SD卡前言一、創建基本工程1、創建Bootloader2、創建項目工程二、配置RT-Thread Settings三、代碼分析1.引入庫2.讀入數據四、效果驗證
    發表于 12-27 19:13 ?20次下載
    <b class='flag-5'>RT-Thread</b> Studio驅動SD卡

    RT-Thread開源作品秀】基于RT-Thread的星務平臺研究

    本作品為了驗證星務軟件在RT-Thread系統運行的可行性,底層是否能夠驅動星務軟件,同時擴展RT-Thread應用范圍。ART-Pi作為衛星下位機,...
    發表于 01-25 18:26 ?6次下載
    【<b class='flag-5'>RT-Thread</b>開源作品秀】基于<b class='flag-5'>RT-Thread</b>的星務平臺研究

    RT-Thread全球技術大會:RT-Thread構建配置系統

    RT-Thread全球技術大會:RT-Thread構建配置系統,構建系統也稱為組件自動化,通常需要通過腳本聲明構建行為。 ? ? ? ? 審
    的頭像 發表于 05-27 14:39 ?1248次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>構建<b class='flag-5'>配置</b><b class='flag-5'>系統</b>

    RT-Thread全球技術大會:RT-Thread上的單元測試框架與運行測試用例

    RT-Thread全球技術大會:RT-Thread上的單元測試框架與運行測試用例 ? ? ? ? ? ? ? ? 審核編輯:彭靜
    的頭像 發表于 05-27 16:21 ?1637次閱讀
    <b class='flag-5'>RT-Thread</b>全球技術大會:<b class='flag-5'>RT-Thread</b>上的單元測試框架與<b class='flag-5'>運行</b>測試用例

    RT-Thread學習筆記 RT-Thread的架構概述

    的種種優越之處。RT-Thread 是一款完全由國內團隊開發維護的嵌入式實時操作系統(RTOS),具有完全的自主知識產權。經過 16 個年頭的沉淀,伴隨著物聯網的興起,它正演變成一個功能強大、組件豐富的物
    的頭像 發表于 07-09 11:27 ?4569次閱讀
    <b class='flag-5'>RT-Thread</b>學習筆記 <b class='flag-5'>RT-Thread</b>的架構概述

    RT-Thread文檔_RT-Thread 簡介

    RT-Thread文檔_RT-Thread 簡介
    發表于 02-22 18:22 ?5次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 簡介

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread 潘多拉 STM32L475 上手指南
    發表于 02-22 18:23 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> 潘多拉 STM32L475 上手指南

    RT-Thread文檔_RT-Thread SMP 介紹與移植

    RT-Thread文檔_RT-Thread SMP 介紹與移植
    發表于 02-22 18:31 ?9次下載
    <b class='flag-5'>RT-Thread</b>文檔_<b class='flag-5'>RT-Thread</b> SMP 介紹與移植

    基于RT-Thread Studio學習

    前期準備:從官網下載 RT-Thread Studio,弄個賬號登陸,開啟rt-thread學習之旅。
    的頭像 發表于 05-15 11:00 ?4007次閱讀
    基于<b class='flag-5'>RT-Thread</b> Studio學習
    主站蜘蛛池模板: 日韩电影天堂网| 日本黄色网址大全| 女人大毛片一级毛片一| 免费在线亚洲| 4hc44四虎www在线影院男同| 精品午夜久久影视| 日日干夜夜爽| 9797色| 国产免费人人看大香伊| 日本人的色道www免费一区| 日本色免费| 久久6免费视频| 你懂的在线观看网址| 精品无码三级在线观看视频| 给我一个可以看片的www日本| 久久国产精品亚洲综合| 国产一级做a爰片久久毛片男| 青草悠悠视频在线观看| 生活片一级性| 99热精品久久只有精品30| 啪啪啦资源站永久| 亚洲欧美成人| 99精品热视频| 色综合成人网| 天堂bt| 免费人成a大片在线观看动漫 | 性欧美精品xxxx| 高清成年美女黄网站色大| 最新色站| 情趣店上班h系列小说| 亚洲电影av| 免费观看三级毛片| 午夜视频高清在线aaa| 天天做天天爱天天爽| 五月天婷婷精品视频| 国产小视频网站| 乱子伦xxxx厨房| 欧美一区二区三区成人看不卡| 成年女人毛片免费视频| 自拍中文字幕| 国产大毛片|