Elektronik Cihazlar ile Bilgisayarların Güvenli Veri Paketleri İle Haberleşmesi, özel Frame Tasarımı.

Elektronik Cihazlar ile Bilgisayarların Güvenli Veri Paketleri İle Haberleşmesi, özel Frame Tasarımı. Featured Image

Özet:

Geliştirilen bazı elektronik sistemlerde, güvenli veri iletişimi büyük bir öncelik taşır. Gönderilen verinin alıcı tarafında doğru bir şekilde alınması ve yorumlanması, sistemlerin güvenli ve doğru çalışması için kritik bir gerekliliktir. Özellikle endüstriyel robotlar gibi sistemlerde, gönderilen verinin yanlış alınması veya yorumlanması ciddi risklere yol açabilir. Bu nedenle, veri iletişimi tasarımında güvenilirlik ve doğruluk öncelikli hale gelir.

Farklı iletişim protokollerinin kullanıldığı elektronik sistemlerde, veri paketlerinin doğruluğunu sağlamak temel bir hedeftir. Örneğin, TCP, CANBUS gibi özel güvenli haberleşme protokolleri, veri doğrulamasını kendi içerisinde sağlar. Ancak SPI, UART/USART gibi diğer iletişim protokolleri daha düşük seviyede çalıştığı için güvenlik riskleri taşıyabilir. Bu nedenle, veri paketlerinin doğru iletilmesini ve yorumlanmasını sağlamak için özel veri paketi tasarımları kullanılmalıdır.

Özellikle veri paketi uzunluğunun değişken olduğu sistemlerde, standart uzunluktaki veri paketlerine göre farklı zorluklarla karşılaşabiliriz. Bu zorlukların üstesinden gelmek için, veri paket uzunluğunu sabit tutmak genellikle tercih edilir. Bu yaklaşım, iletişim sırasında ortaya çıkabilecek sorunları minimize etmeye yardımcı olabilir. Ancak, bellek yönetiminin de önemli olduğunu akılda tutmak gerekir, çünkü sabit uzunluktaki veri paketleri bellek kullanımını etkileyebilir.

Bu yazıda, bellek yönetiminin doğru şekilde yapılmasının neden önemli olduğunu ve veri güvenliğini (verinin doğru iletilmesi ve yorumlanmasının sağlanması) nasıl sağlayabileceğimizi ele alacağız. Güvenlikten bahsederken, verinin doğru iletilmesi ve yorumlanmasından bahsettiğimizi unutmamalıyız. Elektronik sistemlerde güvenli veri iletişimi, hem teknik detayları hem de güvenilirlik prensiplerini içeren karmaşık bir konudur.

* * *

Sistem:

Bir veri paketinin (Frame) doğru tasarlanabilmesi için tasarlanan paketin transferi için kullanılacak protokolün nasıl çalıştığı anlaşılmalıdır. Bu yazıda birbirinden farklı olan UART/USART ve TCP protokollerin örnek verilecek ve bu protokollere göre paket tasarımı yapılacaktır..

UART/USART:

  Şekil 1. UART packet.  

UART (Universal Asynchronous Receiver-Transmitter) ve USART (Universal Synchronous/Asynchronous Receiver-Transmitter), dijital cihazlar arasında veri iletişimi sağlamak için kullanılan seri iletişim protokolleridir. Bir paket bir “start bit”, “data frame”, bir “parity bit”, ve “stop bitlerden” oluşur.

Start Bit:

  Şekil 2. UART packet.  

UART iletişiminde, veri baytının başlatılmasını belirtmek için kullanılan bir sinyaldir. Başlangıç biti, herhangi bir veri baytının başında bulunan ve alıcıya bir veri baytının başlamakta olduğunu haber veren bir sinyaldir. Tipik olarak, başlangıç biti, yüksek (1) durumundan alçak (0) durumuna geçiş olarak temsil edilir. Bu, alıcının sonraki bitleri doğru bir zamanlama ile okumasını sağlar.

Data Frame:

  Şekil 3. UART packet.  

UART iletişiminde, asıl iletilmek istenen bilgiyi taşıyan bitlere veri bitleri denir. Veri bitleri, başlangıç bitinden hemen sonra gelir ve iletilen veriyi temsil eder. Bir UART iletişim protokolünde, iletilen verinin uzunluğu genellikle 5 ila 9 bit arasında değişebilir. En yaygın kullanılan format, 8-bit veridir, yani her veri paketinde 8 adet veri biti bulunmaktadır. Örneğin, ASCII karakter setinde “A” harfini iletmek isterseniz, bu harfin ikili (binary) karşılığı “01000001” şeklinde 8 bitlik bir veri olarak iletilir.

Parity Bits:

Image

UART iletişiminde hata kontrolü için kullanılan bir yöntemdir. Parite, veri bitlerindeki 1'lerin sayısına bağlı olarak hesaplanır. İletilen verideki hata olup olmadığını kontrol etmek için kullanılır. Parite biti, asıl veri bitlerinden sonra gelir.

Parite bitleri genellikle üç türde olabilir:

  1. Tek Parite (Odd Parity): Eğer veri bitlerindeki 1 sayısı çift ise, parite biti 1 olarak ayarlanır, böylece tüm bitlerdeki 1 sayısı tek olur. Eğer veri bitlerindeki 1 sayısı zaten tek ise, parite biti 0 olarak ayarlanır.
    1. Çift Parite (Even Parity): Eğer veri bitlerindeki 1 sayısı Çift ise, parite biti 0 olarak ayarlanır. Eğer veri bitlerindeki 1 sayısı tek ise, parite biti 1 olarak ayarlanır, böylece tüm bitlerdeki 1 sayısı çift olur.
      1. Paritesiz (No Parity): Bu modda, hata kontrolü için parite biti eklenmez.

        Alıcı tarafta, veri bitlerine göre bir parite hesaplaması yapılır ve iletilen parite biti ile karşılaştırılır. Eğer bu iki değer uyuşmazsa, bu bir iletim hatası olduğunu gösterir ve hata, alıcı tarafından tespit edilir. Ancak, tek bir parite biti, sadece tek bit hatalarını tespit edebilir. İki veya daha fazla bitin hatalı değişimi durumunda, hata tespit edilemeyebilir.

        UART iletişiminde, veri baytının sonunu belirtmek için kullanılan bir sinyaldir. Stop biti, veri baytının tamamlandığını gösterir. Ayrıca, bir sonraki veri baytının başlamadan önce bir ara veya boşluk sağlar, böylece alıcı cihazın bir sonraki başlangıç bitine hazırlıklı olmasını garantiler.

        Duruş bitinin temel özellikleri şunlardır:

        1. Sinyal Durumu: Stop biti genellikle yüksek (1) durumu olarak temsil edilir.
          1. Stop Biti Uzunluğu: Genellikle, bir duruş biti kullanılır, ancak bazı durumlarda iletişim protokolü iki duruş biti kullanılmasını gerektirebilir. 1, 1.5 veya 2 duruş biti uzunlukları yaygındır.

            Duruş biti, UART iletişiminin doğru bir şekilde senkronize edilmesine yardımcı olur.

            TCP:

            TCP (Transmission Control Protocol), internet üzerinden veri iletimi için kullanılan bir protokoldür. TCP/IP protokol yığını içinde yer alan bir transport katmanı protokolüdür ve güvenilir, düzenli ve hata düzeltilmiş veri aktarımı sağlar. İnternet üzerinde en yaygın olarak kullanılan protokollerden biridir.

            TCP’nin temel özellikleri şunlardır:

            1. Güvenilir İletim: TCP, veri paketlerinin alıcıya doğru sıra ve eksiksiz olarak ulaşmasını garanti eder. Eğer bir paket kaybolursa, TCP bu paketi yeniden gönderir.
              1. Sıralama: TCP, paketlerin doğru sıralama ile alınmasını sağlar. Paketler karışık sıralama ile ulaşırsa, alıcı tarafında yeniden düzenlenir.
                1. Akış Kontrolü: TCP, gönderici ve alıcının veri alışverişini uyumlu bir hızda yapmalarını sağlar. Bu, ağdaki tıkanıklığı azaltmaya yardımcı olur.
                  1. Bağlantı Odaklı: TCP, veri iletimi başlamadan önce, gönderici ve alıcı arasında bir bağlantı kurulmasını gerektirir. Bu üçlü el sıkışma (three-way handshake) süreci olarak bilinir.
                    1. Hata Kontrolü: Veri bütünlüğü, her paketin başlığında bulunan bir checksum ile sağlanır. Eğer paket zarar görürse, bu durum tespit edilir ve gerekirse paket yeniden gönderilir.
                      1. Çoklu İletim Desteği: Tek bir bağlantı üzerinden birden çok veri akışı yönetilebilir.

                        TCP segmentinin ana bölümleri:

                        Şekil 5. TCP segments.
                        1. Kaynak Portu (Source Port): Veriyi gönderen cihazın port numarası. 16 bit uzunluğunda.
                          1. Hedef Portu (Destination Port): Verinin gönderildiği cihazın port numarası. 16 bit uzunluğunda.
                            1. Sıra Numarası (Sequence Number): Gönderilen verinin sırasını belirtir. Segmentin bu bağlantıdaki baytlar arasında hangi pozisyona geldiğini belirtir. 32 bit uzunluğunda.
                              1. Onaylama Numarası (Acknowledgment Number): Alınan veriyi onaylamak için kullanılır. Bu, bir sonraki beklenen baytın sıra numarasıdır. 32 bit uzunluğunda.
                                1. Veri Ofseti (Data Offset): TCP başlık uzunluğunu belirtir. Bu, başlığın sonunu ve verinin başlangıcını gösterir. 4 bit uzunluğunda.
                                  1. Rezerve (Reserved): Gelecekteki kullanım için ayrılmıştır. Şu anda belirli bir amaç için kullanılmamaktadır. 3 bit uzunluğunda.
                                    1. Kontrol Baytları (Control Flags): TCP’nin çeşitli işlevleri için kullanılır. Bunlar arasında URG, ACK, PSH, RST, SYN ve FIN baytları bulunmaktadır. Her biri 1 bit uzunluğunda.
                                      1. Pencere Boyutu (Window Size): Alıcının kabul edebileceği veri miktarını belirtir. 16 bit uzunluğunda.
                                        1. Checksum: Hata kontrolü için kullanılır. Gönderilen segmentin bütünlüğünü sağlamak amacıyla eklenir. 16 bit uzunluğunda.
                                          1. Acil İşaretçisi (Urgent Pointer): URG bayrağı aktif olduğunda kullanılır. Acil verinin sonuna işaret eder. 16 bit uzunluğunda.
                                            1. Seçenekler (Options): Opsiyonel. TCP’nin bazı özelliklerini kullanmak için ek bilgileri taşır. Örneğin, maksimum segment boyutu veya zaman damgası bu bölümde belirtilebilir.
                                              1. Veri (Data): Taşınan asıl veri. Bu bölüm, segmentin geri kalanını kapsar.

                                                Bu bölümler, TCP segmentinin temel yapısını oluşturur. TCP, veri iletiminin doğru ve güvenilir bir şekilde gerçekleşmesini sağlayan bir protokoldür.

                                                UART gibi protokollerde Dışarıdan gelebilecek elektromanyetik gürültülerden veya veri paketini gönderen cihazın paketi yanlış hazırlaması gibi sebeblerden dolayı veri hatalı gelebilir. TCP gibi kendi içerisinde kontrol mekanizmalarını çalıştıran protokollerde bu problemlerle karşılaşılmamakta veya hata tespiti yapılabilmektedir.

                                                * * *

                                                Güvenli olmayan haberleşme protokolleri için güvenli haberleşme frame’i tasarımı.

                                                Paket yapısı gösterilirken güvenlik ile ilgili alnlar kırmızı, Boyut (Size) ile ilgili alanlar Sarı, Bilgi alanları Mavi olarak gösterilecektir.

                                                Oluşturacağımız Paketin Bölümleri:

                                                1. Header: Paket ile ilgili bilgilerin bulunduğu alan
                                                  1. Content: Paket içeriğinin yani asıl gönderilen datanın bulunduğu alan
                                                    1. Footer: Paket sonunda paket ile ilgili kontrol parametrelerinin bulunduğu alan

                                                      Header Alanı:

                                                      Start Byte (1 Byte):

                                                        Packet Header  

                                                      “Start Byte”, veri paketlerinin başlangıcını belirlemek için kullanılan kritik bir bileşendir. Veriyi alan cihazın paketin başlangıcını doğru bir şekilde tespit edebilmesi için bu tür işaretleyicilere ihtiyaç vardır. Ancak, “Start Byte” seçerken dikkate alınması gereken bazı önemli noktalar vardır.

                                                      “Start Byte” seçerken, paket içerisinde bulunma ihtimali en düşük olan bir değerin tercih edilmesi oldukça mantıklı bir yaklaşımdır. Bu, veri akışının başlangıcının daha güvenilir bir şekilde tespit edilmesini sağlar. Örneğin “Start Byte” olarak 0xFF değerini kullanırsak, bu iyi bir tercih olabilir çünkü 0xFF, veri içeriğinde nadiren rastlanan bir değerdir ve paket başlangıcını belirlemek için etkili bir işaretleyici olarak hizmet edebilir.

                                                      Ancak, “Start Byte” yalnızca paket başlangıcını tespit etmek için yeterli değildir. Veri iletişimi sırasında yaşanabilecek hataları ve uyumsuzlukları da dikkate almak önemlidir. Bu nedenle, “Start Byte” ile birlikte veri bütünlüğünü sağlamak için hata düzeltme mekanizmaları veya veri doğrulama yöntemleri gibi ek önlemler de kullanılmalıdır.

                                                      Total Data Len (2 Byte):

                                                        Packet Header  

                                                      “Total Data Len”, alıcının beklenen veri miktarını öğrenmesini sağlayan bir değerdir. Bu değer, “Start Byte” işaretleyicisinin ardından gelir ve alıcının hangi boyutta bir veri paketi beklemesi gerektiğini belirtir. Bu durum, alıcı cihazın beklenen veriyi doğru bir şekilde işleyebilmesi ve olası hataları tespit edebilmesi için son derece önemlidir.

                                                      Özellikle bu bilgi, veri paketlerinin bütünlüğünü sağlamak için kritik bir rol oynar. Alıcı cihazın beklenenden daha az veri alması durumunda, paketin eksik olduğu ve veri bütünlüğünün zarar gördüğü anlaşılabilir. Aynı şekilde, beklenenden daha fazla veri gelmesi durumunda da alıcı cihaz bu durumu tespit edebilir ve hatalı bir veri paketi olduğunu anlayabilir.

                                                      “Total Data Len” değeri, aynı zamanda veri paketinin maksimum boyutunu da sınırlar. 2 byte’lık bir değer kullandığımız için paketin boyutu en fazla 65536 byte olabilir. Bu sınırlama, veri iletişiminin düzenli ve yönetilebilir olmasını sağlar.

                                                      Tüm bu bilgiler bir araya geldiğinde, “Total Data Len” değeri veri iletişimi sürecinde hem güvenliği hem de veri bütünlüğünü sağlamak için kritik bir bileşen olarak karşımıza çıkıyor. Bu tür ayrıntıların dikkate alınması, elektronik sistemlerin istikrarlı ve güvenilir bir şekilde çalışmasını destekler.

                                                      Device ID (1 Byte):

                                                        Packet Header  

                                                      “Device ID” (Cihaz Kimliği) kavramı, birden fazla cihazın aynı haberleşme hattını paylaştığı senaryolarda oldukça önemlidir. Bu, verilerin doğru cihaza yönlendirilmesini ve işlenmesini sağlamak için kullanılan bir özelliktir.

                                                      “Cihaz Kimliği” veya “Device ID”, veri iletişim hattındaki birden fazla cihazın belirli bir cihazı tanımlamak için kullandığı bir değerdir.

                                                      Ayrıca, “Device ID” alanının kullanımı, veri paketinin kendisine ait olup olmadığını tespit etmek için de kullanılabilir. Bu, veri bütünlüğünü sağlamak ve veri akışındaki olası hataları belirlemek için önemlidir. Özellikle “Device ID” alanı sayesinde alıcı cihaz, veri paketini işlemeden önce paketin kendisine ait olup olmadığına karar verebilir ve gereksiz işlemlerden kaçınabilir.

                                                      “Cihaz Kimliği” alanının 1 byte uzunluğunda olması, en fazla 256 farklı cihazın tanımlanabileceği anlamına gelir. Bu, genellikle birçok uygulama için yeterli bir sayıdır. Eğer daha fazla cihazın tanımlanması gerekiyorsa, “Device ID” alanının uzunluğu artırılarak daha fazla cihaz tanımlaması mümkün hale getirilebilir.

                                                      Sonuç olarak, “Device ID” alanı, çoklu cihazlı sistemlerde veri iletişiminin düzenlenmesi, veri akışının doğru cihaza yönlendirilmesi ve veri bütünlüğünün sağlanması için önemli bir rol oynar. Bu tür ayrıntılar, karmaşık elektronik sistemlerin güvenli ve etkili bir şekilde çalışmasını destekler.

                                                      Packet Number (4 Byte):

                                                        Packet Header  

                                                      “Packet Number” (Paket Numarası) kavramı, veri iletişiminde paketlerin benzersiz kimlikleri ile takip edilmesini sağlayan önemli bir bileşendir. Bu, veri iletişiminin güvenilirliği ve düzenliliği açısından büyük öneme sahiptir.

                                                      “Paket Numarası” veya “Packet Number”, her bir veri paketinin benzersiz bir kimliği olarak kullanılır. Her gönderilen veri paketinin “Packet Number” değeri bir arttırılarak oluşturulur. Bu sayede, her paket farklı bir numaraya sahip olur ve veri iletişiminde hangi paketlerin eksik veya hatalı olduğu belirlenebilir.

                                                      Bir cihaz veri gönderdiğinde, alıcı cihazın bu veriye yanıt olarak cevap göndermesi gerekebilir. “Packet Number” bu durumda da oldukça kullanışlıdır. Alıcı cihaz, gelen verideki “Packet Number” değerini kullanarak, hangi veri paketine cevap vermesi gerektiğini belirleyebilir. Bu sayede, gönderici cihazın hangi veri paketine cevap verildiğini tanımlaması mümkün olur.

                                                      “Paket Numarası” kavramı, veri bütünlüğünü sağlamak ve veri iletişiminin düzenli olmasını sağlamak için büyük bir öneme sahiptir. Eğer bir paket kaybolursa veya hatalı bir şekilde iletilirse, “Packet Number” değeri sayesinde bu durum tespit edilebilir. Bu sayede eksik veya hatalı paketler tekrar gönderilebilir veya düzeltme mekanizmaları devreye sokulabilir.

                                                      Sonuç olarak, “Packet Number” kavramı, veri iletişiminin izlenmesi, düzenlenmesi ve güvenilirliğinin sağlanması için önemli bir araçtır. Bu tür numaralandırma yöntemleri, karmaşık veri iletişim süreçlerini daha yönetilebilir hale getirir ve elektronik sistemlerin güvenli bir şekilde çalışmasına yardımcı olur.

                                                      Info Byte (1 Byte):

                                                        Packet Header  

                                                      “Info Byte” paket tanımlama bilgilerinin bulunduğu alandır. Bu alanlar;

                                                      1. Info Bits: Bu alan, paketin içeriğinin neyle ilgili olduğunu tanımlar. Bu tür bilgiler, veri paketinin doğru bir şekilde yorumlanmasına yardımcı olur. Örneğin, sıcaklık verisi gibi belirli bir tür veriyi içeren bir paketin, “Info Bits” alanında uygun bir kodla tanımlanması, alıcı cihazın ne tür veriyle işlem yapması gerektiğini belirtir.
                                                        1. R/S (Request/Send): Bu alan, paketin bir istek mi yoksa veri gönderme veya parametre yazma işlemi mi temsil ettiğini belirtir. Bu, alıcı cihazın hangi tür tepki vermesi gerektiğini anlamasını sağlar. Talep paketlerinde alıcıdan belirli bir bilgi istenirken, send paketlerinde veri gönderme veya parametre yazma işlemi gerçekleşir.
                                                          1. Is Wait For Answer: Bu alan, gönderen cihazın bu veri paketi için bir cevap bekleyip beklemediğini belirtir. İstek paketleri için önemlidir, çünkü bu alana bağlı olarak alıcı cihazın cevap göndermesi veya göndermemesi gerektiğini anlayabilir. Veri gönderme işlemleri için ise, ACK (acknowledgment) mesajı gönderme gerekliliğini belirtir.
                                                            1. Is High Data Priority: Bu alan, veri paketinin öncelikli bir paket olup olmadığını belirtir. Öncelikli veri paketleri, alıcı cihazın öncelikle işlemesi gereken verileri tanımlar. Bu özellik, sistemdeki farklı veri tipleri veya işlemler arasında öncelik belirlemek için kullanışlıdır.

                                                              Bu “Info Byte” alanındaki bilgiler, veri iletişiminde doğru ve güvenilir işlem yapılabilmesi için oldukça önemlidir. Bu tür kontrol bilgileri, veri iletişiminin yönetimini ve hatasız çalışmasını destekler.

                                                              Content Size (2 Byte):

                                                                Packet Header  

                                                              “Content Size”, iletişim paketinin içerisinde yer alan “Content” adı verilen veri bölümünün uzunluğunu ifade eder. Yani, gönderilecek olan verinin kaç byte uzunluğunda olduğunu belirtir. Bu bilgi, alıcı tarafından gelen verinin ne kadar süre boyunca beklenmesi gerektiğini ve alınan verinin doğru bir şekilde ayrıştırılmasını sağlar.

                                                              Paketlerin içerisindeki veri miktarı, iletişim protokollerine ve kullanılan iletişim kanalına bağlı olarak değişebilir. Bazı durumlarda, büyük veri kümesi taşınması gerekebilirken, diğer durumlarda sadece küçük bir komut veya bilgi gönderimi söz konusu olabilir. Bu nedenle, her iletişim paketinin başlangıcında “Content Size” bilgisinin doğru bir şekilde belirtilmesi, iletişimin güvenilir ve etkili bir şekilde gerçekleşmesi için hayati önem taşır.

                                                              Header Checksum (1 Byte):

                                                                Packet Header  

                                                              Paketin header alanı paket’in güvenli ve doğru bir şekilde alınabilmesi için hayati önem taşımaktadır. Bu yüzden paketin geri kalanı alınmadan önce header kısmının “Header Checksum” ile kontrol edilmesi gerekmektedir.

                                                              Header checksum “Start Byte” ve “Content Size” kısımları dahil olmak üzere paketin header kısmını kapsar.

                                                              Checksum hesaplamak için kullanabilceğiniz fonksiyon aşağıdadır:

                                                              /**
                                                               * @brief Calculate the checksum of a given byte array.
                                                               *
                                                               * This function calculates the checksum of a provided byte array by summing up
                                                               * all the elements and applying a specific manipulation. The result is then
                                                               * returned as a uint8_t value.
                                                               *
                                                               * @param[in] s Pointer to the byte array for which the checksum is to be calculated.
                                                               * @param[in] n Number of elements in the byte array.
                                                               * @return Calculated checksum as a uint8_t value.
                                                               *         If the input pointer `s` is NULL, it returns 0.
                                                               */
                                                              uint8_t checksum_calculate(const uint8_t *s, size_t n)
                                                              {
                                                                 // Check if the input pointer is NULL
                                                                 if (NULL == s)
                                                                 {
                                                                    // Return 0 if the input pointer is NULL
                                                                    return 0;
                                                                 }
                                                                
                                                                 // Initialize a 32-bit variable to hold the checksum
                                                                 uint32_t checksum = 0;
                                                                 
                                                                 // Loop through each element in the byte array
                                                                 for (size_t i = 0; i < n; i++)
                                                                 {
                                                                    // Add the current element's value to the checksum
                                                                    checksum += s[i];
                                                                 }
                                                                
                                                                 // Apply a specific manipulation to the checksum value
                                                                 checksum = ((checksum ^ 255) + 1);
                                                                
                                                                #ifdef LITTLE_ENDIAN 
                                                                   // Return the least significant byte of the checksum if little-endian architecture
                                                                   return ((uint8_t*)&checksum)[3];
                                                                #else
                                                                   // Return the most significant byte of the checksum if not little-endian architecture
                                                                   return ((uint8_t*)&checksum)[0];
                                                                #endif
                                                              }

                                                              Content (Size is in “Content Size”):

                                                                Packet Header  

                                                              “Content” alanı, taşınan verinin barındığı bölümü temsil eder ve bu bölümün boyutu “Content Size” alanında tanımlandığı şekildedir. Yani, “Content Size” alanında belirtilen boyuta uygun olarak veri içeriği “Content” alanına yerleştirilir.

                                                              Crc (4 Byte):

                                                                Packet Header  

                                                              Veri iletişimindeki güvenilirlik ve bütünlüğün sağlanması için CRC (Cyclic Redundancy Check)) alanı oldukça önemlidir. CRC, veri paketinin içeriğinin bozulup bozulmadığını kontrol etmek için kullanılan bir hata tespit mekanizmasıdır. Veri paketi gönderilirken, veri içeriği üzerinde belirli bir matematiksel işlem uygulanarak CRC değeri hesaplanır. Alıcı cihaz, veri paketini alırken aynı matematiksel işlemi gerçekleştirerek hesapladığı CRC değeri ile gönderilen CRC değerini karşılaştırır. Eğer bu iki değer eşleşmiyorsa, veri paketinin içeriğinde bir hata olduğu anlaşılır.

                                                              Crc hesplama işlemine “Start Byte” ve “Content” dahil olmak üzere paketin tamamı dahil edilir. CRC yöntemi, veri hatalarını algılama konusunda oldukça etkili olup iletişim hatası ve veri bozulmalarının tespit edilmesine yardımcı olur.

                                                              Crc hesaplamak için kullanabilceğiniz fonksiyon aşağıdadır (Kaynak):

                                                              uint32_t crc32_calculator(const uint8_t *s, size_t n)
                                                              {
                                                                uint32_t crc = 0xFFFFFFFF;
                                                                
                                                                for (size_t i = 0; i < n; i++)
                                                                {
                                                                  uint8_t ch = s[i];
                                                                  for (size_t j = 0; j < 8; j++)
                                                                  {
                                                                    uint32_t b = (ch ^ crc) & 1;
                                                                    crc >>= 1;
                                                                    if (b)
                                                                    {
                                                                      crc = crc ^ 0xEDB88320;
                                                                    {
                                                                    ch >>= 1;
                                                                  }
                                                                }
                                                                
                                                                return ~crc;
                                                              }

                                                              Stop Byte (1 Byte):

                                                                Packet Header  

                                                              “Stop Byte” seçerken, paket içerisinde bulunma ihtimali en düşük olan bir değerin tercih edilmesi önemlidir. Bu, veri akışının sonunun daha güvenilir bir şekilde tespit edilmesini sağlar. Örneğin, “Start Byte” olarak 0XFF kullanmıştık. “Stop Byte” olarak ise 0xFE değerini kullanmak mantıklı olabilir, çünkü veri içeriğinde nadiren rastlanan bir değerdir ve paket sonunu belirlemek için etkili bir işaretleyici olarak işlev görebilir.

                                                              Tüm Yazılar