QLowEnergyService Class
QLowEnergyService 클래스는 블루투스 저에너지(Bluetooth Low Energy) 장치상의 개별 서비스를 나타냅니다. 더 보기...
| 헤더: | #include <QLowEnergyService> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Bluetooth) target_link_libraries(mytarget PRIVATE Qt6::Bluetooth) |
| qmake: | QT += bluetooth |
| 상속: | QObject |
공개 유형
(since 6.2) enum | DiscoveryMode { FullDiscovery, SkipValueDiscovery } |
| enum | ServiceError { NoError, OperationError, CharacteristicReadError, CharacteristicWriteError, DescriptorReadError, …, UnknownError } |
| enum | ServiceState { InvalidService, RemoteService, RemoteServiceDiscovering, RemoteServiceDiscovered, LocalService, …, ServiceDiscovered } |
| enum | ServiceType { PrimaryService, IncludedService } |
| flags | ServiceTypes |
| enum | WriteMode { WriteWithResponse, WriteWithoutResponse, WriteSigned } |
공개 함수
| virtual | ~QLowEnergyService() |
| QLowEnergyCharacteristic | characteristic(const QBluetoothUuid &uuid) const |
| QList<QLowEnergyCharacteristic> | characteristics() const |
| bool | contains(const QLowEnergyCharacteristic &characteristic) const |
| bool | contains(const QLowEnergyDescriptor &descriptor) const |
| void | discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery) |
| QLowEnergyService::ServiceError | error() const |
| QList<QBluetoothUuid> | includedServices() const |
| void | readCharacteristic(const QLowEnergyCharacteristic &characteristic) |
| void | readDescriptor(const QLowEnergyDescriptor &descriptor) |
| QString | serviceName() const |
| QBluetoothUuid | serviceUuid() const |
| QLowEnergyService::ServiceState | state() const |
| QLowEnergyService::ServiceTypes | type() const |
| void | writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse) |
| void | writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) |
신호
| void | characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) |
| void | characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value) |
| void | characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue) |
| void | descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value) |
| void | descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue) |
(since 6.2) void | errorOccurred(QLowEnergyService::ServiceError newError) |
| void | stateChanged(QLowEnergyService::ServiceState newState) |
상세 설명
QLowEnergyService는 블루투스 저에너지(Bluetooth Low Energy) 서비스의 세부 정보에 대한 액세스를 제공합니다. 이 클래스는 서비스 세부 정보의 검색 및 공개를 용이하게 하고, 포함된 데이터의 읽기 및 쓰기를 허용하며, 데이터 변경 사항을 알립니다.
서비스 구조
블루투스 저에너지(Bluetooth Low Energy) 주변 기기에는 여러 서비스가 포함될 수 있습니다. 또한 각 서비스는 하위 서비스를 포함할 수도 있습니다. 이 클래스는 주변 기기의 단일 서비스를 나타내며, ` QLowEnergyController::createServiceObject()`를 통해 생성됩니다. ` type()`는 해당 서비스가 기본(최상위) 서비스인지, 아니면 다른 서비스의 일부인지 여부를 나타냅니다. 각 서비스는 하나 이상의 특성을 포함할 수 있으며, 각 특성은 디스크립터를 포함할 수 있습니다. 그 결과 구조는 다음 다이어그램과 같을 수 있습니다:

