跳转至

基站WIFI定位

一、基站/wifi/概述

1.1 基站定位原理

基站定位也就是"LBS 定位",全称是 Location Based Service,它包括两层含义:首先是确定移动设备或用户所在的地理位置;其次是提供与位置相关的各类信息服务。意指与定位相关的各类服务系统,简称"定位服务"。

多基站定位中,模块正常联网后,搜索并上报周围的基站信息, 上报到服务器后, 服务器根据三角定位法, 估算出一个大概的坐标,最后返回计算出来的经纬度给模块。

单基站定位中,模块正常联网后,搜索并上报周围的基站信息,服务器会存储多数已知基站的经纬度,根据模块上报的基站信息,直接下发对应位置的经纬度数据。

多基站一般精度在 10-300 米内,单基站误差有可能会在 1.5KM 内

1.2 wifi 定位原理

WIFI 定位的原理和基站定位原理类似,搜索并上报附近的 wifi 信息, 上报到服务器后, 服务器根据三角定位法, 估算出一个大概的坐标,精度在 50~500 米不等。

1.3 免费和收费服务区别

在过去的时间里,合宙为您提供了免费的单基站(LBS)定位服务,为您创造了重要价值。

但是由于单基站定位技术本身的原因,无法提供相对精准的定位服务。

在产品不支持 GPS 功能的情况下,为了满足部分用户更精准的定位需求,合宙现在已推出了多 LBS/WIFI 定位收费服务,相对于免费的单 LBS 定位服务来说,定位精度更高。

1.4.1 免费服务

  1. 免费服务仅支持单基站定位,无 wifi 定位, 使用旧的后台接口,只使用合宙数据库,当前请求频率限制:2 分钟最多 1 次。
  2. 超过频次的定位请求均会返回定位失败。返回错误码,不包含位置信息。

1.4.2 收费服务

在产品不支持 GPS 功能的情况下,为了满足部分用户更精准的定位需求,合宙现在正式推出了多 LBS/WIFI 定位收费服务,相对于免费的单 LBS 定位服务来说,定位精度更高。

收费服务有两种,一种是直接使用合宙的基站 WIFI 位置数据库,一种是直接使用高德的基站 WIFI 位置数据库;

这两种服务的主要区别是:

合宙数据库可能没有高德数据库的位置信息全;

虽然可能不是很全,但是合宙数据库每天都会自动收集更新新的位置信息到数据库中;

如果在位置的精准度和收费成本上,做个权衡,可以选择合宙数据库的收费服务;

如果对成本不敏感,对位置的精准度要求很高,可以选择高德数据库的收费服务;

1. 合宙数据库

注意:只有用2014年11月25号后的lib库才能支持。

相比与免费版的优势:支持多基站和 WIFI 定位,定位精度高

使用合宙数据库,根据请求频率限制,收费价格表如下:

每小时请求次数限制
每次请求间隔限制
单台设备年费(元)
12
至少 5 分钟
1 元
24
至少 2.5 分钟
2 元
60
至少 1 分钟
5 元
240
至少 15 秒
10 元

2. 高德数据库

注意:只有用2014年11月25号后的lib库才能支持。

相比与免费版的优势:支持多基站和 WIFI 定位,不请求合宙数据库,直接请求高德数据库,定位精度更高

使用高德数据库,根据请求频率限制,收费价格表如下:

每小时请求次数限制
每次请求间隔限制
单台设备年费(元)
12
至少 5 分钟
10 元
24
至少 2.5 分钟
20 元
60
至少 1 分钟
50 元

3. 收费服务开通

在 IOT 平台开启付费服务 iot.openluat.com

注:当前后台还未支持新的开启收费服务的前端自主缴费功能,待后续补充,目前如需开通收费服务,需告知合宙销售要开通的 iot 账号和设备 IMEI 列表,与合宙销售同事对接商务流程。

4. 查看已经开通的收费业务

首先登录平台 iot.openluat.com,点击 LBS 服务

进入后我们可以在我的订单中查看已开通的收费服务

二、演示功能概述

Air780EP 支持两种定位,分别是 LBS 定位,WIFI 定位,

本文主要介绍 Air780EP 使用 LuatOS 来实现定位服务,大致流程如下:

付费版本:

  1. 联系销售开通付费服务,然后去 iot 平台 LBS 服务中查看自己的 id 和 key
  2. 烧录示例 demo,通过 airlbs.request 接口发起请求,上报基站和 wifi,进行混合定位

