大多数人都是拿来主义,Wifi能用不就行了么,研究这个做甚?一旦碰到问题,就会无从下手,必须对Linux下的WiFi机制,软硬件,驱动原理,配置方式,工具等做一个全面的说明。本文提到的命令和相关工具既适用于普通电脑用户,也适合嵌入式开发者参考。本文中用到的嵌入式Linux的板子是基于Digi的ConnectCore 6UL的开发板。
一、硬件和驱动信息
对于已经安装好驱动的系统来说,本不该操心这个,但如果你的驱动不对,或是你用了一种很新的网卡需手动安装驱动时,就要理解硬件了,也就是你需要先知道你的无线网卡是哪一款。在有些发行版或嵌入式系统,只要熟悉和了解自身的硬件及其加载的驱动,才能更好地配置Wifi.
ethtool 是用于查询及设置网卡的工具。此外,读取硬件信息和相关接口也是一种方法,命令是lshw, lsusb或lspci(根据您硬件上wifi的接口)此外,还可以看启动信息dmesg中的相关硬件信息。默认地,PC机上的ubuntu已经自带有这些命令。
在PC机上,一般可以通过lspci来查询硬件驱动信息,常用命令为:
lspci -k |mroe 或 lspci -vvv
一般可以找到Wifi芯片及内核驱动信息。
对于嵌入式Linux来说,一般需要在定制和编译系统时添加到rootfs中,如果您想在ConnectCore 6UL中测试这些工具,可以下载预编译好的集成ethtool和lshw的Linux卡刷包. 当然,这种硬件相关的命令,在嵌入式linux中的支持程度也是因板子而异的。
在ConnectCore 6UL的开发板上用
lshw -c network
列出所有网卡信息,可以找到wifi相关的项:
注意,嵌入式板子的相关硬件信息不仅和系统定制时的配置信息有关,也和工具软件的支持有关,并不能总是显示完整信息。从上面的信息可以看到,这个板子上的Wifi配置是Qualcomn芯片组,支持802.11n,驱动是ar6k_wlan。事实上这个信息并不准确,应该是早期ConnectCore28遗留下的配置信息,而并非系统真正加载的驱动程序。
用ethtool 这个工具更主要是在PC机上使用,它可直接获取到对应网卡接口的内核驱动及版本信息。但在Digi 嵌入式开发板上用
ethtool -i wlan0
能获取的信息并不多(只有驱动名称),同样地,它依赖于BSP的配置信息。不过,在PC机上,这个命令可以获取很多网卡的信息。这是因为PC上大多是采用Intel和AMD的芯片组,BSP 信息大多是完整且准确的。
用dmesg获取信息:
dmesg |grep wireless
可以获取Wifi芯片的型号类型:QCA65x4。
综上,硬件信息读取工具不仅取决于软件对硬件的支持程度,也和BSP的配置信息密确相关,它毕竟不是扫描出来的信息,在嵌入式板卡上,除非是网卡驱动安装错误等场景,一般不依赖于这些工具来识别硬件。对于Wifi来说,只要硬件和对应驱动可正常工作,大多可以通过lsmod(列出内核模块驱动)和modinfo(内核驱动信息)两个工具来检查所加载的驱动信息。
在ConnectCore 6UL单板计算机上,用lsmod可以查得其加载的无线设备驱动内核模块为wlan,再通过modinfo wlan来列出详细信息。
值得注意的是,Linux虽然是开源软件,但不论是PC机还是嵌入式设备,像wifi,以及显卡等商业设备,它们的固件是闭源的,由制造商提供。所以.ko内核驱动并不是驱动程序的全部,通常它会调用厂家提供的固件,来实现完整的wifi功能。芯片厂家的固件程序一般位于/lib/firmware中。通常厂家会提供固件的配置文件,除了用默认的配置外,高端用户也可以通过修改配置文件来实现对wifi功能的一些自定义配置。如果要对默认的wifi固件配置文件进行变更,请先备份一份原始配置文件(位于/lib/firmware/wlan目录下)以便可以随时恢复。
二、配置工具和工作模式
如果硬件驱动加载正确,就可以通过通用的无线工具软件来获取相关信息并进行配置。iwconfig是个已经过时的软件,iw则是更新的软件工具。常用的工具软件还包括wpa_cli和nmcli。
linux下用wpa_cli来连接wifi:
wpa_cli -i wlan0 scan //扫描附近热点 wpa_cli -i wlan0 scan_result //打印热点信息 wpa_cli -i wlan0 add_network // 添加一个网络连接,并返回网络ID号,如果wpa_supplicant.conf文件为空,则返回0,表示第一个热点,然后该ID号会在连接热点用到 wpa_cli -i wlan0 set_network 0 ssid '"HiByMusic_5G-1"' //设置ID为0的热点SSID wpa_cli -i wlan0 set_network 0 psk '"hibymusic1109"' //设置ID为0的热点的密码 PS:如果是没有加密的公共网络,则输入以下密码: wpa_cli -i wlan0 set_network 0 key_mgmt NONE 继续输入: 复制代码 wpa_cli -i wlan0 set_network 0 priority 2 //设置当前网络优先级,默认为2 wpa_cli -i wlan0 set_network 0 scan_ssid 1 //设置ssid默认为1即可 wpa_cli -i wlan0 enable_network 0 //启动连接ID为0的网络 wpa_cli -i wlan0 select_network 0 //选择网络0(这样做的好处在于,可以取消先前的其它网络连接) udhcpc -b -i wlan0 -q //此时只是连接上,所以还要自动分配IP地址,-b:后台(back) –i:指定接口 –q:获得续约后退出 ,如果想尽在前台运行,则去掉-b,加上-f
https://www.cnblogs.com/lifexy/p/10180653.html
参考:https://www.digi.com/resources/documentation/digidocs/embedded/dey/3.0/cc6ul/bsp_r_wifi-get-started
未完待续
三、ConnectCore系列SOM的Wifi配置
更改区域,默认为USA
=> setenv regdomain 1 (0 = USA, 1=WW, 2=JP)
Using the standard hostapd. Qualcomm/Digi recommends a maximum number of 10 connected clients. Empirically up to 16 connections have been established. hostapd vs wpa_supplicant: Although the WPA supplicant can also be used for softAP modes, hostapd offers extra functionality and flexibility: Channel and protocol selection MAC filtering Automatic channel selection Beacon interval configuration Rates managements Multiple BSSIDs The extra features that are not supported by the WPA supplicant are not currently part of Digi’s validation Enabling it on the DUT Modify /etc/network/interfaces: auto wlan0 iface wlan0 inet dhcp udhcpc_opts -b wpa-driver ##WPA_DRIVER## # wpa-conf /etc/wpa_supplicant.conf post-up /etc/init.d/hostapd start pre-down /etc/init.d/hostapd stop Configure /etc/hostapd.conf
四、PC端的一些wifi小技巧
* 硬件没打开时如何处理
sudo ip link set wlo1 up RTNETLINK answers: Operation not possible due to RF-kill
这个一般是有硬件的Wifi开关没打开所至,可以安装rfkill来查看
sudo rfkill list all
如果有phy0有hard blocked: yes字样,一般可以检查BIOS的电源管理或是Fn+F2无线开关。
* 休眠时wifi不断开
有时候电脑只接着wifi,其它机器通过wifi访问这台电脑,这时如果长期不用,息屏后wifi会断开,要解决定个问题,只需更改一个配置参数:
sudo nano /etc/NetworkManager/conf.d/default-wifi-powersave-on.conf #把wifi.powersave改为2,如下: [connection] wifi.powersave = 2