Невозможно прочитать данные со стороннего устройства с помощью ExternalAccessory в iOS swift - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть особые требования для связи между устройствами iOS и сторонними устройствами Bluetooth.

Я успешно установил соединение с устройством (устройством с поддержкой MFI), используя EAAccessory Framework, используя следующий код.

let accessory = EAAccessoryManager.shared().connectedAccessories.first!
    session = EASession(accessory: accessory, forProtocol: “protocol string”)
    session?.outputStream?.delegate = self
    session?.outputStream?.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode)
    session?.outputStream?.open()
    session?.inputStream?.delegate = self
    session?.inputStream?.schedule(in: RunLoop.main, forMode: RunLoopMode.defaultRunLoopMode)
    session?.inputStream?.open()
    if availableAccessories.count>0{
        print("Detected Device")
    }
    else{
        print("Not detected")
    }

Теперь нам нужно перевести устройство iOS в состояние ожидания, чтобы считывать передаваемые данные с помощью исправного устройства Bluetooth.

Как мы можем перевести устройство iOS в состояние прослушивания? Мы использовали следующий код.

func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
    switch eventCode {
       case Stream.Event.hasBytesAvailable:
        let inStream = aStream as? InputStream
      _readData(aStream: inStream!)            
       var buffer = [UInt8](repeating: 0, count: 2048)
       var data = Data()
       while ((inStream?.hasBytesAvailable)!) {
       let bytesRead: Int = inStream!.read(&buffer, maxLength: buffer.count)
        if bytesRead >= 0 {
            data.append(buffer, count: bytesRead)
        }
        }

       print("data.hexEncodedString()")
       print(data.hexEncodedString())

    case Stream.Event.hasSpaceAvailable:
        print("Send the next queued command")
    default:
        print("Default")
    }
 }



 var readData : NSMutableData!



public func _readData(aStream:InputStream) {
    print("Trying to read data")
    let INPUT_BUFFER_SIZE = 65536
    let buf = UnsafeMutablePointer<UInt8>.allocate(capacity: INPUT_BUFFER_SIZE)
    while(aStream.hasBytesAvailable) {
        let bytesRead = aStream.read(buf, maxLength: INPUT_BUFFER_SIZE)
        if readData == nil {
            readData = NSMutableData()
        }
        readData.append(buf, length: bytesRead)
    }
    if readData != nil {
        let data: NSData = readData
        let count = data.length / MemoryLayout.size(ofValue: UInt8())
        var array = [UInt8](repeating: 0, count: count)
        data.getBytes(&array, length:count * MemoryLayout<UInt8>.size)
        print("Data Received :: \(readData)")
        let dataString = String(data: data as Data, encoding: .utf8)!
           print("Data Received dataString:: \(dataString)")
    }
}

Я получаю результат как

"ВЫЗОВ 60: a3: 7d: 38: ff: b3 1234 RFCOMM"

Таким образом, мы не можем прочитать фактические данные с устройства. Мы идем в правильном направлении? Требуется ли какой-либо другой сценарий или дальнейшие шаги для достижения этого?

...