解析报文数据

import getopt
import socket
import sys
import time
import struct

##
def unpack_timestamp(model,time_byte):
    if(model[0] == '1'):
        timestamp_s = int.from_bytes(time_byte[-10:-4],byteorder = 'big',signed=False)
        timestamp_ms = int.from_bytes(time_byte[-4:-2],byteorder = 'big',signed=False)
        timestamp_us = int.from_bytes(time_byte[-2:],byteorder = 'big',signed=False)
        
        return int(timestamp_s*1e6+timestamp_ms*1e3+timestamp_us)
    
    else:
        print('not ptp sync mode')

def main(argv):
    port= 2369
    multicast_group = '239.168.20.2'

    try:
        opts, args = getopt.getopt(argv, "-h-p:", ["help", "port="])
    except getopt.GetoptError as e:
        print(e)
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            return
        elif opt in ("-p", "--port"):
            port = arg
            udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
            udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            group = socket.inet_aton(multicast_group)
            mreq = struct.pack('4sL', group, socket.INADDR_ANY)
            udp_socket.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)

            udp_socket.settimeout(10)
            udp_socket.bind(('', int(port)))  # 端口号

            #print("    recv time     |     UDP timestamp     |   Lock state     |    offset(us)\n")
            print("Lock state   |  delay(us)")
            while True:
                data, info = udp_socket.recvfrom(1346)
                #Timeold = time.time()
                #timeold_us = int(round(Timeold * 1000000)) 
                if (data[:2] == b'\xcc\xcc'):
                    t = time.time()
                    t_us = int(round(t * 1000000))  # 微秒级时间戳,count from 1970

                    seq1 = int.from_bytes(data[2:4], byteorder='big') & 0xFFF
                    if (seq1 == 39):
                        info = bin(int.from_bytes(data[2:4], byteorder='big'))[2:].zfill(16)
                        lock_state = info[2:4]
                        timestamp1 = unpack_timestamp(lock_state, data[-20:-10])
                        offset = t_us - timestamp1
                        #print(t_us, timestamp1, lock_state, offset)
                        print("  ", lock_state, "\t\t", offset)

                #Timecur = time.time()
                #timecur_us = int(round(Timecur * 1000000)) 
                #print("Calculate Waste Time: %lu us", timecur_us - timeold_us)

if __name__ == '__main__':
    main(sys.argv[1:])
            
        
        
        
        
    
    
    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值