定位 应用
一、演示功能概述
WiFi 定位功能通过无线信号扫描模块与定位算法引擎,实现将环境中的 WiFi 信号特征转化为精准位置坐标的技术。它支持设备实时获取空间位置信息,并兼容多频段信号分析、误差补偿算法及动态路径追踪。本章节将以 Air8000 核心开发板为平台,演示如何通过集成 WiFi 模组实现跨场景智能定位,并展示其在室内导航、资产追踪等嵌入式物联网应用中的创新实践。
1.1 wifi 定位原理
WIFI 定位的原理和基站定位原理类似,搜索并上报附近的 wifi 信息, 上报到服务器后, 服务器根据三角定位法, 估算出一个大概的坐标,精度在 50~500 米不等。
1.2 基站定位原理
基站定位也就是"LBS 定位",全称是 Location Based Service,它包括两层含义:首先是确定移动设备或用户所在的地理位置;其次是提供与位置相关的各类信息服务。意指与定位相关的各类服务系统,简称"定位服务"。
多基站定位中,模块正常联网后,搜索并上报周围的基站信息, 上报到服务器后, 服务器根据三角定位法, 估算出一个大概的坐标,最后返回计算出来的经纬度给模块。
单基站定位中,模块正常联网后,搜索并上报周围的基站信息,服务器会存储多数已知基站的经纬度,根据模块上报的基站信息,直接下发对应位置的经纬度数据。
多基站一般精度在 10-300 米内,单基站误差有可能会在 1.5KM 内
1.3 免费和收费服务区别
在过去的时间里,合宙为您提供了免费的单基站(LBS)定位服务,为您创造了重要价值。
但是由于单基站定位技术本身的原因,无法提供相对精准的定位服务。
在产品不支持 GPS 功能的情况下,为了满足部分用户更精准的定位需求,合宙现在已推出了多 LBS/WIFI 定位收费服务,相对于免费的单 LBS 定位服务来说,定位精度更高。
1.3.1 免费服务
1. 免费服务仅支持单基站定位,无 wifi 定位, 使用旧的后台接口,只使用合宙数据库,当前请求频率限制:2 分钟最多 1 次。
2. 超过频次的定位请求均会返回定位失败。返回错误码,不包含位置信息。
1.3.2 收费服务
在产品不支持 GPS 功能的情况下,为了满足部分用户更精准的定位需求,合宙现在正式推出了多 LBS/WIFI 定位收费服务,相对于免费的单 LBS 定位服务来说,定位精度更高。
收费服务有两种,一种是直接使用合宙的基站 WIFI 位置数据库,一种是直接使用高德的基站 WIFI 位置数据库;
这两种服务的主要区别是:
合宙数据库可能没有高德数据库的位置信息全;
虽然可能不是很全,但是合宙数据库每天都会自动收集更新新的位置信息到数据库中;
如果在位置的精准度和收费成本上,做个权衡,可以选择合宙数据库的收费服务;
如果对成本不敏感,对位置的精准度要求很高,可以选择高德数据库的收费服务;
1. 合宙数据库
注意:只有用 2014 年 11 月 25 号后的 lib 库才能支持。
相比与免费版的优势:支持多基站和 WIFI 定位,定位精度高
使用合宙数据库,根据请求频率限制,收费价格表如下:
2. 高德数据库
注意:只有用 2014 年 11 月 25 号后的 lib 库才能支持。
相比与免费版的优势:支持多基站和 WIFI 定位,不请求合宙数据库,直接请求高德数据库,定位精度更高。
使用高德数据库,根据请求频率限制,收费价格表如下:
3. 收费服务开通
缴费方式有以下两种(二选一即可):
3.1 登录 iot.openluat.com 点击上方的“订单管理”菜单,自主缴费;
3.2 联系合宙销售同事,由销售同事配合缴费;
4. 查看已经开通的收费业务
首先登录平台 iot.openluat.com,点击 上方的“订单管理”菜单,进入后我们可以在我的订单中查看已开通的收费服务。
点击详情可以查看到具体的订单详细:
1.4 Air8000 的独立 wifi 和 780E 上 wifi 定位区别
1. 780E 系列的 wifi 扫描和 4G 公用天线,扫描会影响 4G 数据的收发,以及 wifi 扫描的效率。
2. air8000 的独立 wifi 扫描速度大约 100ms 相较而言 780E 系列需要长达 10 秒 ,功耗大大降低,扫描数据也更多,更准确。
二、准备硬件环境
参考:Air8000 硬件环境清单,准备好硬件环境。
2.1 Air8000 核心开发板
三、准备软件环境
3.1 文章内容应用
1. 烧录工具:Luatools 工具
2. Air8000 烧录需要的固件和脚本文件:内核固件 | 脚本文件
3. LuatOS 运行所需要的 lib 文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件。
准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。
4. 使用 WIFI 功能需要按照如下步骤在板子上烧录 wifi 固件:https://docs.openluat.com/air8000/luatos/app/updatwifi/update/
3.2 API 介绍
airlbs.request(param)
获取定位数据
参数
**传入值类型** | **解释** |
param | table 参数(联系销售获取id与key) project_id:项目ID project_key:项目密钥 timeout:超时时间,单位毫秒 默认15000 |
返回值
**返回值类型** | **解释** |
bool | 成功返回true,失败会返回false |
table | 定位成功生效,成功返回定位数据 |
例子
local result , data = airlbs.request({project_id = airlbs_project_id,project_key = airlbs_project_key})
if result then
print("airlbs", json.encode(data))
end
-- 2025.4.10 新增adapter参数
local result , data = airlbs.request({
project_id = airlbs_project_id,
project_key = airlbs_project_key,
adapter = socket.LWIP_STA
})
四、代码示例
--[[
1.本demo可直接在Air8000模组上运行
2. 执行逻辑为:
(1)初始化wlan功能
(2)连接wifi热点
(3)等待网络连接成功
(4)执行时间同步
(5)等待时间同步成功
(6)循环扫描wifi,如果扫描到wifi信息,则请求wifi定位
]]
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "WLAN_LOCATION"
VERSION = "1.0.0"
-- sys库是标配
_G.sys = require("sys")
require "sysplus"
local taskName = "WIFI_LOCATION"
local result = false -- 用于保存结果
local data = nil -- 用于保存定位请求数据
local wifiList = {} -- 用于保存扫描到的wifi信息
local requestParam = {} -- 用于保存定位请求参数
local airlbs = require "airlbs"
local airlbsProjectId = "XXXXXX" -- 定位所需的项目key_id
local airlbsProjectKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -- 定位所需的项目key
local function wlan_location_task()
sys.wait(200)
wlan.init() -- wlan功能初始化
-- socket.create(socket.LWIP_STA)
sys.wait(100)
wlan.connect("luatos1234", "12341234") -- 连接wifi
result = sys.waitUntil("IP_READY", 30000) -- 等待网络就绪成功的消息,超时时间30秒
if not result then
log.info("等待网络就绪超时, 结束本次测试")
return
end
socket.sntp(nil, socket.LWIP_STA) -- 同步网络时间
result = sys.waitUntil("NTP_UPDATE", 30000) -- 等待时间同步成功的消息,超时时间30秒
if not result then
log.info("等待时间同步成功超时, 结束本次测试")
return
end
while true do
wlan.scan()
result = sys.waitUntil("WLAN_SCAN_DONE", 20000) -- 等待WIFI扫描完成的消息,超时时间20秒
if result then
wifiList = wlan.scanResult()
if #wifiList > 0 then
for k, v in pairs(wifiList) do
log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
end
local requestParam = {
project_id = airlbsProjectId, -- 定位所需的projectid
project_key = airlbsProjectKey, -- 定位所需的projectkey
wifi_info = wifiList, -- 用于定位的WiFi信息
adapter = socket.LWIP_STA, -- 网络适配器类型
timeout = 5000 -- 定位超时时间
}
result, data = airlbs.request(requestParam)
if result then
log.info("airlbs请求成功", json.encode(data))
else
log.info("airlbs请求失败")
end
else
log.info("没有扫描到wifi")
end
else
log.info("等待WIFI扫描结果超时")
end
sys.wait(20000) -- 等待20秒
end
end
-- 每隔6秒打印一次airlink统计数据, 调试用
sys.taskInit(function()
while 1 do
sys.wait(6000)
airlink.statistics()
end
end)
sysplus.taskInitEx(wlan_location_task, taskName)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
五、功能演示
5.1 启用 IOT WiFi 定位功能
打开 IOT 平台 合宙云平台 进入我们的 LBS 界面
点击我的项目-新建项目,并记录下项目 key_id 和项目 key,随后点击 云平台主页 返回到主页面
随后点击主页上的 订单管理,按照"1.3.2 收费服务"章节的介绍完成设备缴费。
即可在我的设备中看到已缴费设备。
5.2 添加项目 key 并烧录代码
随后打开代码,将记录下的项目 key_id 和项目 key 填写到代码中。
烧录代码
5.3 手机或电脑创建 WIFI 热点
如图,演示用笔记本设置 WIFI 热点,ssid:luatos1234,password:12341234
5.4 查看运行日志
模组已连接上热点
扫描到附近的 WIFI
获取到位置数据
5.5 查询位置是否正确
将获取到的位置复制到定位纠偏网页上,即可显示出当前位置 GPS 定位纠偏。
六、总结
至此,我们已使用 Air8000 核心开发板演示了 WIFI 定位功能。