Swift nsinputstream не дает мне правильные данные от Trimble

Я разработал это для Android и просто использовал bufferedreader и br.readline(), и код правильно интерпретировал поступающие данные.

Я должен получить данные, которые выглядят так:

$GPRMC,191830.00,A,4159.87613,N,09338.29258,W,0.065,303.4,270815,0.8,E,D*21

то, что я получаю, это данные, которые выглядят так:

(WK # (да, это все)

Код в viewDidLoad()

if accessoryList.count > 0 {
        println(accessoryList[0].description)
        session = EASession(accessory: accessoryList[0] as! EAAccessory, forProtocol: "com.trimble.mcs.gnss")
        if session != nil {
            inputStream = session.inputStream
            //outputStream = session.outputStream

            inputStream.delegate = self
            inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
            inputStream.open()
        }
    }
    else {
    }

и моя функция потока()

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) {

    let inStream = aStream as? NSInputStream

    switch (eventCode){
    case NSStreamEvent.OpenCompleted:
        NSLog("Stream opened")
        break
    case NSStreamEvent.HasBytesAvailable:
        NSLog("HasBytesAvailable")
        let bufferSize = 128
        var buffer = [UInt8](count: bufferSize, repeatedValue: 0)
        if(session.inputStream!.hasBytesAvailable) {
            let result :Int = session.inputStream!.read(&buffer, maxLength: bufferSize)
            if(result > 0){
                var output = NSString(bytes: &buffer, length: bufferSize, encoding: NSUTF8StringEncoding)
                if(output != nil) {
                    println(output!)
                }
            }
        }
        break
    case NSStreamEvent.ErrorOccurred:
        NSLog("ErrorOccurred")
        break
    case NSStreamEvent.EndEncountered:
        NSLog("EndEncountered")
        break
    default:
        NSLog("unknown.")
    }
}

Есть что-то, что мне не хватает? Я получаю данные, они просто не на английском языке. Я знаю, что кодировка UTF8. Любая помощь будет оценена по достоинству!


person Randall Meyer    schedule 14.09.2015    source источник


Ответы (1)


Оказывается, есть несколько способов сделать парное соединение. Trimble отправляет мне 2 потока данных, один записан в двоичном формате, а другой — в виде строк NMEA. Я не понял, как получить строки nmea на iphone, но я бы предпочел более точные двоичные значения. Вот ссылка на описание и объяснение того, как интерпретировать двоичные данные http://www.trimble.com/OEM_ReceiverHelp/v4.85/en/GSOFmessages_Overview.html.

Я переписал код с некоторой помощью:

case NSStreamEvent.HasBytesAvailable:
        NSLog("HasBytesAvailable")
        let bufferSize = 512
        var buffer = Array<UInt8>(count: bufferSize, repeatedValue: 0)
        if(session.inputStream!.hasBytesAvailable) {
            let result :Int = session.inputStream!.read(&buffer, maxLength: bufferSize)
            print(buffer[0..<result].map{String(format: "%02x", Int32($0))}.joinWithSeparator(" "))
        }
        break

Надеюсь, это поможет кому-нибудь еще найти этот ответ. Этот код выводит его в 2-байтовых массивах.

person Randall Meyer    schedule 28.09.2015