您好,欢迎访问沃航(武汉)科技有限公司官方网站
通过go语言实现sntp协议以及获取最新的时间戳
2020-12-27 16:48:26

        对于任何程序,快速定位程序当前的时间是一个很重要的事情,其中目前主流的方法是通过互联网sntp协议实现,sntp协议就是向服务器请求,获取当前时间戳的协议,可以实现精确获取时间戳的目的。首先给大家讲解下sntp协议的类型,sntp协议是udp协议,端口号是123,只需要按照特定格式发送请求到123端口,服务器就会返回您要的当前时间,而时间是从1900年1月1日开始的时间戳,与我们常用的格林时间(1970年1月1日)相比,差了70年,这个时间请记住要剪掉,而1900年到1970年经过了0x83aa7e80秒,下面我们以阿里云的ntp服务器为例写一段请求互联网时间的代码。

ntp协议格式的详细资料请参考:传送门

话不多说,上代码:

package main

import (
    "fmt"
    "net"
)

func main () {
    conn, err := net.Dial("udp", "ntp.aliyun.com:123");
    if err != nil {
       fmt.Println("net.Dial err:", err)
       return
    }
    defer conn.Close()
    conn.Write([]byte{
        0xdb, 0x00, 0x11, 0xe9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
    var b [512]byte
    fmt.Println("wait read")
    n, err := conn.Read(b[:])
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("时间戳为: ", uint32(b[n-8])<<24+uint32(b[n-7])<<16+uint32(b[n-6])<<8+uint32(b[n-5])-0x83aa7e80) // 返回为1970年1月1日到现在的秒数
}


文章作者:沃航科技

联系我们
地址:
武汉市洪山区蓝晶国际7栋903
QQ:
932773931
电话:
027-59761089-806
手机:
13397158231
邮箱:
jevian_ma@worldflying.cn
×
物联网组态平台
试用账号:123456
试用密码:123456
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn
×
积木编程平台
试用方式:试用手机号码注册即可使用
如需测试更多功能或者有疑问可发送邮件至:jevian_ma@worldflying.cn