在 Swift 中结合纬度/经度特征(蓝牙 LE)用于 Mapkit 注释

Posted

技术标签:

【中文标题】在 Swift 中结合纬度/经度特征(蓝牙 LE)用于 Mapkit 注释【英文标题】:Combine latitude/longitude characteristics (Bluetooth LE) in Swift for Mapkit Annotations 【发布时间】:2015-10-27 13:26:14 【问题描述】:

我正在开发一个跟踪器 ios 应用程序来跟踪设备的 (GPS) 位置(该设备目前是一个 Arduino Uno,带有用于蓝牙连接的 Adafruit Bluefruit LE UART Friend 和一个用于 GPS 坐标的 Ublox GPS 模块)。我已经设置了 Arduino 和一个 iOS 应用程序,并且我通过一个服务通过单独的特征成功地接收了经度和纬度。

要使用我的跟踪设备的位置在 MapkitView 中添加/更新注释,我需要在一个函数中访问经度和纬度。然而 BLEHandler 和 BLEHandlerDelegate 都只发送一个特征(纬度或经度)的值。因此,我认为我需要一些功能或调整,我可以将这两个值(纬度和经度)加入到 ViewController 中访问。

您能否提供一些指导或展示一些示例代码来说明如何完成这项工作?

我是编程界的新手,所以请原谅我的天真。

非常感谢。

这里是一些代码示例: BLEHandler

func peripheral(peripheral: CBPeripheral!, didUpdateValueForCharacteristic characteristic: CBCharacteristic!, error: NSError!) 

    var dataStrLat : String?
    var dataStrLong : String?

    if characteristic.UUID == UUID_CHAR_LAT 


        var charValue : NSData = characteristic.value

        dataStrLat  = NSString(data: charValue, encoding: NSASCIIStringEncoding) as? String
        //var dataStrLat : String? = NSString(data: charValue, encoding: NSASCIIStringEncoding) as? String

        if(dataStrLat == nil)
            dataStrLat = "blank"
        


        NSLog("%@: Characteristic (gps lat) changed for %@ with value %@", TAG, peripheral.name, dataStrLat!)

        delegate.receivedStringValue(peripheral.name, dataStr: dataStrLat!)

        

    if characteristic.UUID == UUID_CHAR_LONG 


        var charValue : NSData = characteristic.value

        dataStrLong = NSString(data: charValue, encoding: NSASCIIStringEncoding) as? String
        //var dataStrLong : String? = NSString(data: charValue, encoding: NSASCIIStringEncoding) as? String

        if(dataStrLong == nil)
            dataStrLong = "blank"
        


        NSLog("%@: Characteristic (gps long) changed for %@ with value %@", TAG, peripheral.name, dataStrLong!)

        delegate.receivedLongitudeValue(peripheral.name, dataStr: dataStrLong!)

    



BLEHandlerDelegate

func receivedStringValue(deviceName: String, dataStr : String)

func receivedLongitudeValue(deviceName: String, dataStr : String)

【问题讨论】:

你为什么不在一个字符串中表示纬度,经度对:例如“17.123456,58.123456”。然后将其分成 lat 和 lon 组件 您好,感谢您的建议。我正在使用基于 Bluefruit (NRF51) 的 BLE 板,它允许通过 Arduino 发送最多 20 个字节的数据包。由于纬度/经度占用更多字节(字符),我不得不拆分数据包。我还没有弄清楚如何使它小于 20 字节并决定拆分数据包。如果可以在一个数据包/字符串中发送纬度/经度,我确实可以使用它们并在需要时拆分它们。 【参考方案1】:

lat、lon 各占 4 个字节。 所以你需要 8 字节的纬度坐标:

如果您转换为 4 字节整数,通过乘以 1E7 并舍入或强制转换为 int,您将获得 4 个字节。

int latInt = round(latitude * 1E7);

如果您需要将其存储为字符。 逗号后需要 5 或 6 位数字 最坏的情况是

-129,12345 表示经度的 10 位数字 纬度的最坏情况: -89,12345 是 9。 所以你会有一个字符作为分隔符,或者你使用固定长度。

【讨论】:

谢谢!我会试试这个。我还找到了一种通过另一个 GATT 蓝牙服务 (BLUEUARTTX) link 发送更多字符的方法,该服务最多允许 240 个字符。

以上是关于在 Swift 中结合纬度/经度特征(蓝牙 LE)用于 Mapkit 注释的主要内容,如果未能解决你的问题,请参考以下文章

按纬度经度查找topojson特征

Swift:使用纬度/经度时坐标不准确

我可以得到纬度和经度,但我无法在 SWIFT 中访问 GPS 高度信息

当应用程序在iOS swift 3中处于后台模式时如何每10秒获取一次纬度和经度

Swift:获取用户的位置坐标为纬度和经度?

IBAction 显示纬度和经度(swift)