SocketIOClient::SocketIOClient(QObject *parent) : QObject(parent), m_pWebSocket(0), m_pNetworkAccessManager(0), m_requestUrl(), m_mustMask(true), m_connectionTimeout(30000), m_heartBeatTimeout(20000), m_pHeartBeatTimer(0), m_sessionId() { m_pWebSocket = new QWebSocket(QString(), QWebSocketProtocol::V_LATEST, this); m_pNetworkAccessManager = new QNetworkAccessManager(this); m_pHeartBeatTimer = new QTimer(this); m_pHeartBeatTimer->setInterval(m_heartBeatTimeout); connect(m_pWebSocket, SIGNAL(connected()), this,SLOT(onConnected())); connect(m_pWebSocket, SIGNAL(disconnected()), this, SLOT(onDisconnected())); connect(m_pWebSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError))); connect(m_pWebSocket, SIGNAL(textMessageReceived(QString)), this, SLOT(onTextMessage(QString))); connect(m_pWebSocket, SIGNAL(binaryMessageReceived(QByteArray)), this, SLOT(onBinaryMessage(QByteArray))); connect(m_pNetworkAccessManager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); connect(m_pHeartBeatTimer, SIGNAL(timeout()), this, SLOT(sendHeartBeat())); //socket.io connections connect(this, SIGNAL(handshakeSucceeded()), this, SLOT(onHandshakeSucceeded())); //socket.io test connections connect(this, SIGNAL(heartbeatReceived()), this, SLOT(onHeartbeatReceived())); }
//0 void MavSerialPort::heartbeat_handler(){ mavlink_msg_heartbeat_decode(&message, &heartbeat); emit heartbeatReceived(); }
void SocketIOClient::parseMessage(QString message) { //qDebug() << "SocketIOClient::parseMessage" << message; QRegExp regExp("^([^:]+):([0-9]+)?(\\+)?:([^:]+)?:?([\\s\\S]*)?$", Qt::CaseInsensitive, QRegExp::RegExp2); if (regExp.indexIn(message) != -1) { QStringList captured = regExp.capturedTexts(); //qDebug() << "Found:" << regExp.capturedTexts(); int messageType = captured.at(1).toInt(); int messageId = captured.at(2).toInt(); bool mustAck = (messageId != 0); bool autoAck = mustAck && captured.at(3).isEmpty(); QString endpoint = captured.at(4); QString data = captured.at(5); /*qDebug() << "MessageType:" << messageType << "MessageId:" << messageId << "autoAck:" << autoAck << "mustAck:" << mustAck << "endpoint:" << endpoint << "data:" << data;*/ if (autoAck) { acknowledge(messageId); } switch(messageType) { case 0: //disconnect { Q_EMIT(disconnected(endpoint)); break; } case 1: //connect { m_pHeartBeatTimer->start(); Q_EMIT(connected(endpoint)); break; } case 2: //heartbeat { Q_EMIT(heartbeatReceived()); break; } case 3: //message { Q_EMIT(messageReceived(data)); break; } case 4: //json message { qDebug() << "JSON message received:" << data; break; } case 5: //event { QJsonParseError parseError; //qDebug() << "Event received:" << data; QJsonDocument document = QJsonDocument::fromJson(QByteArray(data.toLatin1()), &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << parseError.errorString(); } else { if (document.isObject()) { QJsonObject object = document.object(); QJsonValue value = object["name"]; if (!value.isUndefined()) { QString message = value.toString(); //QVariantList arguments; QJsonArray arguments; QJsonValue argsValue = object["args"]; if (!argsValue.isUndefined() && !argsValue.isNull()) { if (argsValue.isArray()) { //QJsonArray argsArray = argsValue.toArray(); //arguments = argsArray.toVariantList(); arguments = argsValue.toArray(); //qDebug() << "Received arguments" << argsValue; /*Q_FOREACH(QJsonValue val, argsArray) { arguments << val.toVariant(); }*/ } else { qDebug() << "Args argument is not an array"; return; } } Q_EMIT(eventReceived(message, arguments)); } else { qDebug() << "Invalid event received: no name"; } } } break; } case 6: //ack { QRegExp regExp("^([0-9]+)(\\+)?(.*)$", Qt::CaseInsensitive, QRegExp::RegExp2); if (regExp.indexIn(data) != -1) { QJsonParseError parseError; //QVariantList arguments; QJsonArray arguments; int messageId = regExp.cap(1).toInt(); QString argumentsValue = regExp.cap(3); if (!argumentsValue.isEmpty()) { QJsonDocument doc = QJsonDocument::fromJson(argumentsValue.toLatin1(), &parseError); if (parseError.error != QJsonParseError::NoError) { qDebug() << "JSONParseError:" << parseError.errorString(); return; } else { if (doc.isArray()) { //arguments = doc.array().toVariantList(); arguments = doc.array(); } else { qDebug() << "Error: data of event is not an array"; return; } } } Q_EMIT(ackReceived(messageId, arguments)); } break; } case 7: //error { QStringList pieces = data.split("+"); QString reason = pieces[0]; QString advice; if (pieces.length() == 2) { advice = pieces[1]; } Q_EMIT(errorReceived(reason, advice)); break; } case 8: //noop { qDebug() << "Noop received" << data; break; } } } }