【物联网】QCA4010之SNTP协议

【SNTP协议简介】

    在一些特定的场景中,经常需要整个网络中的计算机保持时间同步。例如,空中管制系统或者轨道交通控制系统中的计算机的时间需要保持精确同步。在大型计算机系统中,往往由很多台计算机共同执行某个计算,也需要各台计算机保持时间同步。那么,我们通过什么方法来同步这些计算机的时间呢?

    科学家发明了一种叫做NTP的网络时间协议。网络时间协议是一种在网络计算机上同步计算机时间的的协议,它具有高度的精确性(能精确到几十毫秒),但是算法非常复杂。实际上,在很多应用场景中,并不需要这么高的精确度,通常只要达到秒级的精确度就足够了。于是,科学家在NTP的基础上推出了SNTP(简单网络时间协议,Simple
Network Time Protocol)。SNTP大大简化了NTP协议,同时也能保证时间达到一定的精确度。在实际应用中,SNTP协议主要被用来同步因特网上计算机的时间。

夏时制,夏时令(Daylight Saving Time:DST),又称“日光节约时制”和“夏令时间”,是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。目前全世界有近110个国家每年要实行夏令时。

【注意事项】
中国大陆、中国香港、中国澳门、中国台湾、蒙古国、新加坡、马来西亚、菲律宾、西澳大利亚州的时间与UTC的时差均为+8,也就是UTC+8。

【工作原理】

    SNTP协议采用客户端/服务器的工作方式,可以采用单播(点对点)或者广播(一点对多点)模式操作。SNTP服务器通过接收GPS信号或自带的原子钟作为系统的时间基准。单播模式下,SNTP客户端能够通过定期访问SNTP服务器获得准确的时间信息,用于调整客户端自身所在系统的时间,达到同步时间的目的。广播模式下,SNTP服务器周期性地发送消息给指定的IP广播地址或者IP多播地址。SNTP客户端通过监听这些地址来获得时间信息。

    网络中一般存在很多台SNTP服务器,客户端会通过一定的算法选择最好的几台服务器使用。如果一台SNTP服务器在工作过程中失去了外部时间源,此时SNTP服务器会告诉SNTP客户端“我失去了外部时间”。当SNTP客户端收到这个信息时,就会丢弃发生故障的SNTP服务器发给它的时间信息,然后重新选择其他的SNTP服务器。

【相关API】

头文件:qcom/qcom_sntp.h

void qcom_enable_sntp_client(int enable); //使能或关闭SNTP客户端

void qcom_sntp_srvr_addr(int flag,char* srv_addr);  //配置SNTP服务器的地址

void qcom_sntp_zone(int hour,int min,int add_sub,int enable);//配置SNTP时区

void qcom_sntp_get_time(A_UINT8 device_id, tSntpTime* time); //获取SNTP时间

void qcom_sntp_show_config();  //查看配置信息

void qcom_sntp_get_time_of_day(A_UINT8 device_id, tSntpTM* time);//获取时间

void qcom_sntp_query_srvr_address(A_UINT8 device_id, SNTP_QUERY_SRVR_ADDRESS* addr); //查询SNTP地址

【编程步骤】

1. 使能sntp客户端

2. 配置sntp的时区信息

3. 获取sntp的时间

【注意】

     ceac_sntp_client_enable(DEV_ID, 1);

     qcom_thread_msleep(5000);  //前后一定要睡眠 否则获取的时间是默认的

     ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ;

     qcom_thread_msleep(5000)  //前后一定要睡眠 否则获取的时间是默认的

     ceac_sntp_show_information(DEV_ID);

     ceac_sntp_get_time(DEV_ID);

测试的时候,要确保开发板已经连接上Wifi,否则获取的时间值是默认的时间值。

【参考代码】

第一步:sntp客户端使能

/*
 *@function: enable sntp client
 *
 *@param:  1:enable  0: disable
 *
 *@return none
 */
void ceac_sntp_client_enable(A_UINT8 device_id, int enable)
{
    //enable SNTP at run time
    qcom_enable_sntp_client(enable);
}

第二步:设置sntp的时区信息

/*
 *@function: Configure SNTP time zone and enable/disable day light saving
 *
 *@param: utc  eg:UTC+05:30
 *@param: dls_en  "disable" or enable
 *@return none
 */