특성은 주요 정보 전달체입니다. 이 특성에는 값에 대한 접근 권한을 설명하는 value() 및 properties()가 있습니다. 포함된 디스크립터의 일반적인 목적은 특성의 성격을 더 구체적으로 정의하는 것입니다. 예를 들어, 값을 어떻게 해석해야 하는지, 또는 값이 변경되었을 때 값 소비자에게 알릴 수 있는지 여부를 명시할 수 있습니다.
서비스 상호작용
서비스 객체가 처음 생성되면, 해당 객체의 세부 정보는 아직 파악되지 않은 상태입니다. 이는 현재 state() 값이 DiscoveryRequired 인 것으로 나타납니다. 이때는 serviceUuid()과 serviceName()만 조회할 수 있습니다.
discoverDetails()을 호출하면 포함된 서비스, 특성 및 디스크립터의 탐색이 트리거됩니다. 탐색 과정에서 state()은 DiscoveryRequired 에서 DiscoveringService 을 거쳐 최종 상태인 ServiceDiscovered 로 전환됩니다. 이 전환은 stateChanged() 신호를 통해 알립니다. 세부 정보가 확인되면 포함된 모든 특성, 디스크립터 및 서비스가 파악되며, 이를 읽거나 쓸 수 있게 됩니다.
특성(characteristics)과 설명자(descriptors)의 값은 각각 QLowEnergyCharacteristic 및 QLowEnergyDescriptor 를 통해 가져올 수 있습니다. 그러나 이러한 속성을 직접 읽거나 쓰려면 서비스 객체가 필요합니다. readCharacteristic() 함수는 특성의 값을 다시 읽으려고 시도합니다. 초기 서비스 탐색을 통해 이미 값을 얻었을지라도, 알림이 제공되지 않은 상태에서 특성 값이 지속적으로 변경되는 경우에는 이 호출이 필요할 수 있습니다. 예를 들어, 연속적인 값을 제공하는 시간 특성(time characteristic)이 있을 수 있습니다. 읽기 시도가 성공하면 characteristicRead() 신호가 발생합니다. 값 읽기에 실패하면 CharacteristicReadError 이 발생합니다. writeCharacteristic() 함수는 지정된 특성에 새로운 값을 쓰려고 시도합니다. 쓰기 시도가 성공하면 characteristicWritten() 신호가 발생합니다. 쓰기 작업에 실패하면 CharacteristicWriteError 가 트리거됩니다. 디스크립터의 읽기 및 쓰기는 동일한 패턴을 따릅니다.
모든 시도는 하드웨어 상의 디스크립터나 특성 값을 읽거나 쓰기 위한 것입니다. 즉, 읽기 및 쓰기 시 QLowEnergyCharacteristic::properties()와 같은 메타 정보는 일반적으로 무시됩니다. 예를 들어, 메타데이터 설명에 따라 특성이 읽기 전용으로 지정되어 있더라도 writeCharacteristic()를 호출할 수 있습니다. 결과적인 쓰기 요청은 연결된 장치로 전달되며, 잠재적으로 유효하지 않은 요청에 대한 응답은 장치의 재량에 달려 있습니다. 이 경우, 반환된 장치 오류에 대한 응답으로 ` CharacteristicWriteError `가 발생합니다. 이러한 동작은 잘못된 메타 정보를 보고하는 장치와의 상호작용을 단순화합니다. 요청을 원격 장치로 전달할 수 없는 경우 ` OperationError `가 설정됩니다. 가능한 원인 중 하나는 쓰기 대상 특성 객체가 현재 서비스에 속하지 않는 경우일 수 있습니다. 요약하면, 이 두 가지 유형의 오류를 통해 로컬 오류와 원격 오류 사례를 신속하게 구분할 수 있습니다.
모든 요청은 선입선출(FIFO) 원칙에 따라 순차 처리됩니다. 예를 들어, 이전 쓰기 요청이 완료되기 전에 두 번째 쓰기 요청을 발행하면, 첫 번째 쓰기 요청이 완료될 때까지 두 번째 요청이 지연됩니다.
참고: 현재 서명된 쓰기 또는 신뢰성 있는 쓰기 요청을 전송할 수는 없습니다.
경우에 따라 주변 장치가 값 업데이트를 생성하고, 중앙 장치가 이를 수신하기를 원할 수 있습니다. 특성이 이러한 알림을 지원하려면 ‘ QLowEnergyCharacteristic::Notify ’ 또는 ‘ QLowEnergyCharacteristic::Indicate ’ 속성을 가지고 있어야 하며, ‘ QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration ’ 유형의 디스크립터가 있어야 합니다. 이러한 조건이 충족되면 다음 코드 조각에 표시된 대로 알림을 활성화할 수 있습니다:
//PreCondition: service details already discovered
QLowEnergyCharacteristic batteryLevel = service->characteristic(
QBluetoothUuid::CharacteristicType::BatteryLevel);
if (!batteryLevel.isValid())
return;
QLowEnergyDescriptor notification = batteryLevel.descriptor(
QBluetoothUuid::DescriptorType::ClientCharacteristicConfiguration);
if (!notification.isValid())
return;
// establish hook into notifications
connect(service, SIGNAL(characteristicChanged(QLowEnergyCharacteristic,QByteArray)),
this, SLOT(characteristicChanged(QLowEnergyCharacteristic,QByteArray)));
// enable notification
service->writeDescriptor(notification, QByteArray::fromHex("0100"));
// disable notification
//service->writeDescriptor(notification, QByteArray::fromHex("0000"));
// wait until descriptorWritten() signal is emitted
// to confirm successful write이 예제는 값이 변경될 때마다 센트럴에 업데이트를 전송하는 배터리 잔량 특성(characteristic)을 보여줍니다. 알림은 characteristicChanged() 신호를 통해 제공됩니다. 이 메커니즘에 대한 자세한 내용은 블루투스 사양서에서 확인할 수 있습니다.
서비스 데이터 공유
각 QLowEnergyService 인스턴스는 동일한 서비스에 속한 다른 QLowEnergyService 인스턴스와 내부 상태 및 정보를 공유합니다. 한 인스턴스가 서비스 세부 정보 탐색을 시작하면 나머지 모든 인스턴스가 자동으로 이를 따릅니다. 따라서 다음 코드 조각은 항상 정상적으로 작동합니다:
QLowEnergyService *first, *second;
QLowEnergyController control(remoteDevice);
control.connectToDevice();
// waiting for connection
first = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService);
second = control.createServiceObject(QBluetoothUuid::ServiceClassUuid::BatteryService);
Q_ASSERT(first->state() == QLowEnergyService::RemoteService);
Q_ASSERT(first->state() == second->state());
first->discoverDetails();
Q_ASSERT(first->state() == QLowEnergyService::RemoteServiceDiscovering);
Q_ASSERT(first->state() == second->state());readCharacteristic(), readDescriptor(), writeCharacteristic(), writeDescriptor() 호출이나, 관련 QLowEnergyController 가 장치에서 연결이 끊어짐에 따른 서비스 무효화 등의 다른 작업들도 동일한 방식으로 공유됩니다.
QLowEnergyController, QLowEnergyCharacteristic 및 QLowEnergyDescriptor도 참조하십시오 .
멤버 유형 문서
[since 6.2] enum QLowEnergyService::DiscoveryMode
이 열거형은 서비스 검색 모드를 나열합니다. 모든 모드는 서비스의 특성과 해당 특성의 설명자를 검색합니다. 각 모드는 특성 값과 설명자를 읽는지 여부에 따라 차이가 있습니다.
| 상수 | 값 | 설명 |
|---|---|---|
QLowEnergyService::FullDiscovery | 0 | 전체 검색 시 모든 특성이 검색됩니다. 모든 특성 값과 설명자가 읽힙니다. |
QLowEnergyService::SkipValueDiscovery | 1 | 최소 탐색 시에는 모든 특성이 탐색됩니다. 특성 값과 설명자는 읽히지 않습니다. |
이 열거형은 Qt 6.2에서 도입되었습니다.
discoverDetails()도 참조하십시오 .
enum QLowEnergyService::ServiceError
이 열거형은 서비스가 실행되는 동안 발생할 수 있는 모든 오류 상황을 설명합니다. ` error()` 함수는 가장 최근에 발생한 오류를 반환합니다.
| 상수 | 값 | 설명 |
|---|---|---|
QLowEnergyService::NoError | 0 | 오류가 발생하지 않았습니다. |
QLowEnergyService::OperationError | 1 | 서비스가 준비되지 않은 상태에서 작업이 시도되었습니다. 예를 들어, 서비스가 아직 ServiceDiscovered state () 상태에 있지 않은 상태에서 서비스에 쓰기를 시도하거나, 주변 장치와의 연결이 끊어져 서비스가 유효하지 않은 경우 등이 있습니다. |
QLowEnergyService::CharacteristicReadError (since Qt 5.5) | 5 | 특성 값을 읽으려는 시도가 실패했습니다. 예를 들어, readCharacteristic() 호출에 대한 응답으로 트리거될 수 있습니다. |
QLowEnergyService::CharacteristicWriteError | 2 | 특성에 새 값을 쓰려는 시도가 실패했습니다. 예를 들어, 읽기 전용 특성에 쓰기를 시도할 때 이 오류가 발생할 수 있습니다. |
QLowEnergyService::DescriptorReadError (since Qt 5.5) | 6 | 디스크립터 값을 읽으려는 시도가 실패했습니다. 예를 들어, readDescriptor() 호출에 대한 응답으로 이 오류가 발생할 수 있습니다. |
QLowEnergyService::DescriptorWriteError | 3 | 디스크립터에 새 값을 쓰려는 시도가 실패했습니다. 예를 들어, 읽기 전용 디스크립터에 쓰기를 시도할 때 이 오류가 발생할 수 있습니다. |
QLowEnergyService::UnknownError (since Qt 5.5) | 4 | 서비스와 상호작용하는 과정에서 알 수 없는 오류가 발생했습니다. |
enum QLowEnergyService::ServiceState
이 열거형은 서비스 객체의 state()를 설명합니다.
| 상수 | 값 | 설명 |
|---|---|---|
QLowEnergyService::InvalidService | 0 | 서비스는 기본 장치와의 연결이 끊어지면 무효 상태가 될 수 있습니다. 연결이 끊어졌더라도 서비스는 마지막 정보를 유지합니다. 무효 상태가 된 서비스는 장치와의 연결이 다시 설정되더라도 유효한 상태로 돌아갈 수 없습니다. |
QLowEnergyService::RemoteService | 1 | 서비스 세부 정보는 discoverDetails()를 호출하여 확인해야 합니다. 유일하게 신뢰할 수 있는 정보는 serviceUuid() 및 serviceName()입니다. |
QLowEnergyService::RemoteServiceDiscovering | 2 | 서비스 세부 정보를 탐색 중입니다. |
QLowEnergyService::RemoteServiceDiscovered | 3 | 서비스 세부 정보가 확인되었습니다. |
QLowEnergyService::LocalService (since Qt 5.7) | 4 | 이 서비스는 peripheral role 내의 컨트롤러 객체와 연결되어 있습니다. 이러한 서비스 객체는 상태를 변경하지 않습니다. |
QLowEnergyService::DiscoveryRequired | RemoteService | 사용 중단됨. RemoteService로 이름이 변경되었습니다. |
QLowEnergyService::DiscoveringService | RemoteServiceDiscovering | 사용 중단됨. RemoteServiceDiscovering으로 이름이 변경되었습니다. |
QLowEnergyService::ServiceDiscovered | RemoteServiceDiscovered | 사용 중단되었습니다. RemoteServiceDiscovered로 이름이 변경되었습니다. |
enum QLowEnergyService::ServiceType
flags QLowEnergyService::ServiceTypes
이 열거형은 서비스의 유형을 나타냅니다.
| 상수 | 값 | 설명 |
|---|---|---|
QLowEnergyService::PrimaryService | 0x0001 | 이 서비스는 최상위/주 서비스입니다. 이 유형 플래그가 설정되지 않은 경우, 해당 서비스는 보조 서비스로 간주됩니다. 각 서비스는 다른 서비스에 포함될 수 있으며, 이는 IncludedService로 표시됩니다. |
QLowEnergyService::IncludedService | 0x0002 | 이 서비스는 다른 서비스에 포함되어 있습니다. 일부 플랫폼에서는 현재 서비스를 포함하는 서비스가 탐지될 때까지 이 플래그를 확인할 수 없습니다. |
ServiceTypes 유형은 QFlags<ServiceType>에 대한 typedef입니다. 이 유형은 ServiceType 값들의 OR 조합을 저장합니다.
enum QLowEnergyService::WriteMode
이 열거형은 특성 값을 기록할 때 사용할 모드를 설명합니다. 해당 특성은 ` properties`을 통해 지원하는 쓰기 모드를 알립니다.
| 상수 | 값 | 설명 |
|---|---|---|
QLowEnergyService::WriteWithResponse | 0 | 이 모드를 사용하여 특성 값을 기록할 경우, 주변 장치는 기록 확인 신호를 전송해야 합니다. 작업이 성공하면 characteristicWritten() 신호를 통해 확인 신호가 전송됩니다. 그렇지 않은 경우 CharacteristicWriteError 신호가 전송됩니다. 이 기록 모드를 지원하려면 특성의 QLowEnergyCharacteristic::Write 속성이 설정되어 있어야 합니다. |
QLowEnergyService::WriteWithoutResponse | 1 | 이 모드를 사용하여 특성 값을 쓰면, 원격 주변기기는 쓰기 확인 신호를 보내지 않아야 한다. 작업의 성공 여부를 확인할 수 없으며, 페이로드 길이는 20바이트를 초과해서는 안 된다. 특성은 이 쓰기 모드를 지원하기 위해 QLowEnergyCharacteristic::WriteNoResponse 속성이 설정되어 있어야 한다. 이 모드의 장점은 다른 장치 상호작용 사이에서 수행될 수 있어 쓰기 작업이 더 빠르게 이루어진다는 점이다. |
QLowEnergyService::WriteSigned (since Qt 5.7) | 2 | 이 모드를 사용하여 특성(characteristic)을 기록하는 경우, 원격 주변 장치는 기록 확인을 전송해서는 안 됩니다. 작업의 성공 여부를 확인할 수 없으며, 페이로드 길이는 8바이트를 초과해서는 안 됩니다. 두 장치 간에 본드(bond)가 설정되어 있어야 하며, 링크는 암호화되어서는 안 됩니다. 이 쓰기 모드를 지원하려면 특성(characteristic)의 QLowEnergyCharacteristic::WriteSigned 속성이 설정되어 있어야 합니다. 이 값은 현재 Android 및 BlueZ 5와 커널 버전 3.7 이상이 설치된 Linux에서만 지원됩니다. |
멤버 함수 문서
[virtual noexcept] QLowEnergyService::~QLowEnergyService()
QLowEnergyService 인스턴스를 삭제합니다.
QLowEnergyCharacteristic QLowEnergyService::characteristic(const QBluetoothUuid &uuid) const
uuid 에 해당하는 특성을 반환하며, 해당 조건에 부합하지 않을 경우 유효하지 않은 특성을 반환합니다.
이 서비스 인스턴스의 discoverDetails()가 아직 호출되지 않았거나, 일치하는 uuid 를 가진 특성이 없는 경우 반환된 특성은 유효하지 않습니다.
characteristics()도 참조하십시오 .
[signal] void QLowEnergyService::characteristicChanged(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
연관된 컨트롤러 객체가 ‘ central ’ 역할을 맡고 있는 경우, 주변기기/장치 측의 이벤트로 인해 characteristic 의 값이 변경되면 이 신호가 발신됩니다. 이 경우, 신호 발신은 주변기기 측에서 변경 이벤트가 발생하기 전에 해당 특성의 ‘ ClientCharacteristicConfiguration ’ 디스크립터를 통해 변경 알림이 활성화되었음을 의미합니다. 이에 대한 자세한 내용은 above 에서 확인할 수 있습니다.
컨트롤러가 ‘ peripheral ’ 역할을 수행하는 경우, 즉 서비스 객체가 QLowEnergyController::addService 를 통해 생성된 경우, GATT 클라이언트가 쓰기 요청이나 명령을 사용하여 특성 값을 기록하면 신호가 발신됩니다.
newValue 매개변수에는 characteristic 의 업데이트된 값이 포함됩니다.
[signal] void QLowEnergyService::characteristicRead(const QLowEnergyCharacteristic &characteristic, const QByteArray &value)
이 신호는 ` characteristic `에 대한 읽기 요청이 ` value`를 성공적으로 반환했을 때 발생합니다. 이 신호는 `characteristicRead()`를 호출하여 트리거될 수 있습니다. 읽기 작업이 성공하지 못한 경우, ` CharacteristicReadError ` 플래그를 사용하여 ` errorOccurred()` 신호가 발생합니다.
참고: 이 신호는 Central Role 관련 사용 사례에서만 발생합니다.
readCharacteristic()도 참조하십시오 .
[signal] void QLowEnergyService::characteristicWritten(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue)
이 신호는 ` characteristic `의 값이 ` newValue`로 성공적으로 변경되었을 때 발생합니다. 이 변경은 ` writeCharacteristic()`를 호출함으로써 트리거되어야 합니다. 쓰기 작업이 성공하지 못한 경우, ` CharacteristicWriteError ` 플래그를 사용하여 ` errorOccurred()` 신호가 발생합니다.
이 ‘written’ 신호의 수신은 대상 장치가 쓰기 대상 값을 수신했으며 쓰기 요청의 상태를 보고했다는 신호로 간주할 수 있습니다.
참고: WriteWithoutResponse 모드를 사용하여 writeCharacteristic()를 호출하는경우 , 이 신호와 errorOccurred()는 절대 발생하지 않습니다.
참고: 이 신호는 Central Role 관련 사용 사례에서만 발생합니다.
writeCharacteristic()도 참조하십시오 .
QList<QLowEnergyCharacteristic> QLowEnergyService::characteristics() const
이 ` QLowEnergyService ` 인스턴스와 관련된 모든 특성을 반환합니다.
이 서비스 인스턴스의 discoverDetails()가 아직 호출되지 않았거나 알려진 특성이 없는 경우, 반환되는 목록은 비어 있습니다.
characteristic(), state(), discoverDetails()도 참조하십시오 .
bool QLowEnergyService::contains(const QLowEnergyCharacteristic &characteristic) const
characteristic 가 이 서비스에 속하는 경우 true 를 반환하고, 그렇지 않은 경우 false 를 반환합니다.
특성 characteristic 가 characteristics()에 포함되어 있는 경우, 해당 특성은 이 서비스에 속합니다.
bool QLowEnergyService::contains(const QLowEnergyDescriptor &descriptor) const
descriptor 가 이 서비스에 속하는 경우 ` true `를 반환하고, 그렇지 않은 경우 ` false`를 반환합니다.
[signal] void QLowEnergyService::descriptorRead(const QLowEnergyDescriptor &descriptor, const QByteArray &value)
이 신호는 ` descriptor `에 대한 읽기 요청이 ` value`를 성공적으로 반환했을 때 발생합니다. 이 신호는 `descriptorRead()`를 호출하여 트리거될 수 있습니다. 읽기 작업이 성공하지 못한 경우, ` DescriptorReadError ` 플래그를 사용하여 ` errorOccurred()` 신호가 발생합니다.
참고: 이 신호는 Central Role 관련 사용 사례에서만 발생합니다.
readDescriptor()도 참조하십시오 .
[signal] void QLowEnergyService::descriptorWritten(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
이 신호는 ` descriptor `의 값이 ` newValue`로 성공적으로 변경되었을 때 발생합니다. 관련 컨트롤러 객체가 ` central ` 역할을 수행하는 경우, 이 변경은 ` writeDescriptor()` 호출에 의해 발생해야 합니다. 그렇지 않은 경우, 이 신호는 GATT 클라이언트가 해당 디스크립터에 보낸 쓰기 요청이나 명령의 결과입니다.
writeDescriptor()도 참조하십시오 .
void QLowEnergyService::discoverDetails(QLowEnergyService::DiscoveryMode mode = FullDiscovery)
서비스에 포함된 서비스, 특성 및 관련 설명자의 탐색을 시작합니다.
탐색 과정은 ` stateChanged()` 신호를 통해 표시됩니다. 생성 후, 서비스는 ` DiscoveryRequired ` 상태가 됩니다. `discoverDetails()`를 호출하면 ` DiscoveringService` 상태로 전환됩니다. 세부 정보 탐색이 완료되면 ` ServiceDiscovered ` 상태로 전환됩니다. 각 상태 전환 시마다 ` stateChanged()` 신호가 발생합니다. 인자 ` mode`에 따라 ` FullDiscovery ` 또는 ` SkipValueDiscovery `가 수행됩니다. 어떤 경우든 모든 서비스와 특성이 탐색됩니다. FullDiscovery 는 모든 특성 값과 디스크립터를 읽어 냅니다. SkipValueDiscovery 는 특성 값과 디스크립터를 읽지 않습니다. SkipValueDiscovery 에는 두 가지 장점이 있습니다. 첫째, 속도가 더 빠릅니다. 둘째, 특성을 읽기 가능하다고 잘못 알리면서도 실제로는 읽기를 허용하지 않는 일부 장치의 버그를 우회할 수 있습니다. 이는 예측할 수 없는 동작을 유발할 수 있습니다. SkipValueDiscovery 후에는 readCharacteristic() / readDescriptor()를 호출하고, 이 호출이 성공적으로 완료될 때까지 기다린 후에야 특성이나 디스크립터의 값에 접근할 수 있습니다.
mode 인수는 Qt 6.2에서 도입되었습니다.
state()도 참조하십시오 .
QLowEnergyService::ServiceError QLowEnergyService::error() const
마지막으로 발생한 오류를 반환하거나, ` NoError`를 반환합니다.
[signal, since 6.2] void QLowEnergyService::errorOccurred(QLowEnergyService::ServiceError newError)
이 신호는 오류가 발생했을 때 발생합니다. ` newError ` 매개변수는 발생한 오류를 설명합니다.
이 함수는 Qt 6.2에서 도입되었습니다.
QList<QBluetoothUuid> QLowEnergyService::includedServices() const
현재 서비스에 포함된 모든 서비스의 UUID를 반환합니다.
이 서비스 인스턴스의 ` discoverDetails()`가 아직 호출되지 않았거나 알려진 특성이 없는 경우, 반환된 목록은 비어 있습니다.
포함된 서비스 내에 또 다른 서비스가 포함될 수 있습니다. 이러한 2단계 포함 관계는 해당 1단계 QLowEnergyService 인스턴스를 통해 가져와야 합니다. 기술적으로 이는 순환 의존성을 유발할 수 있습니다.
QLowEnergyController::createServiceObject각 UUID에 대한 서비스 인스턴스를 얻으려면 ()를 사용해야 합니다.
createServiceObject()도 참조하십시오 .
void QLowEnergyService::readCharacteristic(const QLowEnergyCharacteristic &characteristic)
characteristic 의 값을 읽습니다. 작업이 성공하면 characteristicRead() 신호가 발생하고, 그렇지 않으면 CharacteristicReadError 가 설정됩니다. 일반적으로, characteristic 는 QLowEnergyCharacteristic::Read 속성이 설정되어 있을 때 읽을 수 있습니다.
동일한 원격 장치에 대한 모든 디스크립터 및 특성 요청은 직렬화됩니다. 여러 요청을 동시에 발행할 때는 큐가 사용됩니다. 이 큐는 동일한 특성에 대한 중복된 읽기 요청을 제거하지는 않습니다.
특성은 서비스가 ‘ ServiceDiscovered ’ 상태이고 해당 특성이 해당 서비스에 속해 있을 때만 읽을 수 있습니다. 이 조건 중 하나라도 충족되지 않으면 ‘ QLowEnergyService::OperationError ’가 설정됩니다.
참고: QLowEnergyCharacteristic::properties()이 속성을 읽을 수 없다고 보고했음에도 불구하고 이 함수를호출하면 , 항상 하드웨어에서 해당 속성의 값을 읽으려고 시도합니다. 하드웨어에서 오류가 반환되면 CharacteristicReadError 가 설정됩니다.
characteristicRead() 및 writeCharacteristic()도 참조하십시오 .
void QLowEnergyService::readDescriptor(const QLowEnergyDescriptor &descriptor)
descriptor 의 값을 읽습니다. 작업이 성공하면 descriptorRead() 신호가 발생하고, 그렇지 않으면 DescriptorReadError 이 설정됩니다.
동일한 원격 장치에 대한 모든 디스크립터 및 특성 요청은 직렬화됩니다. 여러 요청을 동시에 발행할 때는 큐가 사용됩니다. 이 큐는 동일한 디스크립터에 대한 중복된 읽기 요청을 제거하지는 않습니다.
디스크립터는 서비스가 ServiceDiscovered 상태에 있고, 해당 디스크립터가 해당 서비스에 속하는 경우에만 읽을 수 있습니다. 이 조건 중 하나라도 충족되지 않으면 QLowEnergyService::OperationError 가 설정됩니다.
descriptorRead() 및 writeDescriptor()도 참조하십시오 .
QString QLowEnergyService::serviceName() const
서비스의 이름을 반환하며, 그렇지 않은 경우 빈 문자열을 반환합니다.
serviceUuid()가 잘 알려진 UUID인 경우에만 반환된 이름을 가져올 수 있습니다.
QBluetoothUuid QLowEnergyService::serviceUuid() const
서비스의 UUID를 반환하며, 그렇지 않은 경우 null UUID를 반환합니다.
QLowEnergyService::ServiceState QLowEnergyService::state() const
서비스의 현재 상태를 반환합니다.
장치의 서비스가 처음 인스턴스화된 경우, 객체의 상태는 ` DiscoveryRequired`입니다. 주변 장치의 동일한 서비스를 가리키는 모든 서비스 객체의 상태는 항상 동일합니다. 이는 내부 객체 데이터가 공유되는 특성 때문입니다. 따라서 첫 번째 인스턴스 이후에 생성된 모든 서비스 객체 인스턴스는 이미 존재하는 인스턴스와 동일한 상태를 가집니다.
QLowEnergyController 가 원격 장치와의 연결을 끊으면 서비스는 무효 상태가 됩니다. 무효화된 서비스는 연결 해제 시점의 내부 상태를 유지합니다. 이는 서비스 세부 정보가 한 번 탐색되면 무효화된 서비스에서도 해당 정보를 가져올 수 있음을 의미합니다. 이를 통해 장치 연결이 수립되고, 서비스 세부 정보가 가져온 후, 다음 장치가 주변 기기에 연결할 수 있도록 즉시 장치를 분리하는 시나리오가 가능합니다.
그러나 일반적인 상황에서는 서비스 및 그 세부 정보를 반복적으로 검색하는 것을 방지하기 위해 연결을 유지해야 합니다. 검색에는 다소 시간이 소요될 수 있으며, 클라이언트는 진행 중인 변경 알림을 구독할 수 있습니다.
stateChanged()도 참조하십시오 .
[signal] void QLowEnergyService::stateChanged(QLowEnergyService::ServiceState newState)
이 신호는 서비스의 상태가 변경될 때 발생합니다. newState 는 state()를 통해서도 조회할 수 있습니다.
state()도 참조하십시오 .
QLowEnergyService::ServiceTypes QLowEnergyService::type() const
서비스의 유형을 반환합니다.
참고: 서비스가 ' ServiceDiscovered ' 상태에 도달하기 전까지는 type속성을 신뢰할 수 없습니다. 이 필드는 ' PrimaryService'로 초기화됩니다.
참고: Android에서는 서비스가 주 서비스인지 보조 서비스인지 판단할 수 없습니다. 따라서 모든 서비스에 ' PrimaryService ' 플래그가 설정되어 있습니다.
void QLowEnergyService::writeCharacteristic(const QLowEnergyCharacteristic &characteristic, const QByteArray &newValue, QLowEnergyService::WriteMode mode = WriteWithResponse)
characteristic 의 값으로 newValue 을 기록합니다. 정확한 의미는 연관된 컨트롤러 객체가 수행하는 역할에 따라 달라집니다.
중앙 역할
이 호출은 원격 주변 장치에 대한 쓰기 요청 또는 명령을 발생시킵니다. 작업이 성공하면 ` characteristicWritten()` 신호가 발신되고, 그렇지 않으면 ` CharacteristicWriteError `가 설정됩니다. 이 함수를 호출한다고 해서 ` characteristicChanged()` 신호가 트리거되지는 않으며, 현재 쓰기 요청 이후 주변 장치 자체가 값을 다시 변경하는 경우에만 해당 신호가 트리거됩니다.
mode 매개변수는 원격 장치가 쓰기 확인을 전송해야 하는지 여부를 결정합니다. 쓰기 대상인 characteristic 는 해당 쓰기 모드를 지원해야 합니다. 특성(characteristic)이 지원하는 쓰기 모드는 QLowEnergyCharacteristic::Write 및 QLowEnergyCharacteristic::WriteNoResponse 속성으로 표시됩니다.
동일한 원격 장치에 대한 모든 디스크립터 및 특성 쓰기 요청은 직렬화됩니다. 여러 쓰기 요청을 동시에 발행할 때는 큐가 사용됩니다. 이 큐는 동일한 특성에 대한 중복된 쓰기 요청을 제거하지는 않습니다. 예를 들어, 동일한 디스크립터가 값 A로 설정된 직후 값 B로 설정되는 경우, 두 쓰기 요청은 주어진 순서대로 실행됩니다.
참고: 현재 블루투스 사양에 정의된 서명된(signed) 또는 신뢰할 수 있는(reliable) 쓰기 기능을 사용할 수 없습니다.
특성은 이 서비스가 ‘ ServiceDiscovered ’ 상태에 있고 해당 서비스에 속해 있을 때만 쓰기가 가능합니다. 이 조건 중 하나라도 충족되지 않으면 ‘ QLowEnergyService::OperationError ’가 설정됩니다.
참고: QLowEnergyCharacteristic::properties()이 쓰기 불가능한 속성을 보고했음에도 불구하고 이 함수를호출하면 항상 하드웨어에 쓰기를 시도합니다. 마찬가지로, 특성(characteristic)이 읽기 전용( WriteWithResponse)만 지원하더라도 하드웨어에 읽기 요청( WriteWithoutResponse )이 전송됩니다. 하드웨어가 오류를 반환하면 읽기 실패( CharacteristicWriteError )가 설정됩니다.
주변기기 역할
이 호출의 결과로, 해당 특성 값이 로컬 데이터베이스에 업데이트됩니다.
현재 클라이언트가 연결되어 있고 해당 특성(characteristic)에 대한 알림 또는 표시 기능을 활성화한 경우, 해당 정보가 전송됩니다. 기기가 해당 특성에 대한 알림 또는 표시 기능을 활성화한 상태이고, 현재 연결되어 있지 않지만 로컬 기기와 본드(bond)가 형성되어 있는 경우, 다음 재연결 시 알림 또는 표시가 전송됩니다.
특성 값의 길이에 제약이 있고 newValue 가 해당 제약을 준수하지 않는 경우, 동작은 정의되지 않습니다.
참고: 주변기기 모드에서는 mode 인수가 무시됩니다.
QLowEnergyService::characteristicWritten() 및 QLowEnergyService::readCharacteristic()도 참조하십시오 .
void QLowEnergyService::writeDescriptor(const QLowEnergyDescriptor &descriptor, const QByteArray &newValue)
descriptor 의 값으로 newValue 를 기록합니다. 정확한 의미는 관련 컨트롤러 객체가 수행하는 역할에 따라 달라집니다.
중앙 역할
이 함수를 호출하면 원격 장치에 대한 쓰기 요청이 발생합니다. 작업이 성공하면 descriptorWritten() 신호가 발생하고, 그렇지 않으면 DescriptorWriteError 신호가 발생합니다.
동일한 원격 장치에 대한 모든 디스크립터 및 특성 요청은 순차적으로 처리됩니다. 여러 쓰기 요청을 동시에 발행할 때는 큐가 사용됩니다. 이 큐는 동일한 디스크립터에 대한 중복된 쓰기 요청을 제거하지는 않습니다. 예를 들어, 동일한 디스크립터가 값 A로 설정된 직후 B로 설정되는 경우, 두 쓰기 요청은 주어진 순서대로 실행됩니다.
디스크립터에 쓰기 작업은 해당 서비스가 ‘ ServiceDiscovered ’ 상태일 때만 가능하며, 해당 디스크립터가 해당 서비스에 속해야 합니다. 이 조건 중 하나라도 충족되지 않으면 ‘ QLowEnergyService::OperationError ’가 설정됩니다.
주변 장치 역할
값은 로컬 서비스 데이터베이스에 기록됩니다. newValue 의 내용이 descriptor 에 대해 유효하지 않은 경우, 동작은 정의되지 않습니다.
descriptorWritten() 및 readDescriptor()도 참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.