Fix bluetooth server initialisation and add auto serialnumber and auto devicename mechanism

This commit is contained in:
Simon Stürz 2019-09-19 15:03:43 +02:00
parent 95e5cb549c
commit 58fd8466f7
6 changed files with 89 additions and 29 deletions

View File

@ -23,6 +23,9 @@
#include "../networkmanager.h" #include "../networkmanager.h"
#include "../networkmanagerutils.h" #include "../networkmanagerutils.h"
#include <QFile>
#include <QSysInfo>
BluetoothServer::BluetoothServer(NetworkManager *networkManager) : BluetoothServer::BluetoothServer(NetworkManager *networkManager) :
QObject(networkManager), QObject(networkManager),
m_networkManager(networkManager) m_networkManager(networkManager)
@ -41,6 +44,16 @@ BluetoothServer::~BluetoothServer()
} }
QString BluetoothServer::advertiseName() const
{
return m_advertiseName;
}
void BluetoothServer::setAdvertiseName(const QString &advertiseName)
{
m_advertiseName = advertiseName;
}
QString BluetoothServer::modelName() const QString BluetoothServer::modelName() const
{ {
return m_modelName; return m_modelName;
@ -51,16 +64,6 @@ void BluetoothServer::setModelName(const QString &modelName)
m_modelName = modelName; m_modelName = modelName;
} }
QString BluetoothServer::serverName() const
{
return m_serverName;
}
void BluetoothServer::setServerName(const QString &serverName)
{
m_serverName = serverName;
}
QString BluetoothServer::softwareVersion() const QString BluetoothServer::softwareVersion() const
{ {
return m_softwareVersion; return m_softwareVersion;
@ -81,6 +84,16 @@ void BluetoothServer::setHardwareVersion(const QString &hardwareVersion)
m_hardwareVersion = hardwareVersion; m_hardwareVersion = hardwareVersion;
} }
QString BluetoothServer::serialNumber() const
{
return m_serialNumber;
}
void BluetoothServer::setSerialNumber(const QString &serialNumber)
{
m_serialNumber = serialNumber;
}
bool BluetoothServer::running() const bool BluetoothServer::running() const
{ {
return m_running; return m_running;
@ -109,6 +122,18 @@ QLowEnergyServiceData BluetoothServer::deviceInformationServiceData()
modelNumberCharData.setProperties(QLowEnergyCharacteristic::Read); modelNumberCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(modelNumberCharData); serviceData.addCharacteristic(modelNumberCharData);
// Serial number string 0x2a25
QLowEnergyCharacteristicData serialNumberCharData;
serialNumberCharData.setUuid(QBluetoothUuid::SerialNumberString);
if (m_serialNumber.isNull()) {
// Note: if no serialnumber specified use the system uuid from /etc/machine-id
qCWarning(dcNetworkManagerBluetoothServer()) << "Serial number not specified. Using system uuid from /etc/machine-id as serialnumber.";
m_serialNumber = readMachineId().toString();
}
serialNumberCharData.setValue(m_serialNumber.toUtf8());
serialNumberCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(serialNumberCharData);
// Firmware revision string 0x2a26 // Firmware revision string 0x2a26
QLowEnergyCharacteristicData firmwareRevisionCharData; QLowEnergyCharacteristicData firmwareRevisionCharData;
firmwareRevisionCharData.setUuid(QBluetoothUuid::FirmwareRevisionString); firmwareRevisionCharData.setUuid(QBluetoothUuid::FirmwareRevisionString);
@ -149,7 +174,11 @@ QLowEnergyServiceData BluetoothServer::genericAccessServiceData()
// Device name 0x2a00 // Device name 0x2a00
QLowEnergyCharacteristicData nameCharData; QLowEnergyCharacteristicData nameCharData;
nameCharData.setUuid(QBluetoothUuid::DeviceName); nameCharData.setUuid(QBluetoothUuid::DeviceName);
nameCharData.setValue(m_serverName.toUtf8()); if (m_advertiseName.isNull()) {
qCWarning(dcNetworkManagerBluetoothServer()) << "Advertise name not specified. Using system host name as device name.";
m_advertiseName = QSysInfo::machineHostName();
}
nameCharData.setValue(m_advertiseName.toUtf8());
nameCharData.setProperties(QLowEnergyCharacteristic::Read); nameCharData.setProperties(QLowEnergyCharacteristic::Read);
serviceData.addCharacteristic(nameCharData); serviceData.addCharacteristic(nameCharData);
@ -210,6 +239,25 @@ void BluetoothServer::setConnected(bool connected)
emit connectedChanged(m_connected); emit connectedChanged(m_connected);
} }
QUuid BluetoothServer::readMachineId()
{
QUuid systemUuid;
QFile systemUuidFile("/etc/machine-id");
if (systemUuidFile.open(QFile::ReadOnly)) {
QString tmpId = QString::fromLatin1(systemUuidFile.readAll()).trimmed();
tmpId.insert(8, "-");
tmpId.insert(13, "-");
tmpId.insert(18, "-");
tmpId.insert(23, "-");
systemUuid = QUuid(tmpId);
} else {
qWarning(dcNetworkManagerBluetoothServer()) << "Failed to open /etc/machine-id for reading the system uuid as device information serialnumber.";
}
systemUuidFile.close();
return systemUuid;
}
void BluetoothServer::onHostModeStateChanged(const QBluetoothLocalDevice::HostMode mode) void BluetoothServer::onHostModeStateChanged(const QBluetoothLocalDevice::HostMode mode)
{ {
switch (mode) { switch (mode) {
@ -389,13 +437,15 @@ void BluetoothServer::start()
m_genericAttributeService = m_controller->addService(genericAttributeServiceData(), m_controller); m_genericAttributeService = m_controller->addService(genericAttributeServiceData(), m_controller);
// Create custom services // Create custom services
m_networkService = new NetworkService(m_controller->addService(NetworkService::serviceData(), m_controller), m_networkManager, m_controller); m_networkService = new NetworkService(m_controller->addService(NetworkService::serviceData(m_networkManager), m_controller),
m_wirelessService = new WirelessService(m_controller->addService(WirelessService::serviceData(), m_controller), m_networkManager, m_controller); m_networkManager, m_controller);
m_wirelessService = new WirelessService(m_controller->addService(WirelessService::serviceData(m_networkManager), m_controller),
m_networkManager, m_controller);
QLowEnergyAdvertisingData advertisingData; QLowEnergyAdvertisingData advertisingData;
advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral); advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
advertisingData.setIncludePowerLevel(true); advertisingData.setIncludePowerLevel(true);
advertisingData.setLocalName(m_serverName); advertisingData.setLocalName(m_advertiseName);
// FIXME: set guh manufacturer SIG data once available // FIXME: set guh manufacturer SIG data once available
@ -403,11 +453,10 @@ void BluetoothServer::start()
QLowEnergyAdvertisingParameters advertisingParameters; QLowEnergyAdvertisingParameters advertisingParameters;
advertisingParameters.setInterval(100,100); advertisingParameters.setInterval(100,100);
qCDebug(dcNetworkManagerBluetoothServer()) << "Start advertising" << m_serverName << m_localDevice->address().toString(); qCDebug(dcNetworkManagerBluetoothServer()) << "Start advertising" << m_advertiseName << m_localDevice->address().toString();
m_controller->startAdvertising(advertisingParameters, advertisingData, advertisingData); m_controller->startAdvertising(advertisingParameters, advertisingData, advertisingData);
// Start the advertising timer // Note: setRunning(true) will be called when the service is really advertising, see onControllerStateChanged()
setRunning(true);
} }
void BluetoothServer::stop() void BluetoothServer::stop()

View File

@ -51,27 +51,32 @@ public:
explicit BluetoothServer(NetworkManager *networkManager); explicit BluetoothServer(NetworkManager *networkManager);
~BluetoothServer(); ~BluetoothServer();
QString advertiseName() const;
void setAdvertiseName(const QString &advertiseName);
// Information for the device info service // Information for the device info service
QString modelName() const; QString modelName() const;
void setModelName(const QString &modelName); void setModelName(const QString &modelName);
QString serverName() const;
void setServerName(const QString &serverName);
QString softwareVersion() const; QString softwareVersion() const;
void setSoftwareVersion(const QString &softwareVersion); void setSoftwareVersion(const QString &softwareVersion);
QString hardwareVersion() const; QString hardwareVersion() const;
void setHardwareVersion(const QString &hardwareVersion); void setHardwareVersion(const QString &hardwareVersion);
QString serialNumber() const;
void setSerialNumber(const QString &serialNumber);
bool running() const; bool running() const;
bool connected() const; bool connected() const;
private: private:
QString m_advertiseName;
QString m_modelName; QString m_modelName;
QString m_serverName;
QString m_softwareVersion; QString m_softwareVersion;
QString m_hardwareVersion; QString m_hardwareVersion;
QString m_serialNumber;
NetworkManager *m_networkManager = nullptr; NetworkManager *m_networkManager = nullptr;
QBluetoothLocalDevice *m_localDevice = nullptr; QBluetoothLocalDevice *m_localDevice = nullptr;
@ -94,6 +99,8 @@ private:
void setRunning(bool running); void setRunning(bool running);
void setConnected(bool connected); void setConnected(bool connected);
QUuid readMachineId();
signals: signals:
void runningChanged(const bool &running); void runningChanged(const bool &running);
void connectedChanged(const bool &connected); void connectedChanged(const bool &connected);

View File

@ -51,7 +51,7 @@ QLowEnergyService *NetworkService::service()
return m_service; return m_service;
} }
QLowEnergyServiceData NetworkService::serviceData() QLowEnergyServiceData NetworkService::serviceData(NetworkManager *networkManager)
{ {
QLowEnergyServiceData serviceData; QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
@ -65,7 +65,7 @@ QLowEnergyServiceData NetworkService::serviceData()
networkStatusData.setValue(QByteArray(1, 0)); networkStatusData.setValue(QByteArray(1, 0));
networkStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); networkStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify);
networkStatusData.addDescriptor(clientConfigDescriptorData); networkStatusData.addDescriptor(clientConfigDescriptorData);
networkStatusData.setValue(NetworkService::getNetworkManagerStateByteArray(NetworkManager::NetworkManagerStateUnknown)); networkStatusData.setValue(NetworkService::getNetworkManagerStateByteArray(networkManager->state()));
serviceData.addCharacteristic(networkStatusData); serviceData.addCharacteristic(networkStatusData);
// Network manager commander ef6d6612-b8af-49e0-9eca-ab343513641c // Network manager commander ef6d6612-b8af-49e0-9eca-ab343513641c
@ -88,7 +88,7 @@ QLowEnergyServiceData NetworkService::serviceData()
networkingEnabledStatusData.setUuid(networkingEnabledCharacteristicUuid); networkingEnabledStatusData.setUuid(networkingEnabledCharacteristicUuid);
networkingEnabledStatusData.setValue(QByteArray(1, 0)); networkingEnabledStatusData.setValue(QByteArray(1, 0));
networkingEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); networkingEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify);
networkingEnabledStatusData.setValue(QByteArray::number(0)); networkingEnabledStatusData.setValue(QByteArray::number(static_cast<int>(networkManager->networkingEnabled())));
serviceData.addCharacteristic(networkingEnabledStatusData); serviceData.addCharacteristic(networkingEnabledStatusData);
// Wireless enabled ef6d6615-b8af-49e0-9eca-ab343513641c // Wireless enabled ef6d6615-b8af-49e0-9eca-ab343513641c
@ -96,7 +96,7 @@ QLowEnergyServiceData NetworkService::serviceData()
wirelessEnabledStatusData.setUuid(wirelessEnabledCharacteristicUuid); wirelessEnabledStatusData.setUuid(wirelessEnabledCharacteristicUuid);
wirelessEnabledStatusData.setValue(QByteArray(1, 0)); wirelessEnabledStatusData.setValue(QByteArray(1, 0));
wirelessEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); wirelessEnabledStatusData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify);
wirelessEnabledStatusData.setValue(QByteArray::number(0)); wirelessEnabledStatusData.setValue(QByteArray::number(static_cast<int>(networkManager->wirelessEnabled())));
serviceData.addCharacteristic(wirelessEnabledStatusData); serviceData.addCharacteristic(wirelessEnabledStatusData);
return serviceData; return serviceData;

