高德的位置服务器,高德位置服务浅析

前言

在分析华为 agps 的位置获取具体实现逻辑时,通过抓包发现有一条发送到高德的数据流;

agps 的原理是手机通过移动网络向基站的 agps 服务器请求得到当前位置的卫星星历信息(包括仰角、轨道等),拿到星历信息后再 进行运算出当前设备的伪距信息,最后将伪距信息传送到 agps 服务器并最终得到手机终端的具体 gps 信息返回到设备。

通过抓包得到的是一条 走 wifi 流量的高德数据;是在返回当前位置的时候开始发送的(onLocationChanged 函数返回);

当前的手机是华为手机,在打算分析华为 rom 的时候,拆解 rom,发现有个 高德位置服务.apk ,遂分析该 apk。

包名是: com.amap.android.ams

结论:

高德位置服务会采集当前设备内很多信息。

抓到的数据流

上报的数据是经过 gzip 的编码处理;

可以将抓包数据转成 byte 流之后,再试用 gzip -d filename 命令解码;

POST /APS/r?ver=4.9&q=0&csid=5ff08bb5-bda6-47fc-38ca-30f5b5d2f33b HTTP/1.1

gzipped: 1

Accept-Encoding: gzip

et: 111

Content-Type: application/octet-stream

User-Agent: Dalvik/2.1.0 (Linux; U; Android 8.0.0; EDI-AL10 Build/HUAWEIEDISON-AL10)

Host: aps.amap.com

Connection: Keep-Alive

Content-Length: 895

HTTP/1.1 200

Date: Thu, 04 Jun 2020 06:18:51 GMT

Content-Type: application/octet-stream;charset=UTF-8

Transfer-Encoding: chunked

Connection: keep-alive

retype: -1

rdesc:

content-encoding: gzip

Server: Tengine/Aserver

EagleEye-TraceId: 0e0fb40115912515318368299efd77

Timing-Allow-Origin: *

gzip 的解码代码

#include

#include

int inflate_read(char *source,int len,char **dest,int gzip) {

LOGTEST("[inflate_read][IN]");

int CHUNK = 2048;

int ret;

unsigned have;

z_stream strm;

unsigned char out[CHUNK];

int totalsize = 0;

/* allocate inflate state */

strm.zalloc = Z_NULL;

strm.zfree = Z_NULL;

strm.opaque = Z_NULL;

strm.avail_in = 0;

strm.next_in = Z_NULL;

LOGTEST("[inflate_read][step 0]");

if (gzip)

ret = inflateInit2(&strm, 47);

else

ret = inflateInit(&strm);

LOGTEST("[inflate_read][step 1 ret %d ]", ret);

if (ret != Z_OK)

return ret;

strm.avail_in = 975;

strm.next_in = (Bytef*)source;

LOGTEST("[inflate_read][step 2]");

/* run inflate() on input until output buffer not full */

strm.avail_out = 2048;

strm.next_out = out;

ret = inflate(&strm, Z_NO_FLUSH);

assert(ret != Z_STREAM_ERROR); /* state not clobbered */

switch (ret) {

//Z_OK

//Z_STREAM_END 1

//Z_NEED_DICT 2

//Z_ERRNO (-1)

//Z_STREAM_ERROR (-2)

//Z_DATA_ERROR (-3)

//Z_MEM_ERROR (-4)

//Z_BUF_ERROR (-5)

//Z_VERSION_ERROR (-6)

case Z_NEED_DICT:

ret = Z_DATA_ERROR;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity中使用MQTT连接高德地图服务器,您需要遵循以下步骤: 1. 下载并安装MQTT库:您可以使用paho-mqtt库来在Unity中使用MQTT。请确保在Unity中正确安装该库。 2. 创建MQTT连接:使用paho-mqtt库创建一个MQTT连接,该连接将连接到高德地图服务器。 3. 订阅主题:为了接收高德地图服务器发送的消息,您需要订阅一个或多个主题。 4. 处理消息:一旦您的Unity应用程序订阅了主题,它将开始接收消息。您需要编写代码来处理这些消息并根据需要更新您的Unity场景。 以下是一个示例代码片段,演示如何在Unity中连接到MQTT服务器并订阅高德地图服务器发送的主题: ```csharp using UnityEngine; using System.Collections; using MQTT; public class MqttExample : MonoBehaviour { private MQTT.Client client; // Use this for initialization void Start () { client = new MQTT.Client("tcp://mqtt.example.com:1883", "exampleclient"); client.Connect(); client.Subscribe(new string[] { "topic1", "topic2" }, new byte[] { MQTT.MsgBase.QOS_LEVEL_AT_MOST_ONCE, MQTT.MsgBase.QOS_LEVEL_AT_LEAST_ONCE }); client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; } void client_MqttMsgPublishReceived(object sender, MQTT.MqttMsgPublishEventArgs e) { Debug.Log("Received: " + System.Text.Encoding.UTF8.GetString(e.Message)); } } ``` 请注意,此代码仅是示例代码,并且需要进行修改以适应您的具体应用程序和服务器设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值