瑞芯微 | 如何固定以太口地址为指定ip?

rxw的RK3568的evb1公板,有2个以太口,

默认UI界面只能配置eth0,无法配置eth1,

实际应用中,有时需要一旦有网线插入,就需要该地址设置为指定IP地址

本文介绍2个最简单的方法实现固定IP。

一、通过修改ipconfig.txt

安卓设备以太口的配置信息保存在以下文件中:

/data/misc/ethernet/ipconfig.txt

该文件是二进制文件,而且默认只有eth0的配置信息,一口君通过一些特殊方法,生成了包含eth0、eth1的两个网口配置的配置文件,

并且rxw原厂的ui界面可以识别该配置文件。

配置文件用16进制格式打开内容如下:

00000000 00 00 00 03 00 0C 69 70 41 73 73 69 67 6E 6D 65 ......ipAssignme
00000010 6E 74 00 06 53 54 41 54 49 43 00 0B 6C 69 6E 6B nt..STATIC..link
00000020 41 64 64 72 65 73 73 00 0D 31 39 32 2E 31 36 38 Address..192.168
00000030 2E 34 30 2E 33 34 00 00 00 18 00 07 67 61 74 65 .40.34......gate
00000040 77 61 79 00 00 00 00 00 00 00 01 00 0C 31 39 32 way..........192
00000050 2E 31 36 38 2E 34 30 2E 31 00 03 64 6E 73 00 07 .168.40.1..dns..
00000060 30 2E 30 2E 30 2E 30 00 03 64 6E 73 00 07 30 2E 0.0.0.0..dns..0.
00000070 30 2E 30 2E 30 00 0D 70 72 6F 78 79 53 65 74 74 0.0.0..proxySett
00000080 69 6E 67 73 00 04 4E 4F 4E 45 00 02 69 64 00 04 ings..NONE..id..
00000090 65 74 68 30 00 03 65 6F 73 00 0C 69 70 41 73 73 eth0..eos..ipAss
000000A0 69 67 6E 6D 65 6E 74 00 06 53 54 41 54 49 43 00 ignment..STATIC.
000000B0 0B 6C 69 6E 6B 41 64 64 72 65 73 73 00 0D 31 39 .linkAddress..19
000000C0 32 2E 31 36 38 2E 32 2E 31 32 35 00 00 00 18 00 2.168.2.125.....
000000D0 07 67 61 74 65 77 61 79 00 00 00 00 00 00 00 01 .gateway........
000000E0 00 0B 31 39 32 2E 31 36 38 2E 32 2E 31 00 03 64 ..192.168.2.1..d
000000F0 6E 73 00 07 30 2E 30 2E 30 2E 30 00 03 64 6E 73 ns..0.0.0.0..dns
00000100 00 07 30 2E 30 2E 30 2E 30 00 0D 70 72 6F 78 79 ..0.0.0.0..proxy
00000110 53 65 74 74 69 6E 67 73 00 04 4E 4F 4E 45 00 02 Settings..NONE..
00000120 69 64 00 04 65 74 68 31 00 03 65 6F 73 -- -- -- id..eth1..eos

用 ascii格式打开如下【因为是二进制文件,会有部分内容是乱码】:

    ipAssignment STATIC linkAddress 
192.168.40.34    gateway        192.168.40.1 dns 0.0.0.0 dns 0.0.0.0 
proxySettings NONE id eth0 eos ipAssignment STATIC linkAddress 
192.168.2.125    gateway        192.168.2.1 dns 0.0.0.0 dns 0.0.0.0 
proxySettings NONE id eth1 eos

总结一下,主要配置信息如下:

| 网口 |        ip        |      网关      |
|-----------------------------------------|
| eth0 |  192.168.40.34   |  192.168.40.1 |
| eth1 |  192.168.2.125   |  192.168.2.1  |

将该文件push进开发板,重启即可

adb root
adb remount
adb pull /data/misc/ethernet/ipconfig.txt

这样只要eth1对应的以太口up,就会自动设置ip地址192.168.2.125

同时并不影响UI配置eth0接口

注意:

这种方法仅在rxw3568+android11上测试通过,其他平台或者android版本没有测试。

二、通过开源项目ifplugd

除了第一种种方法还可以通过一个开源的项目ifplugd来实现。

通过ifplugd工具监听网口热插拔信息,然后执行指定脚本,将配置命令存放在脚本中即可。

