# 목차 # ------------------------------------------------------

    [MQTT] Mosquitto 설치 및 테스트 (Ubuntu 22.04)
    [MQTT] Mosquitto 테스트 코드 (C code) - 현재 글

    ------------------------------------------------------------------

     

     

    앞서 Mosquitto를 이용해서 간단한 메시지를 주고 받아보았다. 

     

    이번에는 Ubuntu에 개발관련 라이브러리를 설치하고 간단한 샘플을 작성하여 앞서 보았단 mosquitto_pub와 mosquitto_sub를 만들어 보도록하자. 기본적인 코드라 별다른 설명이 없을 듯 하다. 항목별로 필요한 것들을 봐야 한다면, mosquitto 관련 헤더를 보거나 배포 사이트의 API 문서를 확인해야 한다. 

     

     

    1. 개발환경 설치

      기존에 개발환경이 설치되어있지 않다면, 최소한의 빌드 환경을 맞추어주고, mosquitto 개발 라이브러리를 설치해주면 되겠다. 

    1.1. 컴파일 환경

      다음과 같이 입력하여 컴파일 환경을 설치한다.  필자는 vim을 주로 사용해서 이것도 함께 설치하였다.

      $ sudo apt install build-essential vim 

     

    1.2. 라이브러리 설치

      컴파일러가 설치되었을 터이니 이제는 mosquitto 개발 라이브러리를 설치해주면 된다. 

      $ sudo apt update

      $ sudo apt install libmosquitto-dev

     

    2. Subscriber 코드 작성 

    2.1. 소스 입력 (mqtt_sub.c)

      입력인자를 3개를 받아서 각각의 함수를 이용하여 초기화를 진행하고 루프를 돌게끔 만들어진 소스다.

    #include <stdio.h>
    #include <stdlib.h>
    #include <mosquitto.h>

    void on_message(struct mosquitto *mosq, void *userdata, const struct mosquitto_message *message) {
        printf("Received message on topic '%s': %s\n", message->topic, (char*)message->payload);
    }

    int main(int argc, char** argv) {
        struct mosquitto *mosq = NULL;


        if(argc!=3)
        {
            printf("Illegal arguments.\n");
            printf("------------------\n");
            printf("%s [ID] [Topic]\n",argv[0]);
            printf("- ex, \n");
            printf("- $ %s my_client_ID my_topic\n\n",argv[0]);
            exit(0);
        }

        mosquitto_lib_init();

        mosq = mosquitto_new(argv[1], true, NULL);

        mosquitto_message_callback_set(mosq, on_message);

        mosquitto_connect(mosq, "localhost", 1883, 60);

        mosquitto_subscribe(mosq, NULL, argv[2], 0);

        mosquitto_loop_forever(mosq, -1, 1);

        mosquitto_destroy(mosq);

        mosquitto_lib_cleanup();

        return 0;
    }

     

    2.2. 컴파일

      다음과 같이 컴파일을 할 수 있다.

      $ gcc -o mqtt_sub mqtt_sub.c -lmosquitto

     

    2.3. 실행 예시

      앞서 mosquitto_pub을 이용해서 테스트를 진행해보자. 터미널 2개를 열어서 컴파일한 mqtt_sub를 실행하고, mosquitto_pub을 이용하여 데이터를 보내보자.

    1) mqtt_sub

      $ ./mqtt_sub myid myTopic

     

    2) mosquitto_pub

      $ mosquitto_pub -h localhost -t myTopic -m "Hello World!"

     

      mqtt_sub는 mosquitto_pub이 퍼블리싱한 myTopic메시지를 구독하고 있으므로, 메시지가 발생되면 바로 해당 메시지를 읽어서 터미널에 출력한다. 

     

    3. Publisher 코드 작성  

      이번에는 메시지를 발행하는 퍼블리셔 샘플 코드를 확인해보자. 

    3.1. 소스코드 (mqtt_pub.c)

       아래의 코드는 publisher의 소스코드이다. 

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <mosquitto.h>

    void on_publish(struct mosquitto *mosq, void *userdata, int mid) {
        printf("Message with ID %d has been published.\n", mid);
    }

    int main(int argc, char** argv) 
    {
        struct mosquitto *mosq = NULL;
        int rc = 0;

        if(argc!=4)
        {
        printf("Illegal arguments.\n");
        printf("------------------\n");
        printf("%s [ID] [Topic] [Message]\n",argv[0]);
        printf("- ex, \n");
        printf("- $ %s my_client_ID my_topic\n\n",argv[0]);
        exit(0);
        }

        mosquitto_lib_init();

        mosq = mosquitto_new(argv[1], true, NULL);
        mosquitto_publish_callback_set(mosq, on_publish);

        rc = mosquitto_connect(mosq, "localhost", 1883, 60);
        if (rc != MOSQ_ERR_SUCCESS) {
            fprintf(stderr, "Error: Could not connect to MQTT broker.\n");
            mosquitto_lib_cleanup();
            return 1;
        }

        //const char* topic = argv[2];
        //const char* message = "Hello, world!";
        int qos = 0;
        bool retain = false;

        rc = mosquitto_publish(mosq, NULL, argv[2], strlen(argv[3]), argv[3], qos, retain);
        if (rc != MOSQ_ERR_SUCCESS) {
            fprintf(stderr, "Error: Could not publish message to topic %s.\n", argv[2]);
            mosquitto_lib_cleanup();
            return 1;
        }

        //mosquitto_loop_forever(mosq, -1, 1);

        mosquitto_destroy(mosq);
        mosquitto_lib_cleanup();

        return 0;
    }

     

    3.2. 컴파일

      다음과 같이 컴파일 할 수 있다. 

      $ gcc -o mqtt_pub mqtt_pub.c -lmosquitto

     

    3.3. 실행 예시

      터미널 두개를 열고, 윗쪽에서는 이전에 만든  mqtt_sub를 실행하였다. 그리고 아랫쪽에는 이번에 빌드한 mqtt_pub을 실행했을 때, mqtt_sub에서 mqtt_pub에서 동일한 토픽이름으로 보낸 메시지가 출력되면 된다.

     

    이렇게 간단하게 프로세스간 데이터를 주고 받을 수도 있고, 소스 내부의 localhost를 수정하여 네트워크에 있는 다른 장치에 설치된 mosquitto를 통해서 데이터를 퍼블리싱하거나 받을 수 있다. 

     

    이번 샘플 소스의 기본 내용은 chatGPT를 이용해봤는데, 간단한 샘플들은 이렇게 가져다 쓰면 나쁘지 않은 것같다. 다만, 제공되는 데이터의 종류와 기간등에 따라 여러가지 문제가 발생될 수 있으므로, 가능하면 가져다 사용하더라도 어떻게 사용하는지, 필요한 API에는 어떤것이 있는지 확인하고 사용하는 것이 좋겠다. 

     

    끝.

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기