背景

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

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

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

在内核中添加以下选项:

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

移植 udhcp

移植udhcp的方法有2种。

1.在busybox中配置编译:

Busybox中添加以下选项:

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

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

使用以下脚本:

  1. ##
  2. # Copyright By Schips, All Rights Reserved
  3. # https://gitee.com/schips/
  4. # File Name: make.sh
  5. # Created : Tue 24 Dec 2019 04:20:51 PM CST
  6. ##
  7. #!/bin/sh
  8. BASE=`pwd`
  9. BUILD_HOST=arm-linux
  10. OUTPUT=${BASE}/install/
  11. make_dirs() {
  12. cd ${BASE}
  13. mkdir compressed install source -p
  14. sudo ls
  15. }
  16. tget () { #try wget
  17. filename=`basename $1`
  18. echo "Downloading [${filename}]..."
  19. if [ ! -f ${filename} ];then
  20. wget $1
  21. fi
  22. echo "[OK] Downloaded [${filename}] "
  23. }
  24. download_package () {
  25. cd ${BASE}/compressed
  26. #下载包
  27. tget https://udhcp.busybox.net/source/udhcp-0.9.8.tar.gz
  28. }
  29. tar_package () {
  30. cd ${BASE}/compressed
  31. ls * > /tmp/list.txt
  32. for TAR in `cat /tmp/list.txt`
  33. do
  34. tar -xf $TAR -C ../source
  35. done
  36. rm -rf /tmp/list.txt
  37. }
  38. make_udhcp () {
  39. cd ${BASE}/source/udhcp*
  40. sed -i '5, 12{s/COMBINED_BINARY=/#COMBINED_BINARY=/}' Makefile
  41. sed -i '130, 135{s/case INIT_SELECTING:/case INIT_SELECTING:;/}' dhcpc.c
  42. make CROSS_COMPILE=${BUILD_HOST}-
  43. }
  44. do_copy () {
  45. cd ${BASE}/source/udhcp*
  46. mkdir ${BASE}/install/udhcp -p
  47. mkdir ${BASE}/install/udhcp/sbin -p
  48. mkdir ${BASE}/install/udhcp/config -p
  49. cp ${BASE}/source/udhcp*/udhcpc ${OUTPUT}/udhcp/sbin -v
  50. cp ${BASE}/source/udhcp*/udhcpd ${OUTPUT}/udhcp/sbin -v
  51. # 默认的配置路径 /usr/share/udhcpc/default.script
  52. # 写进了代码中 dhcpc.c:62:#define DEFAULT_SCRIPT "/usr/share/udhcpc/default.script"
  53. cp ${BASE}/source/udhcp*/samples/simple.script ${OUTPUT}/udhcp/config/default.script -v
  54. #cp ${BASE}/source/udhcp*/samples/udhcpd.conf ${OUTPUT}/udhcp/config/ -v
  55. }
  56. make_dirs
  57. #download_package
  58. tar_package
  59. make_udhcp
  60. do_copy
  61. exit 0
  62. 以下内容针对板子
  63. mkdir /usr/share/udhcpc/
  64. cp default.script /usr/share/udhcpc/default.script
  65. chmod +x /usr/share/udhcpc/default.script

拷贝有关配置文件

DHCP客户端

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

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

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

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

  1. #!/bin/sh
  2. # udhcpc script edited by Tim Riker <Tim@Rikers.org>
  3. [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
  4. RESOLV_CONF="/etc/resolv.conf"
  5. [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
  6. [ -n "$subnet" ] && NETMASK="netmask $subnet"
  7. case "$1" in
  8. deconfig)
  9. /sbin/ifconfig $interface 0.0.0.0
  10. ;;
  11. renew|bound)
  12. /sbin/ifconfig $interface $ip $BROADCAST $NETMASK
  13. if [ -n "$router" ] ; then
  14. echo "deleting routers"
  15. while route del default gw 0.0.0.0 dev $interface ; do
  16. :
  17. done
  18. for i in $router ; do
  19. route add default gw $i dev $interface
  20. done
  21. fi
  22. echo -n > $RESOLV_CONF
  23. [ -n "$domain" ] && echo search $domain >> $RESOLV_CONF
  24. for i in $dns ; do
  25. echo adding dns $i
  26. echo nameserver $i >> $RESOLV_CONF
  27. done
  28. ;;
  29. esac
  30. exit 0

DHCP服务器端

vi /etc/udhcpd.conf

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

测试

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

  1. ~# udhcpc -b -i eht0 -q
  2. udhcpc (v0.9.9-pre) started
  3. udhcpc[228]: udhcpc (v0.9.9-pre) started
  4. Sending discover...
  5. udhcpc[228]: Sending discover...
  6. Sending select for 192.168.1.109...
  7. udhcpc[228]: Sending select for 192.168.1.109...
  8. Lease of 192.168.1.109 obtained, lease time 86400
  9. udhcpc[228]: Lease of 192.168.1.109 obtained, lease time 86400
  10. deleting routers
  11. route: SIOC[ADD|DEL]RT: No such process
  12. adding dns 192.168.0.1
  13. ~ # ping www.baidu.com
  14. PING www.a.shifen.com (220.181.38.4): 56 data bytes
  15. 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. Github 结合 Hexo 搭建轻量博客

    http://www.open-open.com/lib/view/open1481532171287.html 开始 Hexo 是一个快速.简洁且高效的博客框架.Hexo 使用 Markdown(或 ...

  2. 理解js中的原型链

    对象有”prototype”属性,函数对象有”prototype”属性,原型对象有”constructor”属性. 关于原型 在JavaScript中,原型也是一个对象,通过原型可以实现对象的属性继承 ...

  3. Centos610无桌面安装Docker-安装

    1.必备环境 设定docker源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.rep ...

  4. JavaScript图形实例:线段构图

    在“JavaScript图形实例:四瓣花型图案”和“JavaScript图形实例:蝴蝶结图案”中,我们绘制图形时,主要采用的方法是先根据给定的曲线参数方程计算出两点坐标,然后将两点用线段连接起来,线段 ...

  5. 乒乓球(0)<P2003_1>

    乒乓球(table.cpp/c/pas) [问题背景]国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的争议,有一部分球员因为无法适应 ...

  6. urllib 库的代替品 requests 的用法

    Requuests 官方的介绍时多么的霸气,之所以那么霸气,是因为 Requestts 相比于 urllib 在使用方面上会让开发者感到更加的人性化.更加简洁.更加舒适,并且国外的一些公司也在使用re ...

  7. SSH项目Dao层和Service层及Action的重用

    泛型 1.泛型的定义 1.泛型是一种类型    1.关于Type            //是一个标示接口,该标示接口描述的意义是代表所有的类型        public interface Typ ...

  8. Java记录4--string

    1.toString所有的类都默认自动继承了Objiect类 2.Object类中的toString方法返回的时类的名字和该哈希表码组成的一个字符串, System.out.println(类对象名) ...

  9. 「Luogu P3078 [USACO13MAR]扑克牌型Poker Hands」

    本题有\(O(N)\)的优秀做法,但是因为在考场上不一定能想到,就来分享一种\(O(N\log_2N)\)的做法.虽然有点慢,但是可以过. 前置芝士 线段树:提高组及以上必备内容,不会的同学可以学习一 ...

  10. 什么是Device ID?

    Android ID用于唯一识别一部设备的一次刷机行为,虽然不能完全确定该设备的唯一性(真的唯一性是用IMEI号的),但是可以很大程度上过滤重复设备.这是移动互联网广告行业的基础,尤其是CPI广告,设 ...