背景

在一些网络环境下,需要静态IP不够现实,需要使用DHCP进行自动获取IP地址。

udhcpc是一个面向嵌入式系统的非常小的DHCP客户端,字母的缩写微μ- DHCP -客户端client(μDHCPc)。

前提:在KERNEL中需要将 Packet socket(CONFIG_PACKET)和IP: DHCP support(CONFIG_IP_PNP_DHCP)编译进内核或编译成模块。

在内核中添加以下选项:

Networking  --->
[*] Networking support
Networking options --->
<* > Packet socket //添加:配置 CONFIG_PACKET
[ * ] IP: DHCP support //添加:配置 CONFIG_IP_PNP_DHCP
[ * ] Network packet filtering (replaces ipchains) ---> //添加,子选项可不选:配置 CONFIG_NETFILTER 说明:若没选<* > Packet socket, [ * ] Network packet filtering (replaces ipchains) --->选项,在执行udhcpc命令时出现如下错误:
~ # udhcpc
udhcpc (v0.9.9-pre) started
udhcpc[208]: udhcpc (v0.9.9-pre) started FATAL: couldn't listen on socket, Address family not supported by protocol
udhcpc[208]: FATAL: couldn't listen on socket, Address family not supported by protocol

移植 udhcp

移植udhcp的方法有2种。

1.在busybox中配置编译:

Busybox中添加以下选项:

Networking Utilities  --->
udhcp Server/Client --->
[] udhcp Server (udhcpd) //在此不作服务端,故不选。生成udhcpd命令
[*] udhcp Client (udhcpc) //生成udhcpc命令
[ ] Lease display utility (dumpleases)
[ ] Log udhcp messages to syslog (instead of stdout)
[ ] Compile udhcp with noisy debugging messages

2.在网上下载源码,进行编译安装即可。(下面介绍这一种)

使用以下脚本:

##
# Copyright By Schips, All Rights Reserved
# https://gitee.com/schips/
# File Name: make.sh
# Created : Tue 24 Dec 2019 04:20:51 PM CST
##
#!/bin/sh
BASE=`pwd`
BUILD_HOST=arm-linux
OUTPUT=${BASE}/install/
make_dirs() {
cd ${BASE}
mkdir compressed install source -p
sudo ls
} tget () { #try wget
filename=`basename $1`
echo "Downloading [${filename}]..."
if [ ! -f ${filename} ];then
wget $1
fi echo "[OK] Downloaded [${filename}] "
} download_package () {
cd ${BASE}/compressed
#下载包
tget https://udhcp.busybox.net/source/udhcp-0.9.8.tar.gz
} tar_package () {
cd ${BASE}/compressed
ls * > /tmp/list.txt
for TAR in `cat /tmp/list.txt`
do
tar -xf $TAR -C ../source
done
rm -rf /tmp/list.txt
} make_udhcp () {
cd ${BASE}/source/udhcp*
sed -i '5, 12{s/COMBINED_BINARY=/#COMBINED_BINARY=/}' Makefile
sed -i '130, 135{s/case INIT_SELECTING:/case INIT_SELECTING:;/}' dhcpc.c
make CROSS_COMPILE=${BUILD_HOST}-
} do_copy () {
cd ${BASE}/source/udhcp*
mkdir ${BASE}/install/udhcp -p
mkdir ${BASE}/install/udhcp/sbin -p
mkdir ${BASE}/install/udhcp/config -p
cp ${BASE}/source/udhcp*/udhcpc ${OUTPUT}/udhcp/sbin -v
cp ${BASE}/source/udhcp*/udhcpd ${OUTPUT}/udhcp/sbin -v
# 默认的配置路径 /usr/share/udhcpc/default.script
# 写进了代码中 dhcpc.c:62:#define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script"
cp ${BASE}/source/udhcp*/samples/simple.script ${OUTPUT}/udhcp/config/default.script -v
#cp ${BASE}/source/udhcp*/samples/udhcpd.conf ${OUTPUT}/udhcp/config/ -v
} make_dirs
#download_package
tar_package
make_udhcp
do_copy exit 0 以下内容针对板子
mkdir /usr/share/udhcpc/
cp default.script /usr/share/udhcpc/default.script
chmod +x /usr/share/udhcpc/default.script