免费版本: 1. 登录iot平台,找到自己项目里的key 2. 更改示例demo里的key,然后烧录进去,通过lbsLoc2.request 接口发起请求,上报基站信息,进行单基站定位

三、准备硬件环境

参考:硬件环境清单第二章节内容,准备以及组装好硬件环境。

四、软件环境

“凡事预则立,不预则废。”在详细阐述本功能示例之前,我们需先精心筹备好以下软件环境。

1. Luatools工具

2. 内核固件文件(底层core固件文件):LuatOS-SoC_V2002_Air780EP;参考项目使用的内核固件

3. luatos需要的脚本和资源文件

免费版本脚本所在位置:https://gitee.com/openLuat/LuatOS-Air780EP/blob/master/demo/lbsLoc2/main.lua

付费版本脚本所在位置:https://gitee.com/openLuat/LuatOS-Air780EP/blob/master/demo/airlbs/main.lua

lib 文件所在位置:https://gitee.com/openLuat/LuatOS-Air780EP/tree/master/script/libs

准备好软件环境之后,接下来查看如何烧录项目文件到Air780EP核心板,将本篇文章中演示使用的项目文件烧录到Air780EP核心板中。

六、代码示例介绍

示例分为免费版本和付费版本,免费版本只有单基站定位,付费版本有多基站定位和 wifi+ 基站混合定位

6.1 免费版本基站定位

6.1.1 代码介绍

demo 链接

-- Luatools需要PROJECT和VERSION这两个信息
PROJECT = "lbsLoc2demo"
VERSION = "1.0.0"

-- sys库是标配
sys = require("sys")

local lbsLoc2 = require("lbsLoc2")

-- Air780EP的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
    pm.power(pm.PWK_MODE, false)
end

