• 嵌入式Linux设备自动获取IP地址


    一、前言

    我目前在开发的一款嵌入式产品,运行Linux系统,需要产品支持接入以太网后自动获取IP地址功能,写下此文记录实现的过程。

    二、固定IP地址

    产品前期调试,为了方便直接通过ifconfig命令设置产品IP为固定IP,例如:

    1. ifconfig eth0 down
    2. ifconfig eth0 192.168.1.100
    3. ifcofnig eth0 up

    产品成熟后,需通过DCHP让产品自动获取动态IP地址。

    三、DHCP

    DHCP全称是:动态主机设置协议(英语:Dynamic Host Configuration Protocol,DHCP)它是一个局域网的网络协议,使用 UDP 协议工作,主要有两个用途:

    1)用于内部网或网络服务供应商自动分配 IP 地址;
    2)给用户用于内部网管理员作为对所有计算机作中央管理的手段。
     

    DHCP分为服务器端和客户端,通常是客户端向服务端申请地址,嵌入式产品上运行的一般是DCHP客户端。

    四、UDHCPC

    udhcpc是一个面向嵌入式系统的非常小的DHCP客户端,它通常由busybox支持。若文件系统内没有包含这个工具,需在busybox配置选项中开启,并重新编译busybox固件。udhcpc的典型用法举例:

    udhcpc -i eth0 -s /etc/udhcpc.script -b

    其中,

    -i 是指定网卡,我这里只有一个eth0,有多个网卡时需要注意区分;

    -s 是指定发生dhcp事件时运行的脚本,默认是/usr/share/udhcpc/default.script这个路径,我这里是将/etc/udhcpc.script软链到了默认路径。

    -b 是指定切换到后台指令。

    这里运行udhcpc的结果仅仅是从服务端拿到了合法的IP地址而已,还需要将IP、网关、DNS等写入网卡,才能正常使用网络。而这些动作全都由/usr/share/udhcpc/default.script这个脚本实现。这个脚本可以从\busybox-1.1.2\examples\udhcp下获取,将脚本simple.script重命名为default.script,放在开发板上的/usr/share/dhcpc/目录下。

    下面是我的default.script,仅供参考:

    1. #!/bin/sh
    2. # udhcpc script edited by Tim Riker
    3. [ -z "$1" ] && echo "Error: should be called from udhcpc" && exit 1
    4. RESOLV_CONF="/etc/resolv.conf"
    5. [ -e $RESOLV_CONF ] || touch $RESOLV_CONF
    6. [ -n "$broadcast" ] && BROADCAST="broadcast $broadcast"
    7. [ -n "$subnet" ] && NETMASK="netmask $subnet"
    8. case "$1" in
    9. deconfig)
    10. /sbin/ifconfig $interface up
    11. /sbin/ifconfig $interface 0.0.0.0
    12. # drop info from this interface
    13. # resolv.conf may be a symlink to /tmp/, so take care
    14. TMPFILE=$(mktemp)
    15. grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
    16. cat $TMPFILE > $RESOLV_CONF
    17. rm -f $TMPFILE
    18. if [ -x /usr/sbin/avahi-autoipd ]; then
    19. /usr/sbin/avahi-autoipd -k $interface
    20. fi
    21. ;;
    22. leasefail|nak)
    23. if [ -x /usr/sbin/avahi-autoipd ]; then
    24. /usr/sbin/avahi-autoipd -wD $interface --no-chroot
    25. fi
    26. ;;
    27. renew|bound)
    28. if [ -x /usr/sbin/avahi-autoipd ]; then
    29. /usr/sbin/avahi-autoipd -k $interface
    30. fi
    31. /sbin/ifconfig $interface $ip $BROADCAST $NETMASK
    32. if [ -n "$router" ] ; then
    33. echo "deleting routers"
    34. while route del default gw 0.0.0.0 dev $interface 2> /dev/null; do
    35. :
    36. done
    37. for i in $router ; do
    38. route add default gw $i dev $interface
    39. done
    40. fi
    41. # drop info from this interface
    42. # resolv.conf may be a symlink to /tmp/, so take care
    43. TMPFILE=$(mktemp)
    44. grep -vE "# $interface\$" $RESOLV_CONF > $TMPFILE
    45. cat $TMPFILE > $RESOLV_CONF
    46. rm -f $TMPFILE
    47. # prefer rfc3359 domain search list (option 119) if available
    48. if [ -n "$search" ]; then
    49. search_list=$search
    50. elif [ -n "$domain" ]; then
    51. search_list=$domain
    52. fi
    53. [ -n "$search_list" ] &&
    54. echo "search $search_list # $interface" >> $RESOLV_CONF
    55. for i in $dns ; do
    56. echo adding dns $i
    57. echo "nameserver $i # $interface" >> $RESOLV_CONF
    58. done
    59. ;;
    60. esac
    61. HOOK_DIR="$0.d"
    62. for hook in "${HOOK_DIR}/"*; do
    63. [ -f "${hook}" -a -x "${hook}" ] || continue
    64. "${hook}" "${@}"
    65. done
    66. exit 0
    
                    
  • 相关阅读:
    Ti AM335X工控模块的ubuntu系统定制与使用-连载 (一)
    轮转数组(超详细!)
    不敢相信,只用500页笔记就趣谈了网络协议
    【目标跟踪-卡尔曼滤波】基于分布式Kalman滤波跟踪运动目标附Matlab代码
    七夕节,我用代码制作了表白信封
    云计算在智能制造中的应用与前景
    OpenCV-Python实战(1) —— 给图片添加图片水印【利用 OpenCV 像素的读写原理实现】
    加权循环仲裁WRR特性对NVME SSD性能有什么影响?
    每日一练 | 华为认证真题练习Day122
    【初阶与进阶C++详解】第十二篇:模板进阶(函数模板特化+类模板特化+模板分离编译)
  • 原文地址:https://blog.csdn.net/fun_tion/article/details/127734830