李迟按:
前段时间接触了wifi,主要是在linux系统下做预研、开发。本文根据个人收集资料及研究经验做了一些基本入门级别的引子,旨在对wifi有一个很基础的入门的认知,比如知道wifi模块硬件接口有哪些,了解wifi驱动,等等。如有需要,可以根据文中给出的术语、链接进行扩展的研究学习。
一、硬件接口
就笔者接触的资料,wifi接口有很多种,不同接口适应于不同场合。更多资料,可以直接到某宝上搜索了解。
USB
适用于PC机,插到USB口安装驱动即可使用。这类接口还是比较常见、常用的。PCI
直接将无线网卡插入PCI插槽,系统一般会识别到PCI设备,但要安装驱动才能正常使用无线网络。后文基于该类接口展开描述。现在在一些嵌入式专用设备上,比较流行使用PCIE接口,对于linux上应用而言并无多大差异。串口
使用AT指令进行操作。一般模块会带有单片机。许多年前,笔者的同学也曾研究过GSM模块,也是使用AT命令的——那时,“迟思堂工作室”正式成立。不过此类模块,对速率要求高的可以不用考虑了。
二、基本概念
wifi的基本概念比较多,网上资料一大把。这里只简单描述一下,有的直接拿人家写好的来用了。
wifi模式
AP模式:即Access Point,接入点。是一个无线网络的创建者,是网络的中心节点。一般家庭或办公室使用的无线路由器就是一个AP。
STA模式:即Station, 类似于无线终端,STA本身并不接受无线的接入,它可以连接到AP,一般无线网卡即工作在该模式。
Monitor模式:这种模式下,所有的数据包无过滤地传输到主机,此模式下主要查看网络中出了那些故障。在支持MAC80211的一般设备中,工作于Monitor模式下,可以有效地对整个网络进行监控,在此模式下,可以实现数据包的注入。
其它概念
SSID:SSID就是一个WiFi网络的网络名称。
频率:
1)IEEE 802.11b/g标准工作在2.4G频段,频率范围为2.400—2.4835GHz,共83.5M带宽
2)划分为14个子信道
3)每个子信道宽度为22MHz
4)相邻信道的中心频点间隔5MHz
5)相邻的多个信道存在频率重叠(如1信道与2、3、4、5信道有频率重叠)
6)整个频段内只有3个(1、6、11)互不干扰信道
国家码:不同国家使用的信道有不同,要根据实际需要设置,中国的国家码为CN,美国为US,等等。
对于5GHz而言,还有DFS。
三、linux相关驱动
linux下的无线网卡驱动,一般会结合ko和固件使用。固件一般不开源,但官方会提供二进制文件下载。固件放到linux系统的/lib/firmware目录下,在系统启动时会到对应目录查找。可以到https://wireless./en/users/Drivers上查看linux无线网卡驱动,上面有许多不同厂商的芯片驱动。对于一些特性,如是否支持AP模式、Monitor模式,等,都可以在上面找到信息。在研究无线网卡前,最好去查一下网卡是否被内核支持。
另外,内核层和用户层操作无线网卡的还涉及到mac80211、cfg80211、nl80211这些模块,还需要对内核进行配置(如iptables、bridge等),这些目前没有研究过,暂时不写。
四、linux相关系统应用
linux系统涉及wifi的模块、软件或服务程序十分之多,本节简单介绍笔者接触过的一些软件。注意,无线网卡也是网卡,一般名称为wlan0、wlan1,ifconfig、ethtool命令依然对其生效。另外网络设备命名规则同样生效,当同一主板变换无线网卡时,其名称会发生变化。关于此问题可以参考笔者个人主页上的文章,有详细描述。
如果单纯在linux系统中使用无线网卡作为上网之用,无需做太多的配置,像在Ubuntu系统中,直接点击桌面任务栏的WIFI图标,找到对应无线路由器名称,输入密码即可。但如果在linux中使用无线网卡搭建热点环境,则需要额外的工具,一般是使用hostapd,外加一个dhcp服务器。
lspci
如果无线网卡使用PCI接口,则可以使用lspci命令查看设备ID。上面提供
# lspci
03:00.0 Class 0280: Device 168c:003c
iw
查看、配置无线网卡命令。查看当前无线网卡信息,直接用iw list即可。关于这个命令本文不展开讨论。hostapd
linux实现AP的服务程序。很多脚本都会使用这个程序。一般结合dhcp服务器组成软件AP。可以自己写脚本实现,也可以使用如ap-hostapd、create_ap这些著名的脚本。
ap-hostapd
一个脚本,利用hostapd、dnsmaq实现完整的软件AP功能。
rfkill
linux下可以使用rfkill命令打开、禁止无线电子设备,如蓝牙、WIFI。如果在系统中无法使用WIFI,则需要查一下是否被禁止了。下面是查看命令:
$ rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
可以看到我的WIFI是没有被阻止的,亦即可正常使用。要禁止(或阻止)WIFI,可以使用命令:rfkill block wifi。要激活,则使用命令:rfkill unblock wifi。具体信息rfkill --help查看。
五、个人研究计划
首先将WIFI网卡当成普通网卡使用,即station模式,能让linux连接无线路由器,正常上网。
然后研究AP模式,把linux系统做成热点,让手机、平板正常连接。
后续再看看minitor模式,主要想抓一下周围手机、平板的包(有些邪恶想法,不过还没实践)。
再后面有机会和时间,深入研究驱动。
当然,如有其它事务中断(比如中午你吃完饭正打算午休,领导叫你马上收拾电脑去机场到东北某省出差几天),以上的再议。
六、参考资源
Intel 7260介绍:/content/www/us/en/wireless-products/dual-band-wireless-ac-7260-bluetooth.htmlCRDA:https://wireless./en/developers/Regulatory/CRDA
Linux下支持的wifi芯片列表:https://wireless./en/users/Devices
查看linux驱动是否支持AP模式:/index.php//09/wifi-hotspot-access-point-not-supported/
linux无线网卡驱动大本营:https://wireless./en/users/Drivers
hostapd官网:http://w1.fi/
WIFI基本知识点:/myarrow/article/details/7930131
WIFI从零开始学起:/perddy/article/details/9017977
李迟 .7.19 周二夜