【问题标题】:Sending data via bluetooth with a button in Swift使用 Swift 中的按钮通过蓝牙发送数据
【发布时间】:2018-02-17 18:58:03
【问题描述】:

我正在尝试通过单击按钮通过蓝牙发送数据。我可以在使用以下代码打开应用程序时发送数据:

var manager: CBCentralManager!
var device: CBPeripheral?
var characteristics: [CBCharacteristic]?
var serviceUUID = "1234"
var char1 = "FFE1"
let deviceName = "HMSoft"

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
    DidDiscoverChar.text = "Characteristic found!"

    device = peripheral
    characteristics = service.characteristics

    var value: UInt8 = 1

    let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)

    for characteristic in service.characteristics as [CBCharacteristic]!
    {
        if(characteristic.uuid.uuidString == "FFE1")
        {
            device?.writeValue(data as Data, for: characteristic,type: CBCharacteristicWriteType.withoutResponse)

        }
    }
}

但是当我尝试用按钮发送它时:

@IBAction func ledOn(_ sender: AnyObject) {
    var value: UInt8 = 1
    let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)

    device?.writeValue(data as Data, for: characteristics,type: CBCharacteristicWriteType.withoutResponse)
}

我得到错误:

无法转换类型“[CBCharacteristic]?”的值到预期的参数类型'CBCharacteristic'

这似乎是一项简单的任务,但作为一个新手,我被卡住了。

编辑:(回复 rmaddy 的回答)

按照您的建议,它确实可以遍历数组,如下所示。

@IBAction func ledOn(_ sender: AnyObject) {

    var value: UInt8 = 1

    let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)


    for characteristic in characteristics as [CBCharacteristic]!
    {

        if(characteristic.uuid.uuidString == "FFE1")
        {
            device?.writeValue(data as Data, for: characteristic,type: CBCharacteristicWriteType.withoutResponse)

        }
    }
}

作为一名程序员,我想提高自己,我希望代码更高效。所以我想我可以在按钮功能之外进行迭代,以避免每次按下按钮时的迭代。为了说明我在操场上做了一个简单的例子:

var characteristicFFE1: String = ""
var array = ["r1", "r2", "r3", "FFE1", "r4"]

for uuidString in array {
    if uuidString == "FFE1" {
       characteristicFFE1 = uuidString
    }
}

然后在IBAction的writeValue中直接使用characteristicFFE1,如下所示:

@IBAction func ledOn(_ sender: AnyObject) {
var value: UInt8 = 1
let data = NSData(bytes: &value, length: MemoryLayout<UInt8>.size)

device?.writeValue(data as Data, for: characteristicsFFE1,type: CBCharacteristicWriteType.withoutResponse)
}

我尝试完成上面的,如下图:

var characteristicFFE1: CBCharacteristic?

 override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    for characteristic in characteristics as [CBCharacteristic]!  //ERROR HERE
    {

        if(characteristic.uuid.uuidString == "FFE1")
        {
            characteristicFFE1 = characteristic

        }
    }

但我收到错误:线程 1:致命错误:在展开可选值时意外发现 nil。

有人知道如何解决这个问题吗?我已经阅读了有关可选和展开的信息,但在这里仍然感到困惑。

【问题讨论】:

  • 究竟是哪一行导致了错误?
  • IBAction 函数的最后一行,"characteristics" 导致它。

标签: swift button bluetooth bluetooth-lowenergy


【解决方案1】:

你的问题来了

  device?.writeValue(data as Data, for: characteristics,type: CBCharacteristicWriteType.withoutResponse)

您想发送您在此处声明的CBCharacteristic 类型的可选数组

   var characteristics: [CBCharacteristic]?

虽然参数应该是 CBCharacteristic 类型的值,但您应该在像这样使用之前初始化它

   var characteristics: CBCharacteristic?

这是来自Docs的方法签名

func writeValue(_data: 数据, 对于特征:CBCharacteristic,类型:CBCharacteristicWriteType)

【讨论】:

  • 感谢您的回复!我应该在哪里初始化它?我尝试在 IBAction 函数中执行此操作,但随后我收到使用“let”而不是“var”的警告。将其更改为“让”后,我在第一次的同一行出现了一个新错误:在初始化之前使用了常量“特征”。有什么想法吗?
猜你喜欢
  • 2019-07-26
  • 2014-11-16
  • 1970-01-01
  • 2015-04-21
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-21
相关资源
最近更新 更多