static void *MqttServerThread(void *pArg)
{
int i,OldStatus,RetryCount,ReadyFdNum,MaxFd,UserIndex;
DWORD TimeOut,DelayCount=0,MaxDelayCount=10;
struct in_addr LocalAddr;
fd_set Rset,Wset;
char RecvBuf[2*1024];
int FdNum,rc;
DWORD TimeOutMS,Len;
DWORD LastSysRunTime,CurrSysRunTime;
DWORD LastFlushTime=0,CurrFlushTime;
DWORD LastRegingTime=0,CurrRegingTime;
fd_set ReadFdSet;
int32_t MqttError;
uint32_t MqttCid = -1;
uint32_t mqtt_id;
Network n;
Client c;
char* c_port="6002";
unsigned char buf[100];
unsigned char readbuf[100];
char* topic="ai_1";
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
TimeOut=50;
LocalAddr.s_addr=htonl(sFsuMqttServer.IPAddr);
GET_CURRENT_SYS_TIME(LastSysRunTime);
for(RetryCount=0;;)
{
if(sFsuMqttServer.IsReqServerQuit)
{
sFsuMqttServer.IsReqServerQuit=FALSE;
break;
}
pthread_testcancel();
if(!sFsuMqttServer.m_IsCreated)
{
MqttError=MqttServerOpen(sFsuMqttServer.m_MqttServerIp,sFsuMqttServer.m_MqttServerPort,sFsuMqttServer.m_MqttTimeOut,sFsuMqttServer.m_MqttDataSize,MqttCid,&mqtt_id);
if (MqttError==MQTT_ERRID_OK)
{
sFsuMqttServer.m_IsCreated=TRUE;
GET_CURRENT_SYS_TIME(LastFlushTime);
GET_CURRENT_SYS_TIME(LastRegingTime);
}
else
{
sFsuMqttServer.m_IsCreated=FALSE;
sleep(5);
continue;
}
}
if(!sFsuMqttServer.m_IsOpened)
{
uint32_t version=4;
uint32_t keep_alive=120;
uint32_t clean_session=0;
uint32_t will_flag=0;
MQTTPacket_willOptions will_options = MQTTPacket_willOptions_initializer;
MqttError=MqttConnect(mqtt_id,version,sFsuMqttServer.m_DeviceID,keep_alive,clean_session,will_flag,&will_options,sFsuMqttServer.m_ProductID,sFsuMqttServer.m_AuthInfo);
if (MqttError==MQTT_ERRID_OK)
{
sFsuMqttServer.m_IsOpened=TRUE;
GET_CURRENT_SYS_TIME(LastFlushTime);
GET_CURRENT_SYS_TIME(LastRegingTime);
}
else
{
sFsuMqttServer.m_IsOpened=FALSE;
sleep(5);
continue;
}
}
for(RetryCount=0,DelayCount=0;;)
{
if(sFsuMqttServer.IsReqServerQuit)
break;
pthread_testcancel();
for (i = 0; i < MQTT_INSTANCE_NUM; i++)
{
//xSemaphoreTakeRecursive(g_mqtt_at_mutex_handle, portMAX_DELAY);
if (gMqttContext[i].is_connected)
{
MQTTYield(gMqttContext[i].client, 1000);
}
//xSemaphoreGiveRecursive(g_mqtt_at_mutex_handle);
}
sleep(1);
}
}
return NULL;
}
extern BOOL MQ_FsuMqttInit(DWORD DevRef, char* DeviceID, char* ProductID, char* AuthInfo)
{
int OldStatus;
if(DeviceID==NULL || ProductID==NULL || AuthInfo==NULL)
{
return FALSE;
}
PTHREAD_MUTEX_SAFE_LOCK(sFsuMqttMutex,OldStatus);
if(sFsuMqttServer.IsOpenedServer)
{
PTHREAD_MUTEX_SAFE_UNLOCK(sFsuMqttMutex,OldStatus);
return TRUE;
}
sFsuMqttServer.m_DevRef=DevRef;
strcpy(sFsuMqttServer.m_DeviceID,DeviceID);
strcpy(sFsuMqttServer.m_ProductID,ProductID);
strcpy(sFsuMqttServer.m_AuthInfo,AuthInfo);
strcpy(sFsuMqttServer.m_MqttServerIp,"183.230.40.39");
sFsuMqttServer.m_MqttServerPort=6002;
sFsuMqttServer.m_MqttTimeOut=1200;
sFsuMqttServer.m_MqttDataSize=100;
sFsuMqttServer.ListenFd=SOCKET_INVALID_FD;
if(pthread_create(&sFsuMqttServer.ptServerThreadID,NULL,MqttServerThread,NULL)!=STD_SUCCESS)
{
PTHREAD_MUTEX_SAFE_UNLOCK(sFsuMqttMutex,OldStatus);
return FALSE;
}
sFsuMqttServer.IsOpenedServer=TRUE;
PTHREAD_MUTEX_SAFE_UNLOCK(sFsuMqttMutex,OldStatus);
return TRUE;
}
extern void MQ_FsuMqttUnInit(void)
{
int i,OldStatus;
PTHREAD_MUTEX_SAFE_LOCK(sFsuMqttMutex,OldStatus);
if(sFsuMqttServer.IsOpenedServer)
{
sFsuMqttServer.IsReqServerQuit=TRUE;
usleep(2000);
if(sFsuMqttServer.IsReqServerQuit)
pthread_cancel(sFsuMqttServer.ptServerThreadID);
pthread_join(sFsuMqttServer.ptServerThreadID,NULL);
sFsuMqttServer.ptServerThreadID=INVALID_PTHREAD_ID;
sFsuMqttServer.IsReqServerQuit=FALSE;
sFsuMqttServer.IsOpenedServer=FALSE;
}
PTHREAD_MUTEX_SAFE_UNLOCK(sFsuMqttMutex,OldStatus);
}
extern void MQ_FsuMqttPublish(DWORD mqtt_id, char* topic, DWORD qos, DWORD retained, DWORD dup, DWORD msg_len, const char *msg)
{
if(topic==NULL || msg==NULL)
return;
MqttPublish(mqtt_id,topic,qos,retained,dup,msg_len,msg);
}
extern void MQ_FsuMqttSubscribe(DWORD mqtt_id, char* topic, DWORD qos)
{
if(topic==NULL)
return;
MqttSubscribe(mqtt_id,topic,qos);
}