Aynı dili konuşmak[nanopb]

İçerisinde yazılım koşan elektronik cihazların bir çoğu akıllı cihazlar, sunucular ya da kendi aralarında bir haberleşme şeklindeler. Söz konusu mikrodenetleyici tabanlı sistemler olduğunda bir kaynaktan bir kaynağa data aktarımında, bu aktarılacak data için tahsis edilecek alan konusunda kimi zaman daha dikkatli olmak gerekebiliyor. Buna ek olarak sistemin konuşuyor olduğu diğer sistemlerle aynı dile sahip olması bir o kadar önemli.

Hatta günümüzde bazı üreticiler, donanımları üzerinde yazılım geliştirme süreçlerinde, donanım üzerinde bulunan modüller için diğer firmalara da bu serileştirme servisinden faydalanarak hizmet vermekte. Çünkü donanım üzerinde hangi teknolojiyi koşturacağınızı size bırakmak istiyor.

İlgili repoyu şuradan inceleyebilirsiniz. https://github.com/nanopb/nanopb

Protokolün kendine has bir sentaks yapısı bulunmakta, bununla ilgili detaylı bilgiye şuradan erişebilirsiniz. https://developers.google.com/protocol-buffers/docs/proto3

Şimdi şöyle bir kurgu düşünelim, geliştirme kitimiz üzerinde 4 farklı ledimizin olduğunu ve bu ledleri bilgisayar tarafında bir arayüz üzerinden kontrol edecek paketleri gönderiyor olduğumuzu varsayalım.

Öncelikle proto dosyamızı hazırlıyoruz.

syntax = "proto2" ;

message led {
    required int32 led_green = 1;
    required int32 led_blue  = 2;
    required int32 led_red   = 3;
    required int32 led_yellow  = 4;
}
python3 nanopb/generator/nanopb_generator.py led.proto

Projemize iki yeni dosya geldi, led.pb.c ve led.pb.h olmak üzere.

Şimdi “encode” ve “decode” işlemlerini yapacağımız uygulama katmanına geçebiliriz. Ben aynı uygulama içerisinde encode ve decode yapacağım için, ilgili iki libi projeme dahil ettim.

#include "stdio.h"
#include "nanopb/pb_encode.h"
#include "nanopb/pb_decode.h"
#include "led.pb.h"


uint8_t buffer[128] = {0};
size_t message_length = 0;
bool status = 0;

typedef enum e_led_state
{
    ON  = 1 << 0,
    OFF = 1 << 1,
    TOGGLE = 1 << 2,

}e_led_state;


static void set_led_state(led* self, int l_blue, int l_green, int l_red, int l_yellow)
{
    if (self == NULL)
    {
        return;
    }

    self -> led_blue = l_blue;
    self -> led_green = l_green;
    self -> led_red = l_red;
    self -> led_yellow = l_yellow;

}

int main(int argc, char* argv[])
{
    //Encoding
    {
        
        led led_state = led_init_zero;

        set_led_state(&led_state, ON, OFF, TOGGLE, ON);

        pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));

        status = pb_encode(&stream, led_fields, &led_state);

        message_length = stream.bytes_written;

        if (!status)
        {
            printf("Encoding failed: %s\n", PB_GET_ERROR(&stream));
            return 1;
        }
    }
      
    //Decoding 
    {

        led led_state = led_init_zero;      
        
        pb_istream_t stream = pb_istream_from_buffer(buffer, message_length);
        
        status = pb_decode(&stream, led_fields, &led_state);

        if (!status)
        {
            printf("\r\n Decoding Failed = %s", PB_GET_ERROR(&stream));
            return 1;
        }

        printf("\r\n State [led_blue] = %i" , led_state.led_blue);
        printf("\r\n State [led_green] = %i" , led_state.led_green);
        printf("\r\n State [led_red] = %i", led_state.led_red);
        printf("\r\n State [led_yellow] = %i \n" , led_state.led_yellow);
        
    }
    
    return 0;
}

Çıktı :

 State [led_blue] = 1
 State [led_green] = 2
 State [led_red] = 4
 State [led_yellow] = 1 

Encoding partında bulunan bufferi cihazın çevresel birimleri üzerinden gelen data aracılığıyla dolduğunu düşünelim. Ve bufferi decoding partında parçalıyoruz. Aynı dili konuşmak işte tam burada geliyor. Host tarafında QT gibi bir uygulama için bu oluşturduğumuz dosyaları kullanarak, uygulama geliştirebiliriz.

Uygulama örneğine şuradan ulaşabilirsiniz.

https://github.com/volkanunal/nanopb_demo_blog

Bir Cevap Yazın

Please log in using one of these methods to post your comment:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google fotoğrafı

Google hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s