Не принимает значение топика MQTT

kklxppnl
Offline
Зарегистрирован: 12.12.2017

Помогите разобраться.  Arduino Mega + W5100. Отправляю топики с сервера, в сериал выводятся только названия, значений нет. 

void callback(char* topic, byte* payload, unsigned int length) {
{
  Serial.println ("");
  Serial.println ("-------");
  Serial.println ("New callback of MQTT-broker");
  payload[length] = '\0';
  String strTopic = String(topic);
  String strPayload = String((char*)payload);
  Serial.println();
  Serial.print (strTopic); //это выводится в сериал
  Serial.print (" ");
  Serial.println (strPayload); // это не выводится
  Serial.println ("-------");
  Serial.println (""); 

if (strTopic == "zal/ZalSvet/ZalButton") {                                // состояние кнопки 
  if (strPayload == "0") {ZalButton = 0;}                           // выкл
  if (strPayload == "1") {ZalButton = 1;}                           // вкл
  if (strPayload == "2") {ZalButton = 2;}                           // авто
  }  

При компиляции вылазит такой warning:

C:\Users\User\Desktop\arduino\arduino.ino: In function 'void setup()':
 
C:\Users\User\Desktop\arduino\arduino.ino:169:28: warning: invalid conversion from 'void (*)(char*, byte*, unsigned int) {aka void (*)(char*, unsigned char*, unsigned int)}' to 'void (*)(char*, uint8_t*, uint32_t) {aka void (*)(char*, unsigned char*, long unsigned int)}' [-fpermissive]
 
 client.setCallback(callback);                                               // Устанавливает функцию обратного вызова сообщения
 
                            ^
 
In file included from C:\Users\User\Desktop\arduino\arduino.ino:21:0:
 
C:\Users\User\Documents\Arduino\libraries\PubSubClient\src/PubSubClient.h:121:18: note: initializing argument 1 of 'PubSubClient& PubSubClient::setCallback(void (*)(char*, uint8_t*, uint32_t))'
 
    PubSubClient& setCallback(MQTT_CALLBACK_SIGNATURE);
 
                  ^

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Так попробуй:

void callback(char* topic, byte* payload, uint32_t length) 
{
	Serial.print(F("Topic: "));
	Serial.println(topic);

	if(length)
	{
		Serial.print(F("Payload: "));
		for(uint32_t i=0;i<length;i++)
		{
			Serial.print((char)payload[i]);
		}
		Serial.println();
	}

}

Если тебе надо в строку payload сохранять, то:

void callback(char* topic, byte* payload, uint32_t length) 
{
	Serial.print(F("Topic: "));
	Serial.println(topic);

	String strPayload;
	
	if(length)
	{
		strPayload.reserve(length + 1);
		
		for(uint32_t i=0;i<length;i++)
		{
			strPayload  += (char) payload[i];
		}
	}
	Serial.print(F("Payload: "));
	Serial.println(strPayload);

}