void ceac_config_sntp_zone(A_UINT8 device_id, A_CHAR* utc, A_CHAR* dls_en)
{
    int flag = 0;
    int hour = 0, min = 0;
    int add_sub;
    char hr[3], mn[3], parsing_hour_min[10];

    if (A_STRLEN(utc) > 9)
    {
        A_PRINTF("Error : Invalid UTC string. Valid string(UTC+hour:min).Eg UTC+05:30\n\r");
        return;
    }

    if (A_STRLEN(dls_en) > 8)
    {
        A_PRINTF("Error : Invalid DSE string.Valid string enable/disable \n\r");
    }

    A_STRCPY(parsing_hour_min, utc);

    //UTC+xx:xx  or UTC-xx:xx
    if (A_STRLEN(parsing_hour_min) != 9)
    {
        A_PRINTF("Error : UTC time format should be UTC+XX:XX or UTC-XX:XX\n");
        A_PRINTF("Hour from 00 to -12/+13, minute should be 0, 30 or 45\n\r");
        return;
    }
    //parse the hour
    hr[0] = parsing_hour_min[4];
    hr[1] = parsing_hour_min[5];
    hr[2] = '\0';
    hour = (hr[0] - '0') * 10 + (hr[1] - '0');

    //parse the minues
    mn[0] = parsing_hour_min[7];
    mn[1] = parsing_hour_min[8];
    mn[2] = '\0';
    min = (mn[0] - '0') * 10 + (mn[1] - '0');

    if (0 != min && 30 != min && 45 != min)
    {
        A_PRINTF("Error : UTC time offset in minutes should be 0, 30 or 45\n\r");
        return;
    }

    //valid time zone: -12,-11, ...., +13
    if ('+' == parsing_hour_min[3])
    {
        add_sub = 1; // time is to be added
        if (hour > 13 || ((13 == hour) && (min > 0)))
        {
            A_PRINTF("Error : UTC time offset in hour from -12 to +13\n\r");
            return;
        }
    }
    else if ('-' == parsing_hour_min[3])
    {
        add_sub = 0; // time is to be substracted
        if((hour > 12) || ((12 == hour) && (min > 0)))
        {
            A_PRINTF("Error : UTC time offset in hour from -12 to +13\n\r");
            return;
        }
    }
    else
    {
        A_PRINTF("Error: Only +/- operation is allowed\n");
        return ;
    }

    //wether disable or enable day light saving
    if (!A_STRCMP(dls_en, "enable"))
        flag = 1;  //enable
    else if (!A_STRCMP(dls_en, "disable"))
        flag = 0;
    else
    {
        A_PRINTF("DSE(day light saving) input parameter should be enable or disable !\n");
        return;
    }

    A_PRINTF("------>qcom_sntp_zone   hour: %d   min: %d  add_sub: %d  flag: %d\n", hour, min, add_sub, flag);
    qcom_sntp_zone(hour, min, add_sub, flag);
    return;
}

第三步:获取时间

/*
 *@function: Get SNTP time
 *
 *
 *@return none
 */
void ceac_sntp_get_time(A_UINT8 device_id)
{
    tSntpTime time;
    char *months[12] = {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
    char *Day[7] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};

    qcom_sntp_get_time(device_id, &time);
    A_PRINTF("\nRTC TimeStamp: %s %s %d %d  %d:%d:%d\n", Day[time.wday], months[time.mon], time.yday, time.year, time.hour, time.min, time.Sec);

    return;
}

第四步:测试程序

void sntp_task(unsigned long which_thread)
{
    // just test SNTP client
    #define DEV_ID 0
    ceac_sntp_client_enable(DEV_ID, 1);
    //Note that: must sleep serval seconds, or it will config error
    qcom_thread_msleep(5000);
    ceac_config_sntp_zone(DEV_ID, "UTC+08:00", "enable") ;
    qcom_thread_msleep(5000);

    ceac_sntp_get_time(DEV_ID);
}

【测试环境】

Win7 + QCA4010开发板 + Xshell

【测试结果】

显示当前正确的时间

时间: 2024-11-02 01:29:32

【物联网】QCA4010之SNTP协议的相关文章

11种你需要了解的物联网(IoT)协议

电子工程师和物联网(IoT)的产品和系统的应用程序开发人员都有一个几乎令人迷惑的连接选项. 许多通信技术是众所周知的,如WiFi,蓝牙,ZigBee和2G / 3G / 4G蜂窝,但也有几个新兴的新兴网络选项,如线程作为家庭自动化应用的替代品,以及在主要城市实施的空白电视技术用于更广泛的基于IoT的用例.根据应用,范围,数据要求,安全性和功率需求以及电池寿命等因素将决定某种形式的技术组合的选择.这些是向开发人员提供的一些主要通信技术. 蓝牙 重要的短距离通信技术当然是蓝牙技术,在计算和许多消费品

物联网协议、联盟、以及解决方案正走向融合

随着技术的演进与市场教育的成功,物联网应用已逐步启动,不过由于各种应用的类型不同,物联网系统架构也不一,为确保系统中的各环节可顺利互连,验证成为物联网上线前的必然流程,不过也因为各种应用的架构不同,订制化已成为物联网测试的趋势. 2017年伊始,我们可以观察到一个现象:物联网协议.联盟.以及解决方案正在走向融合.不可否认,早在几年前就有很多行业观察者预测过物联网行业整合趋势,但事实上,每年的行业标准及专属解决方案都不尽相同. 比如去年,我们看到 HomePlug 成功过渡到了"Wi-Sun&qu

