• 嵌入式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
    
                    
  • 相关阅读:
    核货宝:选择批发订货系统源码需要注意的三大关键点
    一种高速1553B总线通信接口模块
    WRKY转录因子通过促进GhMKK2介导的类黄酮生物合成调节棉花对尖孢镰刀菌的抗性
    ubuntu升级python到python3.11(可能是全网最靠谱的方法,亲测有效)
    使用基于Roslyn的编译时AOP框架来解决.NET项目的代码复用问题
    ActiveReportsJS 3.2 中文版前端在线报表ActiveReportsJS
    【Java】从Java代码到网络编程,三次握手又该如何理解
    淘宝/天猫、1688、京东API接口—item_search - 按关键字搜索淘宝商品
    PKU 概率论+数理统计+建模 期中考复习总结
    C++ 初识STL
  • 原文地址:https://blog.csdn.net/fun_tion/article/details/127734830