ifplugd的移植需要用到libdaemon库,该库主要提供守护进程以及log接口功能。

1. 移植步骤

1)准备文件:
libdaemon-0.14.tar.gz
ifplugd-0.14.tar.gz

后台回复:eth,既可以获取

没有采用最新的libdaemon、ifplugd,会有版本兼容问题

本实例基于ndk编译器编译,

为了方便起见,我把libdaemon、ifplugd源文件全部拷贝到ndk实例工程下,libdaemon的头文件,拷贝了2次,

方便c文件包含。

.....src-ifplugd$ tree ./
./
├── Application.mk
├── daemon.h
├── dexec.c
├── dexec.h
├── dfork.c
├── dfork.h
├── dlog.c
├── dlog.h
├── dnonblock.c
├── dnonblock.h
├── dpid.c
├── dpid.h
├── dsignal.c
├── dsignal.h
├── ethtool-kernel.h
├── ethtool-local.h
├── ifplugd.c
├── ifstatus.c
├── include
├── interface.c
├── interface.h
├── libdaemon
│   ├── daemon.h
│   ├── dexec.h
│   ├── dfork.h
│   ├── dlog.h
│   ├── dnonblock.h
│   ├── dpid.h
│   └── dsignal.h
├── svn-revision.h
└── YROS.mk2 directories, 29 files
2)修改配置文件

编译描述信息位于文件YROS.mk中,

【读者根据自己工程,文件会有所不同】

YROS.mk修改如下:

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \ifplugd.c  interface.cdexec.c dfork.c dlog.c dnonblock.c  dpid.c dsignal.c   LOCAL_SHARED_LIBRARIES := \LOCAL_MODULE_TAGS := optional
LOCAL_CLANG := trueLOCAL_MODULE:= ethcheckdinclude $(BUILD_EXECUTABLE)
3)编译
  1. 编译错误1
λ build.bat                                                                                                                         ndk-build.cmd                                                                                                                       
[armeabi-v7a] Compile thumb  : ifplugd <= ifplugd.c                                                                                 
src/ifplugd.c:66:13: error: use of undeclared identifier 'SYSCONFDIR'                                                               
char *run = SYSCONFDIR"/ifplugd/ifplugd.action";                                                                                    ^                                                                                                                       
src/ifplugd.c:66:23: error: expected ';' after top level declarator                                                                 
char *run = SYSCONFDIR"/ifplugd/ifplugd.action";                                                                                    ^                                                                                                             ;                                                                                                             
src/ifplugd.c:155:18: warning: multiple unsequenced modifications to 'sigfd' [-Wunsequenced]                                        FD_SET(sigfd = daemon_signal_fd(), &rfds);                                                                                      ^                                                                                                                  
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:75:50: note: expanded from macro 'FD_SET'                            
#define FD_SET(fd, set) (__FDS_BITS(set)[__FDELT(fd)] |= __FDMASK(fd))                                                              ^                ~~                                                                
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:48:23: note: expanded from macro '__FDELT'                           
#define __FDELT(fd) ((fd) / NFDBITS)                                                                                                ^                                                                                                             
src/ifplugd.c:374:36: error: expected ')'                                                                                           daemon_log(LOG_INFO, "ifplugd "VERSION" successfully initialized, link beat %sdetected.", status == IFSTATUS_UP ? "" : "not "); ^                                                                                                
src/ifplugd.c:374:15: note: to match this '('                                                                                       daemon_log(LOG_INFO, "ifplugd "VERSION" successfully initialized, link beat %sdetected.", status == IFSTATUS_UP ? "" : "not "); ^                                                                                                                     
src/ifplugd.c:388:18: warning: multiple unsequenced modifications to 'sigfd' [-Wunsequenced]                                        FD_SET(sigfd = daemon_signal_fd(), &rfds);                                                                                      ^                                                                                                                  
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:75:50: note: expanded from macro 'FD_SET'                            
#define FD_SET(fd, set) (__FDS_BITS(set)[__FDELT(fd)] |= __FDMASK(fd))                                                              ^                ~~                                                                
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:48:23: note: expanded from macro '__FDELT'                           
#define __FDELT(fd) ((fd) / NFDBITS)                                                                                                ^                                                                                                             
src/ifplugd.c:704:26: error: expected ')'                                                                                           printf("ifplugd "VERSION" (SVN: "SVN_REVISION")\n");                                                                        ^                                                                                                          
src/ifplugd.c:704:15: note: to match this '('                                                                                       printf("ifplugd "VERSION" (SVN: "SVN_REVISION")\n");                                                                        ^                                                                                                                     
2 warnings and 4 errors generated.                                                                                                  
make: *** [obj/local/armeabi-v7a/objs/ifplugd/ifplugd.o] Error 1                                                                    

