Publi sh массив int как строка поверх MQTT на Arduino - PullRequest
0 голосов
/ 22 апреля 2020

Это сводит меня с ума в течение нескольких часов, так как newb ie:

У меня есть:

int relayStates[] = {0,0,1,1,0,1,0,0};

Позже в моем коде я хочу опубликовать sh состояния как char [] с PubSubClient MQTT как:

00110100

client.publish(topic,<here char[]>);

Я попробовал все преобразования, о которых могу думать, но ничего не работает. Кто-нибудь может мне помочь?

С уважением, Оскар

1 Ответ

0 голосов
/ 22 апреля 2020

Давайте сделаем это вручную, чтобы вы узнали, как создавать строки из массивов int. Определите глобальный массив char, достаточно большой по размеру:

char textToSend [9] = {'\0'}; // takes 8 chars and a terminator

здесь мы копируем из relayStates[] и «конвертируем» в char (может работать для всех однозначных чисел)

  textToSend [0] = '\0'; // we reset the char array
 for(int i = 0; i < 8; i++) {
   if (relayStates[i] == 0) textToSend [i] = '0'; // SINGLE quote as it is a char
   if (relayStates[i] == 1) textToSend [i] = '1'; // SINGLE quote as it is a char
 }
 textToSend [8] = '\0'; // we terminate the char array
 client.publish(topic, textToSend); // we transfer the array content to MQTT

Этот метод прозрачен, эффективен при использовании памяти и может использоваться для стабильных производственных сред.
Улучшения, которые можно добавить:

  • Получение конечного значения для l oop из размера массива int
  • , обеспечивающего его работу с целыми числами, отличными от 0 и 1 - используйте вспомогательный массив для преобразования
    • char numBuffer [9] = {'\0'}; // takes 8 chars and a terminator for converting ints
    • itoa(relayStates[i], numBuffer,10); // converts an int to a base 10 dec char array
    • strcat(textToSend, numBuffer);
...