Пытался вынести кусок кода из CASE в отдельную функцию:
Код
void MQTT_Connect(void) //
{ //
int rc; //
unsigned char buf[200]; //
unsigned char readbuf[100]; //
MQTTClient(&c, 20000, buf, 200, readbuf, 100);
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
data.willFlag = 0; //Данные прописаны в MQTT.h
data.MQTTVersion = MQTTVersioN; //
data.clientID.cstring = MQTTClientID; //
data.username.cstring = MQTTUsername; //
data.password.cstring = MQTTPassword; //
data.keepAliveInterval = MQTTKeepAliveInterval;//
data.cleansession = MQTTCleansession; //
printf("\rConnect to MQTT Brocker\r"); //
if ( (rc = MQTTConnect(&c, &data)) != 0) //
{ //Не успешно
printf("\rClient connection with IBM MQTT broker failed with Error Code %d\r", (int)rc);
switch (rc) //
{ //
case C_REFUSED_PROT_V: //
{ //
printf("Connection Refused, unacceptable protocol version\r");
break; //
} //
case C_REFUSED_ID: //
{ //
printf("Connection Refused, identifier rejected\r");
break; //
} //
case C_REFUSED_SERVER: //
{ //
printf("Connection Refused, Server unavailable\r");
break; //
} //
case C_REFUSED_UID_PWD: //
{ //
printf("Connection Refused, bad user name or password\r");
break; //
} //
case C_REFUSED_UNAUTHORIZED://
{ //
printf("Connection Refused, not authorized\r");
break; //
} //
} //
printf("\rMQTT Error.. Try again... %d\r", GSM_Mashine_Errors++);//
return; //
} //
else //Успешно
{ //
printf("\rConnected with IBM MQTT broker\r");
//Подписка
char* Topic = MQTTSubscribeTopic; //
printf("\rSubscribing topic: %s\r", Topic);
if( MQTTSubscribe(&c, Topic, QOS0, messageArrived) < 0)
{ //
printf("\rSubscribe with IBM MQTT broker failed\r");
} //
else //
{ //
printf("\rSubscribed to topic: %s\r", Topic);
} //
GSM_Mashine_Errors=0; //
GSM_State_Mashine = PubMQTT; //Успешно
} //else if( (rc = MQTTConnect(&c, &data)) != 0)
}
Код выполняется, но в следующем шаге все виснет на вызове int T1 = MQTTPublish(&c,(char*)"iot-2/evt/status/fmt/json", &MQTT_msg);
Ковыряя эту функцию обнаружил что выхода из функции
Код
int MQTTSerialize_publish(unsigned char* buf, int buflen, unsigned char dup, int qos, unsigned char retained, unsigned short packetid,
MQTTString topicName, unsigned char* payload, int payloadlen)
в нужное место не происходит. Т.е. выполнение доходит до return rc; в любом случае, но в вызывающий процесс не возвращается. Но если в теле этой функции блокировать следующий код:
Код
/*
writeMQTTString(&ptr, topicName);
if (qos > 0)
writeInt(&ptr, packetid);
memcpy(ptr, payload, payloadlen);
*/
То выход из функции исправно происходит. Учитывая что код рабочий (на 99%) на ум приходит только нехватка памяти. Что в этом случае делать?
Сообщение отредактировал Димон Безпарольный - Aug 6 2017, 18:40