#include #include #include #include "qtjson/json.h" #include "sappeer.h" #include "hostmanagerconn.h" HostManagerConn::HostManagerConn(SAPConnection *conn, QObject *parent) : QObject(parent), _conn(conn), _socket(conn->getSocket(103)) { connect(_conn, SIGNAL(disconnected()), SLOT(deleteLater())); Q_ASSERT(_socket); connect(_socket, SIGNAL(connected()), SLOT(handleConnected())); connect(_socket, SIGNAL(messageReceived()), SLOT(handleMessageReceived())); } void HostManagerConn::sendMessage(const QString &json) { qDebug() << "Send JSON:" << json; _socket->send(QByteArray(3,0) + json.toUtf8()); } void HostManagerConn::sendMessage(const QVariantMap &msg) { sendMessage(QtJson::serializeStr(msg)); } void HostManagerConn::handleMessage(const QVariantMap &msg) { QString msgId = msg["msgId"].toString(); qDebug() << "Got JSON msg" << msgId; if (msgId == "mgr_watch_info_res") { sendMessage("{\"timestamp\":\"1407542281196=B:L>:<=LAMO\",\"type\":\"connect\",\"msgId\":\"mgr_wearable_status_req\"}"); } else if (msgId == "mgr_host_status_req") { sendMessage(QString("{\"type\":\"connect\",\"data\":%1,\"msgId\":\"mgr_host_status_res\",\"preinstalled\":\"true\"}") .arg(QtJson::sanitizeString(generateHostXml()))); } else if (msgId == "mgr_status_exchange_done") { performTimeSync(); sendMessage(QString("{\"btMac\":\"%1\",\"msgId\":\"mgr_setupwizard_eula_finished_req\",\"isOld\":1}") .arg(_conn->peer()->localName())); } } void HostManagerConn::performTimeSync() { //{"date1224":"24","datetimeepoch":"1409343828044","safety_declared":"0","locale":"es_ES","safety_voice":"1", // "safetyVersion":0,"timezone":"Europe\/Madrid","safety":"false","tablet":"true","dateformat":"dd-MM-yyyy", // "isfrominitial":true,"msgId":"mgr_sync_init_setting_req","usingCamera":"false","safety_cam":"0", // "datetime":"2014 08 29 22 23 48","incomingCall":"false"} QVariantMap msg; msg["msgId"] = "mgr_sync_init_setting_req"; msg["safety_declared"] = "0"; msg["safety_voice"] = "0"; msg["safetyVersion"] = "0"; msg["safety"] = "false"; msg["tablet"] = "true"; msg["incomingCall"] = "false"; msg["usingCamera"] = "false"; msg["safety_cam"] = "0"; msg["locale"] = QLocale::system().name(); // ie es_ES msg["data1224"] = "24"; // TODO msg["dateformat"] = QLocale::system().dateFormat(QLocale::ShortFormat); msg["timezone"] = "Europe/Madrid"; QDateTime dt = QDateTime::currentDateTime(); msg["datetimeepoch"] = QString::number(dt.currentMSecsSinceEpoch()); msg["datetime"] = dt.toString("yyyy MM dd hh mm ss"); sendMessage(msg); } QString HostManagerConn::generateHostXml() { QString xml; QXmlStreamWriter w(&xml); w.setCodec("UTF-8"); w.setAutoFormatting(true); w.writeStartDocument(); w.writeStartElement("DeviceStatus"); w.writeStartElement("device"); w.writeTextElement("deviceID", _conn->peer()->localName()); w.writeTextElement("deviceName", "none"); w.writeTextElement("devicePlatform", "android"); w.writeTextElement("devicePlatformVersion", "4.4.2"); w.writeTextElement("deviceType", "Host"); w.writeTextElement("modelNumber", "EvilPhone"); w.writeTextElement("swVersion", "1.0"); w.writeEmptyElement("connectivity"); w.writeEmptyElement("apps"); w.writeStartElement("deviceFeature"); w.writeTextElement("telephony", "true"); w.writeTextElement("messaging", "true"); w.writeTextElement("tablet", "true"); w.writeTextElement("autolock", "true"); w.writeTextElement("smartrelay", "true"); w.writeTextElement("safetyassistance", "false"); w.writeTextElement("vendor", "Samsung"); w.writeEndElement(); w.writeEmptyElement("security"); w.writeEmptyElement("notification"); w.writeEmptyElement("settings"); w.writeEndElement(); w.writeEndElement(); w.writeEndDocument(); return xml; } void HostManagerConn::handleConnected() { qDebug() << "Manager socket now connected!"; QString msg = QString("{\"btMac\":\"%1\",\"msgId\":\"mgr_watch_info_req\",\"hmVer\":\"2.0.14041404\"}").arg(_conn->peer()->localName()); qDebug() << msg; QByteArray data = QByteArray(3,0) + msg.toUtf8(); _socket->send(data); } void HostManagerConn::handleMessageReceived() { QByteArray data = _socket->receive(); if (data.size() < 5) { qWarning() << "Invalid HostManager message received"; return; } data.remove(0, 3); // First two bytes contain something related to ??? QString str = QString::fromUtf8(data); bool success = false; QVariant json = QtJson::parse(str, success); if (success) { qDebug() << "Got JSON:" << str; handleMessage(json.toMap()); } else { qWarning() << "Cannot parse JSON msg:" << str; return; } }