Fix bluetooth server initialisation and add auto serialnumber and auto devicename mechanism
This commit is contained in:
parent
95e5cb549c
commit
58fd8466f7
@ -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()
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user