Ntp客户端

function parseMsg (buffer) {
    if (buffer.length !== 48) return;
    const pkt = {},
        now = new Date().getTime();
    pkt.leapIndicator = buffer[0] >> 6;
    pkt.version = (buffer[0] & 0x38) >> 3;
    pkt.mode = buffer[0] & 0x7;

    pkt.stratum = buffer[1];
    pkt.interval = Math.pow(2, buffer[2]);
    pkt.precision = Math.pow(2, buffer[3]) * 1000;
    pkt.rootDelay = 1000 * ((256 * (256 * (256 * buffer[4] + buffer[5]) + buffer[6]) + buffer[7]) / 0x10000);
    pkt.rootDispersion = ((buffer[8] << 8) + buffer[9] + ((buffer[10] << 8) + buffer[11]) / Math.pow(2, 16)) * 1000;
    pkt.referenceId = pkt.stratum < 2 ? String.fromCharCode(buffer[12]) + String.fromCharCode(buffer[13]) + String.fromCharCode(buffer[14]) + String.fromCharCode(buffer[15]) : pkt.stratum < 16 ? `${buffer[12]}.${buffer[13]}.${buffer[14]}.${buffer[15]}` : '';
    pkt.referenceTimestamp = toMsecs(buffer, 16);
    pkt.originateTimestamp = toMsecs(buffer, 24);
    pkt.receiveTimestamp = toMsecs(buffer, 32);
    pkt.transmitTimestamp = toMsecs(buffer, 40);

    pkt.time = pkt.originateTimestamp;
    pkt.delay = ((now - pkt.originateTimestamp) - (pkt.transmitTimestamp - pkt.receiveTimestamp)).toFixed(3) / 1;
    pkt.offset = (((pkt.receiveTimestamp - pkt.originateTimestamp) + (pkt.transmitTimestamp - now)) / 2).toFixed(3) / 1;
    return pkt;
}
function toMsecs(buffer, offset) {
    let seconds = 0, fraction = 0;
    for (let i = 0; i < 4; i++) {
        seconds = (seconds * 256) + buffer[offset + i];
    }
    for (let i = 4; i < 8; i++) {
        fraction = (fraction * 256) + buffer[offset + i];
    }
    return (seconds - 2208988800 + (fraction / Math.pow(2, 32))) * 1000;
}

猜你喜欢

转载自www.cnblogs.com/zh33gl/p/10795298.html