Arduino Knolleary PubSubClient будет публиковать сообщения, но не может их получать

Я использую Knolleary PubSubClient для подключения к моему серверу MQTT. Я смог успешно пройти аутентификацию и установить соединение после небольшой работы. Могу даже публиковать сообщения по темам. Однако проблема, с которой я сталкиваюсь, заключается в том, что я могу подписаться на темы и не получить ошибок, но когда я публикую в этой теме (из mosquitto на моем Mac), обратный вызов не вызывается, и сообщение в теме подписки не отображается быть полученным. Я попытался запустить подписку mosquitto на ту же тему в одно и то же время и получил опубликованное сообщение. Не уверен, есть ли проблема в моем коде обратного вызова или в том, что здесь происходит. Любая помощь будет оценена по достоинству. Код Arduino приведен ниже:

/*
 Basic MQTT example 

  - connects to an MQTT server
  - publishes "hello world" to the topic "outTopic"
  - subscribes to the topic "inTopic"
*/
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte server[] = { 10, 2, 63, 123 };
byte ip[]     = { 192, 168, 1, 10 };


void callback(char* topic, byte* payload, unsigned int length) {
  Serial.println(topic);
  //convert byte to char
  payload[length] = '\0';
  String strPayload = String((char*)payload);

  Serial.println(strPayload);
  //int valoc = strPayload.lastIndexOf(',');
  //String val = strPayload.substring(valoc+1);
  //Serial.println(val);


}

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

void setup()
{
  Serial.begin(19200);
  Serial.println("==STARTING==");

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print("."); 
  }

  //delay(500);
  boolean con = client.connect("1", "3snzzon5dyade:abc", "OBSCURED_FOR_SEC");
  while(con != 1){
    Serial.println("no con-while");
     con = client.connect("1", "3snzzon5dyade:abc", "OBSCURED_FOR_SEC");
  }
  //Serial.println(con);
  if(con){
    Serial.println("got con");
    client.publish("testq","hello world");
    client.subscribe("testq");
  }else Serial.println("no con");

}

void loop()
{
  client.loop();
}

Как я уже сказал, я вижу, что с Mosquitto все работает правильно. Я даже безуспешно пытался сопоставить client_ids. Любая помощь или идеи будут приняты с благодарностью.


person calumb    schedule 04.10.2013    source источник
comment
Я не вижу ничего явно неправильного в вашем коде. Естественно, я оставил все свои ардуино на работе, иначе я бы протестировал его. Если вы не решите его к понедельнику, я попробую.   -  person knolleary    schedule 04.10.2013
comment
knolleary, спасибо за ответ. Может быть, брокер несовместим с вашей библиотекой? Такой же код работает и с другими брокерами.   -  person calumb    schedule 04.10.2013
comment
Какую реализацию брокера вы используете?   -  person knolleary    schedule 05.10.2013
comment
не совсем уверен, что вы спрашиваете. Но это настраиваемая реализация брокера, похожая на сервер mosquitto. В этом может быть проблема?   -  person calumb    schedule 08.10.2013
comment
Если код работает против mosquitto, но не против вашей реализации настраиваемого брокера, я бы хотел более внимательно посмотреть, что делает ваша реализация. Я уверен, что вы проделали большую работу по внедрению своего брокера, но, судя по моему мнению, это тот, который неизвестен в вопросе.   -  person knolleary    schedule 09.10.2013
comment
@knolleary какое-нибудь решение, чтобы исправить эту проблему? Я тоже столкнулся с той же проблемой.   -  person Ramprasad    schedule 30.06.2016


Ответы (1)


ваша тема подписки "testq" должна быть в виде массива, например

char testq[] = {'t', 'e', 's', 't', 'q', '\0'};

обязательно завершите свой массив символом '\ 0'

Затем вы подписываетесь с:

client.subscribe(testq);
person Jean-Christophe Duperron    schedule 26.07.2015