【问题标题】:Swift nsinputstream not giving me the correct data from TrimbleSwift nsinputstream 没有给我来自 Trimble 的正确数据
【发布时间】:2015-09-14 19:08:02
【问题描述】:

我已经为 android 开发了这个,并且简单地使用了一个 bufferedreaderbr.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。任何帮助将不胜感激!

【问题讨论】:

    标签: swift nsinputstream


    【解决方案1】:

    事实证明,您可以通过多种方式进行配对连接。 Trimble 正在向我发送 2 个数据流,一个是用二进制编写的,另一个是 nmea 字符串。我还没有弄清楚如何在 iphone 上获取 nmea 字符串,但我更喜欢更准确的二进制值。这是关于如何解释二进制数据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 字节数组的形式打印出来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2014-12-09
      相关资源
      最近更新 更多