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:])
解析报文数据
最新推荐文章于 2024-07-29 17:15:00 发布