使用Swift中的按钮通过蓝牙发送数据

使用Swift中的按钮通过蓝牙发送数据,swift,button,bluetooth,bluetooth-lowenergy,Swift,Button,Bluetooth,Bluetooth Lowenergy,我正在尝试通过蓝牙发送数据,只需点击一个按钮。我可以在打开应用程序时发送数据,代码如下: var manager: CBCentralManager! var device: CBPeripheral? var characteristics: [CBCharacteristic]? var serviceUUID = "1234" var char1 = "FFE1" let deviceName = "HMSoft" func peripheral(_ peripheral: CBPeri

我正在尝试通过蓝牙发送数据,只需点击一个按钮。我可以在打开应用程序时发送数据,代码如下:

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中直接使用characteristicFFE1的writeValue,如下所示:

@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)
}
但是我得到了一个错误:线程1:致命错误:在展开可选值时意外发现nil

有人知道怎么避开这个吗?我读过关于选项和拆封的书,但在这里仍然感到困惑。

你的问题就在这里

  device?.writeValue(data as Data, for: characteristics,type: CBCharacteristicWriteType.withoutResponse)
您希望发送您在此处声明的类型为
CBCharacteristic
的可选数组

   var characteristics: [CBCharacteristic]?
而参数应该是
CBCharacteristic
类型的值,您应该在这样使用之前进行初始化

   var characteristics: CBCharacteristic?
这是来自的方法签名

func writeValue(u-data:data, 对于特征:CBCharacteristic,类型:CBCharacteristicWriteType)


到底是哪一行导致了错误?iAction函数中的最后一行“characteristics”导致了错误。感谢您的回复!我应该在哪里初始化它?我尝试在IBAction函数中执行此操作,但随后收到一条警告,建议使用“let”而不是“var”。在将其更改为“let”后,我在第一次的同一行上得到了一个新错误:在初始化之前使用了常量“characteristic”。有什么想法吗?
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

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