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

update:
1、修改main.lua中关于行NTP时间同步的描述
2、增加sntp_app.lua
3、修改reandme中关于行NTP时间同步的描述

13917187172 6 месяцев назад
Родитель
Сommit
30e60cfe2e

+ 12 - 5
module/Air780EPM/demo/WebSocket/main.lua

@@ -13,11 +13,12 @@
 - 定时器应用功能模块timer_app.lua,定时产生数据,将数据增加send from timer:前缀后发送给server;
 4、WebSocket连接,client收到server数据后,将数据增加recv from websocket server: 前缀后,通过uart1发送出去;
 5、启动一个网络业务逻辑看门狗task,用来监控网络环境,如果连续长时间工作不正常,重启整个软件系统;
-6、netdrv_device:配置连接外网使用的网卡,目前支持以下三种选择(三选一)
-   (1) netdrv_4g:4G网卡
-   (2) netdrv_eth_spi:通过SPI外挂CH390H芯片的以太网卡
-   (3) netdrv_multiple:支持以上三种网卡,可以配置三种网卡的优先级
-   
+6、netdrv_device:配置连接外网使用的网卡,目前支持以下五种选择(五选一)
+   (1)netdrv_wifi:socket.LWIP_STA,WIFI STA网卡;
+   (2) netdrv_ethernet_rmii:socket.LWIP_ETH,通过MAC层的rmii接口外挂PHY芯片(LAN8720Ai)的以太网卡;
+   (3)netdrv_ethernet_spi:socket.LWIP_USER1,通过SPI外挂CH390H芯片的以太网卡;
+   (4)netdrv_4g:socket.LWIP_USER0,通过SPI外挂4G模组的4G网卡;
+   (5)netdrv_multi_network:可以配置多种网卡的优先级,按照优先级配置,使用其中一种网卡连接外网;
 
 更多说明参考本目录下的readme.md文件
 ]]
@@ -80,6 +81,12 @@ require "netdrv_device"
 -- 加载串口应用功能模块
 require "uart_app"
 
+-- 加载时间同步应用功能模块
+-- 当客户端发送一个特定的"echo"命令,会构造一个包含当前时间的JSON消息发送到服务器;
+-- WebSocket测试服务器(echo.websocket.org)是一个回环服务器,它会将收到的消息原样返回;
+-- 时间同步可以避免因设备本地时钟不准而导致发送的时间与日志时间不一致的问题。
+require "sntp_app"
+
 -- 加载定时器应用功能模块
 require "timer_app"
 

+ 88 - 23
module/Air780EPM/demo/WebSocket/readme.md

@@ -2,7 +2,7 @@
 
 1、main.lua:主程序入口;
 
-2、netdrv_device.lua:网卡驱动设备,可以配置使用netdrv文件夹内的三种网卡(单4g网卡,单spi以太网卡,多网卡)中的任何一种网卡;
+2、netdrv_device.lua:网卡驱动设备,可以配置使用netdrv文件夹内的四种网卡(单4g网卡,单wifi网卡,单spi以太网卡,多网卡)中的任何一种网卡;
 
 3、websocket_main.lua:WebSocket client连接以及数据收发处理主逻辑;
 
@@ -16,6 +16,8 @@
 
 8、uart_app.lua:在websocket client和uart外设之间透传数据;
 
+9、sntp_app.lua;发起ntp时间同步动作;
+
 ## 系统消息介绍
 
 1、"IP_READY":某种网卡已经获取到ip信息,仅仅获取到了ip信息,能否和外网连通还不确认;
@@ -56,43 +58,102 @@
 
 5、启动一个网络业务逻辑看门狗task,用来监控网络环境,如果连续长时间工作不正常,重启整个软件系统;
 
-6、netdrv_device:配置连接外网使用的网卡,目前支持以下三种选择(三选一)
+6、在网络就绪后进行NTP时间同步,确保设备时间准确,为收到"echo"命令时发送包含时间信息的JSON数据提供可靠的时间基准,避免出现发送的时间和日志时间不一致的问题。
+
+7、netdrv_device:配置连接外网使用的网卡,目前支持以下五种选择(五选一)
+
+   (1) netdrv_4g:通过SPI外挂4G模组的4G网卡
+
+   (2) netdrv_wifi:WIFI STA网卡
 
-   (1) netdrv_4g:4G网卡
+   (3) netdrv_eth_rmii:通过MAC层的rmii接口外挂PHY芯片(LAN8720Ai)的以太网卡
 
-   (2) netdrv_eth_spi:通过SPI外挂CH390H芯片的以太网卡
+   (4) netdrv_eth_spi:通过SPI外挂CH390H芯片的以太网卡
 
-   (3) netdrv_multiple:支持以上三种网卡,可以配置三种网卡的优先级
+   (5) netdrv_multiple:支持以上(2)、(3)、(4)三种网卡,可以配置三种网卡的优先级
 
 
 ## 演示硬件环境
 