sys.taskInit(function()
    sys.waitUntil("IP_READY", 30000)
    -- mobile.reqCellInfo(60)
    -- sys.wait(1000)
    while mobile do -- 没有mobile库就没有基站定位
        mobile.reqCellInfo(15)--进行基站扫描
        sys.waitUntil("CELL_INFO_UPDATE", 3000)--等到扫描成功,超时时间3S
        local lat, lng, t = lbsLoc2.request(5000)--仅需要基站定位给出的经纬度
        --local lat, lng, t = lbsLoc2.request(5000,nil,nil,true)--需要经纬度和当前时间
        --(时间格式{"year":2024,"min":56,"month":11,"day":12,"sec":44,"hour":14})
        log.info("lbsLoc2", lat, lng, (json.encode(t or {})))
        sys.wait(60000)
    end
end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.1.2 运行结果展示

6.2 付费版本多基站定位

付费版本 可以使用多基站/基站 +wifi 定位多种方式,当然,受限于模块设计,在使用 wifi 扫描时候,4G 数据传输较慢丢包概率较大,所以尽量在 wifi 扫描完毕后,再进行数传工作 (注:付费版本一定要使用第四章的lib文件)

6.2.1 代码介绍

-- Luatools需要PROJECT和VERSION这两个信息
PROJECT = "paid_lbs"
VERSION = "1.0.0"

-- 使用合宙iot平台时需要这个参数
PRODUCT_KEY = "xxx" -- 到 iot.openluat.com 创建项目,获取正确的项目id

-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
sysplus = require("sysplus")
libnet = require "libnet"

log.info("main", PROJECT,VERSION)

if wdt then
    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
    wdt.init(20000)--初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end

local airlbs = require "airlbs"

local timeout = 15--扫描基站做基站定位的超时时间,最小5S,最大60S
-- 此为收费服务,需自行联系销售申请
local airlbs_project_id = ""
local airlbs_project_key = ""

sys.taskInit(function()
    sys.waitUntil("IP_READY")

    socket.sntp()
    sys.waitUntil("NTP_UPDATE", 1000)

    while 1 do
        local result , data = airlbs.request({project_id = airlbs_project_id,project_key = airlbs_project_key,timeout =timeout*1000})
        if result then
            print("airlbs多基站定位返回的经纬度数据为", json.encode(data))
        end
        sys.wait(20000)
    end

end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.2.2 运行结果展示

6.3 付费版本 wifi+ 基站混合定位

付费版本 可以使用多基站/基站 +wifi 定位多种方式,当然,受限于模块设计,在使用 wifi 扫描时候,4G 数据传输较慢丢包概率较大,所以尽量在 wifi 扫描完毕后,再进行数传工作 (注:付费版本一定要使用第四章的lib文件) 6.3.1 代码介绍

-- Luatools需要PROJECT和VERSION这两个信息
PROJECT = "paid_lbs"
VERSION = "1.0.0"

-- 使用合宙iot平台时需要这个参数
PRODUCT_KEY = "xxx" -- 到 iot.openluat.com 创建项目,获取正确的项目id

-- 引入必要的库文件(lua编写), 内部库不需要require
sys = require("sys")
sysplus = require("sysplus")
libnet = require "libnet"

log.info("main", PROJECT, VERSION)

if wdt then
    -- 添加硬狗防止程序卡死,在支持的设备上启用这个功能
    wdt.init(20000) -- 初始化watchdog设置为9s
    sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
end

local airlbs = require "airlbs"

local timeout = 60 -- 扫描基站/wifi 做 基站/wifi定位 的超时时间,最小5S,最大60S

-- 此为收费服务,需自行联系销售申请
local airlbs_project_id = ""
local airlbs_project_key = ""
-- wifi/基站混合定位
sys.taskInit(function()
    sys.waitUntil("IP_READY")
    -- 如需wifi定位,需要硬件以及固件支持wifi扫描功能
    local wifi_info = nil
    if wlan then
        sys.wait(3000) -- 网络可用后等待一段时间才再调用wifi扫描功能,否则可能无法获取wifi信息
        wlan.init()
        wlan.scan()
        sys.waitUntil("WLAN_SCAN_DONE", timeout * 1000)
        wifi_info = wlan.scanResult()
        log.info("scan", "wifi_info", #wifi_info)
    end

    socket.sntp()
    sys.waitUntil("NTP_UPDATE", 1000)

    while 1 do
        local result, data = airlbs.request({
            project_id = airlbs_project_id,
            project_key = airlbs_project_key,
            wifi_info = wifi_info,
            timeout = timeout * 1000
        })
        if result then
            print("airlbs wifi+多基站混合定位的结果", json.encode(data))
        end
        sys.wait(20000) -- 循环20S一次wifi定位
    end

end)

-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!

6.3.2 运行结果展示

7 常见问题

7.1 基站/wifi 混合定位精度如何?

搜索到的小区/wifi 越多,定位的精度越高;一般来说,城市中心定位精度比郊区和农村定位精度高,城市中心的定位精度在几十米到几百米不等,郊区和农村的定位精度更低,可能会有几千米甚至更大的误差。

通过多基站/多 wifi 定位,将实时搜索到的信号强度排名前几的基站和 wifi 同时上报给后台参与定位,当然,基站定位的误差都比较大,如果需要准确定位,请使用支持 GPS 的模块。

7.2 为什么基站定位失败?

  1. 后台基站数据库查询不到所有小区的位置信息;在 Luatools 脚本日志中向上搜索 cells,然后在电脑浏览器中打开定位查询,手动查找 mcc,mnc,lac,ci 位置; 如果手动可以查到位置,则服务器存在 BUG,直接向技术支持人员反映问题;如果手动无法查到位置,则基站数据库还没有收录当前设备的小区位置信息,向技术支持人员反馈,我们会尽快收录。
  2. 达到了总的 qps 限制数量。
  3. 检查代码里的 project_id 和 project_key 是否正常,project_id 是个 7 位的字符串

7.3 合宙官方的基站定位能在国外使用吗?

不能,没有国外的基站数据库。

7.4 基站/WIFI 定位定位获取的经纬度是什么格式的?

基站定位获取的经纬度为 WGS-84 格式,各种坐标系说明以及转换方法请网上搜索坐标系在线转换工具即可查询。

7.5 原来用的lbsLoc.request免费的,现在还能继续免费用吗?

可以免费使用,但lbsloc不维护服务器了,不建议新用户使用。

给读者的话

本篇文章由 黄何 开发; 本篇文章描述的内容,如果有错误、细节缺失、细节不清晰或者其他任何问题,总之就是无法解决您遇到的问题; 请先登录合宙技术交流论坛,然后点击右边链接文档找错赢奖金-Air780EP-LuatOS-软件指南-常用功能实现-基站WIFI定位 用截图标注 + 文字描述的方式跟帖回复,记录清楚您发现的问题; 我们会迅速核实并且修改文档; 同时也会为您累计找错积分,您还可能赢取月度找错奖金!