Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread学习营
网卡设备
dhcp获取IP地址
rt-thread 系统运行期改变网卡配置
发布于 2023-11-28 11:43:57 浏览:1155
订阅该版
[tocm] ## 前言 忘记在哪个论坛问题里回答过这个了,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 地址字符串是否符合格式问题。
6
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
出出啊
恃人不如自恃,人之为己者不如己之自为也
文章
43
回答
1517
被采纳
342
关注TA
发私信
相关文章
1
stm32f407+lan8720 lwip2.0 作业提交
2
玩溜GD32303E-EVAL BSP系列(五)----设备连接网络
3
onenet应用连不上云端
4
【文件系统】晴天文件匹配
5
rtt semc sdram 基于操作系统怎么初始化驱动设备
6
RT-Thread移植笔记
7
RT-Thread内核移植+LoIIs+STM32F103C8+StdLib
8
EVN编译报错,求助大神
9
【内核和外设学习营】十里 简单LED闪亮测试
10
【内核和外设学习营】 十里 串口指令控制RGB灯点亮的颜色
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
SFUD
msh
rt_mq_消息队列_msg_queue
keil_MDK
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1443
个答案
289
次被采纳
张世争
805
个答案
174
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
4
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
1
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
1
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部