2017-02-21 11 views
2

나는 HiveMQ 오픈 브로커에 연결하고 들어오는 메시지를 수신하기 위해 토픽에 가입하려고하는 간단한 코드를 가지고 있습니다.ESP8266이 MQTT 브로커 hivemq에 연결하지 않습니다

여기

 #include <ESP8266WiFi.h> 
     #include <PubSubClient.h> 

     const char *ssid = "P9Inct";  // cannot be longer than 32 characters! 
     const char *pass = "P9inct123*";  // 
     const char *mqtt_server = "broker.hivemq.com"; 
     const int mqtt_port = 1883; 
     const char *mqtt_user = "testUser"; 
     const char *mqtt_pass = "abc123"; 
     const char *mqtt_client_name = "12312312332212"; 
     #define BUFFER_SIZE 100 

     String incoming=""; 
     String did=""; 
     String state=""; 
     // Update these with values suitable for your network. 
     //IPAddress server(172, 16, 0, 2); 
     String DEVID="8581870006";//"6931108641";//old 

     WiFiClient wclient; 
     PubSubClient client(wclient, mqtt_server,mqtt_port); 

     void callback(const MQTT::Publish& pub) { 
      // handle message arrived 
      Serial.print(pub.topic()); 
      Serial.print(" => "); 
      if (pub.has_stream()) { 
      uint8_t buf[BUFFER_SIZE]; 
      int read; 
      while (read = pub.payload_stream()->read(buf, BUFFER_SIZE)) { 
       Serial.write(buf, read); 
      } 
      pub.payload_stream()->stop(); 
      Serial.println(""); 
      } else 
      Serial.println(pub.payload_string()); 

     //////////////////////////////////////////// 

     incoming=String(pub.payload_string()); 
     Serial.println(pub.payload_string()); 
     Serial.println(incoming); 

      } 




     void setup() { 
      // Setup console 
      Serial.begin(115200); 
      delay(10); 
      Serial.println(); 
      Serial.println(); 
     } 

     void loop() { 
      if (WiFi.status() != WL_CONNECTED) { 
      Serial.print("Connecting to "); 
      Serial.print(ssid); 
      Serial.println("..."); 
      WiFi.begin(ssid, pass); 

      if (WiFi.waitForConnectResult() != WL_CONNECTED) 
       return; 
      Serial.println("WiFi connected"); 
      } 

      if (WiFi.status() == WL_CONNECTED) { 
      if (!client.connected()) { 
       Serial.println("Connecting to MQTT server"); 
       if (client.connect(MQTT::Connect(mqtt_client_name) 
        .set_auth(mqtt_user, mqtt_pass))) { 
       Serial.println("Connected to MQTT server"); 
      client.set_callback(callback); 


      client.subscribe("diy/1"+DEVID); 
       } else { 
       Serial.println("Could not connect to MQTT server"); 
       } 
      } 

      if (client.connected()) 
       client.loop(); 
      } 

     } 

WiFi 연결이 잘 작동 코드를하지만, 브로커를 통해 통신이 작동하지 않습니다 그리고 그것은 항상 "MQTT 서버에 연결할 수 없습니다"라는 메시지를 제공합니다. HiveMQ 브로커에서 esp8266을 작동시키는 방법. 골키퍼의 대시 보드는 http://www.mqtt-dashboard.com/

+0

당신의 예제에서 mqtt_client_name은 무엇입니까? 이 번호를받는 방법을 설명해 주시겠습니까? 여기서 임의의 숫자를 사용할 수 있습니까? 아니면 서버에서 가져와야합니까? –

답변

2

입니다. 루프에 불필요한 인쇄 줄이 있습니다. 이것에 적응 시키십시오 :

/* Incoming data callback. */ 
void callback(char* topic, byte* payload, unsigned int length) 
{ 
    char payloadStr[length + 1]; 
    memset(payloadStr, 0, length + 1); 
    strncpy(payloadStr, (char*)payload, length); 
    Serial.printf("Topic : [%s]\n", topic); 
    Serial.printf("Payload : %s\n", payloadStr); 
} 

void performConnect() 
{ 
    uint16_t connectionDelay = 5000; 
    while (!client.connected()) 
    { 
    if (client.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_KEY)) 
    { 
     Serial.printf("Connected to Broker.\n"); 
     client.subscribe("diy/1"+DEVID); 
    } 
    else 
    { 
     Serial.printf("MQTT Connect failed, rc = %d\n", client.state()); 
     Serial.printf("Trying again in %d msec.\n", connectionDelay); 
     delay(connectionDelay); 
    } 
    } 
} 

void loop() 
{ 
    if (!client.connected()) 
    { 
    performConnect(); 
    } 
    client.loop(); 
}