/**************************************************************** Function : Cloud_ReqConnect Description : send req m2m connect packet. username : username. password : username. return : 0: send req connect packet ok other req connect fail. Add by Alex.lin --2015-03-09 ****************************************************************/ uint32 Cloud_ReqConnect( pgcontext pgc,const int8 *username,const int8 *password ) { int8 ret = 0; int32 socket = 0; pgcontext pGlobalVar=NULL; pgconfig pConfigData=NULL; int32 nameLen=0,passwordLen=0; pGlobalVar=pgc; pConfigData = &(pgc->gc); nameLen = strlen( username ); passwordLen = strlen( password ); if( nameLen<=0 || nameLen>22 ) /* invalid name */ { GAgent_Printf( GAGENT_WARNING," can't req to connect to m2m invalid name length !"); return 1; } if( passwordLen<=0 || passwordLen>16 )/* invalid password */ { GAgent_Printf( GAGENT_WARNING," can't req to connect to m2m invalid password length !"); return 1; } GAgent_Printf( GAGENT_INFO,"Connect to server domain:%s port:%d",pGlobalVar->minfo.m2m_SERVER,pGlobalVar->minfo.m2m_Port ); pGlobalVar->rtinfo.waninfo.m2m_socketid = Cloud_InitSocket( pGlobalVar->rtinfo.waninfo.m2m_socketid ,pConfigData->m2m_ip , pGlobalVar->minfo.m2m_Port,0 ); socket = pGlobalVar->rtinfo.waninfo.m2m_socketid; if( socket<=0 ) { GAgent_Printf(GAGENT_WARNING,"m2m socket :%d",socket); return RET_FAILED; } GAgent_Printf(GAGENT_DEBUG,"Cloud_InitSocket OK!"); ret = Mqtt_Login2Server( socket,username,password ); return ret; }
/************************************************** ************************************************** 建立和云端服务器的连接 MQTT业务处理(订阅/登陆/数据等)由MQTT handle 在此期间建立socket短链接 WIFI CLOUD(HTTP) CLOUD(MQTT) ================================================= REQ_DID -------> handle REQ_DID_ACK <---- DID_INFO REQ_M2MINFO ------> handle REQ_M2MINFO_ACK <-- M2M_INFO MQTT_LOGIN -------- (END) -----------> mqtt handle(login) **************************************************/ void GAgent_Login_Cloud(void) { int ret; char *p_Did = NULL; /* WIFI STATION模式下才能接入cloud */ if( (wifiStatus & WIFI_MODE_STATION) != WIFI_MODE_STATION || (wifiStatus & WIFI_STATION_STATUS) != WIFI_STATION_STATUS) { return ; } switch(g_ConCloud_Status) { case CONCLOUD_REQ_DID: if( nl6621_GetTime_S() - g_Xpg_GlobalVar.connect2CloudLastTime < 1 ) { return ; } g_Xpg_GlobalVar.connect2CloudLastTime = nl6621_GetTime_S(); if((Mqtt_Register2Server(&g_stMQTTBroker)==0)) { g_ConCloud_Status = CONCLOUD_REQ_DID_ACK; g_Xpg_GlobalVar.send2HttpLastTime = nl6621_GetTime_S(); log_info("MQTT_Register2Server OK!\n"); } else { log_info("Mqtt_Register2Server Fail!\n"); } break; case CONCLOUD_REQ_DID_ACK: /* time out, or socket isn't created , resent CONCLOUD_REQ_DID */ if( nl6621_GetTime_S()-g_Xpg_GlobalVar.send2HttpLastTime>=HTTP_TIMEOUT || g_Xpg_GlobalVar.http_socketid<=0 ) { g_ConCloud_Status = CONCLOUD_REQ_DID_ACK; break; } ret = Http_Recive_Did(g_Xpg_GlobalVar.DID); if (ret == 0) { p_Did = g_Xpg_GlobalVar.DID; DIdLen = GAGENT_DID_LEN; memcpy((unsigned char*)g_stGAgentConfigData.Cloud_DId, (unsigned char*)p_Did, DIdLen); g_stGAgentConfigData.Cloud_DId[DIdLen] = '\0'; nl6621_SaveConfigData(&g_stGAgentConfigData); g_ConCloud_Status = CONCLOUD_REQ_M2MINFO; log_info( "Http Receive DID is:%s[len:%d]\n", p_Did, DIdLen); log_info( "ConCloud Status[%04x]\n", g_ConCloud_Status); } break; case CONCLOUD_REQ_M2MINFO: if( nl6621_GetTime_S()-g_Xpg_GlobalVar.connect2CloudLastTime < 1 ) { return ; } g_Xpg_GlobalVar.connect2CloudLastTime = nl6621_GetTime_S(); if( Http_Sent_Provision()==0 ) { g_Xpg_GlobalVar.send2HttpLastTime = nl6621_GetTime_S(); g_ConCloud_Status = CONCLOUD_REQ_M2MINFO_ACK; GAgent_Printf( GAGENT_INFO,"Http_Sent_Provision OK! "); } else { GAgent_Printf( GAGENT_INFO,"Http_Sent_Provision Fail!"); } break; case CONCLOUD_REQ_M2MINFO_ACK: /* time out, or socket isn't created ,resent CONCLOUD_REQ_M2MINFO */ if( nl6621_GetTime_S()-g_Xpg_GlobalVar.send2HttpLastTime>=HTTP_TIMEOUT || g_Xpg_GlobalVar.http_socketid<=0 ) { g_ConCloud_Status = CONCLOUD_REQ_M2MINFO; break; } ret = Http_Recive_M2minfo(g_Xpg_GlobalVar.m2m_SERVER, &g_Xpg_GlobalVar.m2m_Port); if( ret==0 ) { g_ConCloud_Status = CONCLOUD_REQ_LOGIN; GAgent_Printf(GAGENT_WARNING, "--HTTP response OK. Goto MQTT LOGIN"); } break; case CONCLOUD_REQ_LOGIN: if( nl6621_GetTime_S() - g_Xpg_GlobalVar.connect2CloudLastTime < 1 ) { return ; } g_Xpg_GlobalVar.connect2CloudLastTime = nl6621_GetTime_S(); if((Mqtt_Login2Server(&g_stMQTTBroker)==0)) { g_ConCloud_Status = CONCLOUD_RUNNING; g_MQTTStatus = MQTT_STATUS_LOGIN; log_info( "Mqtt_Login2Server OK!\n"); } else { log_info("Mqtt_Login2Server Fail!\n"); } break; case CONCLOUD_RUNNING: /* mqtt handle */ if(g_MQTTStatus == MQTT_STATUS_LOGIN) { if( nl6621_GetTime_S() - g_Xpg_GlobalVar.connect2CloudLastTime >= MQTT_CONNECT_TIMEOUT ) { log_info("MQTT connect timeout.\n"); g_ConCloud_Status = CONCLOUD_REQ_LOGIN; break; } } MQTT_handlePacket(); break; case CONCLOUD_INVALID: default: break; } }