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.mk 2 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 := true LOCAL_MODULE:= ethcheckd include $(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.bat

ndk-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/bash

IPADDR=192.168.40.8
ETHPORT=eth1
echo "daniel peng set" $ETHPORT $IPADDR
echo $#
echo $0
echo $1
echo $2
if [ $# -eq 2 ];then
if [ $1 = $ETHPORT ];then
echo $ETHPORT
if [ $2 = "up" ];then
ifconfig $ETHPORT $IPADDR
sleep 1
ip rule add from all lookup main pref 9000
sleep 1
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
echo "set" $ETHPORT "done"
elif [ $2 = "down" ];then
echo "down"
elif [ $2 = "disable" ];then
echo "disable"
elif [ $2 = "error" ];then
echo "error"
fi
fi
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

瑞芯微 | 如何固定以太口地址为指定ip?ifplugd妙用的更多相关文章

  1. Linux下更新瑞芯微固件

    有这样的需求,是因为提供的BSP中是在windows下烧写的系统.我直接在linux下开发,每次编译后代码都要在windows下烧写,是一个很麻烦的事情.为了解决这个问题我尝试着用VirtualBox ...

  2. 9.7寸RK3188瑞芯微四核爱立顺M33平板电脑 - 深圳吉祥星晨科技有限公司 - 华强商情网

    9.7寸RK3188瑞芯微四核爱立顺M33平板电脑 - 深圳吉祥星晨科技有限公司 - 华强商情网 欢迎加入 2000人超级QQ群,平板电脑行业交流群:221371451,平板电脑产品及报价群:5765 ...

  3. 瑞芯微发布最新旗舰应用处理器-RK3588

    在瑞芯微电子第四届“开发者之春”大会上,瑞芯微推出了新一代8nm旗舰处理器-RK3588 这个芯片将采用8nm 制程工艺.基于A76+A55 内核组合,具备4K UI性能.8K VPU,拥有NPU2. ...

  4. 瑞芯微ROCK960 RK3399固件烧录总结

    1 下载固件 进入瑞芯微ROCK960下载主页 https://www.96boards.org/documentation/consumer/rock/downloads/ 选择os固件, Debi ...

  5. 瑞芯微RK3399宣布系统开源,进入百余种行业市场!

    集微网消息,2月24日瑞芯微官方突然宣布, Rockchip RK3399Linux系统开源!作为Rockchip旗舰级芯片,RK3399具有高性能.高扩展.全能型应用特性. 这一重磅消息立马刷爆朋友 ...

  6. 瑞芯微RK3399六核-迅为3399开发板介绍

    迅为3399开发板基于瑞芯微的RK3399处理器设计,Rockchip RK3399是瑞芯微推出的一款低功耗.高性能的应用处理器芯片,该芯片基于Big.Little架构,即具有独立的NEON协同处理器 ...

  7. 瑞芯微ROCK960 RK3399烧录image后扩容rootfs

    问题描述: RK3399开发板烧录官网提供的ubuntu镜像: Ubuntu 16.04 Server arm64(下载地址:https://www.96boards.org/documentatio ...

  8. 宁远电子瑞芯微RK3399开发板DLT3399A底层接口调用

     GPIO口控制 在DLT3399A板卡正面写有GPIO和UART4_1V8丝印的接口,并看到板子反面对应的引脚gpio丝印,选择相对应的gpio控制节点,接口位置如下图所示: 1.dlt3399a上 ...

  9. 瑞芯微RK3188如何配置USB摄像头支持

  10. 瑞芯微RK3188摄像头相关参数的配置

随机推荐

  1. Java 方法中循环调用具有事务的方法

    在Java中,循环调用一个具有事务的方法时,需要特别注意事务的边界和管理.通常,事务的边界是由框架(如Spring)来控制的,确保方法执行时数据的完整性和一致性.然而,在循环中调用事务方法时,每个调用 ...

  2. Basic_pentesting_1靶机渗透流程

    Basic_pentesting_1 Description This is a small boot2root VM I created for my university's cyber secu ...

  3. Bond——大数据时代的数据交换和存储格式

    设想我们在一家很大的互联网公司做IT方面的规划.开发和维护,有以下这样的应用场景: 公司里有若干个不同的开发团队,开发语言有Java..net.Python.C++....十来种,还有很多外包团队对项 ...

  4. Java核心字符串String进阶

    字符串对象 字符串是对象,不是简单数据类型 封装在java.lang包,自动导入 创建字符串对象 常见创建一个字符串对象有下面2个方法 String str=new String("chen ...

  5. Spring AOP里面的通知Advice类型

    @Before前置通知 在执行目标方法之前运行 @After后置通知 在目标方法运行结束之后 @AfterReturning返回通知 在目标方法正常返回值后运行 @AfterThrowing异常通知 ...

  6. vue中封装api数据层访问层

    api封装的是通过封装get/post/jsonp等请求,使得页面无需直接访问后代而是调用相关方法直接获取相关的后代数据,避免过多的数据处理逻辑,将重点放在数据渲染上. 1,准备阶段 a,首先创建ap ...

  7. SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密

    一.介绍 在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号.银行卡号.手机号.工资等信息进行加密存储, ...

  8. OpenGL之ShadowMap

    流程:先创建一个RenderTexture,然后用灯光的视口渲染. 然后切换到正常相机,进行渲染,使用RenderTexture中的深度或者颜色纹理,然后还原当前顶点在灯光中的深度,两者对比,比缓存中 ...

  9. 如何立刻读取在MySQL中自动生成的主键

    在写一个接口时,我们需要对两个表分别动刀,但是我们需要前一个表的主键作为下一个表的功能外键, 如果使用mybatisplus,insert完成之后便可以直接在对象中取出这个id值 如果使用mybati ...

  10. 利用路由守卫实现token过期后返回登录界面

    const timeX = localStorage.getItem("time");//如果有时间戳存在会判断token是否过期if(timeX!==null){ const t ...