У меня есть особые требования для связи между устройствами 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"
Таким образом, мы не можем прочитать фактические данные с устройства. Мы идем в правильном направлении? Требуется ли какой-либо другой сценарий или дальнейшие шаги для достижения этого?