12.2. Dört katman

Protokol kütüphanesi, her biri tek bir sorunu çözen ve altındaki katmanın üzerine inşa edilen dört katmanlı bir yığın olarak kurulmuştur. Bölümün geri kalanı yığını aşağıdan yukarıya doğru gezer.

Dört etiketli katmanın dikey bir yığını: en altta aktarım (USB veya UART), onun üzerinde çerçeveleme (CRC içeren paket başlığı), onun üzerinde güvenilirlik (sıra numaraları, ACK / NAK, yeniden iletimler) ve en üstte kanallar (adlandırılmış mantıksal akışlar).

12.2.1. Aktarım

En altta, kamera ile ana makine arasındaki bayt boru hattı bulunur. Protokol kütüphanesi baytları hangisinin taşıdığını umursamaz:

  • Kameranın takılı olduğu USB portu üzerinden USB-CDC. Her kamera için varsayılan ve en yüksek bant genişliğine sahip seçenek.

  • Kameradaki bir çift GPIO pini üzerinden, ana makinedeki bir seri adaptöre bağlı UART. USB portunun meşgul olduğu veya fiziksel olarak erişilemediği başsız dağıtımlar için kullanışlıdır.

Aktarımın tek görevi “baytlar girer, baytlar çıkar, sırayla” işlemidir. Bu katmanın üstündeki her şey, aktarımın baytları yazıldıkları sırayla teslim ettiğini varsayar, ancak baytların kendilerinin bozulmasına veya bağlantının tamamen kopmasına izin verir. Kayıplı patlamalar (birkaç bayt eksik) ve temiz kopmalar (tüm bağlantının bir süreliğine gitmesi, sonra geri gelmesi) daha üst seviyede ele alınır.

12.2.2. Çerçeveleme

Bir üst katman, bayt akışına yapı dayatır. Her mesaj bir pakete dönüşür – 10 baytlık bir başlık, ardından bir yük, ardından 4 baytlık bir sonek. Başlık şunları taşır:

  • Bir alıcının senkronizasyon kaybından sonra bir paketin başlangıcını yeniden bulmasını sağlayan 2 baytlık bir senkronizasyon sözcüğü (0xD5AA).

  • Güvenilirlik katmanı tarafından kullanılan 1 baytlık bir sıra numarası.

  • Paketin hangi mantıksal akışa ait olduğunu belirten 1 baytlık bir kanal kimliği.

  • ACK / NAK / parça / olay bitleri için 1 baytlık bir bayrak alanı.

  • Protokol komutlarını, sistem komutlarını ve kanal komutlarını birbirinden ayıran 1 baytlık bir işlem kodu.

  • 2 baytlık bir yük uzunluğu.

  • Önceki sekiz başlık baytı üzerindeki 2 baytlık bir CRC.

Yük bunu izler, ardından yükün kendisi üzerinde 4 baytlık bir CRC gelir. İki CRC bozulmayı birbirinden bağımsız olarak yakalar: başlıktaki ters çevrilmiş bir bit başlık CRC’sini geçersiz kılar ve alıcı, yükü hiç okumaya gerek kalmadan paketi atabilir.

12.2.3. Güvenilirlik

Güvenilirlik katmanı, “gelmesi muhtemel paketleri” “gelmiş paketlere” dönüştürür. Başlıktaki sıra numaralarını izler, karşı taraftan gerektiren her paket için onaylama göndermesini ister ve bir onaylama zaman aşımı içinde gelmediğinde yeniden iletir. Varsayılan olarak yeniden iletim zaman aşımı 500 ms ile başlar ve her yeniden denemede iki katına çıkar; vazgeçmeden önce üç yeniden deneme yapılır.

Bu davranışların her biri protocol.init() çağrısında yapılandırılabilir: tek yönlü akışlar için ACK kapatılabilir, kusursuz temiz aktarımlarda CRC doğrulaması atlanabilir ve yeniden iletim parametreleri yavaş veya yüksek gecikmeli bağlantılar için ayarlanabilir.

12.2.4. Kanallar

En üst katman, uygulama kodunun gördüğü katmandır. Bir kanal, 0 ile 31 arasında bir kanal kimliğiyle tanımlanan, adlandırılmış mantıksal bir akıştır. Bir aktarımda en fazla 32 kanal bir arada bulunabilir; her biri diğerlerinden bağımsızdır ve her paketin başlığında kimliğiyle adreslenir. Kamera, dört yerleşik kanalla – stdin, stdout, stream ve profile – açılır ve uygulama kodu, protocol.register() işlevini bir Python sınıfıyla çağırarak bunların üzerine daha fazlasını kaydeder.

Dört katman ilgi alanlarını karıştırmaz. Çerçeveleme kanalları bilmez; güvenilirlik paket içeriğini bilmez; kanal katmanı baytların nasıl geldiğini bilmez. İşte bu ayrım sayesinde bir aktarım değişikliği (örneğin USB’den UART’a) kanal koduna kadar yukarı doğru yayılmaz ve bölümün geri kalanını katman katman gezilebilir kılan da budur.