• 카테고리

    질문 & 답변
  • 세부 분야

    임베디드 · IoT

  • 해결 여부

    미해결

mosquitto 설치부터 null 값이 받아지네요

22.03.30 08:33 작성 조회수 364

0

cmd 창 관리자모드로 실행하고 혹시나 공유기 문제인가해서 wifi도 세번이나 바꿨는데  (도서관 wifi,  내폰 테더링 2.4g wifi,  kt wifi)

여전히 null값만 샌딩 리시브네요. 아 서비스는 실행중이였구요. 방화벽도 싹다 꺼놨습니다. 커뮤니티 싹다 훑었구요.. 구글링해도 답이 안나오네요.... 어떻게 해야 되나요??

그렇다고 윈도우 2019버전하고 mosquitto 2019 버전을 깔수도 없구요;;;

 

 

 

 

 

답변 3

·

답변을 작성해보세요.

0

네 일단 회로도와는 상관없이 wemos 만가지고 wifi가 접속이 되어야됩니다.

wifi부터 접속이 안되신다는 거죠?

한번 강의다시보고 확인해보겠습니다

wemos에 프로그램 소스는 잘 upload가 되는지요? 에러 없이요.

지금 사용하고 계시는 소스를 한번 올려주시면 제가 테스트해보고 말씀드리겠습니다. wemos에서 wifi는 어렵지 않게 접속이 되는데 제가 봐야겠습니다. 

지금 wifi가 5g이면 접속이 않될수도 있구요. 2.4G정도면 접속이 되는경우도 있어서 테스트를 해봐야 겠습니다.

네 소스는 어제 저녁부터 정상적으로 업로드 되어있습니다. 일단 도서관 와이파이가 5g라서 어새벽쯤 집에가서 핸드폰으로 2.4 g로 바꾸고 시험했는데 여전히 안되더라구요.. 오늘 아침에도 도서관 5g(2.4,g+5g),  핸드폰 2.4g 공공와이파이 (2.4g+5g ) 테스트했는데 계속 똑같이 시리얼모니터에 저렇게 나와서당황스럽습니다.. 지금 바로 올라가서 소스 올리겠습니다. 감사합니다

#include <ESP8266WiFi.h>

#include <PubSubClient.h>

 

// Update these with values suitable for your network.

 

const char* ssid = "Namsan";

const char* password = "namsanlib";

const char* mqtt_server = "10.138.89.91";

const char* clientName = "D1miniClientA";

 

// 자신의 mosquitto server 주소를 기록한다.

 

 

WiFiClient espClient;

PubSubClient client(espClient);

unsigned long lastMsg = 0;

#define MSG_BUFFER_SIZE  (50)

char msg[MSG_BUFFER_SIZE];

int value = 0;

 

void setup_wifi() {

  delay(10);

  // We start by connecting to a WiFi network

  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("");

  Serial.println("WiFi connected");

  Serial.println("IP address: ");

  Serial.println(WiFi.localIP());

}

 

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();

// Switch on the LED if an 1 was received as first character

  if ((char)payload[0] == '1') {

    digitalWrite(14, HIGH);   // Turn the LED on (Note that LOW is the voltage level

    // but actually the LED is on; this is because

    // it is active low on the ESP-01)

  } else {

    digitalWrite(14, LOW);  // Turn the LED off by making the voltage HIGH

  }

}

void reconnect() {

  // Loop until we're reconnected

  while (!client.connected()) {

    Serial.print("Attempting MQTT connection...");

    // Attempt to connect

    if (client.connect(clientName)) {

      Serial.println("connected");

      // Once connected, publish an announcement...

      client.publish("outTopic", "hello world");

      // ... and resubscribe

      client.subscribe("inTopic");

    } else {

      Serial.print("failed, rc=");

      Serial.print(client.state());

      Serial.println(" try again in 5 seconds");

      // Wait 5 seconds before retrying

      delay(5000);

    }

  }

}

 

void setup() {

  pinMode(14, OUTPUT);     // Initialize the BUILTIN_LED pin as an output

  Serial.begin(115200);

  setup_wifi();

  client.setServer(mqtt_server, 1883);

  client.setCallback(callback);

}

 

void loop() {

  if (!client.connected()) {

    reconnect();

  }

  client.loop();

  unsigned long now = millis();

  if (now - lastMsg > 2000) { //2초에 한번씩 실행

    lastMsg = now;

    ++value;

    snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value);

    Serial.print("Publish message: ");

    Serial.println(msg);

    client.publish("outTopic", msg);

  }

}

핸드폰에서 확인하니 연결된 디바이스에 esp보드는 있네요. 핸드폰 테더링에 노트북하고 wemos d1보드 2개만 접속중입니다

위소스 부터 테스트를하면 어디가 문제인지 파악이 어렵습니다.
아래소스를 스케치에 새로 파일을 만들어서 붙어넣고 wifi아이디, wifi 비번넣으시고 
컴파일->업로드 하신후 시리얼 모니터창(COM port)을 확인해보시기 바랍니다.
시리얼 모니터창 하단에 보드레이트를 115200 으로 바꾸시고 wemos 리셋버튼을 한번눌러보세요.

#include <ESP8266WiFi.h>

#ifndef STASSID

#define STASSID "WIFI아이디"

#define STAPSK "WiFi비밀번호"

// 연결할 WiFi id, pw

const char* ssid     = STASSID;

const char* password = STAPSK;

// WiFiClient를 선언한다.

WiFiClient client;

// WiFiServer 포트선언

WiFiServer webServer(80);

void setup() {

  Serial.begin(115200);

 

  // WiFi연결

  Serial.println();

  Serial.print("Connecting to ");

  Serial.println(ssid);

  WiFi.begin(ssid, password);  

  // WiFi 연결이 되지않을때 ... 재연결

  while (WiFi.status() != WL_CONNECTED) {

    delay(500);

    Serial.print(".");

  }

  Serial.println("");

  Serial.println("WiFi connected"); // WiFi 연결 성공!

  // 웹 서버 start

  webServer.begin();

  Serial.println("Web server running. Waiting for the ESP IP...");

  // IP 주소 출력

  Serial.println(WiFi.localIP());

}

만약 COM3 라면 아래처럼 접속메세지가 뜰겁니다.^^
해보시고 다시 확인되는 내용 남겨줘보세요^^

혹시 endif는 어디어 들어가야 할까요? 에러가 나서요.. test.ino:3: error: unterminated #ifndef

    3 | #ifndef STASSID

      | 

exit status 1

unterminated #ifndef

 

아 그럼 그 부분은 제거해보시고 해보세요~~

일단 에러있는대로 컴파일 되기는 했는데 핸드폰으로 접속실패만 뜨네요..

 

wifi접속은 이상없다는 건데요.

강의 교안에 5페이지부터가 wifi접속 실습이 있습니다. 이런식으로 접속을 확인하시면서 다음으로 PC에 구동중인 MQTT Server로 접속이 되는지 확인해보면 되구요.

wemos에서 mqttServer ip주소는 PC에서 ipconfig했을때 나오는 ip주소를 적어주시면 됩니다. 교재를 보시고 MQTT접속을 테스트해보시기 바랍니다.

0

네 강사님.  발행자 수신자로 값이 전달은 됩니다. 다만 강사님처럼 client 처리는 되지않고 client null 이라고만 나오고 있습니다. 혹시나 회로도가 잘못됬나 뺴고 다시 꼽느라 시간이 좀더 걸렸습니다. 혹시 원격으로는 어떻게 봐주실수 있는지 궁금해서 답글 남깁니다.. 실습환경은 1pc로 원격접속 환경은 아닙니다.

 

 

 

 

 

 

0

네. 교재 31page에 보시면

MQTT Server가 구동되어있다면

2개의 CMD창을 열고
한쪽 CMD창에서 mosquitto_sub -d -t /test 하시고

두번째 CMD창에서 mosquitto_pub -d -t /test -m "abc" 이렇게 하시고 엔터치면
첫번째 창에 abc라는 문자가 전달되는지 확인해보시기 바랍니다. 
이부분이 되어야 MQTT 통신이 될수있습니다. 해보시고 알려주시면 제가 원격으로 봐드리든지 할께요

[아래부분도 참고해주세요]

- mqtt 실습시  다른 컴퓨터에서 mqtt server에 메시지를 전달할경우 혹시 메세지가 전달 되지 않는다면(IP가 서로 달라도 됩니다.)
1. mqtt server PC에서 방화벽을 해제 해주시고
2. 모든 IP에서 메시지를 받도록 mosquitto설치 폴더에서 mosquitto.conf 파일을 여시고 아래 2부분을 추가 및 수정 저장 하시고 다시 mosquitto서버를 재시작 해주시면 다른 CLIENT에서도 메세지 전송이 가능할것입니다.

- mosquitto.conf 파일 일부-
# listener port-number [ip address/host name/unix socket path]

#listener
listener 1883
# Defaults to false, unless there are no listeners defined in the configuration
# file, in which case it is set to true, but connections are only allowed from
# the local machine.
allow_anonymous true

[실습예시]
-  cmd 창을 열고 수신 대기(server IP : 211.172.87.3)
C:\Program Files\mosquitto>mosquitto_sub -d -t /dht11
Hello

- cmd창을 열고 메세지 발행(다른쪽 PC)
C:\Program Files\mosquitto>mosquitto_sub -d -h  211.172.87.3 -p 1883 -t /dht11 -m "Hello"

네 강사님.  발행자 수신자로 값이 전달은 됩니다. 다만 강사님처럼 client 처리는 되지않고 client null 이라고만 나오고 있습니다. 혹시나 회로도가 잘못됬나 뺴고 다시 꼽느라 시간이 좀더 걸렸습니다. 혹시 원격으로는 어떻게 봐주실수 있는지 궁금해서 답글 남깁니다.. 실습환경은 1pc로 원격접속 환경은 아닙니다.

밑에 답변에 사진 첨부 해놨습니다. 

문제결론 : 보드에서 moqt 통신이 안되는것 같습니다.