拷贝有关配置文件

DHCP客户端

拷贝:simple.script 到板子中的 /usr/share/udhcpc/default.script

mkdir /usr/share/udhcpc/
cp default.script /usr/share/udhcpc/default.script
chmod +x /usr/share/udhcpc/default.script

注:busybox有关路径是在 examples/udhcp,也可以使用 "find . 2>/dev/null | grep" 进行查找

下面提供 default.script 的内容,仅供参考

#!/bin/sh
# udhcpc script edited by Tim Riker <Tim@Rikers.org>
[ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
RESOLV_CONF="/etc/resolv.conf"
[ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
[ -n "$subnet" ] && NETMASK="netmask $subnet"
case "$1" in
deconfig)
/sbin/ifconfig $interface 0.0.0.0
;;
renew|bound)
/sbin/ifconfig $interface $ip $BROADCAST $NETMASK
if [ -n "$router" ] ; then
echo "deleting routers"
while route del default gw 0.0.0.0 dev $interface ; do
:
done
for i in $router ; do
route add default gw $i dev $interface
done
fi
echo -n > $RESOLV_CONF
[ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
for i in $dns ; do
echo adding dns $i
echo nameserver $i >> $RESOLV_CONF
done
;;
esac
exit 0

DHCP服务器端

vi /etc/udhcpd.conf

# The start and end of the IP lease block
start 192.168.1.20 #default: 192.168.0.20 客户端分配的地址范围
end 192.168.1.25 #default: 192.168.0.254
# The interface that udhcpd will use
interface wlan0 #default: eth 0 #目标板子上的无线网卡wlan0
#Examles
opt dns 222.201.130.30 222.201.130.33 #dns服务器
option subnet 255.255.255.0
opt router 192.168.1.10 #wlan的 ip地址,做为网关地址
#opt wins 192.168.10.10 #注释掉
option dns 192.168.1.10 # appened to above DNS servers for a total of 3
option domain local
option lease 864000 # 10 days of seconds

测试

重启开发板,执行udhcpc就可自动获取IP地址了,以下是执行udhcpc的输出信息:

~# udhcpc -b -i eht0 -q

udhcpc (v0.9.9-pre) started
udhcpc[228]: udhcpc (v0.9.9-pre) started
Sending discover...
udhcpc[228]: Sending discover...
Sending select for 192.168.1.109...
udhcpc[228]: Sending select for 192.168.1.109...
Lease of 192.168.1.109 obtained, lease time 86400
udhcpc[228]: Lease of 192.168.1.109 obtained, lease time 86400
deleting routers
route: SIOC[ADD|DEL]RT: No such process
adding dns 192.168.0.1 ~ # ping www.baidu.com
PING www.a.shifen.com (220.181.38.4): 56 data bytes
64 bytes from 220.181.38.4: icmp_seq=0 ttl=52 time=1219.0 ms

arm linux 移植 udhcp 与 使用的更多相关文章

  1. arm linux 移植 x265

    背景 本来想着把 x265编译到ffmpeg里面,搞定了x265的编译:但是一直报ERROR: x265 not found using pkg-config这个错误,我按照网上的资料,查看了ffbu ...

  2. Linux 安装 go 以及 arm linux 移植 go

    背景 Go是一门全新的静态类型开发语言,具有自动垃圾回收,丰富的内置类型,函数多返回值,错误处理,匿名函数,并发编程,反射等特性. 从Go1.4之后Go语言的编译器完全由Go语言编写,所以为了从源代码 ...

  3. arm linux 移植 MQTT (paho、mosquitto)

    前言 我们在这里做2件事情: 1)编译 paho.mqtt.mosquitto 2个开源项目的c版本库(mosquitto库没有用上) 2)编译好 依赖 paho.mqtt的库编写例程 + mosqu ...

  4. arm linux 移植 ffmpeg 库 + x264

    背景 Ffmpeg 中带有h264的解码,没有编码,需要添加x264.libx264是一个自由的H.264编码库,是x264项目的一部分,使用广泛,ffmpeg的H.264实现就是用的libx264. ...

  5. arm linux 移植 PHP

    背景: PHP 是世界上最好的语言. host平台 :Ubuntu 16.04 arm平台 : 3531d arm-gcc :4.9.4 php :7.1.30 zlib :1.2.11 libxml ...

  6. arm linux 移植支持 HP打印机

    背景 由于业务需要,需要hi3531d主板上加入对于HP打印机的支持. 通过与产品经理,技术主管的沟通:通用支持是不现实的,只要求彩色打印,先不考虑打印机的价格,只要支持一款打印机即可. 注意: Li ...

  7. arm linux 移植 gdb/gdbserver

    背景 调试工具gdb的使用对于嵌入式Linux开发人员来说是一项不可少的技能. 目前,嵌入式 Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:用ROM Monitor调试目标机 ...

  8. arm linux 移植 rsync

    背景: 在产品开发中可以使用rsync进行大文件的拷贝,断点续传. host平台 :Ubuntu 16.04 arm平台 : 3531d   rsync   :3.1.3 arm-gcc :4.9.4 ...

  9. arm linux 移植 jpeg

    背景: host平台 :Ubuntu 16.04 arm平台 : S5P6818 jpeg :v9c arm-gcc :4.8.1 主机准备: 运行以下脚本: ## # Copyright By Sc ...

