ソースを参照

add:支持ntp服务器自定义

Dozingfiretruck 3 年 前
コミット
a052e8179f

+ 1 - 1
components/network/adapter/luat_lib_socket.c

@@ -1321,7 +1321,7 @@ static const rotable_Reg_t reg_socket_adapter[] =
 	{ "sslLog",			ROREG_FUNC(l_socket_set_ssl_log)},
 	{"localIP",         	ROREG_FUNC(l_socket_local_ip)},
 #ifdef LUAT_USE_SNTP
-	{"sntp",         	ROREG_FUNC(ntp_get)},
+	{"sntp",         	ROREG_FUNC(l_sntp_get)},
 #endif
 	//@const ETH0 number 带硬件协议栈的ETH0
     { "ETH0",           ROREG_INT(NW_ADAPTER_INDEX_ETH0)},

+ 74 - 17
components/network/libsntp/luat_sntp.c

@@ -4,7 +4,7 @@
 #include "luat_network_adapter.h"
 #include "luat_rtos.h"
 #include "luat_msgbus.h"
-#include "luat_fs.h"
+
 #include "luat_malloc.h"
 #include "luat_rtc.h"
 
@@ -13,7 +13,10 @@
 #define LUAT_LOG_TAG "sntp"
 #include "luat_log.h"
 
