在 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 注释的主要内容,如果未能解决你的问题,请参考以下文章
我可以得到纬度和经度,但我无法在 SWIFT 中访问 GPS 高度信息