随机推荐

  1. 如何使用charles对Android Https进行抓包

      Charles.png charles是一款在Mac下常用的截取网络封包工具,对Android Http进行抓包,只要对手机设置代理即可,但对Android Https进行抓包还是破费一些功夫,网 ...

  2. Python基础语法笔记2

    ------------------------------------------------------------------------------- 常量和Pylint的规范 1.常量:常量 ...

  3. 使用new时,会发生什么?

    使用new来调用函数,或者说发生构造函数调用时,会自动执行下面的操作: 创建(或说构造)一个全新的对象. 这个新对象会被执行[[prototype]]连接. 这个新对象会绑定到函数调用的this. 如 ...

  4. Dart语言学习(十五) Dart函数方法

    Dart函数方法可分为两类: 一.内置方法/函数: print(); 二.自定义方法: 自定义方法的基本格式: 返回类型 方法名称(参数1,参数2,...){ 方法体 return 返回值; } vo ...

  5. Python爬虫连载6-cookie深入使用实例化实现自动登录

    一.使用cookie登录 1.直接把cookie复制下去,然后手动放到请求头 2.http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie (1)cookieJar 管理存储c ...

  6. idea代码神器:根据表生成代码

    Easycode是idea的一个插件,可以直接对数据的表生成entity,controller,service,dao,mapper,无需任何编码,简单而强大. 1.安装(EasyCode) 我这里的 ...

  7. 栈结构Stack

    package seday12; import java.util.Deque; import java.util.LinkedList; /** * @author xingsir * 栈结构. 栈 ...

  8. [追热点]学习Rust之选择IDE

    学习语言非常需要实际上手写代码,自然绕不开IDE工具,所以第一时间当然是选择IDE. Rust官网推荐 先去看看Rust官网推荐了什么IDE:工具 - Rust 程序设计语言 无论您喜欢用命令行还是可 ...

  9. 如何查看NXP产品的供货计划?

    大的半导体厂商一般会提供每个产品的生命周期计划,NXP的工业级IC一般供货10年,汽车级是15年,具体的时间可以在官网查询得到. 首先,打开NXP官网链接 产品长期供货计划,可以看到以下页面 接着,筛 ...

  10. 关于java自学的内容及感受

    这周自学了关于java类的知识,进度有点慢,需要抓紧学习剩下的知识,放假后由于自制力差而各种玩没有认认真真的学习,下周要认真的学习之后的进度,争取开学玩全部完成! /** * 动物的类 * */pub ...