请添加图片描述

修改文件ifplugd.c

59  #define VARRUN "/system"
63  #define SYSCONFDIR ""
64  #define VERSION "yikoulinux"
  1. 编译错误2
λ build.batndk-build.cmd
[armeabi-v7a] Compile thumb  : ifplugd <= dexec.c
[armeabi-v7a] Compile thumb  : ifplugd <= dfork.c
[armeabi-v7a] Compile thumb  : ifplugd <= dlog.c
[armeabi-v7a] Compile thumb  : ifplugd <= dnonblock.c
[armeabi-v7a] Compile thumb  : ifplugd <= dpid.c
src/dpid.c:63:43: error: use of undeclared identifier 'LOCALSTATEDIR'snprintf(fn, sizeof(fn), "%s/%s.pid", VARRUN, daemon_pid_file_ident ? daemon_pid_file_ident : "unknown");^
src/dpid.c:51:16: note: expanded from macro 'VARRUN'
#define VARRUN LOCALSTATEDIR "/run"^
1 error generated.
make: *** [obj/local/armeabi-v7a/objs/ifplugd/dpid.o] Error 1

修改文件dpid.c

50 #define LOCALSTATEDIR
4) 编译成功

编译成功log如下:

H:\compileforandroid                                                                                                     
λ build.bat                                                                                                              ndk-build.cmd                                                                                                            
[armeabi-v7a] Compile thumb  : ifplugd <= ifplugd.c                                                                      
src/ifplugd.c:148:53: warning: missing sentinel in function call [-Wsentinel]                                            execl(run, run, interface, arg, extra_arg, 0);                                                                   ^                                                                    , NULL                                                               
H:/yros-ndk-windows/build//../sysroot/usr/include\unistd.h:105:5: note: function has been explicitly marked sentinel here
int execl(const char* __path, const char* __arg0, ...) __attribute__((__sentinel__));                                    ^                                                                                                                    
src/ifplugd.c:157:18: warning: multiple unsequenced modifications to 'sigfd' [-Wunsequenced]                             FD_SET(sigfd = daemon_signal_fd(), &rfds);                                                                           ^                                                                                                       
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:75:50: note: expanded from macro 'FD_SET'                 
#define FD_SET(fd, set) (__FDS_BITS(set)[__FDELT(fd)] |= __FDMASK(fd))                                                   ^                ~~                                                     
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:48:23: note: expanded from macro '__FDELT'                
#define __FDELT(fd) ((fd) / NFDBITS)                                                                                     ^                                                                                                  
src/ifplugd.c:390:18: warning: multiple unsequenced modifications to 'sigfd' [-Wunsequenced]                             FD_SET(sigfd = daemon_signal_fd(), &rfds);                                                                           ^                                                                                                       
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:75:50: note: expanded from macro 'FD_SET'                 
#define FD_SET(fd, set) (__FDS_BITS(set)[__FDELT(fd)] |= __FDMASK(fd))                                                   ^                ~~                                                     
H:/yros-ndk-windows/build//../sysroot/usr/include\sys/select.h:48:23: note: expanded from macro '__FDELT'                
#define __FDELT(fd) ((fd) / NFDBITS)                                                                                     ^                                                                                                  
3 warnings generated.                                                                                                    
[armeabi-v7a] Compile thumb  : ifplugd <= interface.c                                                                    
[armeabi-v7a] Compile thumb  : ifplugd <= dexec.c                                                                        
[armeabi-v7a] Compile thumb  : ifplugd <= dfork.c                                                                        
[armeabi-v7a] Compile thumb  : ifplugd <= dlog.c                                                                         
[armeabi-v7a] Compile thumb  : ifplugd <= dnonblock.c                                                                    
[armeabi-v7a] Compile thumb  : ifplugd <= dpid.c                                                                         
[armeabi-v7a] Compile thumb  : ifplugd <= dsignal.c                                                                      
[armeabi-v7a] Executable     : ifplugd                                                                                   
[armeabi-v7a] Install        : ifplugd => libs/armeabi-v7a/ifplugd                                                       

在这里插入图片描述

程序位置如下:

libs\armeabi-v7a\ifplugd

