首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过CBL2CAPChannel发送和接收数据

如何通过CBL2CAPChannel发送和接收数据
EN

Stack Overflow用户
提问于 2018-12-19 16:29:05
回答 1查看 1.5K关注 0票数 3

我试图在两个L2CAP设备之间打开一个iOS通道,并以两种方式传输数据。其中一个设备充当中心,另一个作为外围设备。

外围

我发布了这样一个L2CAPChannel:

代码语言:javascript
运行
复制
func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
    if peripheral.state == .poweredOn {
        peripheral.publishL2CAPChannel(withEncryption: false)
    }
}

尝试了真和假的加密。

然后,一旦频道发布,我就从didPublishL2CAPChannel委托方法中获得PSM,并创建一个具有包含PSM的特性的服务,并将其作为其价值并开始对其进行广告宣传。

中央侧的

我扫描外围设备,找到正确的设备,连接到它,开始发现服务,然后一旦服务被发现,我就会发现特性。我找到特征,读它的价值,得到PSM。然后我就这么做:

代码语言:javascript
运行
复制
self.peripheral.openL2CAPChannel(psm)

然后,在委托方法中返回通道已打开的调用,并执行以下操作:

代码语言:javascript
运行
复制
func peripheral(_ peripheral: CBPeripheral, didOpen channel: CBL2CAPChannel?, error: Error?) {
    guard error == nil else {
        print("Couldn't open channel. Error: \(error!.localizedDescription)")
        return
    }
    self.l2capChannel = channel
    self.l2capChannel?.inputStream.delegate = self
    self.l2capChannel?.outputStream.delegate = self
    print("L2CAP channel opened with \(peripheral.name ?? "unknown")")
}

这些指纹:

代码语言:javascript
运行
复制
L2CAP channel opened with mrsta’s iPad

再次出现在外围:

我得到委托方法中的回调:

代码语言:javascript
运行
复制
func peripheralManager(_ peripheral: CBPeripheralManager, didOpen channel: CBL2CAPChannel?, error: Error?) {
    guard error == nil else {
        print("Couldn't open channel. Error: \(error!.localizedDescription)")
        return
    }
    self.l2capChannel = channel
    self.l2capChannel?.inputStream.delegate = self
    self.l2capChannel?.outputStream.delegate = self
    print("L2CAP channel opened")
}

这些指纹:

代码语言:javascript
运行
复制
[CoreBluetooth] No central present! Creating a new object. This shouldn't happen.
L2CAP channel opened

到目前为止,海峡的两边似乎都是开放的。我只是想知道上面打印的“.没有中央礼物”的信息是什么?

过了一会儿,我开始在控制台中收到这样的消息:

代码语言:javascript
运行
复制
[CoreBluetooth] WARNING: Unknown error: 436
[CoreBluetooth] No known channel matching peer <CBPeripheral: 0x2829de120, identifier = 241BAA6F-0BFD-9F5A-1EC9-35A4FD246DF5, name = mrsta’s iPad, state = connected> with psm 192
[CoreBluetooth] WARNING: Unknown error: 431

我不知道这些是什么意思。有什么建议吗?

我还在两个方面实现了StreamDelegate方法:

代码语言:javascript
运行
复制
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
    print("Stream Event occurred: \(eventCode)")
    if eventCode == .hasSpaceAvailable {
        self.tryToWrite()
    }
}

但是,从来不调用上面的委托方法。我尝试像这样写入输出流(从中央端的tryToWrite通道委托方法调用的didOpen ):

代码语言:javascript
运行
复制
func tryToWrite() {
    let string = "Hello"
    let stringData = Data(from: string)
    let _ = stringData.withUnsafeBytes { write(stuff: $0, to: self.l2capChannel, withMaxLength: stringData.count) }
}

func write(stuff: UnsafePointer<UInt8>, to channel: CBL2CAPChannel?, withMaxLength maxLength: Int) {
    let result = channel?.outputStream.write(stuff, maxLength: maxLength)
    print("Write result: \(String(describing: result))")
}

结果是:

代码语言:javascript
运行
复制
Write result: Optional(-1)

这意味着写入失败。

请告诉我我少了什么?在打开通道后,我会遇到哪些错误,以及如何正确地写入和读取数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-08 01:21:25

我使用L2CAP,它正在工作。我在两个"didOpen“函数中所做的工作是

代码语言:javascript
运行
复制
self.l2capChannel = channel

self.l2capChannel?.inputStream.delegate = self 
self.l2capChannel?.inputStream.schedule(in: .main, forMode: .defaultRunLoopMode)
self.l2capChannel?.inputStream.open()

self.l2capChannel?.outputStream.delegate = self
self.l2capChannel?.outputStream.schedule(in: .main, forMode: .defaultRunLoopMode)
self.l2capChannel?.outputStream.open()

当我不再需要他们的时候,我关闭了他们

代码语言:javascript
运行
复制
self.l2capChannel?.inputStream.close()
self.l2capChannel?.inputStream.remove(from: .main, forMode: .defaultRunLoopMode)

self.l2capChannel?.outputStream.close()
self.l2capChannel?.outputStream.remove(from: .main, forMode: .defaultRunLoopMode)

self.l2capChannel? = nil
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53855397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档