物联网通信协议的详解及选择建议

通信对物联网来说十分关键,无论是近距离无线传输技术还是移动通信技术,甚至是LPWAN都影响着物联网的发展.通信协议是指双方实体完成通信或服务所必须遵循的规则和约定.那么物联网都有哪些通信协议?众多的协议该如何选择? 我们将物联网通信协议分为两大类,一类是接入协议,一类是通讯协议.接入协议一般负责子网内设备间的组网及通信(文章<常见物联网近距离无线通信技术解析>有详细介绍):通讯协议主要是运行在传统互联网TCP/IP协议之上的设备通讯协议,负责设备通过互联网进行数据交换及通信. 本文罗列下市面上

物联网竞争硝烟已起 科技巨头系统较量升级

5月25日,作为全球规模最大的消费科技产品交易会之一的CES 首度登陆亚洲,正式在上海新国际博览中心举行.中国移动在本届展会上发布了"OneNet设备云平台"和"物联网专网业务管理平台"两大物联网开放平台.OneNet设备云平台专供智能设备,是介于终端和应用直接的云服务和信息处理平台,具备数据处理好模块化应用能力可为物联网企业提供多种协议的接入支持.物联网专网业务管理平台则是一个管理遍布全球的数据卡的综合性平台,无论是在全国甚至全球的任何地方,只要接入了网络,都可以

如何高效处理物联网中数据与消息

面临爆炸式增长,车联网业务平台问题重重 服务于大量的客户.合作伙伴和生态链的其他企业,用户诉求来源复杂: 需求变化快,不可控因素多: 各种营销手段带来突发的业务访问: 系统越来越复杂,模块越来越多: 市场竞争剧烈,创新不断涌现: 移动互联网规模比传统互联网大10倍,物联网的规模又要再扩大10倍,新时代才刚刚开始. 行车辅助.汽车安全.智能交通.出行服务.生活娱乐等将成为车联网的主要发展方向.面临爆炸式增长,车联网的系统架构需要充分考虑,使性能能够水平.线性扩展,功能满足市场快速变化的需求. 典型

八个研发物联网产品的重要问题

物联网(IoT)并不是一项新技术,而是将既有的技术应用于新情况和新案例中.正因如此,大家会认为开发出一个物联网产品并不那么困难;这种认知是极其错误的. 物联网实际上是一个网络连接系统中的系统.物联网的实作,需要在所有系统之间协调通讯与操作,包括内建传感器的可联网产品.各种云端平台和网络,以及用以控制并监控运作效能的行动应用软件或者web应用程序等等,所以是相当复杂的. 更重要的是,物联网产品通常都缺乏像计算机或移动装置的强大硬件,计算.记忆和储存的功能十分有限. 由于这些困难,制造商在设计和建构

京东发布物联网战略 将推出智子万家升级体验计划

5月9日,京东联合产业链合作伙伴在京召开了以"芯生万物 智享未来"为主题的战略发布会.中国电信.中国移动.中国联通三大运营商的领导以及知名芯片厂商NXP与海尔.格力.美的等多家硬件厂商的高层纷纷到场助阵. 针对目前物联网由工业级向消费级领域拓展过程中,各方在不同环节面临的痛点,京东希望将供应链管理.大数据和云计算等领域的优势共享给各方合作伙伴:从产品定制.网络接入.销售渠道.服务体系等方面,实现全面整合,共建未来消费级物联网.与此同时,为了让更多消费者深度体验到消费物联网给生活带来的智

Actility再获7500万美元注资 扩展其物联网方案

据悉,Actility日前再获7500万美元注资,此次融资将有助于其着力为核心垂直市场打造行业物联网解决方案,涵盖物流和供应链.智能建筑.能源及公共设施等.至此,除Idinvest.Bpifrance.GinkoVentures.KPN.Orange.瑞士电信及富士康等现有投资机构以外,此次宣布的第一批D轮融资为Actility新引入了Creadev. Bosch及 Inmarsat等投资机构,预计本月随后进行的第二批D轮融资还将迎来其他更多战略投资机构入股Actility,实现超额认购. 自2

八个物联网平台商必须自问的问题

物联网(IoT)并不是一项新技术,而是将既有的技术应用于新情况和新案例中.正因如此,大家会认为开发出一个物联网产品并不那么困难;这种认知是极其错误的. 物联网实际上是一个网络连接系统中的系统.物联网的实作,需要在所有系统之间协调通讯与操作,包括内建传感器的可联网产品.各种云端平台和网络,以及用以控制并监控运作效能的行动应用软件或者web应用程序等等,所以是相当复杂的. 更重要的是,物联网产品通常都缺乏像计算机或移动装置的强大硬件,计算.记忆和储存的功能十分有限. 由于这些困难,制造商在设计和建构