28 Nisan 2022 Perşembe

MQTT Nedir ? Rabbit Mq Server Nedir? Mesaj Kuyrukları nedir?

 

 


MQTT: Cihazlar arasında mesajlaşmayı sağlayan yayıncı-abone ağ protokolüdür 

          *TCP/IP tabanlıdır , sıralı ve çift yönlü bir iletişim sağlar 

  *Kaynak kısıtlamaları ve band genişliğinin sınırlı olduğu bağlantılar için tasarlanmıştır

  *Mqtt broker : yayıncıdan gönderilen mesajları abonelere uygun şekilde yönlendirilmesini                      sağlar.Bir bilgisayarda calısan yazılımdır .Bunun  için yazılımlar vardır örn: Rabbitmq server 

   Mqtt client : Mqtt kütüphanesini kullanarak mqtt broker cihazına bağlantı kuran cihazdır 

  *Publisher mesajını brokera gönderir broker abonelere dağıtır . Publisher abonleler hakkında                    herhangi birşey bilmesi gerekmez 

  *Abonesi olmayan bir konu için brokera bir mesaj gelirse broker bu mesajı yokeder 

  *Mqtt text modunda güvensiz şekilde gönderilir. TLS ile güvenli gönderim sağlanabilir .                         Şifrelenmemiş  port 1883  Şifrelenmiş port 8883 

  *Mqtt çift yönlü bir iletişim protokolüdür 

         *Mqtt client hem veri yollayabilir hem alabilir . örn: bir cihaz sensörü sensör datalarını                             yayınlarken aynı zaman sensör ayarları ile ilgili kontrol komutları alabilir

EXCHANGELAR 3 tiptir  

*Topic :  +)Kendine bağlı queuelara belirli pattern ve routekeyle ulaşır 

          örn :  route.key.*    -> route.key.XYZ     (mesaj alır)

-> route.key.ABC     (mesaj alır)

-> route.key         (mesaj ALAMAZ)

-> route.key.ABC.TTT (mesaj ALAMAZ)   

route.key.#     -> route.key.XYZ     (mesaj alır)

-> route.key.ABC     (mesaj alır)

-> route.key         (mesaj alır)

-> route.key.ABC.TTT (mesaj alır)   

+) Route key pattern belirtilmezse fanout(bütün kuyruklara) gönder

    +) Net bir route key verilirse direct(sadece bir kuyruga) gibi çalışır

*Fanout : +)Route key belirtmeksizin bütün kuyruklara gider .Publisher(producer) tarafından gönderilen mesaj bütün kuyruklara gider

*Direct :  +)route keye göre bağlı kuyruklara gönderilir 

http://tryrabbitmq.com/


Share:

27 Nisan 2022 Çarşamba

D-BUS(Inter process communication)

 


DBUS NEDİR?
*D-Bus aynı makine üzerinde birden fazla procesin haberleşmesini sağlayan mesajlaşma tabanlı bir yazılım mekanizması
*Pekçok procein iletişimi verimsiz ve güvensiz olmaktadır bunun yerine bir grup procesin dbus ile haberleşmesi sağlanabilmektedir
*Bir proces birden fazla busa bağlanabilir(izin verilmek şartıyla)
*system bus : Bütün kullanıcılar ve bütün proceslerine sistem servislerini sağlar session bus: Masaüstü aynı oturumdaki kullanıcı uygulamalarına masaüstü servisi sağlayan oturumlar için. *dbus bilgi paylaşımı , modulerlik ve ayrıcalıklar sağlar örn : müzik dinlerken skype araması geline müziği durdurup arama bitince devam ettirmesi gibi *dbus farklı komponentleri entegre etmek için kullanılabilir . örn : word ile excel arasında bilgi paylaşımı gibi

 

BUS MODEL ?
*Busa yapılan her bağlantı bir 'bus name' ile tanımlıdır. Bus name iki veya daha fazla noktayla ayrılmış diziden oluşur örn: org.fredesktop.Networkmanager
*Bir proces bir busa bağlantı kurduğunda benzersiz özel bir bağlantı adı atanır.Bağlantı adı bağlantı olduğu sürece değişmeyeceği garanti altındadır bus sonlandırılana kadar . Bir proces baglantı kursa baglantıyı kapatıp yeni bir baglantı kursa dahi önceki baglantı adı başka bir procesese kesinlikle atanmaz
*Connection adları : ile başlar örn :1.1553

 