-![](https://docs.openluat.com/air780epm/luatos/app/driver/eth/image/RFSvb75NRoEWqYxfCRVcVrOKnsf.jpg)
+![](https://docs.openluat.com/air8101/luatos/app/image/netdrv_multi.jpg)
 
-1、 Air780EPM V1.3 版本开发板一块 + 可上网的 sim 卡一张 +4g 天线一根 + 网线一根:
+1、Air8101核心板一块
 
-- sim卡插入开发板的sim卡槽
+2、TYPE-C USB数据线一根
 
-- 天线装到开发板上
+3、USB转串口数据线一根
 
-- 网线一端插入开发板网口,另外一端连接可以上外网的路由器网口
+4、Air8101核心板和数据线的硬件接线方式为
 
-2、TYPE-C USB数据线一根 + USB转串口数据线一根,Air8000开发板和数据线的硬件接线方式为:
+- Air8101核心板通过TYPE-C USB口供电;(核心板背面的功耗测试开关拨到OFF一端)
 
-- Air780EPM开发板通过TYPE-C USB口供电;(外部供电/USB供电 拨动开关 拨到 USB供电一端)
+- 如果测试发现软件频繁重启,重启原因值为:poweron reason 0,可能是供电不足,此时再通过直流稳压电源对核心板的vbat管脚进行4V供电,或者VIN管脚进行5V供电;
 
 - TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
 
-- USB转串口数据线,一般来说,白线连接开发板的 UART1_TX,绿线连接开发板的 UART1_RX,黑线连接核心板的 GND,另外一端连接电脑USB口;
+- USB转串口数据线,一般来说,白线连接核心板的12/U1TX,绿线连接核心板的11/U1RX,黑线连接核心板的gnd,另外一端连接电脑USB口;
+
+5、可选AirPHY_1000配件板一块,Air8101核心板和AirPHY_1000配件板的硬件接线方式为:
+
+| Air8101核心板 | AirPHY_1000配件板 |
+| ------------- | ----------------- |
+| 59/3V3        | 3.3v              |
+| gnd           | gnd               |
+| 5/D2          | RX1               |
+| 72/D1         | RX0               |
+| 71/D3         | CRS               |
+| 4/D0          | MDIO              |
+| 6/D4          | TX0               |
+| 74/PCK        | MDC               |
+| 70/D5         | TX1               |
+| 7/D6          | TXEN              |
+| 不接          | NC                |
+| 69/D7         | CLK               |
+
+6、可选AirETH_1000配件板一块,Air8101核心板和AirETH_1000配件板的硬件接线方式为:
+
+| Air8101核心板 | AirETH_1000配件板 |
+| ------------- | ----------------- |
+| 59/3V3        | 3.3v              |
+| gnd           | gnd               |
+| 28/DCLK       | SCK               |
+| 54/DISP       | CSS               |
+| 55/HSYN       | SDO               |
+| 57/DE         | SDI               |
+| 14/GPIO8      | INT               |
+
+7、可选Air780EHM/Air780EHV/Air780EGH/Air780EPM核心板或者开发板一块,Air8101核心板和Air780EHM/Air780EHV/Air780EGH/Air780EPM核心板或者开发板的硬件接线方式为:
+
+| Air8101核心板 | Air780EHM/Air780EHV/Air780EGH/Air780EPM核心板 |
+| ------------- | --------------------------------------------- |
+| gnd           | GND                                           |
+| 54/DISP       | 83/SPI0CS                                     |
+| 55/HSYN       | 84/SPI0MISO                                   |
+| 57/DE         | 85/SPI0MOSI                                   |
+| 28/DCLK       | 86/SPI0CLK                                    |
+| 43/R2         | 19/GPIO22                                     |
+| 75/GPIO28     | 22/GPIO1                                      |
+
+
+| Air8101核心板 | Air780EHM/Air780EHV/Air780EGH/Air780EPM开发板 |
+| ------------- | --------------------------------------------- |
+| gnd           | GND                                           |
+| 54/DISP       | SPI_CS                                        |
+| 55/HSYN       | SPI_MISO                                      |
+| 57/DE         | SPI_MOSI                                      |
+| 28/DCLK       | SPI_CLK                                       |
+| 43/R2         | GPIO22                                        |
+| 75/GPIO28     | GPIO1                                         |
 
 
 ## 演示软件环境
 
-1、Luatools下载调试工具 [https://docs.openluat.com/air780epm/common/Luatools/]
+1、Luatools下载调试工具
 
-2、Air780EPM V2012 版本固件(理论上,2025 年 7 月 26 日之后发布的固件都可以)
+2、[Air8101 V1005版本固件](https://docs.openluat.com/air8101/luatos/firmware/)(理论上,2025年7月26日之后发布的固件都可以)
+
+3、PC端的串口工具,例如SSCOM、LLCOM等都可以
 
-3、PC端的串口工具,例如SSCOM、LLCOM等都可以;
 
 
 ## 演示核心步骤
@@ -101,37 +162,41 @@
 
 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
+
+- 如果需要RMII以太网卡,打开require "netdrv_eth_rmii",其余注释掉
+
+- 如果需要SPI以太网卡,打开require "netdrv_eth_spi",其余注释掉
 
-    如果需要以太网卡,打开require "netdrv_eth_spi",其余注释掉
+- 如果需要单4G网卡,打开require "netdrv_4g",其余注释掉
 
-    如果需要多网卡,打开require "netdrv_multiple",其余注释掉。
+- 如果需要多网卡,打开require "netdrv_multiple",其余注释掉;同时netdrv_multiple.lua中的ssid = "茶室-降功耗,找合宙!", password = "Air123456", 修改为自己测试时wifi热点的名称和密码;注意:仅支持2.4G的wifi,不支持5G的wifi
 
 3、Luatools烧录内核固件和修改后的demo脚本代码
 
 4、烧录成功后,自动开机运行,如果出现以下日志,表示WebSocket连接成功:
 ``` lua
-I/user.WebSocket发送任务 WebSocket连接成功
+I/user.WebSocket主任务 连接成功
 ```
 
 5、打开PC端的串口工具,选择对应的端口,配置波特率115200,数据位8,停止位1,无奇偶校验位;勾选“DRT"和"Hex显示"。
 
 6、PC端的串口工具输入"echo",点击发送,WebSocket服务器会回复当前时间信息;
 ``` lua
- 收到WebSocket服务器数据: Wed 2025-08-27 17:34:17
+ I/user.WebSocket接收处理 提取echo消息 Sat 2025-09-04 19:46:19
 ```
 
 7、PC端的串口工具输入任意数据,点击发送,数据会通过WebSocket发送到服务器;
 
 8、PC端的串口工具,发送一段非"echo"数据,会出现以下日志,并且能看到是WebSocket server发送的,类似于以下效果:
 ``` lua
-I/user.准备发送数据到服务器,长度 7
+I/user.准备发送数据到服务器,长度 5
 I/user.原始数据: AAAAA
 I/user.UART发送到服务器的数据包类型 string
 I/user.转发普通数据
 I/user.WebSocket发送任务等待消息 SEND_REQ nil nil
 I/user.WebSocket发送任务 收到发送请求
-I/user.wbs_sender 发送成功 长度 7
+I/user.wbs_sender 发送成功 长度 5
 
 ```
 

+ 65 - 0
module/Air780EPM/demo/WebSocket/sntp_app.lua

@@ -0,0 +1,65 @@
+--[[
+@module  sntp_app
+@summary sntp时间同步应用功能模块
+@version 1.0
+@date    2025.07.01
+@author  马梦阳
+@usage
+本文件为sntp时间同步应用功能模块,核心业务逻辑为:
+1、连接ntp服务器进行时间同步;
+2、如果同步成功,1小时之后重新发起同步动作;
+3、如果同步失败,10秒钟之后重新发起同步动作;
+
+本文件没有对外接口,直接在其他应用功能模块中require "sntp_app"就可以加载运行;
+]]
+
+-- sntp时间同步的任务处理函数
+local function sntp_task_func()
+
+    while true do
+        -- 如果当前时间点设置的默认网卡还没有连接成功,一直在这里循环等待
+        while not socket.adapter(socket.dft()) do
+            log.warn("sntp_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.warn("sntp_task_func", "recv IP_READY")
+
+        -- 发起ntp时间同步动作
+        socket.sntp()
+
+        -- 等待ntp时间同步结果,30秒超时失败,通常只需要几百毫秒就能成功
+        local ret = sys.waitUntil("NTP_UPDATE", 30000)
+
+        --同步成功
+        if ret then
+            -- 以下是获取/打印时间的演示,注意时区问题
+            log.info("sntp_task_func", "时间同步成功", "本地时间", os.date())
+            log.info("sntp_task_func", "时间同步成功", "UTC时间", os.date("!%c"))
+            log.info("sntp_task_func", "时间同步成功", "RTC时钟(UTC时间)", json.encode(rtc.get()))
+            log.info("sntp_task_func", "时间同步成功", "本地时间戳", os.time())
+            local t = os.date("*t")
+            log.info("sntp_task_func", "时间同步成功", "本地时间os.date() json格式", json.encode(t))
+            log.info("sntp_task_func", "时间同步成功", "本地时间os.date(os.time())", os.time(t))
+
+            -- 正常使用, 一小时一次, 已经足够了, 甚至1天一次也可以
+            sys.wait(3600000)
+        --同步失败
+        else
+            log.info("sntp_task_func", "时间同步失败")
+            -- 10秒后重新发起同步动作
+            sys.wait(10000)
+        end
+    end
+end
+
+--创建并且启动一个task
+--运行这个task的主函数sntp_task_func
+sys.taskInit(sntp_task_func)