QT 低功耗控制器外设模式崩溃并出现错误"Resource not available"



更新:

Qt版本:5.11

平台 : 树莓派 3

操作系统 : 拉斯宾语

我正在将我的 linux Qt BLE 应用程序连接到 IOS 中央设备。它在大多数情况下工作正常,但有时它会崩溃并出现以下错误

qt.bluetooth.bluez: void QBluetoothSocketPrivate::_q_readNotify(( 29 错误: -1 "资源暂时不可用">

下面是代码和基础方案。

我有一个运行Qt 5.11的覆盆子派,我创建了一个BLE低功耗外围设备,可以连接到IOS应用程序并发送和接收数据。

声明:

QLowEnergyCharacteristicData ReadCharacteristicData,
WriteCharactersiticData,       
ConnectivityData,
TrackerData_Data; 
QLowEnergyCharacteristic charas;
QLowEnergyDescriptorData  ReadCharacteristicDesc,
WriteCharactersiticDesc,
ConnectivityDesc,
TrackerDesc;
QLowEnergyServiceData serviceData;
QScopedPointer<QLowEnergyController> leController; 
QScopedPointer<QLowEnergyService> service;

服务初始化 :'


Here I am initializing bluetooth service
//! [Advertising Data]
advertisingData.setDiscoverability(QLowEnergyAdvertisingData::DiscoverabilityGeneral);
advertisingData.setLocalName("Atlas360Dev");
advertisingData.setServices(QList<QBluetoothUuid>()<<QBluetoothUuid::Atlas);
// For IOS its readonly and for Atlas its write only
ReadCharacteristicData.setUuid(QBluetoothUuid::ReadCharacteristic);
ReadCharacteristicData.setProperties(QLowEnergyCharacteristic::Notify);
ReadCharacteristicDesc.setUuid(QBluetoothUuid::ClientCharacteristicConfiguration);
ReadCharacteristicDesc.setValue(QByteArray(2,0));
ReadCharacteristicData.addDescriptor(ReadCharacteristicDesc);

// For IOS its write only characteristic and for Atlas its read only
WriteCharactersiticData.setUuid(QBluetoothUuid::WriteCharacteristic);
WriteCharactersiticData.setProperties(QLowEnergyCharacteristic::Write |QLowEnergyCharacteristic::Notify);
WriteCharactersiticDesc.setUuid(QBluetoothUuid::AtlasDescriptor);
WriteCharactersiticDesc.setValue(QByteArray::fromHex("Write").toHex());
WriteCharactersiticData.addDescriptor(WriteCharactersiticDesc);
// For IOS its readonly and for Atlas its write only
ConnectivityData.setUuid(QBluetoothUuid::Connectivity);
ConnectivityData.setProperties(QLowEnergyCharacteristic::Notify);
ConnectivityDesc.setUuid(QBluetoothUuid::ClientCharacteristicConfiguration);
ConnectivityDesc.setValue(QByteArray(2, 0));
ConnectivityData.addDescriptor(ConnectivityDesc);

// For IOS its write only characteristic and for Atlas its read only
TrackerData_Data.setUuid(QBluetoothUuid::TrackingData);
TrackerData_Data.setProperties(QLowEnergyCharacteristic::Notify);
TrackerDesc.setUuid(QBluetoothUuid::ClientCharacteristicConfiguration);
TrackerDesc.setValue(QByteArray(2, 0));
TrackerData_Data.addDescriptor(TrackerDesc);

serviceData.setType(QLowEnergyServiceData::ServiceTypePrimary);
serviceData.setUuid(QBluetoothUuid::Atlas);
serviceData.addCharacteristic(ReadCharacteristicData);
serviceData.addCharacteristic(WriteCharactersiticData);
serviceData.addCharacteristic(ConnectivityData);
serviceData.addCharacteristic(TrackerData_Data);

leController.reset(QLowEnergyController::createPeripheral());


// leController->addService(serviceData) will return a pointer to service object
service.reset(leController->addService(serviceData));
leController->startAdvertising(QLowEnergyAdvertisingParameters(), advertisingData,advertisingData);

connect(&heartbeatTimer, &QTimer::timeout,this, &mainprocess::TickProvider);
connect(leController.data(), &QLowEnergyController::disconnected,this,&mainprocess::reconnect);
connect(service.data(),&QLowEnergyService::characteristicChanged,this,&mainprocess::printvalue);
heartbeatTimer.start(30);

///////////////////////////////////////
This sends data to IOS app every 30ms
///////////////////////////////////////
void mainprocess::TickProvider ()
{
if(Tracker.isRunning())
{
// sending Tracker Data
I have ommitted the code

QLowEnergyCharacteristic Charac_1 = service->characteristic(QBluetoothUuid::TrackingData);
service->writeCharacteristic(Charac_1,trackingdata);
}

// Sending Connectivity Status
QByteArray connectivity;
QLowEnergyCharacteristic Charac_2 = service->characteristic(QBluetoothUuid::Connectivity);
service->writeCharacteristic(Charac_2,connectivity);
}
//////////////////////////////////////////////////////////
Here I receive commands from IOS and respond accordingly
/////////////////////////////////////////////////////////
void mainprocess::printvalue(const QLowEnergyCharacteristic &info, const QByteArray &ba){

if (info.uuid()== QBluetoothUuid(QBluetoothUuid::WriteCharacteristic)){

// Username
if(ba.at(0)==0xA1){
}
// Password
if(ba.at(0)==0xA2){
}
// Tour Title
if(ba.at(0)==0xA3){
}
// Section Title
if(ba.at(0)==0xA4){
}
// Distance Interval
if(ba.at(0)==0xA7){
}
// Countdown
if(ba.at(0)==0xA8){
}
// Address
if(ba.at(0)==0xA9){
}
// Address Upload Later
if(ba.at(0)==0xA5){
}
// Mode
if(ba.at(0)==0xAA){
}
}
}
/////////////////////
Reconnect Function
////////////////////
void mainprocess::reconnect()
{
qDebug()<<"Reconnect Called";
//initializeBluetooth();
// connect(leController.data(), &QLowEnergyController::disconnected,this,&mainprocess::reconnect);
service.reset(leController->addService(serviceData));
connect(service.data(),&QLowEnergyService::characteristicChanged,this,&mainprocess::printvalue);
if (service!=nullptr)
leController->startAdvertising(QLowEnergyAdvertisingParameters(),
advertisingData,advertisingData);//, advertisingData);
}

在BLE扫描期间,同样的情况也发生在我身上。似乎由于某种原因设备已关闭(可以通过hcitool命令进行调查 - 在Linux平台上(

您应该将插槽连接到以下信号:

QBluetoothDeviceDiscoveryAgent::error(QBluetoothDeviceDiscoveryAgent::Error(

您可能会发现您的设备已关闭。

在这种情况下,请检查以下内容:

QBluetoothLocalDevice::hostMode((

如果它返回QBluetoothLocalDevice::HostPoweredOff,只需执行以下操作:

your_bluetooth_local_device->powerOn();

无论如何:请添加一个完整的示例,说明您实际在做什么,使用的Qt版本,平台。

这很可能与此处描述的问题相同:QBluetoothSocketPrivate::_q_readNotify(( 14 错误 根据SteffenH的说法,您必须为每个服务套接字连接使用单独的端口。我相信目前您只使用端口 1。

相关内容

最新更新