2015-02-01 01:42:45 +00:00
/*************************************************************************
* Copyright ( C ) 2015 by Andrius Š tikonas < andrius @ stikonas . eu > *
* *
* This program is free software ; you can redistribute it and / or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation ; either version 3 of the License , or *
* ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program . If not , see < http : //www.gnu.org/licenses/>.*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2015-02-28 23:30:00 +00:00
# include <QNetworkConfiguration>
# include <QNetworkConfigurationManager>
# include <QNetworkSession>
# include <QTimer>
2015-02-03 01:24:47 +00:00
# include <QUdpSocket>
2015-03-11 12:34:56 +00:00
2015-02-01 01:42:45 +00:00
# include "consolereader.h"
# include "server.h"
2015-02-28 23:30:00 +00:00
Server : : Server ( std : : vector < Socket * > * sockets_vector )
2015-02-01 01:42:45 +00:00
{
sockets = sockets_vector ;
udpSocketGet = new QUdpSocket ( ) ;
2015-02-28 23:30:00 +00:00
udpSocketGet - > bind ( QHostAddress : : Any , 10000 ) ;
2015-02-22 23:20:20 +00:00
connect ( udpSocketGet , & QUdpSocket : : readyRead , this , & Server : : readPendingDatagrams ) ;
2015-02-28 23:30:00 +00:00
discoverSockets ( ) ;
QTimer * discoverTimer = new QTimer ( this ) ;
discoverTimer - > setInterval ( 1 * 60 * 1000 ) ; // 1 min
discoverTimer - > setSingleShot ( false ) ;
connect ( discoverTimer , & QTimer : : timeout , this , & Server : : discoverSockets ) ;
discoverTimer - > start ( ) ;
2015-02-01 01:42:45 +00:00
2015-02-22 23:20:20 +00:00
start ( ) ;
}
2015-02-01 01:42:45 +00:00
2015-02-28 23:30:00 +00:00
Server : : Server ( uint16_t port , QByteArray password )
2015-02-22 23:20:20 +00:00
{
2015-03-02 11:58:37 +00:00
QNetworkConfiguration * cfgInitial = new QNetworkConfiguration ;
2015-02-28 23:30:00 +00:00
QNetworkConfiguration * cfg = new QNetworkConfiguration ;
QNetworkConfigurationManager * ncm = new QNetworkConfigurationManager ;
ncm - > updateConfigurations ( ) ;
2015-03-02 11:58:37 +00:00
* cfgInitial = ncm - > defaultConfiguration ( ) ;
QByteArray ssid = cfgInitial - > name ( ) . toLocal8Bit ( ) ;
2015-02-28 23:30:00 +00:00
2015-03-02 11:58:37 +00:00
bool stop = false ;
while ( ! stop )
2015-02-28 23:30:00 +00:00
{
2015-03-02 11:58:37 +00:00
QThread : : sleep ( 1 ) ;
auto nc = ncm - > allConfigurations ( ) ;
for ( auto & x : nc )
2015-02-28 23:30:00 +00:00
{
2015-03-02 11:58:37 +00:00
if ( x . bearerType ( ) = = QNetworkConfiguration : : BearerWLAN )
2015-02-28 23:30:00 +00:00
{
2015-03-02 11:58:37 +00:00
if ( x . name ( ) = = " WiWo-S20 " )
{
2015-04-02 01:19:02 +01:00
qWarning ( ) < < " Connecting to WiWo-S20 wireless " ;
2015-03-02 11:58:37 +00:00
cfg = & x ;
stop = true ;
}
2015-02-28 23:30:00 +00:00
}
}
}
2015-03-02 11:58:37 +00:00
QNetworkSession * session = new QNetworkSession ( * cfg , this ) ;
2015-02-28 23:30:00 +00:00
session - > open ( ) ;
2015-04-02 01:19:02 +01:00
qWarning ( ) < < " Wait for connected! " ;
2015-02-28 23:30:00 +00:00
if ( session - > waitForOpened ( ) )
2015-04-02 01:19:02 +01:00
qWarning ( ) < < " Connected! " ;
2015-02-28 23:30:00 +00:00
2015-02-22 23:20:20 +00:00
QUdpSocket * udpSocketSend = new QUdpSocket ( ) ;
udpSocketGet = new QUdpSocket ( ) ;
udpSocketGet - > bind ( QHostAddress : : Any , port ) ;
2015-02-07 17:29:12 +00:00
2015-02-22 23:20:20 +00:00
QByteArray reply ;
2015-02-01 01:42:45 +00:00
2015-02-22 23:20:20 +00:00
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " HF-A11ASSISTHREAD " ) , QHostAddress : : Broadcast , port ) ;
reply = listen ( QByteArray : : fromStdString ( " HF-A11ASSISTHREAD " ) ) ;
QList < QByteArray > list = reply . split ( ' , ' ) ;
QHostAddress ip ( QString : : fromLatin1 ( list [ 0 ] ) ) ;
2015-04-02 01:19:02 +01:00
qWarning ( ) < < " IP: " < < ip . toString ( ) ;
2015-02-22 23:20:20 +00:00
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " +ok " ) , ip , port ) ;
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " AT+WSSSID= " ) + ssid + QByteArray : : fromStdString ( " \r " ) , ip , port ) ;
listen ( ) ;
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " AT+WSKEY=WPA2PSK,AES, " ) + password + QByteArray : : fromStdString ( " \r " ) , ip , port ) ; // FIXME: support different security settings
2015-02-28 23:30:00 +00:00
// OPEN, SHARED, WPAPSK......NONE, WEP, TKIP, AES
2015-02-22 23:20:20 +00:00
listen ( ) ;
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " AT+WMODE=STA \r " ) , ip , port ) ;
listen ( ) ;
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " AT+Z \r " ) , ip , port ) ; // reboot
2015-02-28 23:30:00 +00:00
session - > close ( ) ;
2015-02-22 23:20:20 +00:00
// FIXME: discover the new socket
2015-04-02 01:19:02 +01:00
qWarning ( ) < < " Finished " ;
2015-03-02 11:58:37 +00:00
session = new QNetworkSession ( * cfgInitial , this ) ;
session - > open ( ) ;
if ( session - > waitForOpened ( ) )
2015-04-02 01:19:02 +01:00
qWarning ( ) < < " Connected " ;
2015-03-02 11:58:37 +00:00
discoverSockets ( ) ;
2015-02-01 01:42:45 +00:00
}
Server : : ~ Server ( )
{
delete udpSocketGet ;
}
2015-02-22 23:20:20 +00:00
QByteArray Server : : listen ( QByteArray message )
{
QByteArray reply ;
QHostAddress sender ;
quint16 senderPort ;
bool stop = false ;
while ( ! stop )
{
QThread : : msleep ( 50 ) ;
while ( udpSocketGet - > hasPendingDatagrams ( ) )
{
reply . resize ( udpSocketGet - > pendingDatagramSize ( ) ) ;
udpSocketGet - > readDatagram ( reply . data ( ) , reply . size ( ) , & sender , & senderPort ) ;
if ( reply ! = message )
{
stop = true ;
}
}
}
return reply ;
}
2015-02-03 01:24:47 +00:00
void Server : : run ( )
{
readPendingDatagrams ( ) ;
}
2015-02-01 01:42:45 +00:00
void Server : : readPendingDatagrams ( )
{
while ( udpSocketGet - > hasPendingDatagrams ( ) )
{
QByteArray reply ;
reply . resize ( udpSocketGet - > pendingDatagramSize ( ) ) ;
QHostAddress sender ;
quint16 senderPort ;
udpSocketGet - > readDatagram ( reply . data ( ) , reply . size ( ) , & sender , & senderPort ) ;
if ( reply ! = discover & & reply . left ( 2 ) = = magicKey ) // check for Magic Key
{
if ( reply . mid ( 4 , 2 ) = = QByteArray : : fromHex ( " 71 61 " ) ) // Reply to discover packet
{
bool duplicate = false ;
for ( std : : vector < Socket * > : : const_iterator i = sockets - > begin ( ) ; i ! = sockets - > end ( ) ; + + i )
{
if ( ( * i ) - > ip = = sender )
{
duplicate = true ;
break ;
}
}
if ( ! duplicate )
{
Socket * socket = new Socket ( sender , reply ) ;
sockets - > push_back ( socket ) ;
2015-03-11 12:34:56 +00:00
Q_EMIT discovered ( ) ;
2015-02-01 01:42:45 +00:00
}
}
else
{
QByteArray mac = reply . mid ( 6 , 6 ) ;
for ( std : : vector < Socket * > : : iterator i = sockets - > begin ( ) ; i ! = sockets - > end ( ) ; + + i )
{
if ( ( * i ) - > mac = = mac )
{
( * i ) - > parseReply ( reply ) ;
break ;
}
}
}
}
}
}
2015-02-22 23:20:20 +00:00
2015-02-28 23:30:00 +00:00
void Server : : discoverSockets ( )
2015-02-22 23:20:20 +00:00
{
QUdpSocket * udpSocketSend = new QUdpSocket ( ) ;
2015-02-28 23:30:00 +00:00
udpSocketSend - > connectToHost ( QHostAddress : : Broadcast , 10000 ) ;
2015-02-22 23:20:20 +00:00
udpSocketSend - > write ( discover ) ;
udpSocketSend - > write ( discover ) ;
udpSocketSend - > disconnectFromHost ( ) ;
delete udpSocketSend ;
}
2015-03-11 12:34:56 +00:00
void broadcastPassword ( QString password )
{
QUdpSocket * udpSocket = new QUdpSocket ( ) ;
udpSocket - > connectToHost ( QHostAddress : : Broadcast , 49999 ) ;
uint sleep = 15 ;
for ( uint j = 0 ; j < 4 ; + + j ) // FIXME: stopping loop on discovery
{
2015-04-02 01:19:02 +01:00
qWarning ( ) < < j ;
2015-03-11 12:34:56 +00:00
for ( unsigned short int i = 0 ; i < 200 ; + + i )
{
udpSocket - > write ( fives ( 76 ) ) ;
QThread : : msleep ( sleep ) ;
}
for ( unsigned short int i = 0 ; i < 3 ; + + i )
{
udpSocket - > write ( fives ( 89 ) ) ;
QThread : : msleep ( sleep ) ;
}
QChar * data = password . data ( ) ;
while ( ! data - > isNull ( ) )
{
udpSocket - > write ( fives ( data - > unicode ( ) + 76 ) ) ;
QThread : : msleep ( sleep ) ;
+ + data ;
}
for ( unsigned short int i = 0 ; i < 3 ; + + i )
{
udpSocket - > write ( fives ( 86 ) ) ;
QThread : : msleep ( sleep ) ;
}
for ( unsigned short int i = 0 ; i < 3 ; + + i )
{
udpSocket - > write ( fives ( 332 + password . length ( ) ) ) ;
QThread : : msleep ( sleep ) ;
}
}
udpSocket - > disconnectFromHost ( ) ;
delete udpSocket ;
// FIXME: special slightly modified SocketData packet might is needed here
}
QByteArray fives ( unsigned short int length )
{
QByteArray packet ;
packet . fill ( 0x05 , length ) ;
return packet ;
}