嵌入式设备网络设置

嵌入式设备的网络设置主要通过命令行来进行操作:

# MAC地址设置
ifconfig eth0 down
ifconfig eth0 hw ether $MACADDR
ifconfig eth0 up
ifconfig eth0 $ip netmask $netmask  # IP和子网掩码设置
route add default gw $gatewayip  # 网关设置
ifconfig lo $localhost  # 本机设置

通过编写脚本可以实现这些设置功能。脚本需要对输入进行详细的检测,以确保是有效的网络配置。

检测项目包括:

这些检测涉及到网络工程的基础知识,例如子网和网关的概念。

在计算机发送数据包时,数据链路层负责处理MAC(Media Access Control,媒体访问控制)地址,而IP地址则是网络层负责的。因此,需要使用ARP(Address Resolution Protocol,地址解析协议)来维护MAC地址与IP地址的对应关系。当发送数据包到某个IP地址时,计算机会从ARP表中查找对应的MAC地址。如果源IP和目标IP在同一个子网(通过与子网掩码进行与操作后结果相同),则直接发送数据包;如果不在同一个子网,则将数据包发送到网关IP对应的设备,由路由器转发。

IP地址由4段8位的二进制数组成,每段范围从0到255。

子网掩码由32位二进制数表示,其中高位必须是连续的1,低位必须是连续的0。子网掩码用于区分网络地址部分和主机地址部分。例如,子网掩码255.255.192.0在二进制表示为11111111 11111111 11000000 00000000,能够容纳的主机数为2^14 - 1 = 16383。

子网掩码255.255.255.254表示只有一个主机,这也是检测时的一个规则。

同一子网内的设备使用相同的网关,这可以通过IP地址与子网掩码进行与操作来验证,即(IP & netmask) == (GW & netmask)。

IP冲突检测可以通过ping和arp命令来实现:

# 如果$conflict为空,则IP不冲突;否则会得到arp缓存中的信息
conflict=`ping -c 2 -t 1 $TMP_IP_INPUT >/dev/null 2>&1 && arp -a $TMP_IP_INPUT`

结合上述约束条件和各种设置失败的异常处理(包括还原现场),脚本可以完成网络设置。

在Shell脚本中,输入参数的处理可以通过getopt来实现:

option=`getopt -l help -l init -- nhim: "$@"` 2> /dev/null
eval set -- "$option"
while true
do
    case $1 in
    -h|--help)
        # 使用说明
        usage_Func
        break;
    ;;
    -n)
        # 设置完成后系统不重启
        SYS_REBOOT_ENABLE=$SYS_REBOOT_OFF
        shift 1
    ;;
    -m)
        # 设置MAC地址,并接收MAC地址到变量MACADDR
        MAC_SET_ENABLE=$MAC_SET_ON
        MACADDR=$2
        shift 2
    ;;
    -i|--init)
        # 此选项用于系统启动时设置网络配置
        INIT_CONFIG_NET_ENABLE=1
        shift 1
    ;;
    --)
        # 使用说明
        shift
        break;
    ;;
    *)
        # 使用说明
        shift
        break;
    ;;
    esac
done

特殊变量列表:

变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

$* 和 $@ 的区别:

$ 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。

网络配置通过INI配置文件进行管理。INI文件由节、键、值组成。例如:

[NETWORK]
ipaddr=172.16.0.xx
netmask=255.255.255.0
gateway=172.16.0.1
macaddr=xxxxxx

读取INI配置文件中的值:

read_ini=`awk -F '=' '/\['$SECTION'\]/{a=1}a==1&&$1~/'$ITEM'/{print $2;exit}' $INIFILE`
# 例如:ip=`awk -F '=' '/\['NETWORK'\]/{a=1}a==1&&$1~/'ipaddr'/{print $2;exit}' $INIFILE`

更改INI配置文件中的值:

sed '/^'"$ITEM"'/{ s~^.*$~'"$ITEM"'='"$VALUE"'~g }' -i "$INIFILE"