Files
2026-08-25 10:37:57 +08:00

2019 lines
66 KiB
C++

#include "NetworkManager.h"
#include "ui_NetworkManager.h"
#include <QDebug>
#include <QProcess>
#include <QNetworkInterface>
#include <QMessageBox>
#include "myinclude.h"
#include "dirent.h"
#include "common/wpa_ctrl.h"
#define LANINTERFACE_NAME "eth0"
#ifdef Q_OS_WIN
#include <wbemidl.h>
#include <comdef.h>
#include <windows.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Wbemuuid.lib")
#else
#define BUFSIZE 8192
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/socket.h>
#include <linux/rtnetlink.h>
#include <unistd.h>
struct route_info {
in_addr dstAddr;
in_addr srcAddr;
in_addr gateWay;
char ifName[IF_NAMESIZE];
};
int readNlSock(int sockFd, char *bufPtr, unsigned int seqNum, int pId) {
struct nlmsghdr *nlHdr;
int readLen = 0, msgLen = 0;
do {
if ((readLen = recv(sockFd, bufPtr, BUFSIZE - msgLen, 0)) < 0) {
perror("SOCK READ: ");
return -1;
}
nlHdr = (struct nlmsghdr *)bufPtr;
if ((NLMSG_OK(nlHdr, readLen) == 0) || (nlHdr->nlmsg_type == NLMSG_ERROR)) {
perror("Error in received packet");
return -1;
}
if (nlHdr->nlmsg_type == NLMSG_DONE)
break;
bufPtr += readLen;
msgLen += readLen;
if ((nlHdr->nlmsg_flags & NLM_F_MULTI) == 0)
break;
} while ((nlHdr->nlmsg_seq != seqNum) || (nlHdr->nlmsg_pid != (unsigned)pId));
return msgLen;
}
void parseRoutes(struct nlmsghdr *nlHdr, struct route_info *rtInfo) {
struct rtmsg *rtMsg = (struct rtmsg *)NLMSG_DATA(nlHdr);
if ((rtMsg->rtm_family != AF_INET) || (rtMsg->rtm_table != RT_TABLE_MAIN))
return;
struct rtattr *rtAttr = (struct rtattr *)RTM_RTA(rtMsg);
int rtLen = RTM_PAYLOAD(nlHdr);
for (; RTA_OK(rtAttr, rtLen); rtAttr = RTA_NEXT(rtAttr, rtLen)) {
switch (rtAttr->rta_type) {
case RTA_OIF:
if_indextoname(*(int *)RTA_DATA(rtAttr), rtInfo->ifName);
break;
case RTA_GATEWAY:
rtInfo->gateWay = *(in_addr *)RTA_DATA(rtAttr);
break;
case RTA_PREFSRC:
rtInfo->srcAddr = *(in_addr *)RTA_DATA(rtAttr);
break;
case RTA_DST:
rtInfo->dstAddr = *(in_addr *)RTA_DATA(rtAttr);
break;
}
}
}
#endif
class NetworkHelper {
public:
static QString DefaultGateway() {
QString ret;
#ifdef Q_OS_WIN
CoInitialize(NULL);
if (CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
return ret;
IWbemLocator *pLoc = NULL;
if (CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, IID_IUnknown, (void **)&pLoc) != S_OK)
return ret;
IWbemServices *pSvc = NULL;
if (pLoc->ConnectServer(L"root\\cimv2", NULL, NULL, NULL, 0, NULL, NULL, &pSvc) != S_OK)
return ret;
IEnumWbemClassObject *pEnumerator = NULL;
HRESULT hr = pSvc->ExecQuery(L"WQL", L"SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'", WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumerator);
if (FAILED(hr)) {
pSvc->Release();
pLoc->Release();
CoUninitialize();
return ret;
}
IWbemClassObject *pclsObj = NULL;
while (pEnumerator && ret.isEmpty()) {
_variant_t vaDefaultIPGateway;
ULONG uReturn;
hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);
if (!uReturn)
break;
hr = pclsObj->Get(L"DefaultIPGateway", 0, &vaDefaultIPGateway, NULL, NULL);
if (hr == WBEM_S_NO_ERROR && vaDefaultIPGateway.vt != VT_NULL) {
LONG lLow = 0;
LONG lUp = 0;
::SafeArrayGetLBound(vaDefaultIPGateway.parray, 1, &lLow);
::SafeArrayGetUBound(vaDefaultIPGateway.parray, 1, &lUp);
for (LONG i = lLow; i <= lUp; i++) {
BSTR bsDefaultIPGateway;
if (::SafeArrayGetElement(vaDefaultIPGateway.parray, &i, &bsDefaultIPGateway) == S_OK) {
ret = QString::fromUtf16(reinterpret_cast<const ushort *>(bsDefaultIPGateway));
::SysFreeString(bsDefaultIPGateway);
break;
}
}
}
VariantClear(&vaDefaultIPGateway);
}
if (pclsObj)
pclsObj->Release();
if (pEnumerator)
pEnumerator->Release();
if (pSvc)
pSvc->Release();
if (pLoc)
pLoc->Release();
CoUninitialize();
#else
int sock, msgSeq = 0;
if ((sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE)) < 0) {
perror("Socket Creation: ");
return ret;
}
char msgBuf[BUFSIZE];
memset(msgBuf, 0, BUFSIZE);
struct nlmsghdr *nlMsg = (struct nlmsghdr *)msgBuf;
nlMsg->nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
nlMsg->nlmsg_type = RTM_GETROUTE;
nlMsg->nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST;
nlMsg->nlmsg_seq = msgSeq++;
nlMsg->nlmsg_pid = getpid();
if (send(sock, nlMsg, nlMsg->nlmsg_len, 0) < 0)
return ret;
int len;
if ((len = readNlSock(sock, msgBuf, msgSeq, getpid())) < 0)
return ret;
struct route_info *rtInfo = (struct route_info *)malloc(sizeof(struct route_info));
for (; NLMSG_OK(nlMsg, len); nlMsg = NLMSG_NEXT(nlMsg, len)) {
memset(rtInfo, 0, sizeof(struct route_info));
parseRoutes(nlMsg, rtInfo);
if (strstr((char *)inet_ntoa(rtInfo->dstAddr), "0.0.0.0") && !strstr((char *)inet_ntoa(rtInfo->gateWay), "0.0.0.0")) {
char buf[64];
inet_ntop(AF_INET, &rtInfo->gateWay, buf, sizeof(buf));
ret = QString(buf);
break;
}
}
free(rtInfo);
close(sock);
#endif
return ret;
}
};
NetworkManager::NetworkManager(QWidget *parent) :
QWidget(parent),
ui(new Ui::NetworkManager)
{
ui->setupUi(this);
Json_ip_init_done =false;
net_data = new PrintNet();
connect(net_data,SIGNAL(json_server_error()),this,SLOT(onjson_server_error()));
connect(net_data,SIGNAL(receiveJSONDatafinish()),this,SLOT(onfinish_get_json()));
connect(net_data,SIGNAL(showMessege()),this,SLOT(ShowNet_dataMessege()));
QRegExp regExp("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");
QRegExpValidator *pValidator = new QRegExpValidator(regExp, this);
// ui->lineEditLanGW->setValidator(new QRegExpValidator(pValidator));
// ui->lineEditLanGW->setInputMask("000.000.000.000;");
ui->spinBoxLanIP3->setDisabled(true);
ui->spinBoxLanIP2->setDisabled(true);
ui->spinBoxLanIP1->setDisabled(true);
ui->spinBoxLanIP0->setDisabled(true);
ui->spinBoxLanMask3->setDisabled(true);
ui->spinBoxLanMask2->setDisabled(true);
ui->spinBoxLanMask1->setDisabled(true);
ui->spinBoxLanMask0->setDisabled(true);
// ui->lineEditLanGW->setDisabled(true);
ui->spinBoxLanGW3->setDisabled(true);
ui->spinBoxLanGW2->setDisabled(true);
ui->spinBoxLanGW1->setDisabled(true);
ui->spinBoxLanGW0->setDisabled(true);
ui->pushButtonSetCancel->setDisabled(true);
connect(ui->networkSelect, SIGNAL(activated(const QString&)), this,
SLOT(selectNetwork(const QString&)));
ctrl_iface = NULL;
ctrl_conn = NULL;
monitor_conn = NULL;
msgNotifier = NULL;
ctrl_iface_dir = strdup("/var/run/wpa_supplicant");
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), SLOT(ping()));
timer->setSingleShot(FALSE);
timer->start(3000);
Json_timer = new QTimer(this);
connect(Json_timer, SIGNAL(timeout()), SLOT(onjson_timer_handler()));
Json_timer->stop();
Jsom_timer_stop =true;
// Json_timer->start(1000);
wlanStartUpFailed = false;
if (openCtrlConnection(ctrl_iface) < 0) {
qDebug()<<"Failed to open control connection to "
"wpa_supplicant.";
wlanStartUpFailed = true;
}
if(wlanStartUpFailed)
return;
updateStatus();
networkMayHaveChanged = true;
updateNetworks();
updateSysStatusToUI();
}
NetworkManager::~NetworkManager()
{
delete ui;
//delete processNetwork;
}
void NetworkManager::onfinish_get_json()
{
net_data->getJson_data(&sysPara->Get_JSON_DATA);
if(Jsom_timer_stop == true){
Json_timer->start(1000);
Jsom_timer_stop = false;
}
ui->messege_info_label->setText( net_data->getMessege() );
emit updateJSONData();
}
void NetworkManager::ShowNet_dataMessege()
{
ui->messege_info_label->setText( net_data->getMessege());
}
void NetworkManager::bindSysPara(SysPara *sysPara){
this->sysPara = sysPara;
const QString cip=getCurrentNetworkIP();
qDebug()<<"当前IP地址是:"<<cip;
if(cip.startsWith("0"))//0.0.0.0
{
qDebug()<<"1秒后设置静态IP";
QTimer::singleShot(1000,this,SLOT(setEth0StaticIP_Thread()));
}
}
void NetworkManager::updateSysStatusToUI()
{
if(sysPara){
if(!Json_ip_init_done){
Json_ip_init_done = true;
ui->deviceID_lineEdit->setText(QString(sysPara->para.Json_device_code));
QString ip_str;
ip_str = QString::number(sysPara->para.Json_IP[0]);
ip_str += ".";
ip_str += QString::number(sysPara->para.Json_IP[1]);
ip_str += ".";
ip_str += QString::number(sysPara->para.Json_IP[2]);
ip_str += ".";
ip_str += QString::number(sysPara->para.Json_IP[3]);
ui->SeverIP_lineEdit->setText(ip_str);
ui->server_port_lineEdit->setText(QString::number(sysPara->para.Json_server_port));
}
ui->checkBoxRemoveCode->setCheckState(sysPara->para.isRemoveCode ? Qt::Checked : Qt::Unchecked);
ui->checkBoxRemoveDigitCode->setCheckState(sysPara->para.isRemoveDigitCode ? Qt::Checked : Qt::Unchecked);
ui->radioButtonGetDataEnable->setChecked(sysPara->para.isEnableGetDataButton);
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces(); //QNetworkInterface::interfaceFromName(LANINTERFACE_NAME);
//获取所有网络接口的列表
foreach(QNetworkInterface interface,list)
{
#if 0
//遍历每一个网络接口
qDebug() << "Device: "<<interface.name();
//设备名
qDebug() << "HardwareAddress: "<<interface.hardwareAddress();
//硬件地址
QList<QNetworkAddressEntry> entryList = interface.addressEntries();
//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址
foreach(QNetworkAddressEntry entry,entryList)
{//遍历每一个IP地址条目
qDebug()<<"IP Address: "<<entry.ip().toString();
//IP地址
qDebug()<<"Netmask: "<<entry.netmask().toString();
//子网掩码
qDebug()<<"Broadcast: "<<entry.broadcast().toString();
//广播地址
QStringList ipList = entry.ip().toString().split(".");
if (ipList.size() == 4) {
qDebug()<<"IP 3: "<<ipList.at(0).toInt();
qDebug()<<"IP 2: "<<ipList.at(1).toInt();
qDebug()<<"IP 1: "<<ipList.at(2).toInt();
qDebug()<<"IP 0: "<<ipList.at(3).toInt();
}
}
#endif
if(QString::compare(interface.name(), LANINTERFACE_NAME)==0)
{
QList<QNetworkAddressEntry> entryList = interface.addressEntries();
//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址
foreach(QNetworkAddressEntry entry,entryList)
{
#if 0
//遍历每一个IP地址条目
qDebug()<<"IP Address: "<<entry.ip().toString();
//IP地址
qDebug()<<"Netmask: "<<entry.netmask().toString();
//子网掩码
qDebug()<<"Broadcast: "<<entry.broadcast().toString();
//广播地址
qDebug() << "Prefix Length:" << entry.prefixLength(); // 前缀长度
//prefix
#endif
//ui->lineEditLanIP->setText(entry.ip().toString());
//ui->lineEditLanMask->setText(entry.netmask().toString());
QStringList lanIpList = entry.ip().toString().split(".");
if (lanIpList.size() == 4) {
ui->spinBoxLanIP3->setValue(lanIpList.at(0).toInt());
ui->spinBoxLanIP2->setValue(lanIpList.at(1).toInt());
ui->spinBoxLanIP1->setValue(lanIpList.at(2).toInt());
ui->spinBoxLanIP0->setValue(lanIpList.at(3).toInt());
}
else if (lanIpList.size() == 0) {
ui->spinBoxLanIP3->setValue(0);
ui->spinBoxLanIP2->setValue(0);
ui->spinBoxLanIP1->setValue(0);
ui->spinBoxLanIP0->setValue(0);
}
QStringList lanMaskList = entry.netmask().toString().split(".");
if (lanMaskList.size() == 4) {
ui->spinBoxLanMask3->setValue(lanMaskList.at(0).toInt());
ui->spinBoxLanMask2->setValue(lanMaskList.at(1).toInt());
ui->spinBoxLanMask1->setValue(lanMaskList.at(2).toInt());
ui->spinBoxLanMask0->setValue(lanMaskList.at(3).toInt());
}
else if (lanMaskList.size() == 0) {
ui->spinBoxLanMask3->setValue(0);
ui->spinBoxLanMask2->setValue(0);
ui->spinBoxLanMask1->setValue(0);
ui->spinBoxLanMask0->setValue(0);
}
//ui->lineEditLanGW->setText(entry.netmask().toString());
QString GatewayAddr = NetworkHelper::DefaultGateway();
//ui->lineEditLanGW->setText(GatewayAddr);
QStringList lanGWList = GatewayAddr.split(".");
if (lanGWList.size() == 4) {
ui->spinBoxLanGW3->setValue(lanGWList.at(0).toInt());
ui->spinBoxLanGW2->setValue(lanGWList.at(1).toInt());
ui->spinBoxLanGW1->setValue(lanGWList.at(2).toInt());
ui->spinBoxLanGW0->setValue(lanGWList.at(3).toInt());
}
else if (lanGWList.size() == 0) {
ui->spinBoxLanGW3->setValue(0);
ui->spinBoxLanGW2->setValue(0);
ui->spinBoxLanGW1->setValue(0);
ui->spinBoxLanGW0->setValue(0);
}
return;
}
}
}
//ui->radioButtonGetDataEnable->setChecked(ui->radioButtonGetDataEnable ? true: false);
}
}
#define INTERFACE_OTHERS "# The loopback interface \n\
auto lo \n\
iface lo inet loopback \n\
\n \
# Wireless interfaces \n\
auto wlan0 \n\
iface wlan0 inet dhcp \n\
wireless_mode managed \n\
wireless_essid any \n\
wpa-driver wext \n\
wpa-conf /etc/wpa_supplicant.conf\n"
void NetworkManager::applyLanUIPara(void)
{
if(sysPara){
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces(); //QNetworkInterface::interfaceFromName(LANINTERFACE_NAME);
//获取所有网络接口的列表
foreach(QNetworkInterface interface,list) {
if(QString::compare(interface.name(), LANINTERFACE_NAME)==0)
{
uint8_t ip3 = ui->spinBoxLanIP3->value();
uint8_t ip2 = ui->spinBoxLanIP2->value();
uint8_t ip1 = ui->spinBoxLanIP1->value();
uint8_t ip0 = ui->spinBoxLanIP0->value();
uint8_t lanMask3 = ui->spinBoxLanMask3->value();
uint8_t lanMask2 = ui->spinBoxLanMask2->value();
uint8_t lanMask1 = ui->spinBoxLanMask1->value();
uint8_t lanMask0 = ui->spinBoxLanMask0->value();
uint8_t lanGW0 = ui->spinBoxLanGW0->value();
QString ipAddrStr(QString("%1.%2.%3.%4").arg(ip3).arg(ip2).arg(ip1).arg(ip0));
QString netMaskStr(QString("%1.%2.%3.%4").arg(lanMask3).arg(lanMask2).arg(lanMask1).arg(lanMask0));
// QHostAddress ipAddr(ipAddrStr);
// QHostAddress netMask(netMaskStr);
qDebug() << "set ip:"<<ipAddrStr;
// entry.setIp(ipAddr);
// entry.setNetmask(netMask);
//process->start("ifconfig", QStringList() << LANINTERFACE_NAME << "192.168.1.100");
//startDetached(const QString &program, const QStringList &arguments, const QString &workingDirectory,
// qint64 *pid = 0)
QStringList argrList;
if (!(ip3|ip2|ip1|ip0)) {
// 动态IP
//qDebug() << "set dhcp";
QProcess dhcpProcess;
dhcpProcess.startDetached("/bin/cp /etc/network/interfaces_dhcp /etc/network/interfaces", argrList);
argrList<< LANINTERFACE_NAME << ipAddrStr;
}
else {
// 静态IP
QFile netInterface("/etc/network/interfaces");
netInterface.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate);
if (netInterface.isOpen()) {
QTextStream stream(&netInterface);
stream.seek(0);
stream << INTERFACE_OTHERS;
stream << " " <<"\n";
stream << "# eth0 interfaces" <<"\n";
stream << "auto eth0" <<"\n";
stream << "iface eth0 inet static" <<"\n";
stream << QString("address %1.%2.%3.%4").arg(ip3).arg(ip2).arg(ip1).arg(ip0) <<"\n";
stream << QString("gateway %1.%2.%3.%4").arg(ip3).arg(ip2).arg(ip1).arg(lanGW0) <<"\n";
stream << QString("netmask %1.%2.%3.%4").arg(lanMask3).arg(lanMask2).arg(lanMask1).arg(lanMask0) <<"\n";
stream << " \n";
netInterface.close();
}
//const QFile::FileError eno=netInterface.error();
//qDebug()<<"打开网络设置文件失败,error="<<eno<<",errstr="<<netInterface.errorString();
argrList<< LANINTERFACE_NAME << ipAddrStr << "netmask" << netMaskStr;
}
qDebug() << "set argu:" << argrList;
//processNetwork->start("ifconfig", argrList);
QProcess process;
process.startDetached("/sbin/ifconfig", argrList);
//processNetwork->startDetached("/sbin/ifconfig", argrList, "/sbin/");
//char cmd[100];
//sprintf(cmd,"ifconfig %s %s netmask %s",LANINTERFACE_NAME, ui->lineEditLanIP->text(), ui->lineEditLanMask->text());
//system(cmd);
//system("ifconfig eth0 192.168.0.16");
return;
}
}
}
}
qint32 NetworkManager::isIpv4Address(QString ip)
{
QRegExp regExp("\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b");
if( !regExp.exactMatch(ip) )
{
return false;
}
return true;
}
void NetworkManager::on_pushButtonSetIP_clicked(bool checked)
{
if(sysPara){
if(sysPara->status.bLanConfigManual)
{
//qDebug()<<QString("before set %1.%2.%3.%4 ").arg(ui->spinBoxLanIP3->value()).arg(ui->spinBoxLanIP2->value()).arg(ui->spinBoxLanIP1->value()).arg(ui->spinBoxLanIP0->value());
//if(isIpv4Address(ui->lineEditLanIP->text())&&isIpv4Address(ui->lineEditLanMask->text()))//检查IP地址是否有效
if(1)
{
applyLanUIPara();
ui->pushButtonSetIP->setText(QObject::tr("手动设定"));
ui->spinBoxLanIP3->setDisabled(true);
ui->spinBoxLanIP2->setDisabled(true);
ui->spinBoxLanIP1->setDisabled(true);
ui->spinBoxLanIP0->setDisabled(true);
ui->spinBoxLanMask3->setDisabled(true);
ui->spinBoxLanMask2->setDisabled(true);
ui->spinBoxLanMask1->setDisabled(true);
ui->spinBoxLanMask0->setDisabled(true);
ui->spinBoxLanGW0->setDisabled(true);
ui->pushButtonSetCancel->setDisabled(true);
sysPara->status.bLanConfigManual = false;
}
else
{
//QMessageBox::information(this, tr("错误"), tr("ip地址错误"));
}
}
else
{
sysPara->status.bLanConfigManual = true;
ui->spinBoxLanIP3->setDisabled(false);
ui->spinBoxLanIP2->setDisabled(false);
ui->spinBoxLanIP1->setDisabled(false);
ui->spinBoxLanIP0->setDisabled(false);
ui->spinBoxLanMask3->setDisabled(false);
ui->spinBoxLanMask2->setDisabled(false);
ui->spinBoxLanMask1->setDisabled(false);
ui->spinBoxLanMask0->setDisabled(false);
ui->spinBoxLanGW0->setDisabled(false);
ui->pushButtonSetIP->setText(QObject::tr("应用"));
ui->pushButtonSetCancel->setDisabled(false);
}
}
// qDebug()<<ui->lineEditLanIP->text();
}
void NetworkManager::on_pushButtonSetCancel_clicked(bool checked)
{
if(sysPara){
if(sysPara->status.bLanConfigManual)
{
sysPara->status.bLanConfigManual = false;
ui->spinBoxLanIP3->setDisabled(true);
ui->spinBoxLanIP2->setDisabled(true);
ui->spinBoxLanIP1->setDisabled(true);
ui->spinBoxLanIP0->setDisabled(true);
ui->spinBoxLanMask3->setDisabled(true);
ui->spinBoxLanMask2->setDisabled(true);
ui->spinBoxLanMask1->setDisabled(true);
ui->spinBoxLanMask0->setDisabled(true);
ui->pushButtonSetCancel->setDisabled(true);
ui->pushButtonSetIP->setText(QObject::tr("手动设定"));
}
}
}
int NetworkManager::openCtrlConnection(const char *ifname)
{
char *cfile;
int flen;
// char buf[2048], *pos, *pos2;
// size_t len;
if (ifname) {
if (ifname != ctrl_iface) {
free(ctrl_iface);
ctrl_iface = strdup(ifname);
}
} else {
#ifdef CONFIG_CTRL_IFACE_UDP
free(ctrl_iface);
ctrl_iface = strdup("udp");
#endif /* CONFIG_CTRL_IFACE_UDP */
#ifdef CONFIG_CTRL_IFACE_UNIX
struct dirent *dent;
DIR *dir = opendir(ctrl_iface_dir);
free(ctrl_iface);
ctrl_iface = NULL;
if (dir) {
while ((dent = readdir(dir))) {
#ifdef _DIRENT_HAVE_D_TYPE
/* Skip the file if it is not a socket.
* Also accept DT_UNKNOWN (0) in case
* the C library or underlying file
* system does not support d_type. */
if (dent->d_type != DT_SOCK &&
dent->d_type != DT_UNKNOWN)
continue;
#endif /* _DIRENT_HAVE_D_TYPE */
if (strcmp(dent->d_name, ".") == 0 ||
strcmp(dent->d_name, "..") == 0)
continue;
printf("Selected interface '%s'\n",
dent->d_name);
ctrl_iface = strdup(dent->d_name);
break;
}
closedir(dir);
}
#endif /* CONFIG_CTRL_IFACE_UNIX */
#ifdef CONFIG_CTRL_IFACE_NAMED_PIPE
struct wpa_ctrl *ctrl;
int ret;
free(ctrl_iface);
ctrl_iface = NULL;
ctrl = wpa_ctrl_open(NULL);
if (ctrl) {
len = sizeof(buf) - 1;
ret = wpa_ctrl_request(ctrl, "INTERFACES", 10, buf,
&len, NULL);
if (ret >= 0) {
connectedToService = true;
buf[len] = '\0';
pos = strchr(buf, '\n');
if (pos)
*pos = '\0';
ctrl_iface = strdup(buf);
}
wpa_ctrl_close(ctrl);
}
#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
}
if (ctrl_iface == NULL) {
#ifdef CONFIG_NATIVE_WINDOWS
static bool first = true;
if (first && !serviceRunning()) {
first = false;
if (QMessageBox::warning(
this, qAppName(),
tr("wpa_supplicant service is not "
"running.\n"
"Do you want to start it?"),
QMessageBox::Yes | QMessageBox::No) ==
QMessageBox::Yes)
startService();
}
#endif /* CONFIG_NATIVE_WINDOWS */
return -1;
}
#ifdef CONFIG_CTRL_IFACE_UNIX
flen = strlen(ctrl_iface_dir) + strlen(ctrl_iface) + 2;
cfile = (char *) malloc(flen);
if (cfile == NULL)
return -1;
snprintf(cfile, flen, "%s/%s", ctrl_iface_dir, ctrl_iface);
#else /* CONFIG_CTRL_IFACE_UNIX */
flen = strlen(ctrl_iface) + 1;
cfile = (char *) malloc(flen);
if (cfile == NULL)
return -1;
snprintf(cfile, flen, "%s", ctrl_iface);
#endif /* CONFIG_CTRL_IFACE_UNIX */
if (ctrl_conn) {
wpa_ctrl_close(ctrl_conn);
ctrl_conn = NULL;
}
if (monitor_conn) {
delete msgNotifier;
msgNotifier = NULL;
wpa_ctrl_detach(monitor_conn);
wpa_ctrl_close(monitor_conn);
monitor_conn = NULL;
}
printf("Trying to connect to '%s'\n", cfile);
ctrl_conn = wpa_ctrl_open(cfile);
if (ctrl_conn == NULL) {
free(cfile);
return -1;
}
monitor_conn = wpa_ctrl_open(cfile);
free(cfile);
if (monitor_conn == NULL) {
wpa_ctrl_close(ctrl_conn);
return -1;
}
if (wpa_ctrl_attach(monitor_conn)) {
printf("Failed to attach to wpa_supplicant\n");
wpa_ctrl_close(monitor_conn);
monitor_conn = NULL;
wpa_ctrl_close(ctrl_conn);
ctrl_conn = NULL;
return -1;
}
#if defined(CONFIG_CTRL_IFACE_UNIX) || defined(CONFIG_CTRL_IFACE_UDP)
msgNotifier = new QSocketNotifier(wpa_ctrl_get_fd(monitor_conn),
QSocketNotifier::Read, this);
connect(msgNotifier, SIGNAL(activated(int)), SLOT(receiveMsgs()));
#endif
//adapterSelect->clear();
//adapterSelect->addItem(ctrl_iface);
//adapterSelect->setCurrentIndex(0);
#if 0
printf("Trying to INTERFACES to '%s'\n", cfile);
len = sizeof(buf) - 1;
if (wpa_ctrl_request(ctrl_conn, "INTERFACES", 10, buf, &len, NULL) >=
0) {
buf[len] = '\0';
pos = buf;
while (*pos) {
pos2 = strchr(pos, '\n');
if (pos2)
*pos2 = '\0';
if (strcmp(pos, ctrl_iface) != 0)
//adapterSelect->addItem(pos);
if (pos2)
pos = pos2 + 1;
else
break;
}
}
len = sizeof(buf) - 1;
if (wpa_ctrl_request(ctrl_conn, "GET_CAPABILITY eap", 18, buf, &len,
NULL) >= 0) {
buf[len] = '\0';
QString res(buf);
QStringList types = res.split(QChar(' '));
bool wps = types.contains("WSC");
actionWPS->setEnabled(wps);
wpsTab->setEnabled(wps);
wpaguiTab->setTabEnabled(wpaguiTab->indexOf(wpsTab), wps);
}
#endif
printf("network out to '%s'\n", cfile);
return 0;
}
int NetworkManager::ctrlRequest(const char *cmd, char *buf, size_t *buflen)
{
int ret;
if (ctrl_conn == NULL)
return -3;
ret = wpa_ctrl_request(ctrl_conn, cmd, strlen(cmd), buf, buflen, NULL);
if (ret == -2)
printf("'%s' command timed out.\n", cmd);
else if (ret < 0)
printf("'%s' command failed.\n", cmd);
return ret;
}
QString NetworkManager::wpaStateTranslate(char *state)
{
if (!strcmp(state, "DISCONNECTED"))
{
//QProcess process;
//process.startDetached("killall udhcpc");
return tr("Disconnected");
}
else if (!strcmp(state, "INACTIVE"))
return tr("Inactive");
else if (!strcmp(state, "SCANNING"))
return tr("Scanning");
else if (!strcmp(state, "AUTHENTICATING"))
return tr("Authenticating");
else if (!strcmp(state, "ASSOCIATING"))
return tr("Associating");
else if (!strcmp(state, "ASSOCIATED"))
return tr("Associated");
else if (!strcmp(state, "4WAY_HANDSHAKE"))
return tr("4-Way Handshake");
else if (!strcmp(state, "GROUP_HANDSHAKE"))
return tr("Group Handshake");
else if (!strcmp(state, "COMPLETED"))
{
QProcess process;
process.startDetached("/home/plg/checkUdhcpcRun.sh");
return tr("Completed");
}
else
return tr("Unknown");
}
void NetworkManager::updateStatus()
{
char buf[2048], *start, *end, *pos;
size_t len;
pingsToStatusUpdate = 10;
len = sizeof(buf) - 1;
if (ctrl_conn == NULL || ctrlRequest("STATUS", buf, &len) < 0) {
ui->textStatus->setText(tr("Could not get status from "
"wpa_supplicant"));
//ui->textAuthentication->clear();
//ui->textEncryption->clear();
ui->textSSID->clear();
//ui->textBssid->clear();
ui->textIPAdrr->clear();
return;
}
buf[len] = '\0';
bool auth_updated = false, ssid_updated = false;
bool bssid_updated = false, ipaddr_updated = false;
bool status_updated = false;
char *pairwise_cipher = NULL, *group_cipher = NULL;
char *mode = NULL;
start = buf;
while (*start) {
bool last = false;
end = strchr(start, '\n');
if (end == NULL) {
last = true;
end = start;
while (end[0] && end[1])
end++;
}
*end = '\0';
pos = strchr(start, '=');
if (pos) {
*pos++ = '\0';
if (strcmp(start, "bssid") == 0) {
bssid_updated = true;
//textBssid->setText(pos);
} else if (strcmp(start, "ssid") == 0) {
ssid_updated = true;
ui->textSSID->setText(pos);
} else if (strcmp(start, "ip_address") == 0) {
ipaddr_updated = true;
ui->textIPAdrr->setText(pos);
} else if (strcmp(start, "wpa_state") == 0) {
status_updated = true;
ui->textStatus->setText(wpaStateTranslate(pos));
} else if (strcmp(start, "key_mgmt") == 0) {
auth_updated = true;
//textAuthentication->setText(pos);
/* TODO: could add EAP status to this */
} else if (strcmp(start, "pairwise_cipher") == 0) {
pairwise_cipher = pos;
} else if (strcmp(start, "group_cipher") == 0) {
group_cipher = pos;
} else if (strcmp(start, "mode") == 0) {
mode = pos;
}
}
if (last)
break;
start = end + 1;
}
if (status_updated && mode)
ui->textStatus->setText(ui->textStatus->text() + " (" + mode + ")");
if (pairwise_cipher || group_cipher) {
QString encr;
if (pairwise_cipher && group_cipher &&
strcmp(pairwise_cipher, group_cipher) != 0) {
encr.append(pairwise_cipher);
encr.append(" + ");
encr.append(group_cipher);
} else if (pairwise_cipher) {
encr.append(pairwise_cipher);
} else {
encr.append(group_cipher);
encr.append(" [group key only]");
}
//textEncryption->setText(encr);
} else
//textEncryption->clear();
;
if (!status_updated)
ui->textStatus->clear();
//if (!auth_updated)
// textAuthentication->clear();
if (!ssid_updated)
ui->textSSID->clear();
//if (!bssid_updated)
// textBssid->clear();
if (!ipaddr_updated)
ui->textIPAdrr->clear();
}
void NetworkManager::updateNetworks()
{
char buf[2048], *start, *end, *id, *ssid, *bssid, *flags;
size_t len;
int first_active = -1;
int was_selected = -1;
bool current = false;
if(wlanStartUpFailed)
return;
if (!networkMayHaveChanged)
return;
//if (networkList->currentRow() >= 0)
// was_selected = networkList->currentRow();
ui->networkSelect->clear();
//ui->scanSSIDSelect->clear();
//networkList->clear();
if (ctrl_conn == NULL)
return;
len = sizeof(buf) - 1;
if (ctrlRequest("LIST_NETWORKS", buf, &len) < 0)
return;
buf[len] = '\0';
start = strchr(buf, '\n');
if (start == NULL)
return;
start++;
while (*start) {
bool last = false;
end = strchr(start, '\n');
if (end == NULL) {
last = true;
end = start;
while (end[0] && end[1])
end++;
}
*end = '\0';
id = start;
ssid = strchr(id, '\t');
if (ssid == NULL)
break;
*ssid++ = '\0';
bssid = strchr(ssid, '\t');
if (bssid == NULL)
break;
*bssid++ = '\0';
flags = strchr(bssid, '\t');
if (flags == NULL)
break;
*flags++ = '\0';
if (strstr(flags, "[DISABLED][P2P-PERSISTENT]")) {
if (last)
break;
start = end + 1;
continue;
}
QString network(id);
network.append(": ");
network.append(ssid);
ui->networkSelect->addItem(network);
//networkList->addItem(network);
//scanSSIDSelect
if (strstr(flags, "[CURRENT]")) {
ui->networkSelect->setCurrentIndex(ui->networkSelect->count() -
1);
current = true;
} else if (first_active < 0 &&
strstr(flags, "[DISABLED]") == NULL)
first_active = ui->networkSelect->count() - 1;
if (last)
break;
start = end + 1;
}
if (ui->networkSelect->count() > 1)
ui->networkSelect->addItem(tr("Select any network"));
if (!current && first_active >= 0)
ui->networkSelect->setCurrentIndex(first_active);
#if 0
if (was_selected >= 0 && networkList->count() > 0) {
if (was_selected < networkList->count())
networkList->setCurrentRow(was_selected);
else
networkList->setCurrentRow(networkList->count() - 1);
}
else
networkList->setCurrentRow(networkSelect->currentIndex());
#endif
networkMayHaveChanged = false;
}
static int str_match(const char *a, const char *b)
{
return strncmp(a, b, strlen(b)) == 0;
}
void NetworkManager::scan()
{
#if 0
if (scanres) {
scanres->close();
delete scanres;
}
scanres = new ScanResults();
if (scanres == NULL)
return;
scanres->setWpaGui(this);
scanres->show();
scanres->exec();
#endif
}
void NetworkManager::processMsg(char *msg)
{
char *pos = msg, *pos2;
int priority = 2;
if (*pos == '<') {
/* skip priority */
pos++;
priority = atoi(pos);
pos = strchr(pos, '>');
if (pos)
pos++;
else
pos = msg;
}
WpaMsg wm(pos, priority);
//if (eh)
// eh->addEvent(wm);
//if (peers)
// peers->event_notify(wm);
msgs.append(wm);
while (msgs.count() > 100)
msgs.pop_front();
/* Update last message with truncated version of the event */
if (strncmp(pos, "CTRL-", 5) == 0) {
pos2 = strchr(pos, str_match(pos, WPA_CTRL_REQ) ? ':' : ' ');
if (pos2)
pos2++;
else
pos2 = pos;
} else
pos2 = pos;
QString lastmsg = pos2;
lastmsg.truncate(40);
//textLastMessage->setText(lastmsg);
pingsToStatusUpdate = 0;
networkMayHaveChanged = true;
if (str_match(pos, WPA_CTRL_REQ))
//processCtrlReq(pos + strlen(WPA_CTRL_REQ));
;
else if (str_match(pos, WPA_EVENT_SCAN_RESULTS) && beSentScanCmd)
{
updateResults();
beSentScanCmd = false;
}
else if (str_match(pos, WPA_EVENT_DISCONNECTED))
//showTrayMessage(QSystemTrayIcon::Information, 3,
// tr("Disconnected from network."));
ui->textStatus->setText("Disconnected");
else if (str_match(pos, WPA_EVENT_CONNECTED)) {
//showTrayMessage(QSystemTrayIcon::Information, 3,
//tr("Connection to network established."));
//QTimer::singleShot(5 * 1000, this, SLOT(showTrayStatus()));
//stopWpsRun(true);
ui->textStatus->setText("Connected");
}
#if 0
else if (str_match(pos, WPS_EVENT_AP_AVAILABLE_PBC)) {
wpsStatusText->setText(tr("WPS AP in active PBC mode found"));
if (textStatus->text() == "INACTIVE" ||
textStatus->text() == "DISCONNECTED")
wpaguiTab->setCurrentWidget(wpsTab);
wpsInstructions->setText(tr("Press the PBC button on the "
"screen to start registration"));
} else if (str_match(pos, WPS_EVENT_AP_AVAILABLE_PIN)) {
wpsStatusText->setText(tr("WPS AP with recently selected "
"registrar"));
if (textStatus->text() == "INACTIVE" ||
textStatus->text() == "DISCONNECTED")
wpaguiTab->setCurrentWidget(wpsTab);
} else if (str_match(pos, WPS_EVENT_AP_AVAILABLE_AUTH)) {
showTrayMessage(QSystemTrayIcon::Information, 3,
"Wi-Fi Protected Setup (WPS) AP\n"
"indicating this client is authorized.");
wpsStatusText->setText("WPS AP indicating this client is "
"authorized");
if (textStatus->text() == "INACTIVE" ||
textStatus->text() == "DISCONNECTED")
wpaguiTab->setCurrentWidget(wpsTab);
} else if (str_match(pos, WPS_EVENT_AP_AVAILABLE)) {
wpsStatusText->setText(tr("WPS AP detected"));
} else if (str_match(pos, WPS_EVENT_OVERLAP)) {
wpsStatusText->setText(tr("PBC mode overlap detected"));
wpsInstructions->setText(tr("More than one AP is currently in "
"active WPS PBC mode. Wait couple "
"of minutes and try again"));
wpaguiTab->setCurrentWidget(wpsTab);
} else if (str_match(pos, WPS_EVENT_CRED_RECEIVED)) {
wpsStatusText->setText(tr("Network configuration received"));
wpaguiTab->setCurrentWidget(wpsTab);
} else if (str_match(pos, WPA_EVENT_EAP_METHOD)) {
if (strstr(pos, "(WSC)"))
wpsStatusText->setText(tr("Registration started"));
} else if (str_match(pos, WPS_EVENT_M2D)) {
wpsStatusText->setText(tr("Registrar does not yet know PIN"));
} else if (str_match(pos, WPS_EVENT_FAIL)) {
wpsStatusText->setText(tr("Registration failed"));
} else if (str_match(pos, WPS_EVENT_SUCCESS)) {
wpsStatusText->setText(tr("Registration succeeded"));
}
#endif
}
void NetworkManager::receiveMsgs()
{
char buf[256];
size_t len;
qDebug()<<"receiveMsgs";
while (monitor_conn && wpa_ctrl_pending(monitor_conn) > 0) {
len = sizeof(buf) - 1;
if (wpa_ctrl_recv(monitor_conn, buf, &len) == 0) {
buf[len] = '\0';
processMsg(buf);
}
}
}
void NetworkManager::updateResults()
{
char reply[2048];
size_t reply_len;
int index;
char cmd[20];
//qDebug()<<"updateResults";
//ui->networkSelect->clear();
ui->scanSSIDSelect->clear();
scanResultMap.clear();
index = 0;
while (1)
{
snprintf(cmd, sizeof(cmd), "BSS %d", index++);
if (index > 1000)
break;
reply_len = sizeof(reply) - 1;
if (ctrlRequest(cmd, reply, &reply_len) < 0)
break;
reply[reply_len] = '\0';
QString bss(reply);
if (bss.isEmpty() || bss.startsWith("FAIL"))
break;
QString ssid, bssid, freq, signal, flags;
QStringList lines = bss.split(QRegExp("\\n"));
for (QStringList::Iterator it = lines.begin();
it != lines.end(); it++) {
int pos = (*it).indexOf('=') + 1;
if (pos < 1)
continue;
if ((*it).startsWith("bssid="))
bssid = (*it).mid(pos);
else if ((*it).startsWith("freq="))
freq = (*it).mid(pos);
else if ((*it).startsWith("qual="))
signal = (*it).mid(pos);
else if ((*it).startsWith("flags="))
flags = (*it).mid(pos);
else if ((*it).startsWith("ssid="))
ssid = (*it).mid(pos);
}
#if 0
QTreeWidgetItem *item = new QTreeWidgetItem(scanResultsWidget);
if (item) {
item->setText(0, ssid);
item->setText(1, bssid);
item->setText(2, freq);
item->setText(3, signal);
item->setText(4, flags);
}
#endif
ui->scanSSIDSelect->addItem(ssid);
QStringList resultList;
resultList<<ssid <<bssid <<freq <<signal <<flags;
//ScanResultList.append(resultList);
//strcpy(scanResult[index].ssid,ssid);
//strcpy(scanResult[index].bssid,bssid);
//strcpy(scanResult[index].signal,signal);
//strcpy(scanResult[index].flags,flags);
//strcpy(scanResult[index].bssid,bssid);
scanResultMap[ssid] = resultList;
//qDebug()<<"ssid:"<<ssid;
if (bssid.isEmpty())
break;
}
}
void NetworkManager::on_pushButtonScan_pressed()
{
char reply[10];
size_t reply_len = sizeof(reply);
if(wlanStartUpFailed)
return;
// if (wpagui == NULL)
// return;
ctrlRequest("SCAN", reply, &reply_len);
beSentScanCmd = true;
}
void NetworkManager::selectSSID( const QString & sel )
{
//if (openCtrlConnection(sel.toAscii().constData()) < 0)
// printf("Failed to open control connection to "
// "wpa_supplicant.\n");
//updateStatus();
//updateNetworks();
}
int NetworkManager::setNetworkParam(int id, const char *field,
const char *value, bool quote)
{
char reply[10], cmd[256];
size_t reply_len;
snprintf(cmd, sizeof(cmd), "SET_NETWORK %d %s %s%s%s",
id, field, quote ? "\"" : "", value, quote ? "\"" : "");
reply_len = sizeof(reply);
ctrlRequest(cmd, reply, &reply_len);
return strncmp(reply, "OK", 2) == 0 ? 0 : -1;
}
void NetworkManager::addNetwork()
{
char reply[10], cmd[256];
size_t reply_len;
int id;
int psklen = ui->pskEdit->text().length();
int auth = ui->authSelect->currentIndex();
if (auth == AUTH_WPA_PSK || auth == AUTH_WPA2_PSK) {
if (psklen < 8 || psklen > 64) {
QMessageBox::warning(
this,
tr("WPA Pre-Shared Key Error"),
tr("WPA-PSK requires a passphrase of 8 to 63 "
"characters\n"
"or 64 hex digit PSK"));
ui->pskEdit->setFocus();
return;
}
}
#if 0
if (idstrEdit->isEnabled() && !idstrEdit->text().isEmpty()) {
QRegExp rx("^(\\w|-)+$");
if (rx.indexIn(idstrEdit->text()) < 0) {
QMessageBox::warning(
this, tr("Network ID Error"),
tr("Network ID String contains non-word "
"characters.\n"
"It must be a simple string, "
"without spaces, containing\n"
"only characters in this range: "
"[A-Za-z0-9_-]\n"));
idstrEdit->setFocus();
return;
}
}
if (wpagui == NULL)
return;
#endif
memset(reply, 0, sizeof(reply));
reply_len = sizeof(reply) - 1;
if (1) {
ctrlRequest("ADD_NETWORK", reply, &reply_len);
if (reply[0] == 'F') {
QMessageBox::warning(this, "wpa_gui",
tr("Failed to add "
"network to wpa_supplicant\n"
"configuration."));
return;
}
id = atoi(reply);
} else
id = edit_network_id;
//setNetworkParam(id, "ssid", ssidEdit->text().toAscii().constData(),
// true);
setNetworkParam(id, "ssid", ui->scanSSIDSelect->currentText().toAscii().constData(),
true);
const char *key_mgmt = NULL, *proto = NULL, *pairwise = NULL;
switch (auth) {
case AUTH_NONE_OPEN:
case AUTH_NONE_WEP:
case AUTH_NONE_WEP_SHARED:
key_mgmt = "NONE";
break;
case AUTH_IEEE8021X:
key_mgmt = "IEEE8021X";
break;
case AUTH_WPA_PSK:
key_mgmt = "WPA-PSK";
proto = "WPA";
break;
case AUTH_WPA_EAP:
key_mgmt = "WPA-EAP";
proto = "WPA";
break;
case AUTH_WPA2_PSK:
key_mgmt = "WPA-PSK";
proto = "WPA2";
break;
case AUTH_WPA2_EAP:
key_mgmt = "WPA-EAP";
proto = "WPA2";
break;
}
if (auth == AUTH_NONE_WEP_SHARED)
setNetworkParam(id, "auth_alg", "SHARED", false);
else
setNetworkParam(id, "auth_alg", "OPEN", false);
if (auth == AUTH_WPA_PSK || auth == AUTH_WPA_EAP ||
auth == AUTH_WPA2_PSK || auth == AUTH_WPA2_EAP) {
int encr = ui->EncryptionSelect->currentIndex();
if (encr == 0)
pairwise = "TKIP";
else
pairwise = "CCMP";
}
if (proto)
setNetworkParam(id, "proto", proto, false);
if (key_mgmt)
setNetworkParam(id, "key_mgmt", key_mgmt, false);
if (pairwise) {
setNetworkParam(id, "pairwise", pairwise, false);
setNetworkParam(id, "group", "TKIP CCMP WEP104 WEP40", false);
}
if (ui->pskEdit->isEnabled() &&
strcmp(ui->pskEdit->text().toAscii().constData(),
WPA_GUI_KEY_DATA) != 0)
setNetworkParam(id, "psk",
ui->pskEdit->text().toAscii().constData(),
psklen != 64);
#if 0
if (eapSelect->isEnabled()) {
const char *eap =
eapSelect->currentText().toAscii().constData();
setNetworkParam(id, "eap", eap, false);
if (strcmp(eap, "SIM") == 0 || strcmp(eap, "AKA") == 0)
setNetworkParam(id, "pcsc", "", true);
else
setNetworkParam(id, "pcsc", "NULL", false);
}
if (phase2Select->isEnabled()) {
QString eap = eapSelect->currentText();
QString inner = phase2Select->currentText();
char phase2[32];
phase2[0] = '\0';
if (eap.compare("PEAP") == 0) {
if (inner.startsWith("EAP-"))
snprintf(phase2, sizeof(phase2), "auth=%s",
inner.right(inner.size() - 4).
toAscii().constData());
} else if (eap.compare("TTLS") == 0) {
if (inner.startsWith("EAP-"))
snprintf(phase2, sizeof(phase2), "autheap=%s",
inner.right(inner.size() - 4).
toAscii().constData());
else
snprintf(phase2, sizeof(phase2), "auth=%s",
inner.toAscii().constData());
} else if (eap.compare("FAST") == 0) {
const char *provisioning = NULL;
if (inner.startsWith("EAP-")) {
snprintf(phase2, sizeof(phase2), "auth=%s",
inner.right(inner.size() - 4).
toAscii().constData());
provisioning = "fast_provisioning=2";
} else if (inner.compare("GTC(auth) + MSCHAPv2(prov)")
== 0) {
snprintf(phase2, sizeof(phase2),
"auth=GTC auth=MSCHAPV2");
provisioning = "fast_provisioning=1";
} else
provisioning = "fast_provisioning=3";
if (provisioning) {
char blob[32];
setNetworkParam(id, "phase1", provisioning,
true);
snprintf(blob, sizeof(blob),
"blob://fast-pac-%d", id);
setNetworkParam(id, "pac_file", blob, true);
}
}
if (phase2[0])
setNetworkParam(id, "phase2", phase2, true);
else
setNetworkParam(id, "phase2", "NULL", false);
} else
setNetworkParam(id, "phase2", "NULL", false);
#endif
setNetworkParam(id, "phase2", "NULL", false);
#if 0
if (identityEdit->isEnabled() && identityEdit->text().length() > 0)
setNetworkParam(id, "identity",
identityEdit->text().toAscii().constData(),
true);
else
setNetworkParam(id, "identity", "NULL", false);
#endif
setNetworkParam(id, "identity", "NULL", false);
if (ui->passwordEdit->isEnabled() && ui->passwordEdit->text().length() > 0 &&
strcmp(ui->passwordEdit->text().toAscii().constData(),
WPA_GUI_KEY_DATA) != 0)
setNetworkParam(id, "password",
ui->passwordEdit->text().toAscii().constData(),
true);
else if (ui->passwordEdit->text().length() == 0)
setNetworkParam(id, "password", "NULL", false);
#if 0
if (cacertEdit->isEnabled() && cacertEdit->text().length() > 0)
setNetworkParam(id, "ca_cert",
cacertEdit->text().toAscii().constData(),
true);
else
setNetworkParam(id, "ca_cert", "NULL", false);
writeWepKey(id, wep0Edit, 0);
writeWepKey(id, wep1Edit, 1);
writeWepKey(id, wep2Edit, 2);
writeWepKey(id, wep3Edit, 3);
#endif
setNetworkParam(id, "ca_cert", "NULL", false);
#if 0
if (wep0Radio->isEnabled() && wep0Radio->isChecked())
setNetworkParam(id, "wep_tx_keyidx", "0", false);
else if (wep1Radio->isEnabled() && wep1Radio->isChecked())
setNetworkParam(id, "wep_tx_keyidx", "1", false);
else if (wep2Radio->isEnabled() && wep2Radio->isChecked())
setNetworkParam(id, "wep_tx_keyidx", "2", false);
else if (wep3Radio->isEnabled() && wep3Radio->isChecked())
setNetworkParam(id, "wep_tx_keyidx", "3", false);
if (idstrEdit->isEnabled() && idstrEdit->text().length() > 0)
setNetworkParam(id, "id_str",
idstrEdit->text().toAscii().constData(),
true);
else
setNetworkParam(id, "id_str", "NULL", false);
#endif
setNetworkParam(id, "id_str", "NULL", false);
#if 0
if (prioritySpinBox->isEnabled()) {
QString prio;
prio = prio.setNum(prioritySpinBox->value());
setNetworkParam(id, "priority", prio.toAscii().constData(),
false);
}
#endif
snprintf(cmd, sizeof(cmd), "ENABLE_NETWORK %d", id);
reply_len = sizeof(reply);
ctrlRequest(cmd, reply, &reply_len);
if (strncmp(reply, "OK", 2) != 0) {
QMessageBox::warning(this, "wpa_gui",
tr("Failed to enable "
"network in wpa_supplicant\n"
"configuration."));
/* Network was added, so continue anyway */
}
triggerUpdate();
ctrlRequest("SAVE_CONFIG", reply, &reply_len);
//close();
}
void NetworkManager::authChanged(int sel)
{
ui->EncryptionSelect->setEnabled(sel != AUTH_NONE_OPEN && sel != AUTH_NONE_WEP &&
sel != AUTH_NONE_WEP_SHARED);
ui->pskEdit->setEnabled(sel == AUTH_WPA_PSK || sel == AUTH_WPA2_PSK);
bool eap = sel == AUTH_IEEE8021X || sel == AUTH_WPA_EAP ||
sel == AUTH_WPA2_EAP;
//eapSelect->setEnabled(eap);
//identityEdit->setEnabled(eap);
ui->passwordEdit->setEnabled(eap);
//cacertEdit->setEnabled(eap);
//phase2Select->setEnabled(eap);
//if (eap)
// eapChanged(eapSelect->currentIndex());
while (ui->EncryptionSelect->count())
ui->EncryptionSelect->removeItem(0);
if (sel == AUTH_NONE_OPEN || sel == AUTH_NONE_WEP ||
sel == AUTH_NONE_WEP_SHARED || sel == AUTH_IEEE8021X) {
ui->EncryptionSelect->addItem("None");
ui->EncryptionSelect->addItem("WEP");
ui->EncryptionSelect->setCurrentIndex(sel == AUTH_NONE_OPEN ? 0 : 1);
} else {
ui->EncryptionSelect->addItem("TKIP");
ui->EncryptionSelect->addItem("CCMP");
ui->EncryptionSelect->setCurrentIndex((sel == AUTH_WPA2_PSK ||
sel == AUTH_WPA2_EAP) ? 1 : 0);
}
//wepEnabled(sel == AUTH_NONE_WEP || sel == AUTH_NONE_WEP_SHARED);
}
void NetworkManager::selectNetwork( const QString & sel )
{
QString cmd(sel);
char reply[10];
size_t reply_len = sizeof(reply);
if (cmd.contains(QRegExp("^\\d+:")))
cmd.truncate(cmd.indexOf(':'));
else
cmd = "any";
cmd.prepend("SELECT_NETWORK ");
ctrlRequest(cmd.toAscii().constData(), reply, &reply_len);
triggerUpdate();
}
void NetworkManager::triggerUpdate()
{
updateStatus();
networkMayHaveChanged = true;
updateNetworks();
}
void NetworkManager::ping()
{
char buf[10];
size_t len;
if(wlanStartUpFailed)
return;
len = sizeof(buf) - 1;
if (ctrlRequest("PING", buf, &len) < 0) {
qDebug()<<"PING failed - trying to reconnect";
if (openCtrlConnection(ctrl_iface) >= 0) {
qDebug()<<"Reconnected successfully";
pingsToStatusUpdate = 0;
}
}
pingsToStatusUpdate--;
if (pingsToStatusUpdate <= 0) {
updateStatus();
updateNetworks();
}
#ifndef CONFIG_CTRL_IFACE_NAMED_PIPE
/* Use less frequent pings and status updates when the main window is
* hidden (running in taskbar). */
int interval = isHidden() ? 20000 : 3000;
if (timer->interval() != interval)
timer->setInterval(interval);
#endif /* CONFIG_CTRL_IFACE_NAMED_PIPE */
}
void NetworkManager::on_pushButtonConnect_pressed()
{
on_pushButtonDisconnect_pressed();
char reply[10];
size_t reply_len = sizeof(reply);
ctrlRequest("REASSOCIATE", reply, &reply_len);
}
void NetworkManager::on_pushButtonDisconnect_pressed()
{
char reply[10];
size_t reply_len = sizeof(reply);
ctrlRequest("DISCONNECT", reply, &reply_len);
}
void NetworkManager::on_scanSSIDSelect_activated(const QString &arg1)
{
//if (openCtrlConnection(sel.toAscii().constData()) < 0)
// printf("Failed to open control connection to "
// "wpa_supplicant.\n");
updateStatus();
updateNetworks();
QStringList networkString=scanResultMap[arg1];
if(networkString.isEmpty())
{
return;
}
// QString flags = sel->text(4);
QString flags = networkString.at(4);
int auth, encr = 0;
if (flags.indexOf("[WPA2-EAP") >= 0)
auth = AUTH_WPA2_EAP;
else if (flags.indexOf("[WPA-EAP") >= 0)
auth = AUTH_WPA_EAP;
else if (flags.indexOf("[WPA2-PSK") >= 0)
auth = AUTH_WPA2_PSK;
else if (flags.indexOf("[WPA-PSK") >= 0)
auth = AUTH_WPA_PSK;
else
auth = AUTH_NONE_OPEN;
if (flags.indexOf("-CCMP") >= 0)
encr = 1;
else if (flags.indexOf("-TKIP") >= 0)
encr = 0;
else if (flags.indexOf("WEP") >= 0) {
encr = 1;
if (auth == AUTH_NONE_OPEN)
auth = AUTH_NONE_WEP;
} else
encr = 0;
ui->authSelect->setCurrentIndex(auth);
authChanged(auth);
ui->EncryptionSelect->setCurrentIndex(encr);
//wepEnabled(auth == AUTH_NONE_WEP);
//getEapCapa();
//if (flags.indexOf("[WPS") >= 0)
// useWpsButton->setEnabled(true);
//bssid = sel.text(1);
}
void NetworkManager::on_pushButtonAddNetworkd_pressed()
{
addNetwork();
}
void NetworkManager::removeNetwork()
{
char reply[10], cmd[256];
size_t reply_len;
int id;
if (QMessageBox::information(
this, "wpa_gui",
tr("This will permanently remove the network\n"
"from the configuration. Do you really want\n"
"to remove this network?"),
tr("Yes"), tr("No")) != 0)
return;
id = ui->networkSelect->currentIndex();
snprintf(cmd, sizeof(cmd), "REMOVE_NETWORK %d", id);
reply_len = sizeof(reply);
ctrlRequest(cmd, reply, &reply_len);
if (strncmp(reply, "OK", 2) != 0) {
QMessageBox::warning(this, "wpa_gui",
tr("Failed to remove network from "
"wpa_supplicant\n"
"configuration."));
} else {
triggerUpdate();
ctrlRequest("SAVE_CONFIG", reply, &reply_len);
}
}
void NetworkManager::on_pushButtonRemove_pressed()
{
removeNetwork();
}
void NetworkManager::on_GetJsonpushButton_clicked()
{
QMessageBox::StandardButton ret;
ret = QMessageBox::question(this, tr("提示"),tr("是否去获取数据!"), QMessageBox::Ok | QMessageBox::Cancel);
if(ret != QMessageBox::Ok)
{
return;
}
// qDebug()<<"on_GetJsonpushButton_clicked";
QString str = "http://";
//str += ui->SeverIP_lineEdit->text();
QString ip_str;
ip_str = QString::number(sysPara->para.Json_IP[0]);
ip_str += ".";
ip_str += QString::number(sysPara->para.Json_IP[1]);
ip_str += ".";
ip_str += QString::number(sysPara->para.Json_IP[2]);
ip_str += ".";
ip_str += QString::number(sysPara->para.Json_IP[3]);
str += ip_str;
str += ":";
//str += ui->server_port_lineEdit->text();
str +=QString::number(sysPara->para.Json_server_port);
if(ui->TestradioButton->isChecked()){
// qDebug()<<"get test value";
// str += "/KLAPS/APSServer/ECode/GetProductUniqueCodeTest";
str = "http://www.anhuikinglan.top:63025/KLAPS/APSServer/ECode/GetProductUniqueCodeTest";
}else{
str += "/KLAPS/APSServer/ECode/GetProductUniqueCode";
}
//net_data->PrintNetGetData(str, ui->deviceID_lineEdit->text());
net_data->PrintNetGetData(str, QString(sysPara->para.Json_device_code));
ui->messege_info_label->setText(tr("获取数据中..."));
}
void NetworkManager::onjson_timer_handler()
{
static int count_time = 0;
count_time++;
ui->messege_info_label->setText( net_data->getMessege() );
// qDebug()<<"on_json_timer_handler";
if(sysPara->para.totalProductCnt != 0 && sysPara->para.totalProductCnt >= sysPara->Get_JSON_DATA.ProductPlanQty){
QString str = "http://";
str += ui->SeverIP_lineEdit->text();
str += ":";
str += ui->server_port_lineEdit->text();
if(ui->TestradioButton->isChecked()){
str += "/KLAPS/APSServer/ECode/UsedProductUniqueCodeTest";
}else{
str += "/KLAPS/APSServer/ECode/UsedProductUniqueCode";
}
net_data->PrintNetPostFinish(str);
sysPara->devOp->clearProductCnt(1 | 0x10 );// [3]总产品计数器清零FPGA
sysPara->para.totalProductCnt = 0;
emit net_stopPrint();
ui->messege_info_label->setText(tr("上报数据中..."));
if(sysPara->Get_JSON_DATA.TaskSwitchingMode == 1){
on_GetJsonpushButton_clicked();
}
}
if(count_time == 20){
count_time = 0;
QString str = "http://";
str += ui->SeverIP_lineEdit->text();
str += ":";
str += ui->server_port_lineEdit->text();
if(ui->TestradioButton->isChecked()){
str += "/KLAPS/APSServer/ECode/SubmitEquipmentCurrentStateTest";
}else{
str += "/KLAPS/APSServer/ECode/SubmitEquipmentCurrentState";
}
net_data->PrintNetPostFinish(str);
// qDebug()<<"upload data";
ui->messege_info_label->setText(tr("上报数据中..."));
}
}
void NetworkManager::onjson_server_error()
{
// ui->net_state_label->setText(tr("通信失败"));
// qDebug()<<"on_json_server_error";
}
void NetworkManager::on_applicate_pushButton_clicked()
{
QString ip_str = ui->SeverIP_lineEdit->text();
QStringList ip_list = ip_str.split(".");
QString ip1,ip2,ip3,ip4;
if (ip_list.size() < 4){
QMessageBox::information(this,tr("提示"),tr("IP设置错误!"));
return;
}
ip1 = ip_list.at(0);
ip2 = ip_list.at(1);
ip3 = ip_list.at(2);
ip4 = ip_list.at(3);
sysPara->para.Json_IP[0] = ip1.toInt();
sysPara->para.Json_IP[1] = ip2.toInt();
sysPara->para.Json_IP[2] = ip3.toInt();
sysPara->para.Json_IP[3] = ip4.toInt();
if(sysPara->para.Json_IP[0] > 255 || sysPara->para.Json_IP[1] > 255
||sysPara->para.Json_IP[2] > 255 ||sysPara->para.Json_IP[3] > 255){
QMessageBox::information(this,tr("提示"),tr("IP设置错误!"));
return;
}
// strcpy(sysPara->para.Json_IP, std_str);
//sysPara->para.Json_device_code = ui->deviceID_lineEdit->text().toInt();
strncpy(sysPara->para.Json_device_code, ui->deviceID_lineEdit->text().toStdString().data(),sizeof(sysPara->para.Json_device_code)-1);
sysPara->para.Json_server_port = ui->server_port_lineEdit->text().toInt();
QMessageBox::information(this,tr("提示"),tr("应用成功"));
// qDebug()<<"Json_device_code="<<sysPara->para.Json_device_code
// <<"Json_server_port="<<sysPara->para.Json_server_port
// <<"sysPara->para.Json_IP="<<sysPara->para.Json_IP[0] << sysPara->para.Json_IP[1]
// <<sysPara->para.Json_IP[2]<<sysPara->para.Json_IP[3];
sysPara->saveParaToFile();
}
//void NetworkManager::on_checkBoxShortNet_clicked(bool checked)
//{
// net_data->m_bShortNet = checked;
//}
void NetworkManager::on_checkBoxRemoveDigitCode_clicked(bool checked)
{
sysPara->para.isRemoveDigitCode = checked;
emit OpenNewFile();
}
void NetworkManager::on_checkBoxRemoveCode_clicked(bool checked)
{
//emit VariablePositionChange(checked);
sysPara->para.isRemoveCode = checked;
//emit OpenNewFile();
}
void NetworkManager::on_radioButtonGetDataEnable_clicked(bool checked)
{
sysPara->para.isEnableGetDataButton = checked;
}
void NetworkManager::updateAuthorization(int auth)
{
if(auth & AUTH_SUPER_USER2)
{
ui->GetJsonpushButton->show();
ui->GetJsonpushButton->show();
ui->messege_info_label->show();
ui->label->show();
ui->deviceID_lineEdit->show();
ui->label_2->show();
ui->SeverIP_lineEdit->show();
ui->label_4->show();
ui->server_port_lineEdit->show();
ui->TestradioButton->show();
// ui->checkBoxShortNet->show();
ui->checkBoxRemoveDigitCode->show();
ui->applicate_pushButton->show();
ui->checkBoxRemoveCode->show();
ui->radioButtonGetDataEnable->show();
}
else
{
ui->GetJsonpushButton->hide();
ui->GetJsonpushButton->hide();
ui->messege_info_label->hide();
ui->label->hide();
ui->deviceID_lineEdit->hide();
ui->label_2->hide();
ui->SeverIP_lineEdit->hide();
ui->label_4->hide();
ui->server_port_lineEdit->hide();
ui->TestradioButton->hide();
// ui->checkBoxShortNet->hide();
ui->checkBoxRemoveDigitCode->hide();
ui->applicate_pushButton->hide();
ui->checkBoxRemoveCode->hide();
ui->radioButtonGetDataEnable->hide();
//sysPara->para.isEnableGetDataButton = false;
}
}
bool NetworkManager::setEth0StaticIP()
{
const uint8_t ip3=192,ip2=168,ip1=0,ip0=66;//100+QDateTime::currentDateTime().time().second();//IP
const uint8_t /*ip3=192,ip2=168,ip1=1,ip0=66,*/lanGW0=1;//网关
const uint8_t lanMask3=255,lanMask2=255,lanMask1=255,lanMask0=0;//子网掩码
// 静态IP
QFile netInterface("/etc/network/interfaces");
netInterface.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate);
if (netInterface.isOpen()) {
QTextStream stream(&netInterface);
stream.seek(0);
stream << INTERFACE_OTHERS;
stream << " " <<"\n";
stream << "# eth0 interfaces" <<"\n";
stream << "auto eth0" <<"\n";
stream << "iface eth0 inet static" <<"\n";
stream << QString("address %1.%2.%3.%4").arg(ip3).arg(ip2).arg(ip1).arg(ip0) <<"\n";
stream << QString("gateway %1.%2.%3.%4").arg(ip3).arg(ip2).arg(ip1).arg(lanGW0) <<"\n";
stream << QString("netmask %1.%2.%3.%4").arg(lanMask3).arg(lanMask2).arg(lanMask1).arg(lanMask0) <<"\n";
stream << " \n";
netInterface.close();
QStringList argrList;
QString ipAddrStr(QString("%1.%2.%3.%4").arg(ip3).arg(ip2).arg(ip1).arg(ip0));
QString netMaskStr(QString("%1.%2.%3.%4").arg(lanMask3).arg(lanMask2).arg(lanMask1).arg(lanMask0));
argrList<< LANINTERFACE_NAME << ipAddrStr << "netmask" << netMaskStr;
qDebug() << "setEth0StaticIP->set argu:" << argrList;
QProcess process;
process.startDetached("/sbin/ifconfig", argrList);
return true;
}
else
{
const QFile::FileError eno=netInterface.error();
qDebug()<<"打开网络设置文件失败,error="<<eno<<",errstr="<<netInterface.errorString();
}
return false;
}
void NetworkManager::setEth0StaticIP_Thread()
{
if(!sysPara->status.bLanConfigManual && this->setEth0StaticIP())
{
qDebug()<<"设置静态IP-完成";
sysPara->status.bLanConfigManual=true;
updateSysStatusToUI();
}
else
{
qDebug()<<"设置静态IP-失败";
}
}
/**
只有返回全是0的地址才需要设置成192.168.0.66这个固定地址
* @brief NetworkManager::getCurrentNetworkIP
* @return 返回当前机器的IP地址
*/
QString NetworkManager::getCurrentNetworkIP()const
{
QString cip("0.0.0.0");
if(sysPara){
QList<QNetworkInterface> list = QNetworkInterface::allInterfaces(); //QNetworkInterface::interfaceFromName(LANINTERFACE_NAME);
//获取所有网络接口的列表
foreach(QNetworkInterface interface,list)
{
if(QString::compare(interface.name(), LANINTERFACE_NAME)==0)
{
QList<QNetworkAddressEntry> entryList = interface.addressEntries();
//获取IP地址条目列表,每个条目中包含一个IP地址,一个子网掩码和一个广播地址
foreach(QNetworkAddressEntry entry,entryList)
{
QStringList lanIpList = entry.ip().toString().split(".");
if (lanIpList.size() == 4) {
return QString("%1.%2.%3.%4").arg(lanIpList.at(0)).arg(lanIpList.at(1)).arg(lanIpList.at(2)).arg(lanIpList.at(3));
}
return cip;
}
}
}
}
return cip;
}