Неправильное поведение процесса Linux (MQTT) при перенаправлении вывода в файл - PullRequest
0 голосов
/ 04 декабря 2018

Я разработал модуль Linux, который использует связь MQTT по TCP.Не было никаких проблем с функциональностью, пока я не создал скрипт для автоматического запуска модуля и перенаправления stdout и stderr в файл.

После перенаправления все другие коммуникации работают отлично, но у связи MQTT есть проблемы.если я отправляю сообщение каждые 1 секунду, они появляются внезапно через несколько с лишним секунд.

Такое странное поведение происходит, только если я использую перенаправление вывода в файл.

Мой сценарий запуска

/bin/su -c "/usr/local/bin/TestApp 2>&1 | awk '{ print strftime(\"%F %T TestApp:\"), \$0; fflush(); }' | tee -a /home/TestApp.txt &" - root

Тогда я попробовал это (но та же проблема)

/bin/su -c "/usr/local/bin/TestApp 2>&1 | tee -a /home/TestApp.txt &" - root

ТАК я попробовал это (и снова та же проблема)

/usr/local/bin/TestApp 2>&1 | tee -a /home/TestApp.txt &

Это тоже не работает

/usr/local/bin/TestApp 2>&1 > /home/TestApp.txt &

Единственное, что работает без каких-либо проблем, это

/usr/local/bin/TestApp 2>&1

В чем причина неправильной работы связи MQTT из-за перенаправления вывода?

пожалуйстасправка.

Редактирование: добавлен код MQTT:

Функция инициализации MQTT:

int mqttInit(void) {
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
int rc;

MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE,NULL);

MQTTAsync_setCallbacks(client, NULL, connlost, msgarrvd, NULL);

conn_opts.keepAliveInterval = 300;//20;
conn_opts.cleansession = true;
conn_opts.onSuccess = onConnect;
conn_opts.onFailure = onConnectFailure;
conn_opts.context = client;
conn_opts.automaticReconnect = true;

if ((rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS) {
    printf("Failed to start connect, return code %d\n", rc);
    rc= EXIT_FAILURE;
  }

  return rc;
}

Функция, которая запускается при получении данных:

int msgarrvd(void *context, char *topicName, int topicLen,MQTTAsync_message *message) {
int i;
char* payloadptr;
char temp[20];
int rc;

printf("===================\n MQTT msgarrvd: \n topic: %s \n paylength=%d \n payload=", topicName, message->payloadlen);

for (i = 0; i < message->payloadlen; i++) {
    msgarrvd_Buff[i] = *payloadptr++;
    printf("%02X", msgarrvd_Buff[i]);
}

printf("\n===================\n");
printf("Message arrived \r\n");

}

1 Ответ

0 голосов
/ 05 декабря 2018

Хорошо, похоже, что @ user803422, упомянутый в комментарии, является решением.

после долгого удара головой я добавил строку в коде в главном файле, и теперь она работает, как и ожидалось

setbuf(stdout, NULL );
...