本文以C Link SDK中的Demo文件./demos/ntp_posix_demo.c为例,介绍如何调用Link SDK的API,使设备从物联网平台获取UTC时间。
背景信息
步骤一:初始化
- 添加头文件。…… …… #include "aiot_ntp_api.h"
- 配置底层依赖和日志输出。aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb);
- 调用aiot_ntp_init,创建NTP客户端实例,并初始化默认参数。ntp_handle = aiot_ntp_init(); if (ntp_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_ntp_init failed\n"); return -1; }
步骤二:配置功能
调用aiot_ntp_setopt,配置以下功能。
- 关联MQTT连接的句柄。重要 配置NTP服务参数前,请确保已配置设备认证信息等相关参数。具体操作,请参见MQTT配置连接参数。- 示例代码:aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_MQTT_HANDLE, mqtt_handle);
- 相关参数:配置项 示例 说明 AIOT_NTPOPT_MQTT_HANDLE mqtt_handle NTP服务功能的请求基于MQTT连接,通过该配置项,关联MQTT连接句柄。 
 
- 示例代码:
- 设置时区。- 示例代码:int8_t time_zone = 8; …… …… aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_TIME_ZONE, (int8_t *)&time_zone);
- 相关参数:配置项 示例 说明 AIOT_NTPOPT_TIME_ZONE time_zone 设备所在时区。 示例代码定义的时区为 time_zone=8,设置设备的时区为东八区,即北京时间。通过设置 time_zone的值,设置设备所在的时区。取值范围:-12~12。例如,-3为西三区。
 
- 示例代码:
- 配置消息回调。- 示例代码:aiot_ntp_setopt(ntp_handle, AIOT_NTPOPT_RECV_HANDLER, (void *)demo_ntp_recv_handler);
- 相关参数:配置项 示例值 说明 AIOT_NTPOPT_RECV_HANDLER demo_ntp_recv_handler 接收到NTP服务消息时,调用该函数。 
 
- 示例代码:
- 配置状态监控。
步骤三:发送请求
调用aiot_ntp_send_request,根据上一步配置的参数,通过Topic /ext/ntp/${YourProductKey}/${YourDeviceName}/request,向服务器发送一条包含设备当前时间的请求消息。
Link SDK通过系统接口,自动上报设备当前时间。
    res = aiot_ntp_send_request(ntp_handle);
    if (res < STATE_SUCCESS) {
        aiot_ntp_deinit(&ntp_handle);
        demo_mqtt_stop(&mqtt_handle);
        return -1;
    }步骤四:接收应答
设备接收NTP服务消息后,触发回调函数demo_ntp_recv_handler,根据回调函数的设置,执行对应处理。
- 物联网平台通过Topic - /ext/ntp/${YourProductKey}/${YourDeviceName}/response向设备发回一条包含时间内容的消息。
- 时间消息的数据结构类型为aiot_ntp_recv_t,可参考示例代码获取时间。
- 本文示例代码对返回的消息解析处理后,通过packet传递,打印该时间消息。 
void demo_ntp_recv_handler(void *handle, const aiot_ntp_recv_t *packet, void *userdata)
{
    switch (packet->type) {
        /* TODO: 含当前时区下, 年月日时分秒的数值, 可在这里把它们解析储存起来 */
        case AIOT_NTPRECV_LOCAL_TIME: {
            printf("local time: %llu, %02d/%02d/%02d-%02d:%02d:%02d:%d\n",
                   (long long unsigned int)packet->data.local_time.timestamp,
                   packet->data.local_time.year,
                   packet->data.local_time.mon, packet->data.local_time.day, packet->data.local_time.hour, packet->data.local_time.min,
                   packet->data.local_time.sec, packet->data.local_time.msec);
        }
        break;
        default: {
        }
    }
}步骤五:退出程序
调用aiot_ntp_deinit,销毁NTP客户端实例,释放资源。
    res = aiot_ntp_deinit(&ntp_handle);
    if (res < STATE_SUCCESS) {
        demo_mqtt_stop(&mqtt_handle);
        printf("aiot_ntp_deinit failed: -0x%04X\n", -res);
        return -1;
    }