gpt4 book ai didi

swift - 用于多阶段蓝牙命令的 RxBluetoothKit 代码模式

转载 作者:行者123 更新时间:2023-11-28 15:36:05 33 4
gpt4 key购买 nike

我已经开始使用 RxBluetoothKit 为我们正在开发的外围设备取得了良好的效果。它运作良好,我能够执行我们需要的交易。

我有一个设计模式问题。我们有几个命令,其中我们的 API 包括多步命令。例如,App写一个命令开始码,Peripheral用ACK确认,然后App写命令,等待一个ACK,发出另一个命令,等待另一个ACK,等等。可以一直持续到App发出一个命令停止代码,这将在未来某个不确定的时间点出现——例如,当用户告诉应用程序停止时。

在 Rx 世界中是否有合适的编码惯用语或模式来实现这一点?总的来说,我是 Rx 的新手,我很好奇这种东西最简单、最干净的实现是什么。

谢谢。

最佳答案

细节一如既往地取决于您非常具体的用例。我喜欢将 Rx 视为基于流的构建 block ,需要将其连接起来以对您的业务逻辑进行建模。

有一个例子:

enum DeviceService: String, ServiceIdentifier {
case myService = "ffff"

var uuid: CBUUID {
return CBUUID(string: self.rawValue)
}
}

enum DeviceCharacteristic: String, CharacteristicIdentifier {
case startCharacteristic = "0001"
case stopCharacteristic = "0002"
case ackCharacteristic = "ffff"
case command1Characteristic = "0003"
case command2Characteristic = "0004"

var uuid: CBUUID {
return CBUUID(string: self.rawValue)
}

var service: ServiceIdentifier {
return DeviceService.myService
}
}

let peripheral : Peripheral? = nil

// Some internal command 1
let command1 = peripheral!.writeValue(Data(bytes: [0xff, 0xfe]),
for: DeviceCharacteristic.command1Characteristic,
type: .withResponse)

// Some internal command 2
let command2 = peripheral!.writeValue(Data(bytes: [0xdd, 0xee]),
for: DeviceCharacteristic.command2Characteristic,
type: .withResponse)

func batchCommands(commands: [Observable<Characteristic>]) -> Observable<Characteristic> {

let commandsWithAck = commands.map { command in
return command.flatMap { characteristic in
return peripheral!.monitorValueUpdate(for: DeviceCharacteristic.ackCharacteristic).take(1)
}
}

let start = peripheral!.writeValue(Data(bytes: [0x01]),
for: DeviceCharacteristic.startCharacteristic,
type: .withResponse)
let stop = peripheral!.writeValue(Data(bytes: [0x00]),
for: DeviceCharacteristic.startCharacteristic,
type: .withResponse)

return start.concat(Observable.concat(commandsWithAck)).concat(stop)
}

// Call it:
let subscription = batchCommands(commands: [command1, command2])
.subscribe(onNext: nil, onError: nil, onCompleted: nil, onDisposed: nil)

在那里,可以更改 startstop observable 以监视用户的行为并在实际开始/停止操作应该发生时发出项目。

关于swift - 用于多阶段蓝牙命令的 RxBluetoothKit 代码模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44247320/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com