init: Air780EPM 官方 LuatOS 项目代码基线
- 来源: 合宙 LuatOS 官方仓库 air780epm 模块完整代码 - 路径: luatos/air780epm/module/Air780EPM/demo 含官方 demo(含 mqtt/mqtts/socket/uart 等) - 后续: 基于 demo 开发 UART<->MQTT 数据上报功能
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
--[[
|
||||
@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(ip, adapter)
|
||||
if adapter == socket.LWIP_GP then
|
||||
-- 在位置1和2设置自定义的DNS服务器ip地址:
|
||||
-- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
|
||||
-- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
|
||||
-- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
|
||||
-- 如果使用专网卡,不要使用这两行代码;
|
||||
-- 如果使用国外的网络,不要使用这两行代码;
|
||||
socket.setDNS(adapter, 1, "223.5.5.5")
|
||||
socket.setDNS(adapter, 2, "114.114.114.114")
|
||||
|
||||
log.info("netdrv_4g.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_GP))
|
||||
end
|
||||
end
|
||||
|
||||
local function ip_lose_func(adapter)
|
||||
if adapter == socket.LWIP_GP then
|
||||
log.warn("netdrv_4g.ip_lose_func", "IP_LOSE")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 此处订阅"IP_READY"和"IP_LOSE"两种消息
|
||||
-- 在消息的处理函数中,仅仅打印了一些信息,便于实时观察4G网络的连接状态
|
||||
-- 也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
|
||||
sys.subscribe("IP_READY", ip_ready_func)
|
||||
sys.subscribe("IP_LOSE", ip_lose_func)
|
||||
|
||||
-- 在Air780EPM上,内核固件运行起来之后,默认网卡就是socket.LWIP_GP
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
--[[
|
||||
@module netdrv_eth_spi
|
||||
@summary “通过SPI外挂CH390H芯片的以太网卡”驱动模块
|
||||
@version 1.0
|
||||
@date 2025.07.24
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为“通过SPI外挂CH390H芯片的以太网卡”驱动模块,核心业务逻辑为:
|
||||
1、打开CH390H芯片供电开关;
|
||||
2、初始化spi0,初始化以太网卡,并且在以太网卡上开启DHCP(动态主机配置协议);
|
||||
3、以太网卡的连接状态发生变化时,在日志中进行打印;
|
||||
|
||||
直接使用Air780EPM V1.3版本开发板硬件测试即可;
|
||||
|
||||
本文件没有对外接口,直接在其他功能模块中require "netdrv_eth_spi"就可以加载运行;
|
||||
]]
|
||||
|
||||
local exnetif = require "exnetif"
|
||||
|
||||
local function ip_ready_func(ip, adapter)
|
||||
if adapter == socket.LWIP_ETH then
|
||||
-- 在位置1和2设置自定义的DNS服务器ip地址:
|
||||
-- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
|
||||
-- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
|
||||
-- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
|
||||
-- 如果使用专网卡,不要使用这两行代码;
|
||||
-- 如果使用国外的网络,不要使用这两行代码;
|
||||
socket.setDNS(adapter, 1, "223.5.5.5")
|
||||
socket.setDNS(adapter, 2, "114.114.114.114")
|
||||
|
||||
log.info("netdrv_eth_spi.ip_ready_func", "IP_READY", socket.localIP(socket.LWIP_ETH))
|
||||
end
|
||||
end
|
||||
|
||||
local function ip_lose_func(adapter)
|
||||
if adapter == socket.LWIP_ETH then
|
||||
log.warn("netdrv_eth_spi.ip_lose_func", "IP_LOSE")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- 以太网联网成功(成功连接路由器,并且获取到了IP地址)后,内核固件会产生一个"IP_READY"消息
|
||||
-- 各个功能模块可以订阅"IP_READY"消息实时处理以太网联网成功的事件
|
||||
-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
|
||||
|
||||
-- 以太网断网后,内核固件会产生一个"IP_LOSE"消息
|
||||
-- 各个功能模块可以订阅"IP_LOSE"消息实时处理以太网断网的事件
|
||||
-- 也可以在任何时刻调用socket.adapter(socket.LWIP_ETH)来获取以太网是否连接成功
|
||||
|
||||
--此处订阅"IP_READY"和"IP_LOSE"两种消息
|
||||
--在消息的处理函数中,仅仅打印了一些信息,便于实时观察“通过SPI外挂CH390H芯片的以太网卡”的连接状态
|
||||
--也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
|
||||
sys.subscribe("IP_READY", ip_ready_func)
|
||||
sys.subscribe("IP_LOSE", ip_lose_func)
|
||||
|
||||
|
||||
local function netdrv_eth_spi_task_func()
|
||||
-- 配置SPI外接以太网芯片CH390H的单网卡,exnetif.set_priority_order使用的网卡编号为socket.LWIP_ETH
|
||||
-- 本demo使用Air780EPM V1.3版本开发板测试,开发板上的硬件配置为:
|
||||
-- GPIO20为CH390H以太网芯片的供电使能控制引脚
|
||||
-- 使用spi0,片选引脚使用GPIO8,中断引脚使用GPIO22
|
||||
-- 如果使用的硬件和以上描述的环境不同,根据自己的硬件配置修改以下参数
|
||||
exnetif.set_priority_order({
|
||||
{
|
||||
ETHERNET = {
|
||||
pwrpin = 20,
|
||||
tp = netdrv.CH390,
|
||||
opts = {spi = 0, cs = 8, irq = 22}
|
||||
}
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
-- 启动一个task,task的处理函数为netdrv_eth_spi_task_func
|
||||
-- 在处理函数中调用exnetif.set_priority_order设置网卡优先级
|
||||
-- 因为exnetif.set_priority_order要求必须在task中被调用,所以此处启动一个task
|
||||
sys.taskInit(netdrv_eth_spi_task_func)
|
||||
@@ -0,0 +1,88 @@
|
||||
--[[
|
||||
@module netdrv_multiple
|
||||
@summary 多网卡(4G网卡、通过SPI外挂CH390H芯片的以太网卡)驱动模块
|
||||
@version 1.0
|
||||
@date 2025.07.24
|
||||
@author 马梦阳
|
||||
@usage
|
||||
本文件为多网卡驱动模块,核心业务逻辑为:
|
||||
1、调用exnetif.set_priority_order配置多网卡的控制参数以及优先级;
|
||||
|
||||
直接使用Air780EPM V1.3版本开发板硬件测试即可;
|
||||
|
||||
本文件没有对外接口,直接在其他功能模块中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)
|
||||
-- 在位置1和2设置自定义的DNS服务器ip地址:
|
||||
-- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
|
||||
-- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
|
||||
-- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
|
||||
-- 如果使用专网卡,不要使用这两行代码;
|
||||
-- 如果使用国外的网络,不要使用这两行代码;
|
||||
socket.setDNS(adapter, 1, "223.5.5.5")
|
||||
socket.setDNS(adapter, 2, "114.114.114.114")
|
||||
|
||||
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芯片”的以太网卡,使用Air780EPM V1.3版本开发板验证
|
||||
{
|
||||
ETHERNET = {
|
||||
-- 供电使能GPIO
|
||||
pwrpin = 20,
|
||||
-- 设置的多个“已经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=0, cs=8, irq=22}
|
||||
}
|
||||
},
|
||||
|
||||
-- 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)
|
||||
@@ -0,0 +1,57 @@
|
||||
--[[
|
||||
@module netdrv_pc
|
||||
@summary “pc模拟器网卡”驱动模块
|
||||
@version 1.0
|
||||
@date 2025.07.01
|
||||
@author 孟伟
|
||||
@usage
|
||||
本文件为pc模拟器网卡驱动模块,核心业务逻辑为:
|
||||
1、监听"IP_READY"和"IP_LOSE",在日志中进行打印;
|
||||
|
||||
本文件没有对外接口,直接在其他功能模块中require "netdrv_pc"就可以加载运行;
|
||||
]]
|
||||
|
||||
local function ip_ready_func(ip, adapter)
|
||||
if adapter == socket.ETH0 then
|
||||
-- 在位置1和2设置自定义的DNS服务器ip地址:
|
||||
-- "223.5.5.5",这个DNS服务器IP地址是阿里云提供的DNS服务器IP地址;
|
||||
-- "114.114.114.114",这个DNS服务器IP地址是国内通用的DNS服务器IP地址;
|
||||
-- 可以加上以下两行代码,在自动获取的DNS服务器工作不稳定的情况下,这两个新增的DNS服务器会使DNS服务更加稳定可靠;
|
||||
-- 如果使用专网卡,不要使用这两行代码;
|
||||
-- 如果使用国外的网络,不要使用这两行代码;
|
||||
socket.setDNS(adapter, 1, "223.5.5.5")
|
||||
socket.setDNS(adapter, 2, "114.114.114.114")
|
||||
|
||||
log.info("netdrv_pc.ip_ready_func", "IP_READY", socket.localIP(socket.ETH0))
|
||||
end
|
||||
end
|
||||
|
||||
local function ip_lose_func(adapter)
|
||||
if adapter == socket.ETH0 then
|
||||
log.warn("netdrv_pc.ip_lose_func", "IP_LOSE")
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
--此处订阅"IP_READY"和"IP_LOSE"两种消息
|
||||
--在消息的处理函数中,仅仅打印了一些信息,便于实时观察pc模拟器网络的连接状态
|
||||
--也可以根据自己的项目需求,在消息处理函数中增加自己的业务逻辑控制,例如可以在连网状态发生改变时更新网络图标
|
||||
sys.subscribe("IP_READY", ip_ready_func)
|
||||
sys.subscribe("IP_LOSE", ip_lose_func)
|
||||
|
||||
-- 设置默认网卡为socket.ETH0
|
||||
-- pc模拟器上的默认网卡仍然需要使用接口(socket.ETH0)来设置,因为exnetif扩展库当前还不支持模拟器
|
||||
socket.dft(socket.ETH0)
|
||||
|
||||
|
||||
|
||||
-- 下面这段代码是在PC模拟器上构造一个唯一的ID;不同PC上运行模拟器,这个ID要不一样
|
||||
-- 因为mqtt client使用的是这个ID做为client id,如果不同PC上的id一样,模拟器在不同PC上同时运行时,mqtt client就会频繁出现被踢下线的问题
|
||||
-- 目前模拟器上还没有合适的接口获取唯一ID,所以此处先简单的构造一个ID,需要手动保证ID唯一,在此处我简单使用了zhutianhua1做为ID
|
||||
_G.mobile = {}
|
||||
function mobile.imei()
|
||||
return "zhutianhua1"
|
||||
-- log.info("mcu.unique_id()", mcu.unique_id())
|
||||
-- return mcu.unique_id().."zhutianhua1"
|
||||
end
|
||||
Reference in New Issue
Block a user