OBJECT MODEL?
*Nesnelerlin signal ve metodları aracılığıyla haberleşme sağlanır . örn : Zaman servisi olarak adlandırılan servisten tarih ve zamanı dönen metod kullanılarak zaman sorgulanabilir örn : usb ve aygıt yöneticilerini yöneten bir servisin "Yenir aygıt eklendi" bildirisi gibi . Bus sadece kayıtlı(ilgilenen) proceslere bu sinyali iletir
*Interface : Bir nesne ile kullanılabilecek sinyal ve metodlar kümesidir .Nokta ile ayrılır örn : org.freedesktop.Introspectable
*Bus name ile interface name karıstırılmamalıdır . Bus birden fazla interface içerebilir
* Nesne adının yanında interface adı vermek iyi bir alıskanlıktır ama zorunlu değildir Interface çeşitleri : org.freedesktop.DBus.Peer: D-Bus baglantısının canlılığını kontrol eder org.freedesktop.DBus.Introspectable: Client procese xml formatında metod ve sinyaller saglar org.freedesktop.DBus.Properties: Object tabanında özellikler ve öznitelikler sağlar

 

COMMUNICATION MODEL ?
*Yüksek seviyeli proces haberleşme sistemidir
. *Raw bytelar yerine procesler arası mesaj değişimi tabanlı dbus iletişimidir
*İki türü vardır + One to one : Bir clientın metodları ile iletişim sağlanır cevap dönülebilir + Publish-subscribe: Bir object ilgilenen bütün proceslere yayın yapar. Geri dönüş değeri gibi bir durum yoktur
*Her D-Bus mesajı header ve bodye sahiptir . Header kısmında mesajın tipini , göndericiyi , hedef, bus name metod ,path, sinyal adı gibi belirten belirli alanları vardır . Body kısmında ise giris cıkttı argümanları gibi veriler bulunur *Her data wire formatı denen ikili formatta kodlanmıstır GENEL
*libdbus bire bir iletişimi destekler ve sağlar .Bus name gerek yoktur
*Dbus-daemon pek cok proces arası iletişimi saglar kontrol eder .Bus name gereklidir
Share:

28 Temmuz 2021 Çarşamba

21 Haziran 2021 Pazartesi

DETECT USB DEVICE IN QT (QTde usb cihazı eventlarını yakalama)

1) İlk olarak headerlar eklenir 

#include <windows.h>
#include <dbt.h>

2)QWidget  için  virtual fonksiyonu override ederiz herhangi bir usb eventi oluştuğunda artık yakalayabiliriz 

bool DT_IFVPLAYER::nativeEvent(const QByteArray& eventType, void* message, long* result)
{
Q_UNUSED(eventType);
MSG* msg = reinterpret_cast<MSG*>(message);
int msgType = msg->message;
if (msgType == WM_DEVICECHANGE)
{
PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)msg->lParam;
switch (msg->wParam)
{
case DBT_DEVICETYPESPECIFIC:
{ qDebug() << "DBT_DEVICETYPESPECIFIC ";
break;
}
case DBT_DEVICEARRIVAL:
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv->dbcv_flags == 0)
{
check_drive();
}
}
qDebug() << "DBT_DEVICEARRIVAL";
break;

case DBT_DEVICEREMOVECOMPLETE:
if (lpdb->dbch_devicetype == DBT_DEVTYP_VOLUME)
{
PDEV_BROADCAST_VOLUME lpdbv = (PDEV_BROADCAST_VOLUME)lpdb;
if (lpdbv->dbcv_flags == 0)
{
check_drive();
}
}
qDebug() << "DBT_DEVICEREMOVECOMPLETE";
break;
}
}
return false;
}



Share:

4 Mayıs 2021 Salı

Create Dynamic Library for Windows (Windowsta Dinamik Kütüphane oluşturma)


 // DLL olusturuma 

1)visual studiodan new Project kısmından Dynamic Library(DLL) seceriz .

2)Fonksiyonları toplayacagımız yeni bir header(.h) dosyası ekleriz 

3)Header dosyamızın başına 

#pragma once

#define DllImport   __declspec( dllimport )

#define DllExport   __declspec( dllexport )  ekleriz  ve bütün fonksiyonlarımızın basına  DllExport ekleriz 

4)Headerı istediğimiz yerde include eder fonksiyonları başında DllExport olmadan tanımlarız 

5) Build edince .h / .lib ve .dll dosyamızı olusturur alırız 


// DLL Kullanma

1)C++->Genel->Include header kısmına header dosyamızın bulunduğu pathı veririz 

2)Linker->input->additional dependencies kısmına .lib dosya adını yazarız 

