Add support for initial pairing of the socket (WIP, some manual steps necessary).

This commit is contained in:
Andrius Štikonas 2015-02-22 23:20:20 +00:00
parent e7c521bc10
commit c7c93181bf
5 changed files with 83 additions and 20 deletions

View File

@ -18,6 +18,7 @@
#include <iostream>
#include "consolereader.h"
#include "server.h"
ConsoleReader::ConsoleReader ( std::vector<Socket*> *sockets_vector )
{
@ -43,6 +44,18 @@ void ConsoleReader::run()
std::cin >> command;
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':
(*sockets) [number]->tableData();
break;
@ -94,12 +107,11 @@ void ConsoleReader::listSockets()
{
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 << "Socket Name: " << (*i)->socketName.toStdString() << "\t Remote Password: " << (*i)->remotePassword.toStdString() << "\t Timezone: " << (*i)->timeZone.toHex().toStdString()
<< std::endl;
std::cout << "Socket Name: " << (*i)->socketName.toStdString() << "\t Remote Password: " << (*i)->remotePassword.toStdString() << "\t Timezone: " << (*i)->timeZone.toHex().toStdString() << std::endl;
std::cout << "Countdown: " << (*i)->countdown.toHex().toStdString() << 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 << "q - quit\ns - pick another socket (default is 1)\nt - change timezone" << std::endl;
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 << "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;
}

View File

@ -25,7 +25,7 @@ int main(int argc, char *argv[])
QCoreApplication app(argc, argv);
std::vector<Socket*> *sockets = new std::vector<Socket*>;
Server server(sockets);
Server server(sockets, 10000);
ConsoleReader *reader = new ConsoleReader(sockets);
return app.exec();

View File

@ -21,30 +21,69 @@
#include "consolereader.h"
#include "server.h"
Server::Server ( std::vector<Socket*> *sockets_vector )
Server::Server ( std::vector<Socket*> *sockets_vector, uint16_t port )
{
sockets = sockets_vector;
QUdpSocket *udpSocketSend = new QUdpSocket();
udpSocketGet = new QUdpSocket();
udpSocketSend->connectToHost ( QHostAddress::Broadcast, 10000 );
udpSocketGet->bind ( QHostAddress::Any, 10000);
udpSocketGet->bind ( QHostAddress::Any, port );
connect ( udpSocketGet, &QUdpSocket::readyRead, this, &Server::readPendingDatagrams);
udpSocketSend->write ( discover );
udpSocketSend->write ( discover );
udpSocketSend->disconnectFromHost();
delete udpSocketSend;
discoverSockets(port);
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()
{
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()
{
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;
}

View File

@ -27,10 +27,10 @@ class QUdpSocket;
class Server : public QThread
{
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();
void discoverSockets ();
void readPendingDatagrams();
void run();
@ -38,6 +38,9 @@ private:
QByteArray discover = QByteArray::fromHex ( "68 64 00 06 71 61" );
QUdpSocket *udpSocketGet;
std::vector<Socket*> *sockets;
void discoverSockets(uint16_t port);
QByteArray listen( QByteArray message = 0 );
};
#endif /* SERVER_H */

View File

@ -37,7 +37,7 @@ Q_SIGNALS:
void datagramQueued();
public:
Socket ( QHostAddress, QByteArray );
Socket ( QHostAddress, QByteArray ); // from discovery packet
~Socket();
void toggle();
void tableData();