Some more finishing touches
This commit is contained in:
parent
c293474fd4
commit
14fe5bb610
@ -36,8 +36,8 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device)
|
|||||||
m_currentConnection = nullptr;
|
m_currentConnection = nullptr;
|
||||||
currentConnectionChanged();
|
currentConnectionChanged();
|
||||||
m_accessPoints->clearModel();
|
m_accessPoints->clearModel();
|
||||||
m_status = StatusDisconnected;
|
m_bluetoothStatus = BluetoothStatusDisconnected;
|
||||||
emit statusChanged(m_status);
|
emit bluetoothStatusChanged(m_bluetoothStatus);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -45,12 +45,14 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device)
|
|||||||
connect(m_btController, &QLowEnergyController::connected, this, [this](){
|
connect(m_btController, &QLowEnergyController::connected, this, [this](){
|
||||||
qDebug() << "Bluetooth connected";
|
qDebug() << "Bluetooth connected";
|
||||||
m_btController->discoverServices();
|
m_btController->discoverServices();
|
||||||
|
m_bluetoothStatus = BluetoothStatusConnectedToBluetooth;
|
||||||
|
emit bluetoothStatusChanged(m_bluetoothStatus);
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(m_btController, &QLowEnergyController::disconnected, this, [this](){
|
connect(m_btController, &QLowEnergyController::disconnected, this, [this](){
|
||||||
qDebug() << "Bluetooth disconnected";
|
qDebug() << "Bluetooth disconnected";
|
||||||
m_status = StatusDisconnected;
|
m_bluetoothStatus = BluetoothStatusDisconnected;
|
||||||
emit statusChanged(m_status);
|
emit bluetoothStatusChanged(m_bluetoothStatus);
|
||||||
m_btController->deleteLater();
|
m_btController->deleteLater();
|
||||||
m_btController = nullptr;
|
m_btController = nullptr;
|
||||||
m_currentConnection = nullptr;
|
m_currentConnection = nullptr;
|
||||||
@ -69,8 +71,8 @@ void BtWiFiSetup::connectToDevice(const BluetoothDeviceInfo *device)
|
|||||||
setupServices();
|
setupServices();
|
||||||
});
|
});
|
||||||
|
|
||||||
m_status = StatusConnectingToBluetooth;
|
m_bluetoothStatus = BluetoothStatusConnectingToBluetooth;
|
||||||
emit statusChanged(m_status);
|
emit bluetoothStatusChanged(m_bluetoothStatus);
|
||||||
m_btController->connectToDevice();
|
m_btController->connectToDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,8 +85,8 @@ void BtWiFiSetup::disconnectFromDevice()
|
|||||||
|
|
||||||
void BtWiFiSetup::connectDeviceToWiFi(const QString &ssid, const QString &password)
|
void BtWiFiSetup::connectDeviceToWiFi(const QString &ssid, const QString &password)
|
||||||
{
|
{
|
||||||
if (m_status != StatusConnectedToBluetooth) {
|
if (m_bluetoothStatus != BluetoothStatusConnectedToBluetooth) {
|
||||||
qWarning() << "Cannot connect to wifi in state" << m_status;
|
qWarning() << "Cannot connect to wifi in state" << m_bluetoothStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVariantMap request;
|
QVariantMap request;
|
||||||
@ -98,10 +100,9 @@ void BtWiFiSetup::connectDeviceToWiFi(const QString &ssid, const QString &passwo
|
|||||||
|
|
||||||
void BtWiFiSetup::disconnectDeviceFromWiFi()
|
void BtWiFiSetup::disconnectDeviceFromWiFi()
|
||||||
{
|
{
|
||||||
if (m_status != StatusConnectedToWiFi) {
|
if (m_bluetoothStatus != BluetoothStatusConnectedToBluetooth) {
|
||||||
qWarning() << "Cannot disconnect from wifi in state" << m_status;
|
qWarning() << "Cannot disconnect from wifi in state" << m_bluetoothStatus;
|
||||||
}
|
}
|
||||||
QLowEnergyCharacteristic ssidCharacteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid);
|
|
||||||
QVariantMap request;
|
QVariantMap request;
|
||||||
request.insert("c", (int)WirelessServiceCommandDisconnect);
|
request.insert("c", (int)WirelessServiceCommandDisconnect);
|
||||||
streamData(m_wifiService, wifiCommanderCharacteristicUuid, request);
|
streamData(m_wifiService, wifiCommanderCharacteristicUuid, request);
|
||||||
@ -109,28 +110,30 @@ void BtWiFiSetup::disconnectDeviceFromWiFi()
|
|||||||
|
|
||||||
void BtWiFiSetup::scanWiFi()
|
void BtWiFiSetup::scanWiFi()
|
||||||
{
|
{
|
||||||
QLowEnergyCharacteristic characteristic = m_wifiService->characteristic(wifiCommanderCharacteristicUuid);
|
if (m_bluetoothStatus != BluetoothStatusConnectedToBluetooth) {
|
||||||
|
qWarning() << "Cannot disconnect from wifi in state" << m_bluetoothStatus;
|
||||||
|
}
|
||||||
QVariantMap request;
|
QVariantMap request;
|
||||||
request.insert("c", (int)WirelessServiceCommandScan);
|
request.insert("c", (int)WirelessServiceCommandScan);
|
||||||
streamData(m_wifiService, wifiCommanderCharacteristicUuid, request);
|
streamData(m_wifiService, wifiCommanderCharacteristicUuid, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BtWiFiSetup::pressPushButton()
|
bool BtWiFiSetup::pressPushButton()
|
||||||
{
|
{
|
||||||
if (!m_systemService) {
|
if (!m_systemService) {
|
||||||
qDebug() << "System service not available. Cannot perform push button pairing";
|
qDebug() << "System service not available. Cannot perform push button pairing";
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
QLowEnergyCharacteristic commanderCharacteristic = m_systemService->characteristic(systemCommanderCharacteristicUuid);
|
|
||||||
QVariantMap request;
|
QVariantMap request;
|
||||||
request.insert("c", (int)SystemServiceCommandPushAuthentication);
|
request.insert("c", (int)SystemServiceCommandPushAuthentication);
|
||||||
|
|
||||||
streamData(m_systemService, systemCommanderCharacteristicUuid, request);
|
streamData(m_systemService, systemCommanderCharacteristicUuid, request);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
BtWiFiSetup::Status BtWiFiSetup::status() const
|
BtWiFiSetup::BluetoothStatus BtWiFiSetup::bluetoothStatus() const
|
||||||
{
|
{
|
||||||
return m_status;
|
return m_bluetoothStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString BtWiFiSetup::modelNumber() const
|
QString BtWiFiSetup::modelNumber() const
|
||||||
@ -175,6 +178,9 @@ bool BtWiFiSetup::networkingEnabled() const
|
|||||||
|
|
||||||
void BtWiFiSetup::setNetworkingEnabled(bool networkingEnabled)
|
void BtWiFiSetup::setNetworkingEnabled(bool networkingEnabled)
|
||||||
{
|
{
|
||||||
|
if (m_bluetoothStatus != BluetoothStatusConnectedToBluetooth) {
|
||||||
|
qWarning() << "Cannot disconnect from wifi in state" << m_bluetoothStatus;
|
||||||
|
}
|
||||||
QLowEnergyCharacteristic characteristic = m_networkService->characteristic(networkCommanderCharacteristicUuid);
|
QLowEnergyCharacteristic characteristic = m_networkService->characteristic(networkCommanderCharacteristicUuid);
|
||||||
m_networkService->writeCharacteristic(characteristic, networkingEnabled ? QByteArray::fromHex("00") : QByteArray::fromHex("01"));
|
m_networkService->writeCharacteristic(characteristic, networkingEnabled ? QByteArray::fromHex("00") : QByteArray::fromHex("01"));
|
||||||
}
|
}
|
||||||
@ -186,6 +192,9 @@ bool BtWiFiSetup::wirelessEnabled() const
|
|||||||
|
|
||||||
void BtWiFiSetup::setWirelessEnabled(bool wirelessEnabled) const
|
void BtWiFiSetup::setWirelessEnabled(bool wirelessEnabled) const
|
||||||
{
|
{
|
||||||
|
if (m_bluetoothStatus != BluetoothStatusConnectedToBluetooth) {
|
||||||
|
qWarning() << "Cannot disconnect from wifi in state" << m_bluetoothStatus;
|
||||||
|
}
|
||||||
QLowEnergyCharacteristic characteristic = m_networkService->characteristic(networkCommanderCharacteristicUuid);
|
QLowEnergyCharacteristic characteristic = m_networkService->characteristic(networkCommanderCharacteristicUuid);
|
||||||
m_networkService->writeCharacteristic(characteristic, wirelessEnabled ? QByteArray::fromHex("02") : QByteArray::fromHex("03"));
|
m_networkService->writeCharacteristic(characteristic, wirelessEnabled ? QByteArray::fromHex("02") : QByteArray::fromHex("03"));
|
||||||
}
|
}
|
||||||
@ -202,7 +211,7 @@ WirelessAccessPoint *BtWiFiSetup::currentConnection() const
|
|||||||
|
|
||||||
void BtWiFiSetup::setupServices()
|
void BtWiFiSetup::setupServices()
|
||||||
{
|
{
|
||||||
qDebug() << "Setting up services";
|
qDebug() << "Setting up Bluetooth services";
|
||||||
m_deviceInformationService = m_btController->createServiceObject(QBluetoothUuid::DeviceInformation, m_btController);
|
m_deviceInformationService = m_btController->createServiceObject(QBluetoothUuid::DeviceInformation, m_btController);
|
||||||
m_networkService = m_btController->createServiceObject(networkServiceUuid, m_btController);
|
m_networkService = m_btController->createServiceObject(networkServiceUuid, m_btController);
|
||||||
m_wifiService = m_btController->createServiceObject(wifiServiceUuid, m_btController);
|
m_wifiService = m_btController->createServiceObject(wifiServiceUuid, m_btController);
|
||||||
@ -268,8 +277,6 @@ void BtWiFiSetup::setupServices()
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
qDebug() << "Wifi service discovered";
|
qDebug() << "Wifi service discovered";
|
||||||
m_status = StatusConnectedToBluetooth;
|
|
||||||
emit statusChanged(m_status);
|
|
||||||
|
|
||||||
// Enable notifations
|
// Enable notifations
|
||||||
m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100"));
|
m_wifiService->writeDescriptor(m_wifiService->characteristic(wifiResponseCharacteristicUuid).descriptor(QBluetoothUuid::ClientCharacteristicConfiguration), QByteArray::fromHex("0100"));
|
||||||
@ -345,11 +352,15 @@ void BtWiFiSetup::processWiFiPacket(const QVariantMap &data)
|
|||||||
break;
|
break;
|
||||||
case WirelessServiceCommandConnect:
|
case WirelessServiceCommandConnect:
|
||||||
qDebug() << "Connect call succeeded";
|
qDebug() << "Connect call succeeded";
|
||||||
m_status = StatusConnectingToWiFi;
|
|
||||||
emit statusChanged(m_status);
|
|
||||||
break;
|
break;
|
||||||
case WirelessServiceCommandGetCurrentConnection:
|
case WirelessServiceCommandGetCurrentConnection:
|
||||||
// Find current network
|
// Find current network
|
||||||
|
if (!data.value("p").toMap().value("m").toString().isEmpty() && data.value("p").toMap().value("i").toString().isEmpty()) {
|
||||||
|
// There's a bug in libnymea-networkmanager that sometimes it emits current connection before it actually obtained the IP address
|
||||||
|
qDebug() << "Retring to fetch the current connection because IP is not set yet.";
|
||||||
|
loadCurrentConnection();
|
||||||
|
return;
|
||||||
|
}
|
||||||
m_currentConnection = nullptr;
|
m_currentConnection = nullptr;
|
||||||
foreach (WirelessAccessPoint *accessPoint, m_accessPoints->wirelessAccessPoints()) {
|
foreach (WirelessAccessPoint *accessPoint, m_accessPoints->wirelessAccessPoints()) {
|
||||||
QVariantMap currentConnection = data.value("p").toMap();
|
QVariantMap currentConnection = data.value("p").toMap();
|
||||||
@ -357,6 +368,7 @@ void BtWiFiSetup::processWiFiPacket(const QVariantMap &data)
|
|||||||
if (accessPoint->macAddress() == macAddress) {
|
if (accessPoint->macAddress() == macAddress) {
|
||||||
// Set the current network
|
// Set the current network
|
||||||
m_currentConnection = accessPoint;
|
m_currentConnection = accessPoint;
|
||||||
|
|
||||||
accessPoint->setHostAddress(currentConnection.value("i").toString());
|
accessPoint->setHostAddress(currentConnection.value("i").toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -428,9 +440,6 @@ void BtWiFiSetup::characteristicChanged(const QLowEnergyCharacteristic &characte
|
|||||||
m_networkStatus = static_cast<NetworkStatus>(value.toHex().toInt(nullptr, 16));
|
m_networkStatus = static_cast<NetworkStatus>(value.toHex().toInt(nullptr, 16));
|
||||||
qDebug() << "Network status changed:" << m_networkStatus;
|
qDebug() << "Network status changed:" << m_networkStatus;
|
||||||
if (m_networkStatus == NetworkStatusGlobal) {
|
if (m_networkStatus == NetworkStatusGlobal) {
|
||||||
m_status = StatusConnectedToWiFi;
|
|
||||||
emit statusChanged(m_status);
|
|
||||||
|
|
||||||
loadCurrentConnection();
|
loadCurrentConnection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ class WirelessAccessPoint;
|
|||||||
class BtWiFiSetup : public QObject
|
class BtWiFiSetup : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
Q_PROPERTY(Status status READ status NOTIFY statusChanged)
|
Q_PROPERTY(BluetoothStatus bluetoothStatus READ bluetoothStatus NOTIFY bluetoothStatusChanged)
|
||||||
|
|
||||||
Q_PROPERTY(QString modelNumber READ modelNumber NOTIFY modelNumberChanged)
|
Q_PROPERTY(QString modelNumber READ modelNumber NOTIFY modelNumberChanged)
|
||||||
Q_PROPERTY(QString manufacturer READ manufacturer NOTIFY manufacturerChanged)
|
Q_PROPERTY(QString manufacturer READ manufacturer NOTIFY manufacturerChanged)
|
||||||
@ -29,14 +29,41 @@ class BtWiFiSetup : public QObject
|
|||||||
Q_PROPERTY(WirelessAccessPoint *currentConnection READ currentConnection NOTIFY currentConnectionChanged)
|
Q_PROPERTY(WirelessAccessPoint *currentConnection READ currentConnection NOTIFY currentConnectionChanged)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum Status {
|
enum BluetoothStatus {
|
||||||
StatusDisconnected,
|
BluetoothStatusDisconnected,
|
||||||
StatusConnectingToBluetooth,
|
BluetoothStatusConnectingToBluetooth,
|
||||||
StatusConnectedToBluetooth,
|
BluetoothStatusConnectedToBluetooth
|
||||||
StatusConnectingToWiFi,
|
|
||||||
StatusConnectedToWiFi
|
|
||||||
};
|
};
|
||||||
Q_ENUM(Status)
|
Q_ENUM(BluetoothStatus)
|
||||||
|
|
||||||
|
enum NetworkStatus {
|
||||||
|
NetworkStatusUnknown = 0x00,
|
||||||
|
NetworkStatusAsleep = 0x01,
|
||||||
|
NetworkStatusDisconnected = 0x02,
|
||||||
|
NetworkStatusDisconnecting = 0x03,
|
||||||
|
NetworkStatusConnecting = 0x04,
|
||||||
|
NetworkStatusLocal = 0x05,
|
||||||
|
NetworkStatusConnectedSite = 0x06,
|
||||||
|
NetworkStatusGlobal = 0x07
|
||||||
|
};
|
||||||
|
Q_ENUM(NetworkStatus)
|
||||||
|
|
||||||
|
enum WirelessStatus {
|
||||||
|
WirelessStatusUnknown = 0x00,
|
||||||
|
WirelessStatusUnmanaged = 0x01,
|
||||||
|
WirelessStatusUnavailable = 0x02,
|
||||||
|
WirelessStatusDisconnected = 0x03,
|
||||||
|
WirelessStatusPrepare = 0x04,
|
||||||
|
WirelessStatusConfig = 0x05,
|
||||||
|
WirelessStatusNeedAuth = 0x06,
|
||||||
|
WirelessStatusIpConfig = 0x07,
|
||||||
|
WirelessStatusIpCheck = 0x08,
|
||||||
|
WirelessStatusSecondaries = 0x09,
|
||||||
|
WirelessStatusActivated = 0x0A,
|
||||||
|
WirelessStatusDeactivating = 0x0B,
|
||||||
|
WirelessStatusFailed = 0x0C
|
||||||
|
};
|
||||||
|
Q_ENUM(WirelessStatus)
|
||||||
|
|
||||||
enum WirelessServiceCommand {
|
enum WirelessServiceCommand {
|
||||||
WirelessServiceCommandInvalid = -1,
|
WirelessServiceCommandInvalid = -1,
|
||||||
@ -94,34 +121,6 @@ public:
|
|||||||
};
|
};
|
||||||
Q_ENUM(SystemServiceResponse)
|
Q_ENUM(SystemServiceResponse)
|
||||||
|
|
||||||
enum NetworkStatus {
|
|
||||||
NetworkStatusUnknown = 0x00,
|
|
||||||
NetworkStatusAsleep = 0x01,
|
|
||||||
NetworkStatusDisconnected = 0x02,
|
|
||||||
NetworkStatusDisconnecting = 0x03,
|
|
||||||
NetworkStatusConnecting = 0x04,
|
|
||||||
NetworkStatusLocal = 0x05,
|
|
||||||
NetworkStatusConnectedSite = 0x06,
|
|
||||||
NetworkStatusGlobal = 0x07
|
|
||||||
};
|
|
||||||
Q_ENUM(NetworkStatus)
|
|
||||||
|
|
||||||
enum WirelessStatus {
|
|
||||||
WirelessStatusUnknown = 0x00,
|
|
||||||
WirelessStatusUnmanaged = 0x01,
|
|
||||||
WirelessStatusUnavailable = 0x02,
|
|
||||||
WirelessStatusDisconnected = 0x03,
|
|
||||||
WirelessStatusPrepare = 0x04,
|
|
||||||
WirelessStatusConfig = 0x05,
|
|
||||||
WirelessStatusNeedAuth = 0x06,
|
|
||||||
WirelessStatusIpConfig = 0x07,
|
|
||||||
WirelessStatusIpCheck = 0x08,
|
|
||||||
WirelessStatusSecondaries = 0x09,
|
|
||||||
WirelessStatusActivated = 0x0A,
|
|
||||||
WirelessStatusDeactivating = 0x0B,
|
|
||||||
WirelessStatusFailed = 0x0C
|
|
||||||
};
|
|
||||||
Q_ENUM(WirelessStatus)
|
|
||||||
|
|
||||||
explicit BtWiFiSetup(QObject *parent = nullptr);
|
explicit BtWiFiSetup(QObject *parent = nullptr);
|
||||||
|
|
||||||
@ -130,9 +129,9 @@ public:
|
|||||||
Q_INVOKABLE void connectDeviceToWiFi(const QString &ssid, const QString &password);
|
Q_INVOKABLE void connectDeviceToWiFi(const QString &ssid, const QString &password);
|
||||||
Q_INVOKABLE void disconnectDeviceFromWiFi();
|
Q_INVOKABLE void disconnectDeviceFromWiFi();
|
||||||
Q_INVOKABLE void scanWiFi();
|
Q_INVOKABLE void scanWiFi();
|
||||||
Q_INVOKABLE void pressPushButton();
|
Q_INVOKABLE bool pressPushButton();
|
||||||
|
|
||||||
Status status() const;
|
BluetoothStatus bluetoothStatus() const;
|
||||||
|
|
||||||
QString modelNumber() const;
|
QString modelNumber() const;
|
||||||
QString manufacturer() const;
|
QString manufacturer() const;
|
||||||
@ -152,7 +151,7 @@ public:
|
|||||||
WirelessAccessPoint *currentConnection() const;
|
WirelessAccessPoint *currentConnection() const;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void statusChanged(Status status);
|
void bluetoothStatusChanged(BluetoothStatus status);
|
||||||
void bluetoothConnectionError();
|
void bluetoothConnectionError();
|
||||||
void wifiSetupError();
|
void wifiSetupError();
|
||||||
|
|
||||||
@ -181,7 +180,7 @@ private slots:
|
|||||||
void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value);
|
void characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Status m_status = StatusDisconnected;
|
BluetoothStatus m_bluetoothStatus = BluetoothStatusDisconnected;
|
||||||
QLowEnergyController *m_btController = nullptr;
|
QLowEnergyController *m_btController = nullptr;
|
||||||
|
|
||||||
QLowEnergyService *m_deviceInformationService = nullptr;
|
QLowEnergyService *m_deviceInformationService = nullptr;
|
||||||
|
|||||||
Reference in New Issue
Block a user