-static const char* sntp_server[] = {
+#define SNTP_SERVER_COUNT       3
+#define SNTP_SERVER_LEN_MAX     32
+
+static char sntp_server[SNTP_SERVER_COUNT][SNTP_SERVER_LEN_MAX] = {
     "ntp1.aliyun.com",
     "ntp2.aliyun.com",
     "ntp3.aliyun.com"
@@ -22,12 +25,25 @@ static sntp_server_num = 0;
 
 static const uint8_t sntp_packet[48]={0x1b};
 
+#define NTP_UPDATE 1
+#define NTP_ERROR  2
+
 static int l_sntp_event_handle(lua_State* L, void* ptr) {
+    rtos_msg_t* msg = (rtos_msg_t*)lua_topointer(L, -1);
     if (lua_getglobal(L, "sys_pub") != LUA_TFUNCTION) {
         return 0;
     };
-    // LLOGD("TIME_SYNC %d", status);
-    lua_pushstring(L, "NTP_UPDATE");
+    switch (msg->arg1)
+    {
+    case NTP_UPDATE:
+        lua_pushstring(L, "NTP_UPDATE");
+        break;
+    case NTP_ERROR:
+        lua_pushstring(L, "NTP_ERROR");
+        break;
+    default:
+        return 0;
+    }
     lua_call(L, 1, 0);
     return 0;
 }
@@ -49,7 +65,7 @@ int luat_sntp_connect(network_ctrl_t *sntp_netc){
 	ret = network_connect(sntp_netc, sntp_server[sntp_server_num], strlen(sntp_server[sntp_server_num]), (0xff == ip_addr.is_ipv6)?NULL:&(ip_addr), 123, 1000);
 #endif
     sntp_server_num++;
-	LLOGD("network_connect ret %d", ret);
+	// LLOGD("network_connect ret %d", ret);
 	if (ret < 0) {
         network_close(sntp_netc, 0);
         return -1;
@@ -61,11 +77,27 @@ int luat_sntp_close_socket(network_ctrl_t *sntp_netc){
     if (sntp_netc){
 		network_force_close_socket(sntp_netc);
 	}
-	if (sntp_server_num > 0 && sntp_server_num < sizeof(sntp_server)){
+    if (sntp_server_num == 0){
+#ifdef __LUATOS__
+        rtos_msg_t msg;
+        msg.handler = l_sntp_event_handle;
+        msg.arg1 = NTP_UPDATE;
+        luat_msgbus_put(&msg, 0);
+#endif
+        network_release_ctrl(sntp_netc);
+        return 0;
+	}
+	if (sntp_server_num < sizeof(sntp_server)){
 		luat_sntp_connect(sntp_netc);
 	}else{
         network_release_ctrl(sntp_netc);
         sntp_server_num = 0;
+#ifdef __LUATOS__
+        rtos_msg_t msg;
+        msg.handler = l_sntp_event_handle;
+        msg.arg1 = NTP_ERROR;
+        luat_msgbus_put(&msg, 0);
+#endif
     }
     return 0;
 }
@@ -105,16 +137,11 @@ next:
 				}
                 const uint8_t *p = (const uint8_t *)resp_buff+40;
                 uint32_t time =  (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
-                LLOGD("time:%d",time - 2208988800);
-				luat_heap_free(resp_buff);
-#ifdef __LUATOS__
-                rtos_msg_t msg;
-                msg.handler = l_sntp_event_handle;
-                int re = luat_msgbus_put(&msg, 0);
-#endif
-                luat_rtc_set_tamp32(time);
+                luat_rtc_set_tamp32(time - 0x83AA7E80);
+                LLOGD("Unix timestamp:%d",time - 0x83AA7E80);
                 sntp_server_num = 0;
                 luat_sntp_close_socket(sntp_netc);
+                luat_heap_free(resp_buff);
 			}
 		}else{
 			luat_sntp_close_socket(sntp_netc);
@@ -126,12 +153,12 @@ next:
 
 	}
 	if (event->Param1){
-		LLOGW("sntp_callback param1 %d, closing socket", event->Param1);
+		// LLOGW("sntp_callback param1 %d, closing socket", event->Param1);
 		luat_sntp_close_socket(sntp_netc);
 	}
 	ret = network_wait_event(sntp_netc, NULL, 0, NULL);
 	if (ret < 0){
-		LLOGW("network_wait_event ret %d, closing socket", ret);
+		// LLOGW("network_wait_event ret %d, closing socket", ret);
 		luat_sntp_close_socket(sntp_netc);
 		return -1;
 	}
@@ -145,7 +172,7 @@ int ntp_get(void){
 	}
 	network_ctrl_t *sntp_netc = network_alloc_ctrl(adapter_index);
 	if (!sntp_netc){
-		LLOGW("network_alloc_ctrl fail");
+		LLOGE("network_alloc_ctrl fail");
 		return -1;
 	}
 	network_init_ctrl(sntp_netc, NULL, luat_sntp_callback, sntp_netc);
@@ -155,5 +182,35 @@ int ntp_get(void){
     return luat_sntp_connect(sntp_netc);
 }
 
+int l_sntp_get(lua_State *L){
+    size_t len = 0;
+	if (lua_isstring(L, 1)){
+        const char * server_addr = luaL_checklstring(L, 1, &len);
+        if (len < SNTP_SERVER_LEN_MAX){
+            memcpy(sntp_server[0], server_addr, len);
+            sntp_server[0][len] = 0x00;
+        }else{
+            LLOGE("server_addr too lang");
+        }
+	}else if(lua_istable(L, 1)){
+        size_t count = lua_rawlen(L, 1);
+        if (count > sizeof(sntp_server)){
+            count = sizeof(sntp_server);
+        }
+		for (size_t i = 1; i <= count; i++){
+			lua_geti(L, 1, i);
+			const char * server_addr = luaL_checklstring(L, -1, &len);
+            if (len < SNTP_SERVER_LEN_MAX){
+                memcpy(sntp_server[0], server_addr, len);
+                sntp_server[0][len] = 0x00;
+            }else{
+                LLOGE("server_addr too lang");
+            }
+			lua_pop(L, 1);
+		}
+	}
+    ntp_get();
+	return 0;
+}
 
 

+ 1 - 0
components/network/libsntp/luat_sntp.h

@@ -3,5 +3,6 @@
 
 
 int ntp_get(void);
+int l_sntp_get(lua_State *L);
 
 #endif