BLE 设备可以直接连接到 watchOS 应用程序吗?

时间:2021-02-10 12:42:45

标签: watchkit apple-watch watchos

import WatchKit
import Foundation
import CoreBluetooth

var WK_Peripheral: CBPeripheral!
var WK_manager: CBCentralManager!

class BLERow: NSObject {
    @IBOutlet var lblName: WKInterfaceLabel!
}

class BLEDevices: WKInterfaceController {

//MARK:- Outlets
@IBOutlet weak var bleTable: WKInterfaceTable!
@IBOutlet weak var cancelButton: WKInterfaceButton!
@IBOutlet weak var connectButton: WKInterfaceButton!
@IBOutlet weak var connectLabel: WKInterfaceLabel!

var BLEManager = BluetoothManager.getInstance()
var arrPeripherals = [CBPeripheral]()

//MARK:- Life cycle
override func awake(withContext context: Any?) {
    super.awake(withContext: context)
//        BLEManager.startScanPeripheral()
        WK_manager = CBCentralManager(delegate: self, queue: nil)
        // Configure interface objects here.
}

func startScan(){
    arrPeripherals.removeAll()
    print("Scanning...")
    connectLabel.setText("Scanning")
    WK_manager.scanForPeripherals(withServices:nil, options: nil)
}

override func willActivate() {
    // This method is called when watch view controller is about to be visible to user
    super.willActivate()
}

override func didDeactivate() {
    // This method is called when watch view controller is no longer visible
    super.didDeactivate()
}

//MARK:- Actions
@IBAction func cancelTouchUp() {
}

@IBAction func connectTouchUp() {
}

//MARK:- TableView Functions
func setupTable() {
    connectLabel.setText("SetUp \(arrPeripherals.count)")
    bleTable.setNumberOfRows(self.arrPeripherals.count, withRowType: "rowType")
    for i in 0 ..< self.arrPeripherals.count {
        if let row = bleTable.rowController(at: i) as? BLERow {
            row.lblName.setText(self.arrPeripherals[i].name)
        }
    }
}

override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) {
    self.pushController(withName: "DetailController", context: self.arrPeripherals[rowIndex])
}

}

extension BLEDevices: CBCentralManagerDelegate {

func centralManagerDidUpdateState(_ central: CBCentralManager) {
    if central.state == .unknown {
        print("Unknown")
        connectLabel.setText("Unknown")
    }
    else if central.state == .unsupported {
        print("Unsupported")
        connectLabel.setText("Unsupported")
    }
    else if central.state == .unauthorized {
        print("Unauthorized")
        connectLabel.setText("Unauthorized")
    }
    else if central.state == .resetting {
        print("Resetting")
        connectLabel.setText("Resetting")
    }
    else if central.state == .poweredOn {
        print("Powered On")
        connectLabel.setText("Powered On")
        self.startScan()
    }
    else if central.state == .poweredOff {
        print("Powered Off")
        connectLabel.setText("Powered Off")
    }
}

func didDiscoverPeripheral(_ peripheral: CBPeripheral, advertisementData: [String : Any], RSSI: NSNumber) {
    connectLabel.setText("discovered")
    if let data = advertisementData["kCBAdvDataManufacturerData"] as? Data {
        assert(data.count >= 7)
        //0d00 - TI manufacturer ID
        //Constructing 2-byte data as little endian (as TI's manufacturer ID is 000D)
        let manufactureID = UInt16(data[0]) + UInt16(data[1]) << 8
        print(String(format: "manufactureID--> %04X", manufactureID)) //->000D
        //fe - the node ID that I have given
        let nodeID = data[2]
        print(String(format: "nodeID--> %02X", nodeID)) //->FE
        //05 - state of the node (something that remains constant
        let state = data[3]
        print(String(format: "state--> %02X", state)) //->05
        //c6f - is the sensor tag battery voltage
        //Constructing 2-byte data as big endian (as shown in the Java code)
        let batteryVoltage = UInt16(data[4]) << 8 + UInt16(data[5])
        print(String(format: "batteryVoltage--> %04X", batteryVoltage)) //->0C6F
        //32- is the BLE packet counter.
        let packetCounter = data[6]
        print(String(format: "packetCounter--> %02X", packetCounter)) //->32
    }
    if let service = advertisementData["kCBAdvDataServiceUUIDs"] as? NSArray {
        print(service)
    }
    if !arrPeripherals.contains(peripheral) {
        if peripheral.name == "OBU_QUS"{
            arrPeripherals.append(peripheral)
            if arrPeripherals.count > 0 {
                self.bleTable.setHidden(false)
            }else{
                self.bleTable.setHidden(true)
            }
            setupTable()
        }
    }
}

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
}

func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) {
}

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
}
}

我想将 BLE 设备直接连接到我的 watchOS。现在我可以检查中央管理器是否开始扫描设备,但我从来没有得到一个设备。 我用单例类尝试过,然后直接使用它但没有取得任何成功。 如果上面的代码片段有什么问题,请给我建议。任何帮助将不胜感激。

0 个答案:

没有答案