Some more work

pull/503/head
Michael Zanetti 2021-01-11 14:07:36 +01:00
parent 456bd70bc5
commit 8df96a2d53
3 changed files with 80 additions and 18 deletions

View File

@ -277,7 +277,7 @@ void registerQmlTypes() {
qmlRegisterUncreatableType<BluetoothDeviceInfo>(uri, 1, 0, "BluetoothDeviceInfo", "Can't create this in QML. Get it from the DeviceInfos.");
qmlRegisterUncreatableType<BluetoothDeviceInfos>(uri, 1, 0, "BluetoothDeviceInfos", "Can't create this in QML. Get it from the BluetoothDiscovery.");
qmlRegisterUncreatableType<WirelessSetupManager>(uri, 1, 0, "WirelessSetupManager", "Can't create this in QML. Get it from the NetworkManagerControler.");
qmlRegisterUncreatableType<WirelessAccessPoint>(uri, 1, 0, "WirelessAccessPoints", "Can't create this in QML. Get it from the WirelessAccessPoints.");
qmlRegisterUncreatableType<WirelessAccessPoint>(uri, 1, 0, "WirelessAccessPoint", "Can't create this in QML. Get it from the WirelessAccessPoints.");
qmlRegisterUncreatableType<WirelessAccessPoints>(uri, 1, 0, "WirelessAccessPoints", "Can't create this in QML. Get it from the Engine instance.");
qmlRegisterType<WirelessAccessPointsProxy>(uri, 1, 0, "WirelessAccessPointsProxy");

View File

@ -52,7 +52,7 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device)
typedef void (QLowEnergyController::*errorsSignal)(QLowEnergyController::Error);
connect(m_btController, static_cast<errorsSignal>(&QLowEnergyController::error), this, [this](QLowEnergyController::Error error){
qDebug() << "Bluetooth error:" << error;
emit this->error();
emit this->bluetoothConnectionError();
});
connect(m_btController, &QLowEnergyController::discoveryFinished, this, [this](){
@ -65,11 +65,28 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device)
m_btController->connectToDevice();
}
void BtWiFiSetup::connectDeviceToWiFi(const QString &ssid)
void BtWiFiSetup::disconnectFromDevice()
{
if (m_btController) {
m_btController->disconnectFromDevice();
m_btController->deleteLater();
m_btController = nullptr;
}
}
void BtWiFiSetup::connectDeviceToWiFi(const QString &ssid, const QString &password)
{
if (m_status != StatusConnectedToBluetooth) {
qWarning() << "Cannot connect to wifi in state" << m_status;
}
QVariantMap request;
request.insert("c", (int)WirelessServiceCommandConnect);
QVariantMap parameters;
parameters.insert("e", ssid);
parameters.insert("p", password);
request.insert("p", parameters);
streamData(request);
}
BtWiFiSetup::Status BtWiFiSetup::status() const
@ -206,9 +223,7 @@ void BtWiFiSetup::setupServices()
m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100"));
m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiStatusCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100"));
QVariantMap request;
request.insert("c", (int)WirelessServiceCommandGetNetworks);
streamData(request);
loadNetworks();
});
connect(m_wifiService, &QLowEnergyService::characteristicChanged, this, &BtWiFiSetup::characteristicChanged);
m_wifiService->discoverDetails();
@ -255,7 +270,7 @@ void BtWiFiSetup::processWiFiPacket(const QVariantMap &data)
WirelessServiceCommand command = static_cast<WirelessServiceCommand>(data.value("c").toInt());
WirelessServiceResponse responseCode = (WirelessServiceResponse)data.value("r").toInt();
if (responseCode != WirelessServiceResponseSuccess) {
qWarning() << "Error in wifi command:" << responseCode;
qWarning() << "Error in wifi command" << command << ":" << responseCode;
return;
}
@ -275,28 +290,70 @@ void BtWiFiSetup::processWiFiPacket(const QVariantMap &data)
accessPoint->setHostAddress("");
m_accessPoints->addWirelessAccessPoint(accessPoint);
}
break;
case WirelessServiceCommandConnect:
qDebug() << "Connect call succeeded";
m_status = StatusConnectingToWiFi;
emit statusChanged(m_status);
break;
}
}
void BtWiFiSetup::loadNetworks()
{
QVariantMap request;
request.insert("c", (int)WirelessServiceCommandGetNetworks);
streamData(request);
}
void BtWiFiSetup::loadCurrentConnection()
{
QVariantMap request;
request.insert("c", (int)WirelessServiceCommandGetCurrentConnection);
streamData(request);
}
void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &data)
{
m_inputBuffers[characteristic.uuid()].append(data);
if (m_inputBuffers[characteristic.uuid()].endsWith("\n")) {
{
if (characteristic.uuid() == wifiResponseCharacteristicUuid) {
m_inputBuffers[characteristic.uuid()].append(data);
if (!m_inputBuffers[characteristic.uuid()].endsWith("\n")) {
return;
}
QByteArray data = m_inputBuffers.take(characteristic.uuid());
QJsonParseError error;
QJsonDocument jsonDoc = QJsonDocument::fromJson(data, &error);
if (error.error != QJsonParseError::NoError) {
qWarning() << "Invalid json data received:" << error.errorString() << data;
qWarning() << "Invalid json data received:" << error.errorString() << data << "from characteristic:" << characteristic.uuid();
m_btController->disconnectFromDevice();
return;
}
processWiFiPacket(jsonDoc.toVariant().toMap());
if (characteristic.uuid() == wifiResponseCharacteristicUuid) {
processWiFiPacket(jsonDoc.toVariant().toMap());
} else {
qWarning() << "Unhandled packet from characteristic" << characteristic.uuid();
} else if (characteristic.uuid() == wifiStatusCharacteristicUuid) {
m_wirelessStatus = static_cast<WirelessStatus>(data.toHex().toInt(nullptr, 16));
qDebug() << "Wireless status changed" << m_wirelessStatus;
emit wirelessStatusChanged();
if (m_wirelessStatus == WirelessStatusFailed) {
emit wifiSetupError();
} else if (m_wirelessStatus == WirelessStatusActivated) {
loadCurrentConnection();
}
} else if (characteristic.uuid() == networkStatusCharacteristicUuid) {
m_networkStatus = static_cast<NetworkStatus>(data.toHex().toInt(nullptr, 16));
qDebug() << "Network status changed:" << m_networkStatus;
if (m_networkStatus == NetworkStatusGlobal) {
m_status = StatusConnectedToWiFi;
emit statusChanged(m_status);
loadCurrentConnection();
}
} else {
qWarning() << "Unhandled packet from characteristic" << characteristic.uuid();
}
}

View File

@ -126,7 +126,8 @@ public:
explicit BtWiFiSetup(QObject *parent = nullptr);
Q_INVOKABLE void connectToDevice(const BluetoothDeviceInfo *device);
Q_INVOKABLE void connectDeviceToWiFi(const QString &ssid);
Q_INVOKABLE void disconnectFromDevice();
Q_INVOKABLE void connectDeviceToWiFi(const QString &ssid, const QString &password);
Status status() const;
@ -146,7 +147,8 @@ public:
signals:
void statusChanged(Status status);
void error();
void bluetoothConnectionError();
void wifiSetupError();
void modelNumberChanged();
void manufacturerChanged();
@ -166,6 +168,9 @@ private:
void streamData(const QVariantMap &request);
void processWiFiPacket(const QVariantMap &data);
void loadNetworks();
void loadCurrentConnection();
private slots:
void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &data);