View File

@ -56,7 +56,7 @@ public:
QLowEnergyService *service(); QLowEnergyService *service();
static QLowEnergyServiceData serviceData(); static QLowEnergyServiceData serviceData(NetworkManager *networkManager);
static QByteArray getNetworkManagerStateByteArray(const NetworkManager::NetworkManagerState &state); static QByteArray getNetworkManagerStateByteArray(const NetworkManager::NetworkManagerState &state);
private: private:

View File

@ -59,7 +59,7 @@ QLowEnergyService *WirelessService::service()
return m_service; return m_service;
} }
QLowEnergyServiceData WirelessService::serviceData() QLowEnergyServiceData WirelessService::serviceData(NetworkManager *networkManager)
{ {
QLowEnergyServiceData serviceData; QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary); serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
@ -88,7 +88,11 @@ QLowEnergyServiceData WirelessService::serviceData()
wirelessStatusCharacteristicData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify); wirelessStatusCharacteristicData.setProperties(QLowEnergyCharacteristic::Read | QLowEnergyCharacteristic::Notify);
wirelessStatusCharacteristicData.addDescriptor(clientConfigDescriptorData); wirelessStatusCharacteristicData.addDescriptor(clientConfigDescriptorData);
wirelessStatusCharacteristicData.setValueLength(1, 1); wirelessStatusCharacteristicData.setValueLength(1, 1);
wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(NetworkDevice::NetworkDeviceStateUnavailable)); if (networkManager->wirelessNetworkDevices().isEmpty()) {
wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(NetworkDevice::NetworkDeviceStateUnknown));
} else {
wirelessStatusCharacteristicData.setValue(WirelessService::getWirelessNetworkDeviceState(networkManager->wirelessNetworkDevices().first()->deviceState()));
}
serviceData.addCharacteristic(wirelessStatusCharacteristicData); serviceData.addCharacteristic(wirelessStatusCharacteristicData);
return serviceData; return serviceData;

View File

@ -63,7 +63,7 @@ public:
explicit WirelessService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent = nullptr); explicit WirelessService(QLowEnergyService *service, NetworkManager *networkManager, QObject *parent = nullptr);
QLowEnergyService *service(); QLowEnergyService *service();
static QLowEnergyServiceData serviceData(); static QLowEnergyServiceData serviceData(NetworkManager *networkManager);
private: private:
QLowEnergyService *m_service = nullptr; QLowEnergyService *m_service = nullptr;