Skip to content

Characteristics with same CBUUID in different services #410

@lynx56

Description

@lynx56

Describe the bug
I have two services in one peripheral.
Service A
55AA0148-0001-55AA-1461-227D5E1F4C35
with characteristic
tx: 55AA0001-0001-55AA-1461-227D5E1F4C35

Service B
55AA0248-0001-55AA-1461-227D5E1F4C35
with similar characteristic
tx: 55AA0001-0001-55AA-1461-227D5E1F4C35

When I try to observe both tx characteristics, I get only one notification
To Reproduce

typealias ReadCharacteristic = Observable<Data>

public class DefaultCharacteristicsService {
    public let observeConnection: Observable<Bool>
    private let bag = DisposeBag()
    private let peripheral: Peripheral
    private var peripheralObserver: Observable<Peripheral> = .empty()
    private var peripheralSubscription: SerialDisposable
    
    public init(peripheral: Peripheral) {
        self.peripheral = peripheral
        observeConnection = peripheral.observeConnection()
        peripheralSubscription = SerialDisposable()
        peripheralSubscription.disposed(by: bag)
    }
    
    public func start() -> Observable<Bool> {
        peripheralObserver = peripheral.establishConnection().share(replay: 1, scope: .forever)
        peripheralSubscription.disposable = peripheralObserver.subscribe()
        return peripheral.observeConnection()
    }
    
    public func stop() {
        peripheral.manager.manager.cancelPeripheralConnection(peripheral.peripheral)
        peripheralSubscription.disposable.dispose()
    }

    public func observeCharacteristic(service: GATTService) -> ReadCharacteristic {
        characteristic(service: service)
            .flatMap {
                $0.characteristic.properties.contains(.notify) ||
                    $0.characteristic.properties.contains(.indicate) ? $0.observeValueUpdateAndSetNotification() : $0.readValue().asObservable()
            }
            .compactMap { $0.characteristic.value }
            .debug("observeCharacteristic \(service) characteristic")
    }

    private func characteristic(service: GATTService) -> Observable<Characteristic> {
        peripheralObserver
            .filter { $0.isConnected }
            .flatMap {
                $0.discoverServices([service.serviceCBUUID])
            }
            .asObservable()
            .flatMap { Observable.from($0) }
            .flatMap {
               $0.discoverCharacteristics([service.characteristicCBUUID])
            }
            .asObservable()
            .flatMap { Observable.from($0) }
    }
}
func test(peripheral: Peripheral) {
        let service = DefaultCharacteristicsService(peripheral: peripheral)
        service.start()
        
        service.observeCharacteristic(service: .init(characteristicCBUUID: CBUUID(string: "55AA0001-0001-55AA-1461-227D5E1F4C35"),
                                                     serviceCBUUID: CBUUID(string: "55AA0148-0001-55AA-1461-227D5E1F4C35"))).subscribe(onNext: {
            print($0.debugDescription)
        }, onError: {
            print($0.localizedDescription)
        }).disposed(by: bag)
        
        service.observeCharacteristic(service: .init(characteristicCBUUID: CBUUID(string: "55AA0001-0001-55AA-1461-227D5E1F4C35"),
                                                     serviceCBUUID: CBUUID(string: "55AA0248-0001-55AA-1461-227D5E1F4C35"))).subscribe(onNext: {
            print($0.debugDescription)
        }, onError: {
            print($0.localizedDescription)
        }).disposed(by: bag)
}

It print events in first subscription

Expected behavior
It print events in different subscriptions

Probably problem is here (CharacteristicNotificationManager):
https://ibb.co/MCkFKtz

Environment:

  • All Devices
  • Library version 6.0

Thank you for your amazing job!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions