Protokol Tanımlamanın Kolay ve Yönetilebilir Yolu: NanoPB

NanoPB

NanoPB Google’ın Protobuf’ını kısıtlı kapasiteli sistemler için implemente eden bir kütüphane. Kullanımı, Protobuf kullanmaya aşina olan insanlar için gayet de basit. Yukarıda bahsi geçen birçok problem, sizin için önceden çözülmüş ve “standartlaştırılmış” bir şekilde size sunuluyor. Sizin yerinize veriyi encode/decode ediyor. Farklı platformlar arası özgürce veri paylaşımı yapmanıza imkan veriyor:

NanoPB hakkında bilgiye buradan ulaşabilirsiniz.

Bu yazıda Protobuf detaylarına girmeyeceğim. Eğer bu konuda bilgi eksiğiniz varsa şuradaki tutorial’ları favori dilinizde implemente ederek bu eksikliği giderebilirsiniz.

Kısa bir örnek yapalım.

  • Alış-veriş yapmak istediğimiz veriyi proto dilinde .proto uzantılı dosyada tanımlıyoruz. Sözgelimi, HOST tarafından cihaz tarafına komutlar gönderecek olalım. Proto domain’inde transfer ettiğimiz her şey bir proto mesajından ibaret. Komut isteği için CommandRequest ismindeki bu tanımlamayı, proto dilinde şu şekilde yapıyoruz:

Mesaj içerisinde olası komutların bulunduğu bir enumeration tanımlanmış. Buna ek olarak bu enum türünden bir değişken daha tanımlanmış. Yani bu mesaj içerisinde sadece CommandRequestCode türünden bir değişken bulunmakta.

Aynı protokol içinde bir request olduğuna göre, buna uygun bir response olması gerekir değil mi?

Benzer şekilde cevap mesajında bir response kodu ve ek olarak error kodu alanları yer almakta. Eğer ki cevap kodu NACK ise, bu durumda error kodu alanı ile karşı tarafa hatanın ne olduğu bildirilir.

  • Daha sonra protokol ana frame’ini oluştururuz.

Bakıldığında frame içinde, ya sadece CommandRequest türünden bir mesaj bulunur ya da sadece OperationResponse türünden bir mesaj bulunur. Bu amaç için oneof’u kullanırız.

Bu aşamada aslında kendimize has frame’i birkaç dakika içinde oluşturmuş olduk.

  • Sonra bu tanımlamaları .proto isimli bir dosya içine kaydedip, proto derleyicisi ile derliyoruz. Benim nanopb derleyicim Linux makinamda kurulu. Çünkü bu işler Linux ortamında çok daha kolay. Dosyamı my_protocol.proto ismiyle kaydettim ve şu şekilde derliyorum:

Bizim için protokolümüzü C dilinde implemente eden iki adet dosya üretildi.

  • Bu implementasyon dosyaları, projeye dahil edilerek kullanıma hazır hale gelir.

C kodu içindeki örnek bir kullanımı da görelim. Bu aşamadan sonraki açıklamaları kod içerisinde yazacağım.

Görüldüğü üzere NanoPB (ve türevi) çözümler, bizim için birçok şeyi kendi içerisinde hallediyor. Test edilmesi gereken onlarca şeyi test etmeye hiç gerek kalmıyor, çünkü zaten hazır. Protokolü esnetmek ne kadar da kolay değil mi? Yeni bir komut eklemek istediğimizde tek yapmamız gereken yeni bir enumeration değeri eklemek. Buna ek olarak bu teknolojiyi kompleks veri yapıları ve mesajların transferinde de kullanabiliriz. Dinamik olarak “payload” alanlarının oluşturulmasına da imkan veriyor. Daha detaylı bilgiler için nanopb web sayfasına erişebilirsiniz.

Faydası olması dileğiyle, esen kalın.

Burak.

Software Developer (Embedded, C, C++, Qt)

Software Developer (Embedded, C, C++, Qt)