我正努力使用以下Qt/C++
方法使用Wireless Extension Tools for Linux库来读取Wifi卡的当前频道:
const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString& interfaceName) { static UeTypeCurrentFrequencyChannel result=UeTypeCurrentFrequencyChannel(); iwreq wrq; iw_range range; int kernelSocket=iw_sockets_open(); if(iw_get_range_info(kernelSocket, interfaceName.toLocal8Bit().constData(), &range)>=0) { if(iw_get_ext(kernelSocket, interfaceName.toLocal8Bit().constData(), SIOCGIWFREQ, &wrq)>=0) { //BUG current frequency and channel is not read, it might be becuase of nonroot credentials - it returns error 22 (EINVAL - Invalid argument), why? result.first=iw_freq2float(&(wrq.u.freq)); result.second=iw_freq_to_channel(result.first.toDouble(), &range); qDebug() << Q_FUNC_INFO << "success - current channel:" << result; } else { result.first=QString(interfaceName); result.second=QString(tr("current channel read failed.")); qDebug() << Q_FUNC_INFO << "error (iw_get_ext):" << errno; } // if } else { result.first=QString(interfaceName); result.second=QString(tr("current channel read failed.")); qDebug() << Q_FUNC_INFO << "error (iw_get_range_info):" << errno; } // if iw_sockets_close(kernelSocket); return result; } // ueCurrentFrequencyChannel
现在, iw_get_ext
总是返回-1
, errno
被设置为22
值。 我看了一下errno.h,并search错误22
,我有下面的错误声明:
#define EINVAL 22 /* Invalid argument */
。
为什么在尝试使用ioctl
查询networking适配器的当前频率信道时出现Invalid argument
错误? 我已经启动了包含这个代码的应用程序作为普通用户,
static const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString&) error(iw_get_ext): 22
为什么,我错过了什么?
附录#1:
如果我使用iwlist
从terminal扫描WiFi卡和networking,我会得到所有需要的信息,无论是以普通用户还是root 用户身份运行。
附录#2:代码已经升级, iw_get_range_info()
工作。
附录#3:情况刚刚好; 随机的场合,我得到了成功:
static const UeTypeCurrentFrequencyChannel& UeNetworkManager::ueCurrentFrequencyChannel(const QString&) success - current channel: QPair(QVariant(double, 2.412e+09),QVariant(int, 1))
与iwlist scan output
相同:
wlan0 Scan completed : Cell 01 - Address: 64:6E:EA:22:21:D4 Channel:1 Frequency:2.412 GHz (Channel 1)
经过一段时间的编程/testing应用程序,错误再次出现,但iwlist scan
仍然有效。 我正在使用Ubuntu 16.04.1 LTS
和内核Linux workstation 4.4.0-38-generic #57-Ubuntu SMP Tue Sep 6 15:42:33 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
。
这可能是可能的问题有关的WiFi
卡Power Management
?
看看cfg80211_wext_giwfreq 。 因此,如果您的Wi-Fi
卡未使用任何连接模式,您将获得当前频道的EINVAL
。
命令iwlist
扫描工作,因为Wi-Fi卡在扫描时间切换到AP client mode
。