Initial commit: CCU621_M firmware project with BLE debug link support.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 17:28:36 +08:00
commit 9ceb218f80
1597 changed files with 724159 additions and 0 deletions
+190
View File
@@ -0,0 +1,190 @@
/*
* Copyright (C) 2015-2018 Alibaba Group Holding Limited
*/
#include "iotx_dm_internal.h"
#ifdef DEPRECATED_LINKKIT
#include "infra_json_parser.h"
#include "mqtt_api.h"
#include "impl_ntp.h"
#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */
extern "C" {
#endif
#ifdef INFRA_MEM_STATS
#include "infra_mem_stats.h"
#define IMPL_NTP_MALLOC(size) LITE_malloc(size, MEM_MAGIC, "impl.ntp")
#define IMPL_NTP_FREE(ptr) LITE_free(ptr)
#else
#define IMPL_NTP_MALLOC(size) HAL_Malloc(size)
#define IMPL_NTP_FREE(ptr) {HAL_Free((void *)ptr);ptr = NULL;}
#endif
typedef void (*ntp_reply_cb_t)(const char *);
static ntp_reply_cb_t g_ntp_reply_cb = NULL;
static char g_ntp_time[NTP_TIME_STR_MAX_LEN + 1] = {0};
static void linkkit_ntp_time_reply(void *pcontext, void *pclient, void *mesg)
{
#define DEV_TX_TIME "deviceSendTime"
#define SERVER_RX_TIME "serverRecvTime"
#define SERVER_TX_TIME "serverSendTime"
int len = 0;
char *elem = NULL;
char server_rx_time[NTP_TIME_STR_MAX_LEN + 1] = {0};
char server_tx_time[NTP_TIME_STR_MAX_LEN + 1] = {0};
uint32_t payload_len;
char *payload;
uint32_t tx = 0;
uint32_t rx = 0;
uint32_t diff = 0;
iotx_mqtt_event_msg_pt msg = (iotx_mqtt_event_msg_pt)mesg;
iotx_mqtt_topic_info_pt ptopic_info = (iotx_mqtt_topic_info_pt) msg->msg;
switch (msg->event_type) {
case IOTX_MQTT_EVENT_PUBLISH_RECEIVED:
payload_len = ptopic_info->payload_len;
payload = (char *)ptopic_info->payload;
break;
default:
goto NTP_FAIL;
}
if (payload == NULL || payload_len == 0) {
goto NTP_FAIL;
}
memset(g_ntp_time, 0, sizeof(g_ntp_time));
log_debug("[ntp]", "ntp reply len:%u, payload:%s\r\n", payload_len, payload);
/*
* get deviceSendTime, serverRecvTime, serverSendTime
*/
elem = json_get_value_by_name(payload, payload_len, SERVER_TX_TIME, &len, NULL);
if (elem == NULL || len <= 0 || len > NTP_TIME_STR_MAX_LEN) {
goto NTP_FAIL;
}
memcpy(server_tx_time, elem, len);
elem = json_get_value_by_name(payload, payload_len, SERVER_RX_TIME, &len, NULL);
if (elem == NULL || len <= 0 || len > NTP_TIME_STR_MAX_LEN) {
goto NTP_FAIL;
}
memcpy(server_rx_time, elem, len);
elem = json_get_value_by_name(payload, payload_len, DEV_TX_TIME, &len, NULL);
if (elem == NULL || len <= 0 || len > NTP_TIME_STR_MAX_LEN) {
goto NTP_FAIL;
}
/*
* atoi fails to convert string to integer
* so we convert manully
*/
while (len -- > 0) {
tx *= 10;
tx += elem[0] - '0';
elem ++;
}
rx = HAL_UptimeMs();
diff = (rx - tx) >> 1;
if (diff >= 1000000) {
goto NTP_FAIL;
}
len = strlen(server_tx_time);
elem = &server_tx_time[len > 9 ? len - 9 : 0];
tx = atoi(elem);
tx += diff;
if (tx > 999999999) {
tx = 999999999;
}
if (len > 9) {
sprintf(elem, "%09u", (unsigned int)tx);
} else {
sprintf(elem, "%u", (unsigned int)tx);
}
strncpy(g_ntp_time, (const char *)server_tx_time, sizeof(g_ntp_time) - 1);
NTP_FAIL:
if (g_ntp_reply_cb != NULL) {
g_ntp_reply_cb(g_ntp_time);
}
return;
}
int linkkit_ntp_time_request(void (*ntp_reply)(const char *ntp_offset_time_ms))
{
int ret = -1;
int final_len = 0;
int packet_len = 64;
int topic_len = 128;
char *packet = NULL;
char *topic = NULL;
do {
char pk[IOTX_PRODUCT_KEY_LEN + 1] = {0};
char dn[IOTX_DEVICE_NAME_LEN + 1] = {0};
IOT_Ioctl(IOTX_IOCTL_GET_PRODUCT_KEY, pk);
IOT_Ioctl(IOTX_IOCTL_GET_DEVICE_NAME, dn);
topic = (char *)IMPL_NTP_MALLOC(topic_len + 1);
if (topic == NULL) {
goto NTP_REQ_ERR;
}
memset(topic, 0, topic_len + 1);
HAL_Snprintf(topic, topic_len, TOPIC_NTP_REPLY, pk, dn);
#ifdef MQTT_AUTO_SUBSCRIBE
ret = IOT_MQTT_Subscribe_Sync(NULL, topic, IOTX_MQTT_QOS3_SUB_LOCAL,
(iotx_mqtt_event_handle_func_fpt)linkkit_ntp_time_reply, NULL, 1000);
#else
ret = IOT_MQTT_Subscribe_Sync(NULL, topic, IOTX_MQTT_QOS0,
(iotx_mqtt_event_handle_func_fpt)linkkit_ntp_time_reply, NULL, 1000);
#endif
if (ret < 0) {
goto NTP_REQ_ERR;
}
memset(topic, 0, topic_len + 1);
HAL_Snprintf(topic, topic_len, TOPIC_NTP, pk, dn);
} while (0);
packet = (char *)IMPL_NTP_MALLOC(packet_len + 1);
if (packet == NULL) {
ret = -1;
goto NTP_REQ_ERR;
}
memset(packet, 0, packet_len + 1);
g_ntp_reply_cb = ntp_reply;
final_len = HAL_Snprintf(packet, packet_len, "{\"deviceSendTime\":\"%u\"}", (unsigned int)(HAL_UptimeMs()));
log_debug("[ntp]", "report ntp:%s\r\n", packet);
ret = IOT_MQTT_Publish_Simple(NULL, topic, IOTX_MQTT_QOS0, packet, final_len);
NTP_REQ_ERR:
if (topic) {
IMPL_NTP_FREE(topic);
}
if (packet) {
IMPL_NTP_FREE(packet);
}
return ret;
}
#if defined(__cplusplus) /* If this is a C++ compiler, use C linkage */
}
#endif
#endif