0

我发现我正在使用的蓝牙 4.0 模块接收到 iPhone 的信号强度,但它的格式为NSNumber并且 writeValue() 方法只接受 type 的值Data

我将如何转换 fromNSNumber到 type Data?还是有另一种更好的方法将这些数据从我的 iPhone 发送到蓝牙模块?

我使用的蓝牙模块是 HM-10,它连接到一个 arduino。

import UIKit
import CoreBluetooth

class ViewController: UIViewController, CBPeripheralDelegate, CBCentralManagerDelegate {
    private var centralManager: CBCentralManager!
    private var peripheral: CBPeripheral!
    var readRSSITimer: Timer!
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        print("Central state update")
        if central.state != .poweredOn {
            print("Central is not powered on")
        } else {
            print("Central scanning for", ParticlePeripheral.particleLEDServiceUUID);
            centralManager.scanForPeripherals(withServices: [ParticlePeripheral.particleLEDServiceUUID],
                                              options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }
    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        // We've found it so stop scan
        self.centralManager.stopScan()
        // Copy the peripheral instance
        self.peripheral = peripheral
        self.peripheral.delegate = self
        // Connect!
        self.centralManager.connect(self.peripheral, options: nil)
    }
    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        if peripheral == self.peripheral {
            print("Connected to your Particle Board")
            peripheral.discoverServices([ParticlePeripheral.particleLEDServiceUUID])
            print(self.peripheral.readRSSI())
            self.startReadRSSI()
            peripheral.delegate = self
        }
    }
    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
        self.stopReadRSSI()
        if self.peripheral != nil {
            self.peripheral.delegate = nil
            self.peripheral = nil
        }
    }
    func stopScan() {
        self.centralManager.stopScan()
    }
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        if let services = peripheral.services {
            for service in services {
                if service.uuid == ParticlePeripheral.particleLEDServiceUUID {
                    print("LED service found")
                    //Now kick off discovery of characteristics
                    peripheral.discoverCharacteristics([ParticlePeripheral.redLEDCharacteristicUUID,
                                                        ], for: service) //edited this
                    return
                }
            }
        }
    }
    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if let characteristics = service.characteristics {
            for characteristic in characteristics {
                if characteristic.uuid == ParticlePeripheral.redLEDCharacteristicUUID {
                    print("Red LED characteristic found")
                } else if characteristic.uuid == ParticlePeripheral.greenLEDCharacteristicUUID {
                    print("Green LED characteristic found")
                } else if characteristic.uuid == ParticlePeripheral.blueLEDCharacteristicUUID {
                    print("Blue LED characteristic found");
                }
            }
        }
    }
    func peripheral(_ peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: Error?) {
        print("RSSI = \(RSSI)")
    }
    @objc func readRSSI() {
        if (self.peripheral != nil) {
            self.peripheral.delegate = self
            print("RSSI Request - \(peripheral.name!)")
            print(self.peripheral.readRSSI())
        } else {
            print("peripheral = nil")
        }    
    }
    func startReadRSSI() {
        if self.readRSSITimer == nil {
            self.readRSSITimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: #selector(ViewController.readRSSI), userInfo: nil, repeats: true)
        }
    } 
    func stopReadRSSI() {
        if (self.readRSSITimer != nil) {
            self.readRSSITimer.invalidate()
            self.readRSSITimer = nil
        }
    }
}
4

1 回答 1

0

您可以使用数据字节初始化程序并将收到的数字传递给它以将其转换为数据:

init(bytes: UnsafeRawPointer, count: Int)

extension NSNumber {
    var data: Data {
        var source = self
        return Data(bytes: &source, count: MemoryLayout<NSNumber>.size)
    }
}

要将其从 Data 转换回 NSNumber,您可以使用 Data 的方法

func withUnsafeBytes<ResultType>(_ body: (UnsafeRawBufferPointer) throws -> ResultType) rethrows -> ResultType

extension Data {
    func object<T>() -> T { withUnsafeBytes { $0.load(as: T.self) } }
    var nsNumber: NSNumber { object() }
}

游乐场测试:

let integerNumber = NSNumber.init(value: 2)
let integerNumberData = integerNumber.data

let loadedintegerNumber: NSNumber = integerNumberData.nsNumber

loadedintegerNumber  // 2

let floatNumber = NSNumber.init(value: 2.7)
let floatNumberData = floatNumber.data

let loadedFloatNumber: NSNumber = floatNumberData.nsNumber

loadedFloatNumber  // 2.7

let boolNumber = NSNumber.init(value: true)
let boolNumberData = boolNumber.data

let loadedBoolNumber: NSNumber = boolNumberData.nsNumber

loadedBoolNumber  // 1
于 2020-02-01T20:50:31.550 回答