我正在开发具有两个特性的蓝牙服务:一个是让其他设备读取 MAC 地址列表,另一个是为程序编写命令。 一切正常,唯一的问题是当我与主服务断开连接然后重新连接时,我可以看到两个服务,但无法读取或写入。 这是代码:
static const QLatin1String serviceUuid("11223344-5566-7788-99aa-bbccddeeff00");
static const QLatin1String readListUuid("11223344-5566-7788-99aa-bbccddeeff11");
static const QLatin1String writeListUuid("11223344-5566-7788-99aa-bbccddeeff12");
// [Advertising Data]
QLowEnergyAdvertisingData advertisingData;
advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
advertisingData.setIncludePowerLevel(true);
advertisingData.setLocalName("BOX");
advertisingData.setServices(QList<QBluetoothUuid>() << QBluetoothUuid(serviceUuid));
// [Service Data]
QLowEnergyCharacteristicData readList,writeList;
readList.setUuid(QBluetoothUuid(readListUuid));
readList.setProperties(QLowEnergyCharacteristic::Read);
writeList.setUuid(QBluetoothUuid(writeListUuid));
writeList.setProperties(QLowEnergyCharacteristic::Write);
const QLowEnergyDescriptorData clientConfig(QBluetoothUuid::CharacteristicUserDescription,QByteArray(2, 0));
readList.addDescriptor(clientConfig);
writeList.addDescriptor(clientConfig);
QLowEnergyServiceData serviceData;
serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(QBluetoothUuid(serviceUuid));
serviceData.addCharacteristic(readList);
serviceData.addCharacteristic(writeList);
// [Start Advertising]
leController.reset(QLowEnergyController::createPeripheral());
service_list.reset(leController->addService(serviceData));
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,advertisingData);
qCDebug(BLELog) << " Start BLE backend [...] ";
ConnectionHandler connectionHandler;
DeviceHandler m_deviceHandler;
// TODO! Restore debug options.
GenericDeviceIf::start(debugMode, protocolDebug);
// Initialize reachable state to unreachable.
DataModel::getInstance()->setDeviceCategoryReachable(_category, false);
_endpoints = DataModel::getInstance() ->getEndpointsListByCategory(dataBaseClasses::ENDPOINT_CATEGORY_BLE);
m_deviceHandler.setDevice(nullptr);
qDeleteAll(devices);
devices.clear();
emit devicesChanged();
qCDebug(BLELog) << "Scanning for devices...";
discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
emit scanningChanged();
// [Retrieving the list of devices]
QLowEnergyCharacteristic characteristic = service_list->characteristic(QBluetoothUuid(readListUuid));
QString sep = "\n";
for (const auto &e: _endpoints){
L.append(QString(e->getName()).toUtf8());
L.append(QString("\t").toUtf8());
L.append(QString(e->getMapping()).toUtf8());
L.append(QString(sep.toUtf8()));
}
L.resize(L.size()-1);
if (L.isEmpty())
qCDebug(BLELog) << "No endpoints loaded in the list";
else
service_list -> writeCharacteristic(characteristic, L) ;
// [Reconnect to the service when it disconnects]
auto reconnect = [this , serviceData, advertisingData]()
{
service_list.reset(leController->addService(serviceData));
if (!service_list.isNull()) {
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData, advertisingData);
}
};
auto getCommand = [this, serviceData, advertisingData]()
{
command = service_list->characteristic(QBluetoothUuid(writeListUuid)).value();
qCDebug(BLELog) << command;
};
QObject::connect(leController.data(), &QLowEnergyController::disconnected, reconnect);
QObject::connect(service_list.get() , &QLowEnergyService::characteristicChanged, getCommand);
在头文件中 service_list 和 leController 定义如下:
QScopedPointer<QLowEnergyController> leController;
QScopedPointer<QLowEnergyService> service_list;
我根据心率服务器示例编写了代码。