测试

1. 查看ifplugd参数
ifplugd -h
rk3568_r:/ # ifplugd -h
ifplugd [options]-a --no-auto              Do not enable interface automatically (off)-n --no-daemon            Do not daemonize (for debugging) (off)-s --no-syslog            Do not use syslog, use stderr instead (for debugging) (off)-b --no-beep              Do not beep (off)-f --ignore-fail          Ignore detection failure, retry instead (failure is treated as DOWN) (off)-F --ignore-fail-positive Ignore detection failure, retry instead (failure is treated as UP) (off)-i --iface=IFACE          Specify ethernet interface (eth0)-r --run=EXEC             Specify program to execute (/ifplugd/ifplugd.action)-I --ignore-retval        Don't exit on nonzero return value of program executed (off)-t --poll-time=SECS       Specify poll time in seconds (1)-u --delay-up=SECS        Specify delay for configuring interface (0)-d --delay-down=SECS      Specify delay for deconfiguring interface (5)-m --api-mode=MODE        Force API mode (mii, priv, ethtool, wlan, auto) (auto)-q --no-shutdown          Don't run script on daemon quit (off)-w --wait-on-fork         Wait until daemon fork finished (off)-x --extra-arg            Specify an extra argument for action script-h --help                 Show this help-k --kill                 Kill a running daemon-c --check-running        Check if a daemon is currently running-v --version              Show version-S --suspend              Suspend running daemon-R --resume               Resume running daemon-z --info                 Write status of running daemon to syslog
2. 增加脚本if.sh

当网口eth1 up后,ifplugd会执行如下命令【下面动作由ifplugd自动执行】:

/system/if.sh eth1 up

根据参数顺序,编写脚本if.sh如下:

