Add support for initial pairing of the socket (WIP, some manual steps necessary).
This commit is contained in:
parent
e7c521bc10
commit
c7c93181bf
|
@ -18,6 +18,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
#include "consolereader.h"
|
#include "consolereader.h"
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
ConsoleReader::ConsoleReader ( std::vector<Socket*> *sockets_vector )
|
ConsoleReader::ConsoleReader ( std::vector<Socket*> *sockets_vector )
|
||||||
{
|
{
|
||||||
|
@ -43,6 +44,18 @@ void ConsoleReader::run()
|
||||||
std::cin >> command;
|
std::cin >> command;
|
||||||
switch ( command[0] )
|
switch ( command[0] )
|
||||||
{
|
{
|
||||||
|
case 'a':
|
||||||
|
{
|
||||||
|
std::cout << "Please set your Orvibo socket to pair mode (rapidly blinking blue light) and connect computer to socket's WiFi network (WiWo-S20)" << std::endl;
|
||||||
|
std::string ssid;
|
||||||
|
std::cout << "SSID of your Wifi: ";
|
||||||
|
std::cin >> ssid;
|
||||||
|
std::string password;
|
||||||
|
std::cout << "Password: ";
|
||||||
|
std::cin >> password;
|
||||||
|
Server *server = new Server(48899, QByteArray::fromStdString(ssid), QByteArray::fromStdString(password)); // HF-A11 chip can be controlled over port 48899
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 'd':
|
case 'd':
|
||||||
(*sockets) [number]->tableData();
|
(*sockets) [number]->tableData();
|
||||||
break;
|
break;
|
||||||
|
@ -94,12 +107,11 @@ void ConsoleReader::listSockets()
|
||||||
{
|
{
|
||||||
std::cout << "_____________________________________________________________________________\n" << std::endl;
|
std::cout << "_____________________________________________________________________________\n" << std::endl;
|
||||||
std::cout << "IP Address: " << (*i)->ip.toString().toStdString() << "\t MAC Address: " << (*i)->mac.toHex().toStdString() << "\t Power: " << ( (*i)->powered ? "On" : "Off" ) << std::endl;
|
std::cout << "IP Address: " << (*i)->ip.toString().toStdString() << "\t MAC Address: " << (*i)->mac.toHex().toStdString() << "\t Power: " << ( (*i)->powered ? "On" : "Off" ) << std::endl;
|
||||||
std::cout << "Socket Name: " << (*i)->socketName.toStdString() << "\t Remote Password: " << (*i)->remotePassword.toStdString() << "\t Timezone: " << (*i)->timeZone.toHex().toStdString()
|
std::cout << "Socket Name: " << (*i)->socketName.toStdString() << "\t Remote Password: " << (*i)->remotePassword.toStdString() << "\t Timezone: " << (*i)->timeZone.toHex().toStdString() << std::endl;
|
||||||
<< std::endl;
|
|
||||||
std::cout << "Countdown: " << (*i)->countdown.toHex().toStdString() << std::endl;
|
std::cout << "Countdown: " << (*i)->countdown.toHex().toStdString() << std::endl;
|
||||||
}
|
}
|
||||||
std::cout << "_____________________________________________________________________________\n" << std::endl;
|
std::cout << "_____________________________________________________________________________\n" << std::endl;
|
||||||
std::cout << "d - update table data\nn - change socket name (max 16 characters)\np - toggle power state\nP - change remote password (max 12 characters)\n";
|
std::cout << "a - add unpaired socket (WiFi needed)\nd - update table data\nn - change socket name (max 16 characters)\np - toggle power state\n";
|
||||||
std::cout << "q - quit\ns - pick another socket (default is 1)\nt - change timezone" << std::endl;
|
std::cout << "P - change remote password (max 12 characters)\nq - quit\ns - pick another socket (default is 1)\nt - change timezone" << std::endl;
|
||||||
std::cout << "Enter command: " << std::endl;
|
std::cout << "Enter command: " << std::endl;
|
||||||
}
|
}
|
||||||
|
|
2
main.cpp
2
main.cpp
|
@ -25,7 +25,7 @@ int main(int argc, char *argv[])
|
||||||
QCoreApplication app(argc, argv);
|
QCoreApplication app(argc, argv);
|
||||||
|
|
||||||
std::vector<Socket*> *sockets = new std::vector<Socket*>;
|
std::vector<Socket*> *sockets = new std::vector<Socket*>;
|
||||||
Server server(sockets);
|
Server server(sockets, 10000);
|
||||||
ConsoleReader *reader = new ConsoleReader(sockets);
|
ConsoleReader *reader = new ConsoleReader(sockets);
|
||||||
|
|
||||||
return app.exec();
|
return app.exec();
|
||||||
|
|
72
server.cpp
72
server.cpp
|
@ -21,30 +21,69 @@
|
||||||
#include "consolereader.h"
|
#include "consolereader.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
Server::Server ( std::vector<Socket*> *sockets_vector )
|
Server::Server ( std::vector<Socket*> *sockets_vector, uint16_t port )
|
||||||
{
|
{
|
||||||
sockets = sockets_vector;
|
sockets = sockets_vector;
|
||||||
QUdpSocket *udpSocketSend = new QUdpSocket();
|
|
||||||
udpSocketGet = new QUdpSocket();
|
udpSocketGet = new QUdpSocket();
|
||||||
|
udpSocketGet->bind ( QHostAddress::Any, port );
|
||||||
udpSocketSend->connectToHost ( QHostAddress::Broadcast, 10000 );
|
|
||||||
udpSocketGet->bind ( QHostAddress::Any, 10000);
|
|
||||||
|
|
||||||
connect ( udpSocketGet, &QUdpSocket::readyRead, this, &Server::readPendingDatagrams);
|
connect ( udpSocketGet, &QUdpSocket::readyRead, this, &Server::readPendingDatagrams);
|
||||||
|
discoverSockets(port);
|
||||||
udpSocketSend->write ( discover );
|
|
||||||
udpSocketSend->write ( discover );
|
|
||||||
udpSocketSend->disconnectFromHost();
|
|
||||||
delete udpSocketSend;
|
|
||||||
|
|
||||||
start();
|
start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Server::Server(uint16_t port, QByteArray ssid, QByteArray password)
|
||||||
|
{
|
||||||
|
QUdpSocket *udpSocketSend = new QUdpSocket();
|
||||||
|
udpSocketGet = new QUdpSocket();
|
||||||
|
udpSocketGet->bind ( QHostAddress::Any, port);
|
||||||
|
|
||||||
|
QByteArray reply;
|
||||||
|
|
||||||
|
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]));
|
||||||
|
std::cout << "IP: " << ip.toString().toStdString() << std::endl;
|
||||||
|
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
|
||||||
|
listen();
|
||||||
|
udpSocketGet->writeDatagram ( QByteArray::fromStdString("AT+WMODE=STA\r"), ip, port );
|
||||||
|
listen();
|
||||||
|
udpSocketGet->writeDatagram ( QByteArray::fromStdString("AT+Z\r"), ip, port ); // reboot
|
||||||
|
// FIXME: discover the new socket
|
||||||
|
}
|
||||||
|
|
||||||
Server::~Server()
|
Server::~Server()
|
||||||
{
|
{
|
||||||
delete udpSocketGet;
|
delete udpSocketGet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
std::cout << reply.toStdString() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return reply;
|
||||||
|
}
|
||||||
|
|
||||||
void Server::run()
|
void Server::run()
|
||||||
{
|
{
|
||||||
readPendingDatagrams();
|
readPendingDatagrams();
|
||||||
|
@ -92,8 +131,17 @@ void Server::readPendingDatagrams()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
std::cout << "Packet not belonging to any socket: " << reply.toHex().toStdString() << std::endl;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::discoverSockets(uint16_t port)
|
||||||
|
{
|
||||||
|
QUdpSocket *udpSocketSend = new QUdpSocket();
|
||||||
|
udpSocketSend->connectToHost ( QHostAddress::Broadcast, port );
|
||||||
|
udpSocketSend->write ( discover );
|
||||||
|
udpSocketSend->write ( discover );
|
||||||
|
udpSocketSend->disconnectFromHost();
|
||||||
|
delete udpSocketSend;
|
||||||
|
}
|
||||||
|
|
7
server.h
7
server.h
|
@ -27,10 +27,10 @@ class QUdpSocket;
|
||||||
class Server : public QThread
|
class Server : public QThread
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Server ( std::vector<Socket*> *sockets_vector );
|
Server ( std::vector<Socket*> *sockets_vector, uint16_t port );
|
||||||
|
Server ( uint16_t port, QByteArray ssid, QByteArray password );
|
||||||
~Server();
|
~Server();
|
||||||
|
|
||||||
void discoverSockets ();
|
|
||||||
void readPendingDatagrams();
|
void readPendingDatagrams();
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
|
@ -38,6 +38,9 @@ private:
|
||||||
QByteArray discover = QByteArray::fromHex ( "68 64 00 06 71 61" );
|
QByteArray discover = QByteArray::fromHex ( "68 64 00 06 71 61" );
|
||||||
QUdpSocket *udpSocketGet;
|
QUdpSocket *udpSocketGet;
|
||||||
std::vector<Socket*> *sockets;
|
std::vector<Socket*> *sockets;
|
||||||
|
|
||||||
|
void discoverSockets(uint16_t port);
|
||||||
|
QByteArray listen( QByteArray message = 0 );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* SERVER_H */
|
#endif /* SERVER_H */
|
||||||
|
|
Loading…
Reference in New Issue