• 新唐NUC980使用记录:使用wpa_supplicant访问无线网络


    目的

    通过无线访问网络现在来说已经是一种比较常用且重要的功能了。如果开发板中已经有无线网卡驱动并且可以启用无线网卡的情况下,可以使用 wpa_supplicant 程序来访问无线网络。这篇文章将对相关内容进行介绍。

    这篇文章中内容均在下面的开发板上进行测试:
    《新唐NUC980使用记录:自制开发板(基于NUC980DK61YC)》

    这篇文章主要是在下面文章基础上进行的:
    《新唐NUC980使用记录:向内核添加USB无线网卡驱动(基于RTL8188EUS)》

    基础说明

    wpa_supplicant 是一个非常常用的用于连接无线接入点的程序,像是树莓派、安卓这些设备中连接无线接入点使用的都是这个程序。它的官网是 http://w1.fi/ 你可以在这里下载到程序源码,也可以在这找到相关的文档说明。

    这个程序通常会根据放在 /etc/wpa_supplicant/ 下的配置文件 wpa_supplicant.conf 来连接无线接入点,其内容格式一般如下:

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=CN
    
    network={
    	ssid="Name of your wireless LAN"
    	psk="Password for your wireless LAN"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    其中 country 为地区代码( CN 表示China); network 保存的是一个无线网络的相关信息。你也可以设置多个无线网络:

    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    country=CN
    
    network={
    	ssid="Name of your wireless LAN 1"
    	psk="Password for your wireless LAN 1"
    }
    
    network={
    	ssid="Name of your wireless LAN 2"
    	psk="Password for your wireless LAN 2"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    需要注意的是上面的配置文件路径和内容格式会依据实际文件系统和程序版本而有所差异,实际使用中需要灵活处理。

    使用wpa_supplicant访问无线网络

    在这里我使用 buildroot 来编译 wpa_supplicant 程序到文件系统中。我这里使用的版本为 buildroot-2022.02.3wpa_supplicant 程序配置如下:

    cd ~/nuc980-sdk/ 
    cd buildroot-2022.02.3/
    
    make menuconfig
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    需要注意的是 wpa_supplicant 可能依赖于 openssh ,我这里前面依赖的文章中已经配置了相关功能。

    配置完成后进行编译:

    make
    
    • 1

    编译生成根文件系统后替换SD卡上原先的根文件系统(SD插入电脑后rootfs分区会自动挂载到 /media/nx/rootfs/ 目录):

    sudo rm -rf /media/nx/rootfs/*
    sudo tar -xf output/images/rootfs.tar -C /media/nx/rootfs/
    
    • 1
    • 2

    对根文件系统中SSH进行设置:

    sudo gedit /media/nx/rootfs/etc/ssh/sshd_config
    
    • 1

    修改内容如下:

    # 32行 允许root用户进行ssh访问
    PermitRootLogin yes
    # 57行 允许使用密码进行ssh访问
    PasswordAuthentication yes
    
    • 1
    • 2
    • 3
    • 4

    对根文件系统中wpa_supplicant进行设置:

    sudo gedit /media/nx/rootfs/etc/wpa_supplicant.conf
    
    • 1

    修改内容如下:

    ap_scan=1
    
    network={
      ssid="Name of your wireless LAN"
      psk="Password for your wireless LAN"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    需要注意的是我这里使用的 buildroot 版本目前下载的 wpa_supplicant 版本为 wpa_supplicant v2.10 ,该版本已经没有 ctrl_interface 这个参数了,在配置文件中需要去除,不然后面使用中会报如下错误:

    Line 1: unknown global field 'ctrl_interface=/var/run/wpa_supplicant'.
    Line 1: Invalid configuration line 'ctrl_interface=/var/run/wpa_supplicant'.
    Failed to read or parse configuration '/etc/wpa_supplicant.conf'
    
    • 1
    • 2
    • 3

    全部完成后将SD卡插回开发板,等启动完成后就可以在开发板上进行测试了:

    # 连接到无线接入点
    # -i 指定网卡;-c 指定配置文件;-B 后台运行
    wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -B
    # wpa_supplicant -Dnl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
    
    # 连接到无线接入点后向网络中的dhcp服务器申请ip地址
    udhcpc -i wlan0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    接入到无线网络之后我们就能够使用SSH通过无线网络访问开发板了:
    在这里插入图片描述

    设置开机自动联网

    设置开机自动联网操作起来不复杂,无非就是在开机时通过脚本执行 wpa_supplicantudhcpc 命令设置相关内容即可。

    通常Linux加载文件系统后首先会启动 init 进程,该进程会在执行完一些基础设置后启动一些用户脚本,用来实现开机启动功能。

    这里使用 buildroot 默认会使用 busybox 来构建根文件系统,它有自己的 init 进程。该进程会在启动后读取 /etc/inittab 文件内容,并执行其中命令。默认设置下它会在开机时进行一些必要的文件系统及网络操作,最后执行 /etc/init.d/rcS 脚本。

    /etc/init.d/rcS 脚本会依据文件名排序依次执行 /etc/init.d/ 目录下文件名为 S??* 的文件中的 start 方法(比如 S01syslogdS50sshd 等)。

    另外在 /etc/inittab 可以看到系统会在关机前执行 /etc/init.d/rcK 脚本。该脚本会执行 S??* 的文件中的 stop 方法。

    所以对于我们来说要在开机时执行命令可以在 /etc/init.d/ 目录下新建名为 S??* 格式的文件,然后在其中编写一个 start 方法,在其中写上我们需要开机执行的命令即可。

    在这里我们在开发板 /etc/init.d/ 目录下新建名为 S99wifi 的脚本,其内容如下:

    #!/bin/sh
    #
    # wifi        Starts wifi.
    #
    
    umask 077
    
    start() {
            printf "Starting wpa_supplicant and udhcpc for wlan0: "
            wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -B
            udhcpc -i wlan0
            echo "OK"
    }
    
    stop() {
            printf "Stopping wpa_supplicant: "
            killall wpa_supplicant
            echo "OK"
    }
    
    restart() {
            stop
            start
    }
    
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart|reload)
            restart
            ;;
      *)
            echo "Usage: $0 {start|stop|restart}"
            exit 1
    esac
    
    exit $?
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    这个脚本也可以在电脑上编写然后传到开发板中,需要注意的是行尾必须是以只有换行符,不能是windows上回车加换行的形式。

    调整脚本权限:

    chmod 755 /etc/init.d/S99wifi
    
    • 1

    下面是开机自动联网的演示:
    在这里插入图片描述

    总结

    总的来说使用无线网卡去连接无线接入点来访问网络操作还是比较简单的。基本上只要能够了解相关原理,能够应对相关程序版本上差异性的操作,那么整体流程跑通应该不成问题。

  • 相关阅读:
    Vue文件中css相关知识
    vue 监听屏幕的宽度
    【设计模式】结构型-组合模式
    【笔记】自动驾驶预测与决策规划_Part2_基于模型的预测方法
    Linux环境搭建与登陆
    [图论] 6-1-1 网络最大流
    下一个十年,数字化的发展趋势
    【python爬虫笔记】验证码
    vue如何使用socket与服务端进行通信
    Spark 3.0 - 9.Ml 朴素贝叶斯中文分类分析与实战
  • 原文地址:https://blog.csdn.net/Naisu_kun/article/details/126623836