1인창조기업

예비창업자의 창업일지_005탄

3hongstore 2025. 1. 18. 19:54

 

esp32에 연결된 각종 센서 정보를 mqtt를 이용하여 통신 및 조작할 수 있도록 노력 중...

mqtt 연결 문제로 꽤 오래 고생하다가

 

HIVEMQ Cloud를 이용하여 드디어 연결에 성공.

 

아래는 해당 코드

각자 본인에 맞는 wifi 이름/비번, 클라우드 url/아이디/비번 등 관련 사항을 입력하면 접속될 거라 믿습니다.

시행착오는 Chatgpt에게 도움 요청을....

 

#include <WiFi.h>
#include <PubSubClient.h>
#include <WiFiClientSecure.h>

// WiFi 및 MQTT 설정
const char* ssid = "your_wifi_name"; 
const char* password = "your_wifi_password";
const char* mqtt_server = "your_mqtt_url";
const int mqtt_port = 8883; //your_mqtt_port
const char* mqtt_user = "your_mqtt_ID";
const char* mqtt_pass = "your_mqtt_password";

WiFiClientSecure espClient;
PubSubClient client(espClient);

unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (500)
char msg[MSG_BUFFER_SIZE];
int value = 0;

// WiFi 연결 설정
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("\nWiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}

// MQTT 콜백 함수
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message arrived [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// MQTT 연결 함수
void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection... ");
    String clientId = "ESP32Client";
    if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass)) {
      Serial.println("connected");
      client.publish("testTopic", "Hello from ESP32");
      client.subscribe("testTopic");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      delay(5000);
    }
  }
}

// 초기화 설정
void setup() {
  Serial.begin(115200);
  setup_wifi();

  // 인증서 설정 (테스트용 비보안 설정)
  espClient.setInsecure();

  client.setServer(mqtt_server, mqtt_port);
  client.setCallback(callback);
}

// 메인 루프
void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  unsigned long now = millis();
  if (now - lastMsg > 60000) {
    lastMsg = now;
    ++value;
    snprintf(msg, MSG_BUFFER_SIZE, "Hello World #%ld", value);
    Serial.print("Publish message: ");
    Serial.println(msg);
    client.publish("testTopic", msg);
  }
}
 

connected....보려고 참 고생했네요....

현재는 60초에 한번씩 메시지를 주고받는 것을 아두이노의 시리얼 모니터로 볼 수 있는 상태입니다.

앞으로는 각종 센서를 연결해서 해당 수치를 볼 수 있도록 하는 것과

mqtt통신을 통해 센서가 작동되는 임의의 설정값 등을 등록 및 수정할 수 있도록 하여

원격으로 센서와 구동부들을 작동할 수 있도록 할 생각입니다.

 

천천히 꾸준히 아자!!