#!/bin/bashIPADDR=192.168.40.8
ETHPORT=eth1
echo "daniel peng set" $ETHPORT $IPADDR
echo $#
echo $0
echo $1
echo $2
if [ $# -eq 2 ];thenif [ $1 = $ETHPORT ];then echo $ETHPORTif [ $2 = "up" ];thenifconfig $ETHPORT $IPADDRsleep 1ip rule add from all lookup main pref 9000 sleep 1echo 1 > /proc/sys/net/ipv4/ip_forward iptables -Fecho "set" $ETHPORT "done"elif [ $2 = "down" ];thenecho "down"elif [ $2 = "disable" ];thenecho "disable"elif [ $2 = "error" ];thenecho "error"fifi
fi

功能:

网口eth1 up后,设置该网口地址为IPADDR,即:192.168.40.8

读者可以根据自己的需要编写相应的脚本。

3. 运行ifplugd

ifplugd监听网口eth1并且执行后面的脚本文件

在板子上输入以下命令:

ifplugd -i eth1 -r "sh /system/if.sh"

查看该守护进程:

H:\compileforandroid
λ adb shell
rk3568_r:/ # ifplugd -i eth1 -r "sh /system/if.sh"
rk3568_r:/ # ps -ef | grep if
wifi            280      1 0 09:58:52 ?     00:00:00 android.hardware.wifi@1.0-service
wifi            385      1 0 09:58:53 ?     00:00:00 wificond
root           1826      1 0 10:18:06 ?     00:00:00 ifplugd -i eth1 -r sh /system/if.sh
root           1834   1819 2 10:18:17 pts/0 00:00:00 grep if

一旦网口插入网线后,地址就会被自动设置。

要实现开机就自动运行ifplugd,可以参考下面文章

《安卓如何设置开机自动启动某个程序?ramdisk + init.rc给你搞定》

补充

ifplugd的确可以实现监测网卡的状态,并执行相应脚本,

但是有个前提,就是网口已经注册到系统中,即用ifconfig -a能查看到

如何是usb网口这种设备,在插入usb口之后网口设备才会注册,

那么这种情况下,要想设置usb网卡,那么就就需要修改ifplugd程序。

下文,给大家讲解如何自己实现一个简单的网口检测并设置ip的小程序

完整代码,点赞留言,后台回复:eth

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/132719.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGLM流式输出的报错修复

ChatGLM中的openai_api.py中的代码如下&#xff1a; # codingutf-8 # Implements API for ChatGLM2-6B in OpenAIs format. (https://platform.openai.com/docs/api-reference/chat) # Usage: python openai_api.py # Visit http://localhost:8000/docs for documents.import …

linux放开8080端口

linux放开8080端口 输入命令&#xff1a; 查看8080端口是否开放 firewall-cmd --query-port8080/tcpno显示端口未打开&#xff0c;yes表示开启&#xff0c;linux开启防火墙默认关闭8080端口 这里是引用&#xff1a;https://blog.csdn.net/weixin_54067866/article/details/1…

(十五)VBA常用基础知识:正则表达式的使用

vba正则表达式的说明 项目说明Pattern在这里写正则表达式&#xff0c;例&#xff1a;[\d]{2,4}IgnoreCase大小写区分&#xff0c;默认false&#xff1a;区分&#xff1b;true&#xff1a;不区分Globaltrue&#xff1a;全体检索&#xff1b;false&#xff1a;最小匹配Test类似p…

Python利用jieba分词提取字符串中的省市区(字符串无规则)

目录 背景库&#xff08;jieba&#xff09;代码拓展结尾 背景 今天的需求就是在一串字符串中提取包含&#xff0c;省、市、区&#xff0c;该字符串不是一个正常的地址;,如下字符串 "安徽省、浙江省、江苏省、上海市,冷运标快首重1kg价格xx元,1.01kg(含)-5kg(不含)续重价…

API接口安全运营研究(内附官方开发平台api接口接入方式)

摘 要 根据当前API技术发展的趋势&#xff0c;从实际应用中发生的安全事件出发&#xff0c;分析并讨论相关API安全运营问题。从风险角度阐述了API接口安全存在的问题&#xff0c;探讨了API检测技术在安全运营中起到的作用&#xff0c;同时针对API安全运营实践&#xff0c;提出…

基于VUE的图书借阅管理系统的设计与实现

目录 一、摘要 二、技术描述 三、部分截图 四、获取方式 一、摘要 随着我国经济的高速发展&#xff0c;人们对图书的需求也愈发旺盛&#xff0c;而传统图书管理模式存在以下弊端&#xff1a;信息存储和分类操作不够高效&#xff0c;导致查找书籍困难&#xff1b;借还书流程…

扒一扒集成运放uA741的内部电路

uA741是一款常见的集成运放芯片,这个是uA741的内部电路。 Q1与Q2组成的差动对是整个741运算放大器的输入端,这两个三极管是射极跟随器的连接方式,特点是输入电阻大,输出电阻小。 Q1和Q2的输出接至共基极组态的PNP晶体管Q3和Q4

python psutil库之——获取网络信息(网络接口信息、网络配置信息、以太网接口、ip信息、ip地址信息)

文章目录 使用Python psutil库获取网络信息安装psutil库获取网络连接信息查看所有网络连接过滤特定状态的连接 获取网络接口信息获取网络IO统计信息实例1实例2 总结 使用Python psutil库获取网络信息 Python的psutil库是一个跨平台库&#xff0c;能够方便地获取系统使用情况和…

电子书制作软件Vellum mac中文版特点

Vellum mac是一款专业的电子书制作软件&#xff0c;它可以帮助用户将文本文件转换为高质量的电子书&#xff0c;支持多种格式&#xff0c;包括EPUB、MOBI、PDF等。Vellum具有直观的用户界面和易于使用的工具&#xff0c;可以让用户快速地创建和发布电子书。 Vellum mac软件特点…

unity2022版本 实现加减进度条

简介 在现代游戏开发中&#xff0c;用户界面 (UI) 扮演着至关重要的角色&#xff0c;它不仅为玩家提供信息&#xff0c;还增强了游戏的可玩性。加减进度条是一种常见的UI元素&#xff0c;它可以用于显示游戏中的进度、倒计时、资源管理和其他关键信息。在这篇博客中&#xff0…

CART 算法——决策树

目录 1.CART的生成&#xff1a; &#xff08;1&#xff09;回归树的生成 &#xff08;2&#xff09;分类树的生成 ①基尼指数 ②算法步骤 2.CART剪枝&#xff1a; &#xff08;1&#xff09;损失函数 &#xff08;2&#xff09;算法步骤&#xff1a; CART是英文“class…

选择适合你的知识付费小程序平台

在建立知识付费小程序之前&#xff0c;选择一个适合你需求的平台是至关重要的。本文将探讨几个知识付费小程序平台&#xff0c;并提供代码示例&#xff0c;帮助你了解如何在这些平台上开始搭建自己的知识付费应用。 1. 平台选择&#xff1a;WeChat 小程序 微信小程序是一个强…