李迟按:

前段时间接触了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.wiki.kernel.org/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模式,主要想抓一下周围手机、平板的包(有些邪恶想法,不过还没实践)。

再后面有机会和时间,深入研究驱动。

当然,如有其它事务中断(比如中午你吃完饭正打算午休,领导叫你马上收拾电脑去机场到东北某省出差几天),以上的再议。

六、参考资源

CRDA:https://wireless.wiki.kernel.org/en/developers/Regulatory/CRDA

Linux下支持的wifi芯片列表:https://wireless.wiki.kernel.org/en/users/Devices

查看linux驱动是否支持AP模式:http://ubuntuhandbook.org/index.php/2014/09/wifi-hotspot-access-point-not-supported/

linux无线网卡驱动大本营:https://wireless.wiki.kernel.org/en/users/Drivers

hostapd官网:http://w1.fi/

WIFI基本知识点:http://blog.csdn.net/myarrow/article/details/7930131

WIFI从零开始学起:http://blog.csdn.net/perddy/article/details/9017977


李迟  2016.7.19 周二夜

Logo

更多推荐