Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang melaksanakan protokol ptp

golang melaksanakan protokol ptp

WBOY
WBOYasal
2023-05-15 10:10:07739semak imbas

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.

  1. Gambaran keseluruhan 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.

  1. Golang melaksanakan protokol PTP

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.

  1. Ringkasan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:penukaran jenis imej golangArtikel seterusnya:penukaran jenis imej golang