PTP (Precision Time Protocol) ialah protokol penyegerakan masa yang boleh mencapai penyegerakan masa tahap sub-mikrosaat dalam sistem teragih. Dalam bidang seperti automasi industri dan komunikasi rangkaian, penyegerakan masa adalah sangat penting. Pelaksanaan protokol PTP sentiasa menjadi topik hangat, dan Golang ialah bahasa pengaturcaraan yang cekap Ciri-ciri konkurensi semula jadi dan mekanisme pengurusan memori yang baik menjadikannya salah satu bahasa pilihan untuk melaksanakan protokol PTP.
Protokol PTP dirumuskan oleh IEEE Standard 1588 dan digunakan terutamanya untuk komunikasi rangkaian untuk mencapai penyegerakan masa antara nod rangkaian dalam sistem teragih. Protokol PTP dengan tepat menyegerakkan maklumat masa ketepatan antara jam rujukan dan jam hamba melalui rangkaian, supaya jam rujukan dan jam hamba pada asasnya konsisten.
Protokol PTP terutamanya terdiri daripada dua peranan, jam Master dan jam Hamba. Jam Induk menyiarkan mesej Penyegerakan melalui rangkaian Jam Hamba menerima mesej Penyegerakan jam Induk, mengira kelewatan dengan jam Induk berdasarkan mesej Permintaan Lengah, dan melaksanakan penentukuran jam dan masa melalui mesej Susulan.
Kelebihan Golang ialah sangat mudah untuk menulis kod serentak yang betul, dan mekanisme pengurusan memori di Golang juga membantu pembangun menyelesaikan kebocoran ingatan, dsb. soalan. Ciri-ciri ini sangat berfaedah untuk melaksanakan protokol PTP.
2.1 Struktur protokol PTP
Protokol PTP terutamanya terdiri daripada dua bahagian: mesej dan paket, jadi kami boleh mewakilinya dengan mentakrifkan struktur dalam Golang.
Untuk mesej dalam protokol PTP, kita boleh menggunakan definisi berikut:
taip struct Header{
TransportSpecific uint8 Version uint8 MessageLength uint16 DomainNumber uint8 Flags PTPFlags CorrectionField int64 SourcePortIdentity PortIdentity SequenceID uint16 ControlField uint8 LogMessageInterval uint8
}
Untuk mesej dalam protokol PTP Teks, kita boleh menggunakan takrifan berikut:
taip SyncMessage struct{
Header Header OriginTimestamp uint64
}
Ini ialah takrifan mesej Sync, yang merangkumi struktur Pengepala dan medan OriginTimestamp . Mesej lain boleh ditakrifkan sama.
2.2 Analisis dan penjanaan protokol PTP
Dalam proses melaksanakan protokol PTP, kita perlu menghuraikan dan menjana data rangkaian. Oleh itu, kita perlu menggunakan pakej binari di Golang untuk menghuraikan dan menjana susunan bait rangkaian.
Mengambil mesej Sync sebagai contoh, kami boleh mentakrifkan fungsi ParseSyncMessage untuk menghuraikan susunan bait rangkaian bagi mesej Sync.
func ParseSyncMessage(data []bait) (*SyncMessage, error) {
msg := new(SyncMessage) err := binary.Read(bytes.NewReader(data), binary.BigEndian, &msg.Header) if err != nil { return nil, err } err = binary.Read(bytes.NewReader(data[40:48]), binary.BigEndian, &msg.OriginTimestamp) if err != nil { return nil, err } return msg, nil
}
Fungsi ini membaca medan Pengepala dan OriginTimestamp daripada data rangkaian Dan kembali struktur jenis SyncMessage. Fungsi penghuraian mesej lain boleh dilaksanakan dengan cara yang sama.
Untuk menjana paket protokol PTP, kami boleh mentakrifkan fungsi GenerateSyncMessage untuk menjana paket Sync. Fungsi ini menetapkan setiap medan mesej Sync kepada nilai yang sepadan, dan akhirnya menjana mesej Sync dalam susunan bait rangkaian.
func GenerateSyncMessage() ([]bait, ralat) {
msg := new(SyncMessage) msg.Header.TransportSpecific = 0x80 msg.Header.Version = 2 msg.Header.MessageLength = 44 msg.Header.DomainNumber = 0 msg.Header.ControlField = 0x00 msg.Header.SequenceID = 1 msg.Header.SourcePortIdentity = PortIdentity{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xff, 0xfe} msg.Header.Flags = PTPFlag(0x00) msg.Header.CorrectionField = 0 msg.OriginTimestamp = uint64(time.Now().UnixNano()) b := new(bytes.Buffer) err := binary.Write(b, binary.BigEndian, &msg) if err != nil { return nil, err } return b.Bytes(), nil
}
2.3 Komunikasi rangkaian protokol PTP
Protokol PTP terutamanya disiarkan melalui rangkaian Segerakkan mesej untuk penyegerakan jam. Oleh itu, kita perlu menggunakan pakej bersih di Golang untuk melaksanakan komunikasi rangkaian.
Berikut ialah kaedah pelaksanaan penyiaran mesej Sync ke rangkaian:
func BroadCastSyncMessage() ralat {
conn, err := net.ListenPacket("udp4", ":319") if err != nil { return err } defer conn.Close() for { b, err := GenerateSyncMessage() if err != nil { return err } _, err = conn.WriteTo(b, &net.UDPAddr{IP: net.IPv4(224, 0, 1, 129), Port: 319}) if err != nil { return err } time.Sleep(time.Second) } return nil
}
Fungsi ini sentiasa disiarkan ke rangkaian Mesej penyegerakan disiarkan sekali setiap saat. Kaedah penghantaran mesej lain juga boleh dilaksanakan dengan cara yang sama.
Artikel ini memperkenalkan cara menggunakan Golang untuk melaksanakan protokol PTP. Melalui definisi struktur, analisis dan penjanaan data rangkaian, dan komunikasi rangkaian, kami boleh dengan mudah melaksanakan protokol PTP dan mencapai penyegerakan masa antara nod rangkaian. Ciri konkurensi semula jadi Golang dan mekanisme pengurusan memori yang baik menjadikan pelaksanaan protokol PTP lebih mudah.
Atas ialah kandungan terperinci golang melaksanakan protokol ptp. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!