Просмотр исходного кода

update:Air8000的airlbs demo

王城钧 7 месяцев назад
Родитель
Сommit
81071060a4

+ 117 - 0
module/Air8000/demo/airlbs/airlbs_app.lua

@@ -0,0 +1,117 @@
+--[[
+@module  airlbs_app.lua
+@summary Airlbs应用
+@version 1.0
+@date    2025.08.13
+@author  王城钧
+@usage
+
+本文件为airlbs“多基站”、“多基站+多wifi”两种应用场景的定位功能演示,核心业务逻辑为:
+1. 等待网络就绪 
+2. 发起NTP授时 
+3. 循环定位请求 
+
+本文件没有对外接口,直接在main.lua中require "airlbs_app"就可以加载运行;
+]]
+
+local airlbs = require "airlbs"
+
+local timeout = 10 -- 扫描基站/wifi 做 基站/wifi定位 的超时时间,最小5S,最大60S
+
+--  此服务为收费服务,需自行联系销售申请或者在 https://iot.openluat.com/finance/order 购买
+
+--  以下为合宙LBS平台开通的项目id和秘钥
+--  以下项目密钥和id请根据实际项目进行修改,https://iot.openluat.com/lbs/bs 在此网址中我的项目下
+local airlbs_project_id = "此处换成自己的项目id"
+local airlbs_project_key = "此处换成自己的项目key"
+
+--多基站定位
+local function airlbs_multi_cells_task_func()
+    while not socket.adapter(socket.dft()) do
+        log.warn("lbsloc2_task_func", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
+        -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
+        -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
+        sys.waitUntil("IP_READY", 1000)
+    end
+
+    -- 检测到了IP_READY消息
+    log.info("airlbs_multi_cells_func", "recv IP_READY", socket.dft())
+    socket.sntp() -- 进行NTP授时
+    sys.waitUntil("NTP_UPDATE", 1000) 
+    while 1 do
+        if airlbs_project_id and airlbs_project_key then
+            local result, data = airlbs.request({
+                project_id = airlbs_project_id,-- 项目ID
+                project_key = airlbs_project_key,-- 项目密钥
+                timeout = timeout * 1000, -- 实际的超时时间(单位:ms)
+            })
+            if result then
+                log.info("airlbs多基站定位返回的经纬度数据为", json.encode(data))
+            end
+        else
+            log.warn("请检查project_id和project_key")
+        end
+        sys.wait(20000) -- 循环20S一次多基站定位
+    end
+end
+
+--多基站+多wifi定位
+local function airlbs_multi_cells_wifi_task_func()
+    while not socket.adapter(socket.dft()) do
+        log.warn("airlbs_multi_cells_wifi_func", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
+        -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
+        -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
+        sys.waitUntil("IP_READY", 1000)
+    end
+
+    -- 检测到了IP_READY消息
+    log.info("airlbs_multi_cells_wifi_func", "recv IP_READY", socket.dft())
+
+    socket.sntp() --进行NTP授时
+    sys.waitUntil("NTP_UPDATE", 1000)
+
+    -- 如需wifi定位,需要硬件以及固件支持wifi扫描功能
+    local wifi_info = nil
+    if wlan then
+        wlan.init()--初始化wlan
+        wlan.scan()--扫描wifi
+        sys.waitUntil("WLAN_SCAN_DONE", timeout * 1000)--等待扫描完成
+        wifi_info = wlan.scanResult()--获取扫描结果
+        log.info("scan", "wifi_info", #wifi_info)--打印扫描结果
+    end
+
+    while 1 do
+        local result, data = airlbs.request({
+            project_id = airlbs_project_id,-- 项目ID
+            project_key = airlbs_project_key,-- 项目密钥
+            wifi_info = wifi_info,-- wifi信息
+            timeout = timeout * 1000,-- 实际的超时时间(单位:ms)
+        })
+        if result then
+            local data_str = json.encode(data)
+            log.info("airlbs多基站+多wifi定位返回的经纬度数据为", data_str)-- 解析经纬度
+            local lat = data_str:match("\"lat\":([0-9.-]+)")-- 匹配lat
+            log.info("airlbs", "lat", lat)-- 打印lat
+            local lng = data_str:match("\"lng\":([0-9.-]+)")-- 匹配lng
+            log.info("airlbs", "lng", lng)-- 打印lng
+        else        
+            log.warn("请检查project_id和project_key")-- 打印提示信息
+        end
+        sys.wait(20000) -- 循环20S一次基站+wifi定位
+    end
+
+end
+
+--多基站定位
+sys.taskInit(airlbs_multi_cells_task_func)
+
+--多基站+多wifi定位
+sys.taskInit(airlbs_multi_cells_wifi_task_func)

+ 48 - 73
module/Air8000/demo/airlbs/main.lua

@@ -1,93 +1,68 @@
--- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "paid_lbs"
-VERSION = "1.0.0"
+--[[
+@module  main.lua
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.08.13
+@author  王城钧
+@usage
+本demo演示的核心功能为:
+1、airlbs“多基站”、“多基站+多wifi”两种应用场景的定位演示。
+2、netdrv_device:配置连接外网使用的网卡,目前支持以下四种选择(四选一)
+   (1) netdrv_4g:4G网卡
+   (2) netdrv_wifi:WIFI STA网卡
+   (3) netdrv_eth_spi:通过SPI外挂CH390H芯片的以太网卡
+   (4) netdrv_multiple:支持以上三种网卡,可以配置三种网卡的优先级
 
--- 使用合宙iot平台时需要这个参数
-PRODUCT_KEY = "xxx" -- 到 iot.openluat.com 创建项目,获取正确的项目id
+此服务为收费服务,需自行联系销售申请或者在 https://iot.openluat.com/finance/order 购买
+更多说明参考本目录下的readme.md文件
+]]
 
--- 引入必要的库文件(lua编写), 内部库不需要require
-sys = require("sys")
-sysplus = require("sysplus")
-libnet = require "libnet"
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "AIRLBS_DEMO"
+VERSION = "001.000.000"
 
+-- 在日志中打印项目名和项目版本号
 log.info("main", PROJECT, VERSION)
 
+-- 如果内核固件支持wdt看门狗功能,此处对看门狗进行初始化和定时喂狗处理
+-- 如果脚本程序死循环卡死,就会无法及时喂狗,最终会自动重启
 if wdt then
     -- 添加硬狗防止程序卡死,在支持的设备上启用这个功能
     wdt.init(20000) -- 初始化watchdog设置为9s
     sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
 end
 
-local airlbs = require "airlbs"
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
 
-local timeout = 60 -- 扫描基站/wifi 做 基站/wifi定位 的超时时间,最小5S,最大60S
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
 
--- 此为收费服务,需自行联系销售申请
-local airlbs_project_id = ""
-local airlbs_project_key = ""
 
--- --多基站定位
--- sys.taskInit(function()
---     sys.waitUntil("IP_READY") -- 等待底层上报联网成功
---     socket.sntp() -- 进行NTP授时,放置部分联通卡没有基站授时
---     sys.waitUntil("NTP_UPDATE", 1000)
---     while 1 do
---         if airlbs_project_id and airlbs_project_key then
---             local result, data = airlbs.request({
---                 project_id = airlbs_project_id,
---                 project_key = airlbs_project_key,
---                 timeout = timeout * 1000 -- 实际的超时时间(单位:ms)
---             })
---             if result then
---                 log.info("airlbs多基站定位返回的经纬度数据为", json.encode(data))
---             end
---         else
---             log.warn("请检查project_id和project_key")
---         end
---         sys.wait(20000)
---     end
+-- 加载网络驱动设备功能模块
+require "netdrv_device"
 
--- end)
+-- 加载airlbs应用模块
+-- 此为收费服务,需自行联系销售申请,或者在https://iot.openluat.com/finance/order 自行开通
+require "airlbs_app"
 
--- 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
-            local data_str = json.encode(data)
-            log.info("airlbs多基站定位返回的经纬度数据为", data_str)
-            -- 解析经纬度
-            local lat = data_str:match("\"lat\":([0-9.-]+)")
-            log.info("airlbs", "lat", lat)
-            local lng = data_str:match("\"lng\":([0-9.-]+)")
-            log.info("airlbs", "lng", lng)
-        else        
-            log.warn("请检查project_id和project_key")
-        end
-        sys.wait(20000) -- 循环20S一次wifi定位
-    end
-
-end)
 
 -- 用户代码已结束---------------------------------------------
 -- 结尾总是这一句

+ 33 - 0
module/Air8000/demo/airlbs/netdrv/netdrv_4g.lua

@@ -0,0 +1,33 @@
+--[[
+@module  netdrv_4g
+@summary “4G网卡”驱动模块
+@version 1.0
+@date    2025.07.01
+@author  朱天华
+@usage
+本文件为4G网卡驱动模块,核心业务逻辑为:
+1、监听"IP_READY"和"IP_LOSE",在日志中进行打印;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_4g"就可以加载运行;
+]]
+
+local function ip_ready_func()
+    log.info("netdrv_4g.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_GP))
+end
+
+local function ip_lose_func()
+    log.warn("netdrv_4g.ip_lose_func", "IP_LOSE")
+end
+
+
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察4G网络的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+-- 设置默认网卡为socket.LWIP_GP
+-- 在Air8000上,内核固件运行起来之后,默认网卡就是socket.LWIP_GP
+-- 在单4G网卡使用场景下,下面这一行代码加不加都没有影响,为了和其他网卡驱动模块的代码风格保持一致,所以加上了
+socket.dft(socket.LWIP_GP)

+ 84 - 0
module/Air8000/demo/airlbs/netdrv/netdrv_eth_spi.lua

@@ -0,0 +1,84 @@
+--[[
+@module  netdrv_eth_spi
+@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块
+@version 1.0
+@date    2025.07.24
+@author  朱天华
+@usage
+本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块,核心业务逻辑为:
+1、打开CH390H芯片供电开关;
+2、初始化spi1,初始化以太网卡,并且在以太网卡上开启DHCP(动态主机配置协议);
+3、以太网卡的连接状态发生变化时,在日志中进行打印;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_spi"就可以加载运行;
+]]
+
+local function ip_ready_func()
+    log.info("netdrv_eth_spi.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
+end
+
+local function ip_lose_func()
+    log.warn("netdrv_eth_spi.ip_lose_func", "IP_LOSE")
+end
+
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+
+-- 设置默认网卡为socket.LWIP_ETH
+socket.dft(socket.LWIP_ETH)
+
+
+-- 本demo测试使用的是Air8000开发板
+-- GPIO140为CH390H以太网芯片的供电使能控制引脚
+gpio.setup(140, 1, gpio.PULLUP)
+
+-- 这个task的核心业务逻辑是:初始化SPI,初始化以太网卡,并在以太网卡上开启动态主机配置协议
+local function netdrv_eth_spi_task_func()
+    -- 初始化SPI1
+    local result = spi.setup(
+        1,--spi_id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        25600000--,--频率
+        -- spi.MSB,--高低位顺序    可选,默认高位在前
+        -- spi.master,--主模式     可选,默认主
+        -- spi.full--全双工       可选,默认全双工
+    )
+    log.info("netdrv_eth_spi", "spi open result", result)
+    --返回值为0,表示打开成功
+    if result ~= 0 then
+        log.error("netdrv_eth_spi", "spi open error",result)
+        return
+    end
+
+    --初始化以太网卡
+
+    --以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+    --各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
+    --也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+    --以太网断网后,内核固件会产生一个"IP_LOSE"消息
+    --各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
+    --也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
+
+    -- socket.LWIP_ETH 指定网络适配器编号
+    -- netdrv.CH390外挂CH390
+    -- SPI ID 1, 片选 GPIO12
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1, cs=12})
+
+    -- 在以太网上开启动态主机配置协议
+    netdrv.dhcp(socket.LWIP_ETH, true)
+end
+
+-- 创建并且启动一个task
+-- task的处理函数为netdrv_eth_spi_task_func
+sys.taskInit(netdrv_eth_spi_task_func)

+ 94 - 0
module/Air8000/demo/airlbs/netdrv/netdrv_multiple.lua

@@ -0,0 +1,94 @@
+--[[
+@module  netdrv_multiple
+@summary 多网卡(4G网卡、WIFI STA网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块
+@version 1.0
+@date    2025.07.24
+@author  朱天华
+@usage
+本文件为多网卡驱动模块,核心业务逻辑为:
+1、调用exnetif.set_priority_order配置多网卡的控制参数以及优先级;
+
+直接使用Air8000开发板硬件测试即可;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_multiple"就可以加载运行;
+]]
+
+local exnetif = require "exnetif"
+
+-- 网卡状态变化通知回调函数
+-- 当exnetif中检测到网卡切换或者所有网卡都断网时,会触发调用此回调函数
+-- 当网卡切换切换时:
+--     net_type:string类型,表示当前使用的网卡字符串
+--     adapter:number类型,表示当前使用的网卡id
+-- 当所有网卡断网时:
+--     net_type:为nil
+--     adapter:number类型,为-1
+local function netdrv_multiple_notify_cbfunc(net_type,adapter)
+    if type(net_type)=="string" then
+        log.info("netdrv_multiple_notify_cbfunc", "use new adapter", net_type, adapter)
+    elseif type(net_type)=="nil" then
+        log.warn("netdrv_multiple_notify_cbfunc", "no available adapter", net_type, adapter)
+    else
+        log.warn("netdrv_multiple_notify_cbfunc", "unknown status", net_type, adapter)
+    end
+end
+
+local function netdrv_multiple_task_func()
+    --设置网卡优先级
+    exnetif.set_priority_order(
+        {
+            -- “通过SPI外挂CH390H芯片”的以太网卡,使用Air8000开发板验证
+            {
+                ETHERNET = {
+                    -- 供电使能GPIO
+                    pwrpin = 140,
+                    -- 设置的多个“已经IP READY,但是还没有ping通”网卡,循环执行ping动作的间隔(单位毫秒,可选)
+                    -- 如果没有传入此参数,exnetif会使用默认值10秒
+                    ping_time = 3000,
+
+                    -- 连通性检测ip(选填参数);
+                    -- 如果没有传入ip地址,exnetif中会默认使用httpdns能否成功获取baidu.com的ip作为是否连通的判断条件;
+                    -- 如果传入,一定要传入可靠的并且可以ping通的ip地址;
+                    -- ping_ip = "填入可靠的并且可以ping通的ip地址",
+
+                    -- 网卡芯片型号(选填参数),仅spi方式外挂以太网时需要填写。
+                    tp = netdrv.CH390,
+                    opts = {spi=1, cs=12}
+                }
+            },
+
+            -- WIFI STA网卡
+            {
+                WIFI = {
+                    -- 要连接的WIFI路由器名称
+                    ssid = "iPhone",
+                    -- 要连接的WIFI路由器密码
+                    password = "xiaoshuai",
+
+                    -- 连通性检测ip(选填参数);
+                    -- 如果没有传入ip地址,exnetif中会默认使用httpdns能否成功获取baidu.com的ip作为是否连通的判断条件;
+                    -- 如果传入,一定要传入可靠的并且可以ping通的ip地址;
+                    -- ping_ip = "填入可靠的并且可以ping通的ip地址",
+                }
+            },
+
+            -- 4G网卡
+            {
+                LWIP_GP = true
+            }
+        }
+    )
+end
+
+-- 设置网卡状态变化通知回调函数netdrv_multiple_notify_cbfunc
+exnetif.notify_status(netdrv_multiple_notify_cbfunc)
+
+-- 如果存在udp网络应用,并且udp网络应用中,根据应用层的心跳能够判断出来udp数据通信出现了异常;
+-- 可以在判断出现异常的位置,调用一次exnetif.check_network_status()接口,强制对当前正式使用的网卡进行一次连通性检测;
+-- 如果存在tcp网络应用,不需要用户调用exnetif.check_network_status()接口去控制,exnetif会在tcp网络应用通信异常时自动对当前使用的网卡进行连通性检测。
+
+
+-- 启动一个task,task的处理函数为netdrv_multiple_task_func
+-- 在处理函数中调用exnetif.set_priority_order设置网卡优先级
+-- 因为exnetif.set_priority_order要求必须在task中被调用,所以此处启动一个task
+sys.taskInit(netdrv_multiple_task_func)

+ 49 - 0
module/Air8000/demo/airlbs/netdrv/netdrv_wifi.lua

@@ -0,0 +1,49 @@
+--[[
+@module  netdrv_wifi
+@summary “WIFI STA网卡”驱动模块
+@version 1.0
+@date    2025.07.01
+@author  朱天华
+@usage
+本文件为WIFI STA网卡驱动模块,核心业务逻辑为:
+1、初始化WIFI网络;
+2、连接WIFI路由器;
+3、和WIFI路由器之间的连接状态发生变化时,在日志中进行打印;
+
+本文件没有对外接口,直接在其他功能模块中require "netdrv_wifi"就可以加载运行;
+]]
+
+local function ip_ready_func()
+    log.info("netdrv_wifi.ip_ready_func", "IP_READY", json.encode(wlan.getInfo()))
+end
+
+local function ip_lose_func()
+    log.warn("netdrv_wifi.ip_lose_func", "IP_LOSE")
+end
+
+
+-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
+-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察WIFI的连接状态
+-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
+sys.subscribe("IP_READY", ip_ready_func)
+sys.subscribe("IP_LOSE", ip_lose_func)
+
+
+-- 设置默认网卡为socket.LWIP_STA
+socket.dft(socket.LWIP_STA)
+
+
+wlan.init()
+-- 连接WIFI热点,连接结果会通过"IP_READY"或者"IP_LOSE"消息通知
+-- Air8000仅支持2.4G的WIFI,不支持5G的WIFI
+-- 此处前两个参数表示WIFI热点名称以及密码,更换为自己测试时的真实参数即可
+-- 第三个参数1表示WIFI连接异常时,内核固件会自动重连
+wlan.connect("iPhone", "xiaoshuai", 1)
+
+-- WIFI联网成功(做为STATION成功连接AP,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
+-- 各个功能模块可以订阅"IP_READY"消息实时处理WIFI联网成功的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_STA)来获取WIFI网络是否连接成功
+
+-- WIFI断网后,内核固件会产生一个"IP_LOSE"消息
+-- 各个功能模块可以订阅"IP_LOSE"消息实时处理WIFI断网的事件
+-- 也可以在任何时刻调用socket.adapter(socket.LWIP_STA)来获取WIFI网络是否连接成功

+ 33 - 0
module/Air8000/demo/airlbs/netdrv_device.lua

@@ -0,0 +1,33 @@
+--[[
+@module  netdrv_device
+@summary 网络驱动设备功能模块
+@version 1.0
+@date    2025.07.24
+@author  朱天华
+@usage
+本文件为网络驱动设备功能模块,核心业务逻辑为:根据项目需求,选择并且配置合适的网卡(网络适配器)
+1、netdrv_4g:socket.LWIP_GP,4G网卡;
+2、netdrv_wifi:socket.LWIP_STA,WIFI STA网卡;
+3、netdrv_ethernet_spi:socket.LWIP_ETH,通过SPI外挂CH390H芯片的以太网卡;
+4、netdrv_multiple:可以配置多种网卡的优先级,按照优先级配置,使用其中一种网卡连接外网;
+
+根据自己的项目需求,只需要require以上四种中的一种即可;
+
+
+本文件没有对外接口,直接在main.lua中require "netdrv_device"就可以加载运行;
+]]
+
+
+-- 根据自己的项目需求,只需要require以下四种中的一种即可;
+
+-- 加载“4G网卡”驱动模块
+require "netdrv_4g"
+
+-- 加载“WIFI STA网卡”驱动模块
+-- require "netdrv_wifi"
+
+-- 加载“通过SPI外挂CH390H芯片的以太网卡”驱动模块
+-- require "netdrv_eth_spi"
+
+-- 加载“可以配置优先级的多种网卡”驱动模块
+-- require "netdrv_multiple"

+ 140 - 0
module/Air8000/demo/airlbs/readme.md

@@ -0,0 +1,140 @@
+## 功能模块介绍
+
+1、main.lua:主程序入口;
+
+2、netdrv_device.lua:网卡驱动设备,可以配置使用netdrv文件夹内的四种网卡(单4g网卡,单wifi网卡,单spi以太网卡,多网卡)中的任何一种网卡;
+
+3、airlbs_app.lua:合宙airlbs“多基站”、“多基站+多wifi”两种应用场景的定位功能模块; 
+
+## 演示功能概述
+
+使用Air8000开发板测试airlbs功能
+
+1、airlbs“多基站”、“多基站+多wifi”两种应用场景的定位演示。
+
+2、netdrv_device:配置连接外网使用的网卡,目前支持以下四种选择(四选一)
+
+(1) netdrv_4g:4G网卡
+
+(2) netdrv_wifi:WIFI STA网卡
+
+(3) netdrv_eth_spi:通过SPI外挂CH390H芯片的以太网卡
+
+(4) netdrv_multiple:支持以上三种网卡,可以配置三种网卡的优先级
+
+本功能为收费项目,相对于免费的单 LBS 定位服务来说,定位精度更高,缴费地址[合宙云平台](https://iot.openluat.com/finance/order)。
+
+如需免费的单基站定位服务,可参考lbsloc2的相关demo,但是由于单基站定位技术本身的原因,无法提供相对精准的定位服务。
+
+## 演示硬件环境
+
+![](https://docs.openluat.com/air8000/luatos/app/image/netdrv_multi.jpg)
+
+1、Air8000开发板一块+可上网的sim卡一张+4g天线一根+wifi天线一根+网线一根:
+
+* sim卡插入开发板的sim卡槽
+
+* 天线装到开发板上
+
+* 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+
+2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air8000开发板和数据线的硬件接线方式为:
+
+* Air8000开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+
+* TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2012版本](https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/core)(理论上最新版本固件也可以,如果使用最新版本的固件不可以,可以烧录V2012-1固件对比验证)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、demo脚本代码netdrv_device.lua中,按照自己的网卡需求启用对应的Lua文件
+
+- 如果需要单4G网卡,打开require "netdrv_4g",其余注释掉
+
+- 如果需要单WIFI STA网卡,打开require "netdrv_wifi",其余注释掉;同时netdrv_wifi.lua中的wlan.connect("茶室-降功耗,找合宙!", "Air123456", 1),前两个参数,修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
+
+- 如果需要以太网卡,打开require "netdrv_eth_spi",其余注释掉
+
+- 如果需要多网卡,打开require "netdrv_multiple",其余注释掉;同时netdrv_multiple.lua中的ssid = "茶室-降功耗,找合宙!", password = "Air123456", 修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
+
+3、修改airlbs_app.lua文件中的airlbs_project_id和airlbs_project_key,对应[合宙云平台](https://iot.openluat.com/lbs/project-list)我的项目里面的key_id和key。
+
+3、烧录内核固件和airlbs相关demo成功后,自动开机运行。
+
+4、可以看到代码运行结果如下,不管是在选择什么网卡场景下,基本都是如下情况:
+
+以下是默认使用4G网卡下使用airlbs“多基站”、“多基站+多wifi”两种应用场景的定位演示的日志
+
+日志中如果出现以下类似打印则说明定位成功:
+
+多基站定位返回的经纬度数据为 {"lat":31.1354542,"lng":121.5423279}
+
+多基站+多wifi定位返回的经纬度数据为 {"lat":31.1334343,"lng":121.5450211}
+
+```
+[2025-08-18 18:27:06.254][000000006.164] I/user.netdrv_4g.ip_ready_func IP_READY 10.63.114.98 255.255.255.255 0.0.0.0 nil
+
+[2025-08-18 18:27:06.261][000000006.192] D/mobile TIME_SYNC 0
+
+[2025-08-18 18:27:06.267][000000006.196] dns_run 691:dns all done ,now stop
+
+[2025-08-18 18:27:06.271][000000006.213] I/user.扫描出的数据 {"cells":[[460,0,6278,28455710,-59,-1,333,-87,-11,3590]]}
+
+[2025-08-18 18:27:06.277][000000006.214] D/socket connect to airlbs.openluat.com,12413
+
+[2025-08-18 18:27:06.282][000000006.214] dns_run 674:airlbs.openluat.com state 0 id 2 ipv6 0 use dns server2, try 0
+
+[2025-08-18 18:27:06.287][000000006.238] D/sntp Unix timestamp: 1755512826
+
+[2025-08-18 18:27:06.291][000000006.245] dns_run 691:dns all done ,now stop
+
+[2025-08-18 18:27:06.297][000000006.247] I/user.airlbs 服务器连上了
+
+[2025-08-18 18:27:06.326][000000006.296] I/user.airlbs wait true true nil
+
+[2025-08-18 18:27:06.334][000000006.298] I/user.定位请求的结果 true 超时时间 0 table: 0C7F1C60
+
+[2025-08-18 18:27:06.340][000000006.299] I/user.多基站请求成功,服务器返回的原始数据 table: 0C7F1C60
+
+[2025-08-18 18:27:06.349][000000006.299] I/user.airlbs多基站定位返回的经纬度数据为 {"lat":31.1354542,"lng":121.5423279}
+
+[2025-08-18 18:27:07.955][000000007.944] D/airlink.wlan 收到扫描结果 11
+
+[2025-08-18 18:27:07.964][000000007.946] I/user.scan wifi_info 11
+
+[2025-08-18 18:27:08.114][000000008.095] I/user.扫描出的数据 {"cells":[[460,0,6278,28455710,-59,0,333,-85,-9,3590],[460,0,6278,140674719,null,0,108,-93,-17,3590]],"macs":[["40:31:3C:D7:B4:BB",-77],["8C:DE:F9:21:02:AA",-78],["68:77:24:19:60:EE",-82],["02:E7:E3:BF:CC:73",-91],["80:89:17:56:DA:25",-91],["02:E7:E3:9F:CC:73",-93],["02:E7:E3:AF:CC:73",-95],["92:76:9F:13:21:BD",-95],["22:08:89:26:DF:44",-96],["00:E7:E3:FF:CC:73",-96],["72:85:C4:8E:EF:EA",-99]]}
+
+[2025-08-18 18:27:08.120][000000008.096] D/socket connect to airlbs.openluat.com,12413
+
+[2025-08-18 18:27:08.126][000000008.096] dns_run 674:airlbs.openluat.com state 0 id 3 ipv6 0 use dns server2, try 0
+
+[2025-08-18 18:27:08.145][000000008.127] dns_run 691:dns all done ,now stop
+
+[2025-08-18 18:27:08.150][000000008.128] I/user.airlbs 服务器连上了
+
+[2025-08-18 18:27:08.192][000000008.176] I/user.airlbs wait true true nil
+
+[2025-08-18 18:27:08.197][000000008.178] I/user.定位请求的结果 true 超时时间 0 table: 0C7EDAD0
+
+[2025-08-18 18:27:08.204][000000008.179] [2025-08-18 18:28:36.976][000000096.887] I/user.airlbs多基站+多wifi定位返回的经纬度数据为 {"lat":31.1334343,"lng":121.5450211}
+
+[2025-08-18 18:28:36.988][000000096.887] I/user.airlbs lat 31.1334343
+
+[2025-08-18 18:28:36.999][000000096.888] I/user.airlbs lng 121.5450211
+
+
+```
+
+
+
+
+
+
+