SWIFT - BLE通讯

时间:2016-03-04 10:49:43

标签: ios swift bluetooth arduino bluetooth-lowenergy

我有一个SWIFT应用程序必须通过Bluetooth LowEnergy模块向我的Arduino发送一个值!

我已正确完成搜索和连接部分,但我无法发送和接收任何数据。

这是我的代码,用于获取可用的BLE设备列表,并将所有这些设置放在表格视图中,然后单击应用程序提供的单元格以将设备与它们连接!

这一切都很完美但我不知道发送例如" a"从应用程序到BLE的角色,从arduino回到应用程序的答案!

    import UIKit
    import CoreBluetooth


class BluetoothList: UITableViewController,CBCentralManagerDelegate, CBPeripheralDelegate {

    var listValue = [Lista]()
    var Blue: CBCentralManager!
    var conn: CBPeripheral!
    var a: String!
    var char: CBCharacteristic!

    func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
        if (peripheral.name == a){
            self.conn = peripheral
            self.conn.delegate = self
            Blue.stopScan()
            Blue.connectPeripheral(self.conn, options: nil)
            self.performSegueWithIdentifier("ConnectionSegue", sender: nil)
        }
        else{
            listValue = [
                Lista(Name: peripheral.name!, RSS: RSSI.stringValue)
            ]
            self.tableView.reloadData()
        }
    }

    func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) {
        peripheral.delegate = self
        peripheral.discoverServices(nil)

    }

    func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) {
        if let servicePeripheral = peripheral.services! as [CBService]!{
            for service in servicePeripheral{
                peripheral.discoverCharacteristics(nil, forService: service)
            }
        }
    }

    func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) {
        if let characterArray = service.characteristics! as [CBCharacteristic]!{

            for cc in characterArray {
                if(cc.UUID.UUIDString == "FF05"){
                    print("OKOK")
                    peripheral.readValueForCharacteristic(cc)
                }
            }
        }
    }

    func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) {
        if (characteristic.UUID.UUIDString == "FF05"){

            let value = UnsafePointer<Int>((characteristic.value?.bytes.memory)!)
            print("\(value)")
        }
    }

    func centralManagerDidUpdateState(central: CBCentralManager){
        switch(central.state){
        case .PoweredOn:
            Blue.scanForPeripheralsWithServices(nil, options:nil)
            print("Bluetooth is powered ON")
        case .PoweredOff:
            print("Bluetooth is powered OFF")
        case .Resetting:
            print("Bluetooth is resetting")
        case .Unauthorized:
            print("Bluetooth is unauthorized")
        case .Unknown:
            print("Bluetooth is unknown")
        case .Unsupported:
            print("Bluetooth is not supported")
        }
    }

    override func viewDidLoad() {

        super.viewDidLoad()
        Blue = CBCentralManager(delegate: self, queue: nil)

    }

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let currentCell = tableView.cellForRowAtIndexPath(tableView.indexPathForSelectedRow!)! as UITableViewCell
        a = currentCell.textLabel?.text
        Blue = CBCentralManager(delegate: self, queue: nil)
    }

    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }

    @IBAction func Reload_BTN(sender: AnyObject) {
        self.tableView.reloadData()
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.listValue.count
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let cella = self.tableView.dequeueReusableCellWithIdentifier("Cella", forIndexPath: indexPath)
        let Lista = self.listValue[indexPath.row]
        cella.textLabel?.text = Lista.Name
        cella.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
        return cella
    }

1 个答案:

答案 0 :(得分:6)

以下代码适用于Swift 3(XCode 8 Beta 6)。这是一个使用标准UUID用于串行端口的示例,例如某些商业模块上的串行端口。因此,服务和特征的声明应如下所示:

private let UuidSerialService = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
private let UuidTx =            "6E400002-B5A3-F393-E0A9-E50E24DCCA9E"
private let UuidRx =            "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"

然后你的委托给didDiscoverCharacteristic的方法可以是这样的:

public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?)
{
    if let characteristics = service.characteristics {
        for characteristic in characteristics {
            // Tx:
            if characteristic.uuid == CBUUID(string: UuidTx) {
                print("Tx char found: \(characteristic.uuid)")
                txCharacteristic = characteristic
            }

            // Rx:
            if characteristic.uuid == CBUUID(string: UuidRx) {
                rxCharacteristic = characteristic
                if let rxCharacteristic = rxCharacteristic {
                    print("Rx char found: \(characteristic.uuid)")
                    serialPortPeripheral?.setNotifyValue(true, for: rxCharacteristic)
                }
            }
        }
    }
}

对于写入Tx,类似下面的工作,其中值是[UInt8]:

let data = NSData(bytes: value, length: value.count)
serialPortPeripheral?.writeValue(data as Data, for: txCharacteristic, type: CBCharacteristicWriteType.withResponse)

读?

public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
    let rxData = characteristic.value
    if let rxData = rxData {
        let numberOfBytes = rxData.count
        var rxByteArray = [UInt8](repeating: 0, count: numberOfBytes)
        (rxData as NSData).getBytes(&rxByteArray, length: numberOfBytes)
        print(rxByteArray)
    }
}

最后,如果您不知道或不确定BLE设备的服务和特性,您可以寻找一款名为“LightBlue”的免费iOS应用。它会发现一个设备,如果你连接它,它将列出所有服务和特征。请注意,当LightBlue连接到您的设备时,您的应用程序将无法访问BLE硬件。