bool QTSServerInterface::RedisGetBestRms(string& strRmsIP,string& strRmsPort)//获得当前录像数最小的RMS { //算法描述:获取RMS列表,然后获取每一个RMS的存活信息和正在录像个数 OSMutexLocker mutexLock(&fRedisMutex); if(!ConRedis()) return false; bool bReVal=true; char chTemp[128]={0}; sprintf(chTemp,"smembers RMSName"); redisReply* reply = (redisReply*)redisCommand(fRedisCon,chTemp);//获得EsayDarWin列表 if (NULL == reply)//错误,需要进行重连 { redisFree(fRedisCon); fIfConSucess=false; return false; } if(reply->elements>0&&reply->type==REDIS_REPLY_ARRAY)//smembers返回的是数组 { //这里可以使用管线 redisReply* childReply=NULL; for(size_t i=0;i<reply->elements;i++)//对于每一个EasyDarWin判断其存活性和RTP属性 { childReply = reply->element[i]; string strChileReply(childReply->str); sprintf(chTemp,"exists %s",(strChileReply+"_Live").c_str());//判断RMSn是否存活 if(redisAppendCommand(fRedisCon,chTemp)!=REDIS_OK) { freeReplyObject(reply); redisFree(fRedisCon); fIfConSucess=false; return false; } sprintf(chTemp,"hget %s %s",(strChileReply+"_Info").c_str(),"RecordingCount");//获取RMS当前录像个数 if(redisAppendCommand(fRedisCon,chTemp)!=REDIS_OK) { freeReplyObject(reply); redisFree(fRedisCon); fIfConSucess=false; return false; } } int key=-1,keynum=0; redisReply *reply2=NULL,*reply3=NULL; for(size_t i=0;i<reply->elements;i++) { if(redisGetReply(fRedisCon,(void**)&reply2)!=REDIS_OK) { freeReplyObject(reply); freeReplyObject(reply2); redisFree(fRedisCon); fIfConSucess=false; return false; } if(redisGetReply(fRedisCon,(void**)&reply3)!=REDIS_OK) { freeReplyObject(reply); freeReplyObject(reply3); redisFree(fRedisCon); fIfConSucess=false; return false; } if(reply2->type==REDIS_REPLY_INTEGER&&reply2->integer==1&& reply3->type==REDIS_REPLY_STRING)//如果filed对应的value存在,返回REDIS_REPLY_STRING,否则返回REDIS_REPLY_NIL {//找到了 int RecordingNum=atoi(reply3->str); if(key==-1) { key=i; keynum=RecordingNum; } else { if(RecordingNum<keynum)//找到更好的了 { key=i; keynum=RecordingNum; } } } freeReplyObject(reply2); freeReplyObject(reply3); } if(key==-1)//没有存活的 { bReVal=false; } else { string strIpPort(reply->element[key]->str); int ipos = strIpPort.find(':');//错误判断 strRmsIP = strIpPort.substr(0,ipos); strRmsPort = strIpPort.substr(ipos+1,strIpPort.size()-ipos-1); } } else//没有可用的EasyDarWin { bReVal=false; } freeReplyObject(reply); return bReVal; }
//以管线的方式执行串行命令,减少等待时间,但是如果下一个命令需要用到上一个命令的返回结果,则无法使用管线。 bool QTSServerInterface::RedisGetAssociatedDarWin(string& strDeviceSerial,string &strCameraSerial,string& strDssIP,string& strDssPort)//获得与当前设备序列号和摄像头序列号关联的EasyDarWin,也就说找到该设备正在推送的EasyDarWin { //算法描述,获得darwin列表,对于每一个darwin判断其是否存活,如果存活,根据查找其正在推流列表看是否存在指定的设备序列号和摄像头序列号 OSMutexLocker mutexLock(&fRedisMutex); if(!ConRedis()) return false; bool bReVal=false; //由设备序列号和摄像序列号合成推流名称,EasyDarWIn在redis上的存储为:设备序列号/摄像头序列号.sdp string strPushName=strDeviceSerial+'/'+strCameraSerial+".sdp"; char chTemp[128]={0}; sprintf(chTemp,"smembers EasyDarWinName"); redisReply* reply = (redisReply*)redisCommand(fRedisCon,chTemp);//获得EsayDarWin列表 if (NULL == reply)//错误,需要进行重连 { redisFree(fRedisCon); fIfConSucess=false; return false; } printf("%d\n",reply->type); if(reply->elements>0&&reply->type==REDIS_REPLY_ARRAY)//smembers返回的是数组 { //这里可以使用管线 redisReply* childReply=NULL; for(size_t i=0;i<reply->elements;i++)//对于每一个EasyDarWin判断其存活性和(与指定设备序列号和摄像头序列号)关联性 { childReply = reply->element[i]; string strChileReply(childReply->str); sprintf(chTemp,"exists %s",(strChileReply+"_Live").c_str());//判断EasyDarWin是否存活 if(redisAppendCommand(fRedisCon,chTemp)!=REDIS_OK) { freeReplyObject(reply); redisFree(fRedisCon); fIfConSucess=false; return false; } sprintf(chTemp,"sismember %s %s",(strChileReply+"_PushName").c_str(),strPushName.c_str());//判断DarWin上是否存在该推流设备 if(redisAppendCommand(fRedisCon,chTemp)!=REDIS_OK) { freeReplyObject(reply); redisFree(fRedisCon); fIfConSucess=false; return false; } } redisReply *reply2=NULL,*reply3=NULL; for(size_t i=0;i<reply->elements;i++) { if(redisGetReply(fRedisCon,(void**)&reply2)!=REDIS_OK) { freeReplyObject(reply); freeReplyObject(reply2); redisFree(fRedisCon); fIfConSucess=false; return false; } if(redisGetReply(fRedisCon,(void**)&reply3)!=REDIS_OK) { freeReplyObject(reply); freeReplyObject(reply3); redisFree(fRedisCon); fIfConSucess=false; return false; } if(reply2->type==REDIS_REPLY_INTEGER&&reply2->integer==1&& reply3->type==REDIS_REPLY_INTEGER&&reply3->integer==1) {//找到了 string strIpPort(reply->element[i]->str); int ipos=strIpPort.find(':');//错误判断 strDssIP=strIpPort.substr(0,ipos); strDssPort=strIpPort.substr(ipos+1,strIpPort.size()-ipos-1); //freeReplyObject(reply2); //freeReplyObject(reply3); bReVal=true; //break;//找到了也不能加break,而是需要执行完,因为对每一个请求必须有一个应答,否则次序就发生了混乱 } freeReplyObject(reply2); freeReplyObject(reply3); } } else//没有可用的EasyDarWin { } freeReplyObject(reply); return bReVal; }
bool QTSServerInterface::RedisGetAssociatedRms(string& strDeviceSerial,string &strCameraSerial,string& strRmsIP,string& strRmsPort)//获得与当前设备序列号和摄像头序列号关联的RMS { //算法描述,获得RMS列表,对于每一个RMS判断其是否存活,如果存活,查找正在录像设备列表 OSMutexLocker mutexLock(&fRedisMutex); if(!ConRedis()) return false; bool bReVal=false; string strRecordingDevName=strDeviceSerial+'_'+strCameraSerial;//设备序列号_摄像头序列号 char chTemp[128]={0}; sprintf(chTemp,"smembers RMSName"); redisReply* reply = (redisReply*)redisCommand(fRedisCon,chTemp);//获得RMS列表 if (NULL == reply)//错误,需要进行重连 { redisFree(fRedisCon); fIfConSucess=false; return false; } if(reply->elements>0&&reply->type==REDIS_REPLY_ARRAY)//smembers返回的是数组 { //这里可以使用管线 redisReply* childReply=NULL; for(size_t i=0;i<reply->elements;i++)//对于每一个RMS判断其存活性和(指定设备序列号和摄像头序列号)是否关联 { childReply = reply->element[i]; string strChileReply(childReply->str); sprintf(chTemp,"exists %s",(strChileReply+"_Live").c_str());//判断RMS是否存活 if(redisAppendCommand(fRedisCon,chTemp)!=REDIS_OK) { freeReplyObject(reply); redisFree(fRedisCon); fIfConSucess=false; return false; } sprintf(chTemp,"sismember %s %s",(strChileReply+"_RecordingDevName").c_str(),strRecordingDevName.c_str());//判断RMS是否对该设备正在录像 if(redisAppendCommand(fRedisCon,chTemp)!=REDIS_OK) { freeReplyObject(reply); redisFree(fRedisCon); fIfConSucess=false; return false; } } redisReply *reply2=NULL,*reply3=NULL; for(size_t i=0;i<reply->elements;i++) { if(redisGetReply(fRedisCon,(void**)&reply2)!=REDIS_OK) { freeReplyObject(reply); freeReplyObject(reply2); redisFree(fRedisCon); fIfConSucess=false; return false; } if(redisGetReply(fRedisCon,(void**)&reply3)!=REDIS_OK) { freeReplyObject(reply); freeReplyObject(reply3); redisFree(fRedisCon); fIfConSucess=false; return false; } if(reply2->type==REDIS_REPLY_INTEGER&&reply2->integer==1&& reply3->type==REDIS_REPLY_INTEGER&&reply3->integer==1) {//找到了 string strIpPort(reply->element[i]->str); int ipos=strIpPort.find(':');//错误判断 strRmsIP=strIpPort.substr(0,ipos); strRmsPort=strIpPort.substr(ipos+1,strIpPort.size()-ipos-1); //freeReplyObject(reply2); //freeReplyObject(reply3); bReVal=true; //break; } freeReplyObject(reply2); freeReplyObject(reply3); } } else//没有可用的RMS { } freeReplyObject(reply); return bReVal; }
QTSS_Error RedisGetAssociatedCMS(QTSS_GetAssociatedCMS_Params* inParams) { OSMutexLocker mutexLock(&sMutex); if (!sIfConSucess) return QTSS_NotConnected; char chTemp[128] = { 0 }; //1. get the list of EasyDarwin easyRedisReply * reply = (easyRedisReply *)sRedisClient->SMembers("EasyCMSName"); if (reply == NULL) { sRedisClient->Free(); sIfConSucess = false; return QTSS_NotConnected; } //2.judge if the EasyCMS is ilve and contain serial device if ((reply->elements > 0) && (reply->type == EASY_REDIS_REPLY_ARRAY)) { easyRedisReply* childReply = NULL; for (size_t i = 0; i < reply->elements; i++) { childReply = reply->element[i]; std::string strChileReply(childReply->str); sprintf(chTemp, "exists %s", (strChileReply + "_Live").c_str()); sRedisClient->AppendCommand(chTemp); sprintf(chTemp, "sismember %s %s", (strChileReply + "_DevName").c_str(), inParams->inSerial); sRedisClient->AppendCommand(chTemp); } easyRedisReply *reply2 = NULL, *reply3 = NULL; for (size_t i = 0; i < reply->elements; i++) { if (sRedisClient->GetReply((void**)&reply2) != EASY_REDIS_OK) { EasyFreeReplyObject(reply); if (reply2) { EasyFreeReplyObject(reply2); } sRedisClient->Free(); sIfConSucess = false; return QTSS_NotConnected; } if (sRedisClient->GetReply((void**)&reply3) != EASY_REDIS_OK) { EasyFreeReplyObject(reply); if (reply3) { EasyFreeReplyObject(reply3); } sRedisClient->Free(); sIfConSucess = false; return QTSS_NotConnected; } if ((reply2->type == EASY_REDIS_REPLY_INTEGER) && (reply2->integer == 1) && (reply3->type == EASY_REDIS_REPLY_INTEGER) && (reply3->integer == 1)) {//find it std::string strIpPort(reply->element[i]->str); int ipos = strIpPort.find(':');//judge error memcpy(inParams->outCMSIP, strIpPort.c_str(), ipos); memcpy(inParams->outCMSPort, &strIpPort[ipos + 1], strIpPort.size() - ipos - 1); //break;//can't break,as 1 to 1 } EasyFreeReplyObject(reply2); EasyFreeReplyObject(reply3); } } EasyFreeReplyObject(reply); return QTSS_NoErr; }