最近在做通过蓝牙ble获取蓝牙模块的位置信息,查阅资料后总算做出来了,在这里记录一下笔记。
蓝牙标准协议网站:点击打开链接
首先我们先去蓝牙标准协议网站对照来看。
位置信息相关的服务为:
Location and Navigation service uuid: 00001819-0000-1000-8000-00805f9b34fb
-- Location and speed characteristic uuid: 00002a67-0000-1000-8000-00805f9b34fb
首先说读取值,假如下面为我们读到的特征值,先来分析一下:
假如返回值一个包会放不下,会分几个包连续发过来,下面的就是分了两个包发过来。
再分析一下具体值,首先我们先看第一个包的值 85-00-0C-00-17-0A-21-05-71-18-1b-04
由于蓝牙传输是先低位再高位,所以要从后面读起来。
由上面可知最前面的为Flag,Format是16bit,所以85-00 其实就是要把16进制的0085转为2进制,即0000 0000 1000 0101
先从低位读,由上面可知13个 000 0 00 0 10 0 0 0 1 0 1
不为0即有值的为1bit,2bit,7bit 分别是 Instantaneous Speed,Location Present,Position Status
这里我们只需要 Location Present ,因为 Instantaneous Speed是uint16 占了两个字节
所以 85-00-0C-00-17-0A-21-05-71-18-1b-04 去掉85后面的两位00-0C,经度和纬度都是sint32,所以都是4位,一共8位,所以剩下的就是经纬度
17-0A-21-05(Latitude),71-18-1b-04(Longitude),再转为相对应的10进制就是gps经纬度了,记得 1/(10^7) 。
170A2105 :纬度 即: 05210A17
71181B04 :经度 即: 41B1871
再转为10进制 * 10-7 8.6051351 既可以得到gps经纬度。
后面的包的值都是以此类推,先判断Flag,再根据Flag值来判断value里面是有什么的值,再转出来。