zoukankan      html  css  js  c++  java
  • 嵌入式设备网络设置

    嵌入式设备的网络设置主要是靠一些命令进行处理的:

    #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)来维护,当需要发送一个数据报给某个IP时,本机会从建立的对照表中查询对应的MAC地址来发送,此时如果本机IP和目标IP同网(两个IP与子网掩码的与(&)值相同),则直接发送数据报,而不同的话,则将数据报发往网关IP对应的主机,由路由代发。

    首先IP是由4段8位二进制数表示,每一段为8位(每位是0或1),占一个字节,因此每一段大小从0到255.

    子网掩码由32位(每位可以是0或1,规则上,高位必须有连续的若干个1,低位必须全为0)表示,分为网络地址段和主机地址段。网络地址段就是子网(Subnet),同一子网(Subnet)是使用相同的网关,32位中,前面全是1的部分即为子网覆盖的区间,后面0的部分就代表主机部分。例如一个子网掩码为255.255.192.0, 换成32位二进制表示:11111111 11111111 11000000 00000000, 即可容纳的主机数就是后面0的个数表示的大小,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
            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
        ;;
        --)
            # usage_Func
            shift
            break;
        ;;
        *)
            # usage_Func
            shift
            break;
        ;;
        esac
    done

    特殊变量列表  

               变量  含义  

    1. $0      当前脚本的文件名  
    2. $n      传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。  
    3. $#      传递给脚本或函数的参数个数。  
    4. $*      传递给脚本或函数的所有参数。  
    5. $@      传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。  
    6. $?      上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。  
    7. $$      当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。  
    8. $* 和 $@ 的区别  
    9. $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。  
    10. 但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$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` 
    #eg:ip=`awk -F '=' '/['NETWORK']/{a=1}a==1&&$1~/'ipaddr'/{print $2;exit}' $INIFILE` 

    更改INI配置文件中的值:

    sed '/^'"$ITEM"'/{ s~^.*$~'"$ITEM"'='"$VALUE"'~g }' -i "$INIFILE" 
    种树最好的时间是十年前,其次是现在。
  • 相关阅读:
    NetCore指令集和
    在WPF中的Canvas上实现控件的拖动、缩放
    WPF 窗体中的 Canvas 限定范围拖动 鼠标滚轴改变大小
    利用百度API(js),怎样通过地址获取经纬度
    讨论一下hibernate如何动态注册一个动态生成的实体类
    大端序vs小端序
    influxdb+telegraf+grafana实现nginx监控
    python库pillow:实现生成图片并加水印
    mac使用之设置vim colors
    学习python库:elasticsearch-dsl
  • 原文地址:https://www.cnblogs.com/bobojiang/p/8385974.html
Copyright © 2011-2022 走看看