3)Linker->General->additional library directories kısmına .lib pathı gösterilir 

4).exenin olduğu kısma ise .dlli kopyalamalıyız yoksa hata verecektir

Share:

25 Nisan 2021 Pazar

Threadlere özgü alanlar (pthread_key_create fonksiyonu)

 #include <string.h>

#include <unistd.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct tagPERSON {
    char name[32];
    int no;
} PERSON;
void *thread_proc1(void *param);
void *thread_proc2(void *param);
void foo(void);
pthread_key_t g_slotKey;
int main(void)
{
    pthread_t tid1, tid2;
    int result;
    if (pthread_key_create(&g_slotKey, NULL) != 0) {
        fprintf(stderr, "pthread_create: %s\n", strerror(result));
        exit(EXIT_FAILURE);
    }
    if ((result = pthread_create(&tid1, NULL, thread_proc1, NULL)) != 0) {
        fprintf(stderr, "pthread_create: %s\n", strerror(result));
        exit(EXIT_FAILURE);
    }
    if ((result = pthread_create(&tid2, NULL, thread_proc2, NULL)) != 0) {
        fprintf(stderr, "pthread_create: %s\n", strerror(result));
        exit(EXIT_FAILURE);
    }
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_key_delete(g_slotKey);
    return 0;
}
void *thread_proc1(void *param)
{
    PERSON *per;
    if ((per = (PERSON *)malloc(sizeof(PERSON))) == NULL) {
        fprintf(stderr, "cannot allocate memory!..\n");
        exit(EXIT_FAILURE);
    }
    strcpy(per->name, "Carol David");
    per->no = 333;
    pthread_setspecific(g_slotKey, per);
    foo();
    free(per);
    return NULL;
}
void *thread_proc2(void *param)
{
    PERSON *per;
    if ((per = (PERSON *)malloc(sizeof(PERSON))) == NULL) {
        fprintf(stderr, "cannot allocate memory!..\n");
        exit(EXIT_FAILURE);
    }
    strcpy(per->name, "Ferdinand Isaac");
    per->no = 765;
    pthread_setspecific(g_slotKey, per);
    foo();
    free(per);
    return NULL;
}
void foo(void)
{
    PERSON *per;
    per = (PERSON *)pthread_getspecific(g_slotKey);
    printf("%s, %d\n", per->name, per->no);
}

Share:

23 Nisan 2021 Cuma

Unix Linux sistemlerinde Semapor kullanımı

 

#include <stdio.h>
#include <string.h>
#include<unistd.h>
#include<semaphore.h>
#include<pthread.h>
#include <stdlib.h>
void exit_sys(const char* msg);
void exit_sys_result(const char *msg,int result);

void *thread_proc1(void *param);
void *thread_proc2(void *param);

void do_something(const char *msg);

sem_t g_sem;


int main(void)
{
    printf("Hello World!\n");

    int result;
    pthread_t tid1,tid2;
    srand(time(NULL));


    if(sem_init(&g_sem,0,1)==-1)
    {
        exit_sys("sem_init");
    }

    if((result=pthread_create(&tid1,NULL,thread_proc1,NULL))!=0)
    {
          exit_sys_result("thread create1",result);
    }

    if((result=pthread_create(&tid2,NULL,thread_proc2,NULL))!=0)
    {
           exit_sys_result("thread create2",result);
    }

    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
    sem_destroy(&g_sem);


    return 0;
}


void *thread_proc1(void *param)
{
    int i;
    for(i=0;i<10;i++)
    {
        do_something(" thread-1 ");
    }
    return NULL;
}

void *thread_proc2(void *param)
{
    int i;
    for(i=0;i<10;i++)
    {
        do_something(" thread-2 ");
    }
    return NULL;
}

void do_something(const char *str)
{
    sem_wait(&g_sem);
    printf("-----------------------\n");
    printf("%s: Step-1\n",str);
    usleep(rand()%300000);
    printf("%s: Step-2\n",str);
    usleep(rand()%300000);
    printf("%s: Step-3\n",str);
    usleep(rand()%300000);
    printf("%s: Step-4\n",str);
    usleep(rand()%300000);
    printf("%s: Step-5\n",str);
    usleep(rand()%300000);
    sem_post(&g_sem);

}
void exit_sys(const char *msg)
{
    perror(msg);
    exit(EXIT_FAILURE);
}
void exit_sys_result(const char *msg, int result)
{
    fprintf(stderr, "%s: %s\n", msg, strerror(result));
    exit(EXIT_FAILURE);
}






















Share: