我开发了Linux模块,它使用TCP上的MQTT通信。
直到我编写了一个脚本来自动启动模块并将stdout和stderr重定向到一个文件,功能才有问题。
重定向之后,所有其他通信工作正常,但MQTT通信存在问题。如果我每1秒发一条信息,他们会在30多秒后突然出现。
这种奇怪的行为只有在我使用输出重定向到文件时才会发生。
我的启动脚本
/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 init函数:
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;
}
接收数据时获取triggerd的函数:
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");
}