Skip to content

基站定位

本文档介绍了基站定位的使用方法,并通过demo_lbs.c举例演示

基本流程

基站定位的核心流程是先获取设备的网络状态、小区信息、信号强度等关键数据,接着构建 HTTP 请求并发送到基站定位服务,最后解析服务返回的 JSON 数据,从而获取设备的经纬度信息。具体流程可参考下方的流程图:

获取网络状态

在定位开始前首先通过yopen_nw_get_reg_status接口检查网络注册状态

示例:

 do{
        yopen_nw_get_reg_status(0, &nw_status);

        yopen_rtos_task_sleep_ms(1000);

        DEMO_LBS_TRACE("==========nw_status old %d==========", nw_status.data_reg.state);

        if(nw_status.data_reg.state == YOPEN_NW_REG_STATE_DENIED)
        {
            DEMO_LBS_TRACE("network reg denied !!!!");
        }

    }while(!(nw_status.data_reg.state == YOPEN_NW_REG_STATE_HOME_NETWORK || nw_status.data_reg.state == YOPEN_NW_REG_STATE_ROAMING));//当网络状态既不是本地网络也不是漫游状态时,继续循环检查

循环获取基站信息

当网络连接成功后,程序将进入一个无限循环,在这个循环中会持续执行以下操作,以获取定位所需的各项信息,相关接口可以参考网络信息配置

  • 调用 yopen_nw_get_phy_status_info 函数获取物理状态信息。
  • 调用 yopen_nw_get_cell_info 函数获取小区信息,并将小区信息结构体清零。
  • 调用 yopen_nw_get_csq 函数获取信号强度。
  • 调用 yopen_dev_get_imei 函数获取设备的 IMEI 号。

示例:

yopen_nw_get_phy_status_info(0,&phy_status_info);//获取物理状态信息
memset(&cell_info, 0, sizeof(cell_info));
yopen_nw_get_cell_info(0, &cell_info);//获取小区信息,并将小区信息结构体清零
yopen_nw_get_csq(0, &csq);//获取信号强度
yopen_dev_get_imei(imei, 64, 0);//获取设备的 IMEI 号

构建 HTTP 请求 URL

根据前面获取到的小区信息(包括 mcc, mnc, tac, cid)、信号强度(csq)、物理状态信息中的 rssi 以及设备的 IMEI 号,使用 sprintf 函数填充 HTTP_LBS_URL 模板,从而生成实际的 HTTP 请求 URL。相关接口可以参考HTTP连接,以下是示例代码框架:

if (cell_info.lte_info_valid) {
    sprintf(s_http_lbs_url, HTTP_LBS_URL, cell_info.lte_info[0].mcc, cell_info.lte_info[0].mnc,
            cell_info.lte_info[0].tac, cell_info.lte_info[0].cid, csq, phy_status_info.rssi, imei);
    DEMO_LBS_TRACE("http url %s", s_http_lbs_url);
}

发送 HTTP 请求

构建好 HTTP 请求 URL 后,需要将请求发送到基站定位服务。这一步主要通过调用 httpConnect 接口连接到服务器,然后调用 httpSendRequest 发送 HTTP GET 请求。以下是示例代码:

result = httpConnect(clientContext, url);//HTTP连接
if (result != HTTP_OK) {
    DEMO_LBS_TRACE("httpConnect error %d!!!", result);
    goto exit;
}

result = httpSendRequest(clientContext, url, HTTP_GET, clientData);//HTTP_GET
if (result != HTTP_OK) {
    DEMO_LBS_TRACE("httpSendRequest error %d!!!", result);
    goto exit;
}

接收http响应

发送请求后,需要接收服务器返回的响应。这一步通过调用 httpRecvResponse 函数来实现。

httpRecvResponse(clientContext, clientData);//HTTP接收响应

解析 JSON 数据

服务器返回的响应通常是 JSON 格式的数据,需要从中提取出有用的信息,如 codemsglnglat 字段的值。以下是解析 JSON 数据的示例代码:

   // 获取code字段
    cJSON *code = cJSON_GetObjectItem(root, "code");
    if (cJSON_IsNumber(code)) {
        DEMO_LBS_TRACE("code: %d\n", code->valueint);
    }

    // 获取msg字段
    cJSON *msg = cJSON_GetObjectItem(root, "msg");
    if (cJSON_IsString(msg)) {
        DEMO_LBS_TRACE("msg: %s\n", msg->valuestring);
    }

    // 获取result对象
    cJSON *result = cJSON_GetObjectItem(root, "result");
    if (cJSON_IsObject(result)) {
        // 获取result中的lng字段
        cJSON *lng = cJSON_GetObjectItem(result, "lng");
        if (cJSON_IsNumber(lng)) {
            DEMO_LBS_TRACE("lng: %.6f\n", lng->valuedouble);
        }

        // 获取result中的lat字段
        cJSON *lat = cJSON_GetObjectItem(result, "lat");
        if (cJSON_IsNumber(lat)) {
            DEMO_LBS_TRACE("lat: %.6f\n", lat->valuedouble);
        }
    }

举例演示

通过以上步骤,就可以完成基站定位的整个流程,从获取网络状态到最终解析出设备的经纬度信息。

打开 demo_heartbeat.c,经编译运行后烧录至开发板,具体过程参考Yopen 入门篇开发入门

根据日志信息,获取到的位置经纬度为:

  • 经度(lng):117.137002
  • 纬度(lat):31.834294