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-08-18 15:29:09 +01:00
Server : : Server ( std : : vector < Socket * > * sockets_vector )
2015-02-01 01:42:45 +00:00
{
sockets = sockets_vector ;
udpSocketGet = new QUdpSocket ( ) ;
2015-08-18 15:29:09 +01:00
udpSocketGet - > bind ( QHostAddress : : Any , 10000 ) ;
connect ( udpSocketGet , & QUdpSocket : : readyRead , this , & Server : : readPendingDatagrams ) ;
2015-02-28 23:30:00 +00:00
discoverSockets ( ) ;
QTimer * discoverTimer = new QTimer ( this ) ;
2015-08-18 15:29:09 +01:00
discoverTimer - > setInterval ( 1 * 60 * 1000 ) ; // 1 min
2015-02-28 23:30:00 +00:00
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-05-26 00:02:19 +01:00
Server : : Server ( uint16_t port , QByteArray ssid , 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 ( ) ;
2015-05-26 00:02:19 +01:00
2015-08-18 15:29:09 +01:00
if ( ssid = = " c " ) {
2015-05-26 00:02:19 +01:00
ssid = cfgInitial - > name ( ) . toLocal8Bit ( ) ;
qDebug ( ) < < " SSID unspecified, using current network: " < < ssid ;
}
2015-02-28 23:30:00 +00:00
2015-03-02 11:58:37 +00:00
bool stop = false ;
2015-08-18 15:29:09 +01:00
while ( ! stop ) {
2015-03-02 11:58:37 +00:00
QThread : : sleep ( 1 ) ;
auto nc = ncm - > allConfigurations ( ) ;
2015-08-18 15:29:09 +01:00
for ( auto & x : nc ) {
if ( x . bearerType ( ) = = QNetworkConfiguration : : BearerWLAN ) {
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 ( ) ;
2015-08-18 15:29:09 +01:00
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-08-18 15:29:09 +01:00
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " HF-A11ASSISTHREAD " ) , QHostAddress : : Broadcast , port ) ;
2015-02-22 23:20:20 +00:00
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-08-18 15:29:09 +01:00
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " +ok " ) , ip , port ) ;
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " AT+WSSSID= " ) + ssid + QByteArray : : fromStdString ( " \r " ) , ip , port ) ;
2015-02-22 23:20:20 +00:00
listen ( ) ;
2015-08-18 15:29:09 +01:00
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 ( ) ;
2015-08-18 15:29:09 +01:00
udpSocketGet - > writeDatagram ( QByteArray : : fromStdString ( " AT+WMODE=STA \r " ) , ip , port ) ;
2015-02-22 23:20:20 +00:00
listen ( ) ;
2015-08-18 15:29:09 +01:00
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 ;
2015-08-18 15:29:09 +01:00
while ( ! stop ) {
2015-02-22 23:20:20 +00:00
QThread : : msleep ( 50 ) ;
2015-08-18 15:29:09 +01:00
while ( udpSocketGet - > hasPendingDatagrams ( ) ) {
reply . resize ( udpSocketGet - > pendingDatagramSize ( ) ) ;
udpSocketGet - > readDatagram ( reply . data ( ) , reply . size ( ) , & sender , & senderPort ) ;
if ( reply ! = message ) {
2015-02-22 23:20:20 +00:00
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 ( )
{
2015-08-18 15:29:09 +01:00
while ( udpSocketGet - > hasPendingDatagrams ( ) ) {
2015-04-02 22:10:06 +01:00
QByteArray reply , mac ;
2015-08-18 15:29:09 +01:00
reply . resize ( udpSocketGet - > pendingDatagramSize ( ) ) ;
2015-02-01 01:42:45 +00:00
QHostAddress sender ;
quint16 senderPort ;
2015-08-18 15:29:09 +01:00
udpSocketGet - > readDatagram ( reply . data ( ) , reply . size ( ) , & sender , & senderPort ) ;
2015-02-01 01:42:45 +00:00
2015-08-18 15:29:09 +01:00
if ( reply ! = discover & & reply . left ( 2 ) = = magicKey ) { // check for Magic Key
if ( reply . mid ( 4 , 2 ) = = QStringLiteral ( " qa " ) . toLatin1 ( ) | | reply . mid ( 4 , 2 ) = = QStringLiteral ( " qg " ) . toLatin1 ( ) ) { // Reply to discover packet
2015-02-01 01:42:45 +00:00
bool duplicate = false ;
2015-08-18 15:29:09 +01:00
for ( std : : vector < Socket * > : : const_iterator i = sockets - > begin ( ) ; i ! = sockets - > end ( ) ; + + i ) {
if ( ( * i ) - > ip = = sender ) {
2015-02-01 01:42:45 +00:00
duplicate = true ;
break ;
}
}
2015-08-18 15:29:09 +01:00
if ( ! duplicate ) {
Socket * socket = new Socket ( sender , reply ) ;
sockets - > push_back ( socket ) ;
2015-10-05 01:10:50 +01:00
std : : sort ( sockets - > begin ( ) , sockets - > end ( ) , [ ] ( const Socket * a , const Socket * b ) - > bool { return QString ( a - > socketName ) < QString ( b - > socketName ) ; } ) ;
2015-03-11 12:34:56 +00:00
Q_EMIT discovered ( ) ;
2015-02-01 01:42:45 +00:00
}
2015-08-18 15:29:09 +01:00
mac = reply . mid ( 7 , 6 ) ;
} else {
mac = reply . mid ( 6 , 6 ) ;
2015-02-01 01:42:45 +00:00
}
2015-08-18 15:29:09 +01:00
for ( std : : vector < Socket * > : : iterator i = sockets - > begin ( ) ; i ! = sockets - > end ( ) ; + + i ) {
if ( ( * i ) - > mac = = mac ) {
2015-04-02 22:10:06 +01:00
( * i ) - > parseReply ( reply ) ;
break ;
2015-02-01 01:42:45 +00:00
}
2015-04-02 22:10:06 +01:00
2015-02-01 01:42:45 +00:00
}
}
}
}
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-08-18 15:29:09 +01:00
udpSocketSend - > connectToHost ( QHostAddress : : Broadcast , 10000 ) ;
udpSocketSend - > write ( discover ) ;
udpSocketSend - > write ( discover ) ;
2015-02-22 23:20:20 +00:00
udpSocketSend - > disconnectFromHost ( ) ;
delete udpSocketSend ;
}
2015-03-11 12:34:56 +00:00
void broadcastPassword ( QString password )
{
QUdpSocket * udpSocket = new QUdpSocket ( ) ;
2015-08-18 15:29:09 +01:00
udpSocket - > connectToHost ( QHostAddress : : Broadcast , 49999 ) ;
2015-03-11 12:34:56 +00:00
uint sleep = 15 ;
2015-08-18 15:29:09 +01:00
for ( uint j = 0 ; j < 4 ; + + j ) { // FIXME: stopping loop on discovery
2015-04-02 01:19:02 +01:00
qWarning ( ) < < j ;
2015-08-18 15:29:09 +01:00
for ( unsigned short int i = 0 ; i < 200 ; + + i ) {
udpSocket - > write ( fives ( 76 ) ) ;
2015-03-11 12:34:56 +00:00
QThread : : msleep ( sleep ) ;
}
2015-08-18 15:29:09 +01:00
for ( unsigned short int i = 0 ; i < 3 ; + + i ) {
udpSocket - > write ( fives ( 89 ) ) ;
2015-03-11 12:34:56 +00:00
QThread : : msleep ( sleep ) ;
}
QChar * data = password . data ( ) ;
2015-08-18 15:29:09 +01:00
while ( ! data - > isNull ( ) ) {
udpSocket - > write ( fives ( data - > unicode ( ) + 76 ) ) ;
2015-03-11 12:34:56 +00:00
QThread : : msleep ( sleep ) ;
+ + data ;
}
2015-08-18 15:29:09 +01:00
for ( unsigned short int i = 0 ; i < 3 ; + + i ) {
udpSocket - > write ( fives ( 86 ) ) ;
2015-03-11 12:34:56 +00:00
QThread : : msleep ( sleep ) ;
}
2015-08-18 15:29:09 +01:00
for ( unsigned short int i = 0 ; i < 3 ; + + i ) {
udpSocket - > write ( fives ( 332 + password . length ( ) ) ) ;
2015-03-11 12:34:56 +00:00
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 ;
}