当前位置: 首页 > news >正文

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

文章目录

  • 目的
  • 基础说明
  • 使用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"
}

其中 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"
}

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

使用wpa_supplicant访问无线网络

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

cd ~/nuc980-sdk/ 
cd buildroot-2022.02.3/

make menuconfig

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

配置完成后进行编译:

make

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

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

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

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

修改内容如下:

# 32行 允许root用户进行ssh访问
PermitRootLogin yes
# 57行 允许使用密码进行ssh访问
PasswordAuthentication yes

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

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

修改内容如下:

ap_scan=1

network={
  ssid="Name of your wireless LAN"
  psk="Password for your wireless LAN"
}

需要注意的是我这里使用的 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'

全部完成后将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

在这里插入图片描述

接入到无线网络之后我们就能够使用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 and udhcpc: "
        killall wpa_supplicant
        killall udhcpc
        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 $?

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

调整脚本权限:

chmod 755 /etc/init.d/S99wifi

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

总结

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

相关文章:

  • 教师教室预约管理系统(SpringBoot,H-UI,Mysql)
  • Centos7五步安装Docker并解决docker官方镜像无法访问问题
  • flink技术总结待续
  • Mac - 安装Nginx
  • SpringBoot事件机制
  • IDEA配置tomcat以及创建项目
  • Node.js | 使用内置模块 event 实现发布订阅模式
  • 七千字详解javaString类
  • 希尔排序算法
  • synchronized同步以及双重检索
  • Codeforce8.29-9.4做题笔记
  • springboot+宴会预定平台 毕业设计-附源码231718
  • python super()详解,一篇文章告诉你python的super是什么,如何使用
  • Redis 的持久化
  • 2022年中国证券行业智能投顾专题分析
  • hadoop集群管理系统搭建规划说明
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • Otto开发初探——微服务依赖管理新利器
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SpringCloud集成分布式事务LCN (一)
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue:响应原理
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 近期前端发展计划
  • 如何解决微信端直接跳WAP端
  • 事件委托的小应用
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • #DBA杂记1
  • #传输# #传输数据判断#
  • $L^p$ 调和函数恒为零
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (C语言)fgets与fputs函数详解
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET NPOI导出Excel详解
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 回调、接口回调、 委托
  • .NET:自动将请求参数绑定到ASPX、ASHX和MVC(菜鸟必看)
  • .netcore 获取appsettings
  • .net程序集学习心得
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [acm算法学习] 后缀数组SA
  • [Assignment] C++1
  • [bzoj 3124][sdoi 2013 省选] 直径
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C#]DataTable常用操作总结【转】