linux设备上的Onvif 实现19:发现及鉴权示例程序

前面讲述了一大堆函数用法,现在给出具体实例程序,完成了搜索摄像头和鉴权。

/******************************************************************************
* Name:   MySearchOnvif
*
* Desc:   search onvif device
* Param: none   
* Return: int,  return device count
* Global:  
* Note:  
* Author:   Tom-hongtao.gao
* -------------------------------------
* Log:   2013/09/25, Create this function by Tom-hongtao.gao
******************************************************************************/
int MySearchOnvif(void)
{
    int count = 0;  //获得的设信息备个数
    int i;
    BOOL bret=FALSE;
   
    /*--------存储数据反初始化-------------*/
    DLDeinit();
   
    /************初始化*************/   
    struct soap *soap;  //soap环境变量   
    soap = soap_new(); //为soap申请变量空间,并初始化
    if(soap==NULL)
    {
        printf("%s : %d, can't create new soap! \n",__FUNCTION__, __LINE__);
        return 0;
    }   
    soap_set_namespaces(soap, namespaces); //设置soap的namespaces
   
    /* ---- 探测设备------ */
    count = MySendProbe(soap);
    if(count<=0)
    {
        printf("%s : %d, can't find ipcamera!  \n ",__FUNCTION__, __LINE__);
        //清除soap
        soap_end(soap); // clean up and remove deserialized data
        soap_free(soap);//detach and free runtime context
        return 0;
    }
   
    /* ---- 检测每个设备能力------ */   
    for(i=0; i<count;i++)
    {  
        /* ---- 开始获取设备能力------ */
        bret = MyGetCapabilities(soap, i);
        if(bret==FALSE)
        {
            printf("--ERROR: MyGetCapabilities() return false!  \n"); 
            DLSetAuthorization(i, 2);  //设置为鉴权失败
            continue;
        }
       
        /* ---- 开始获取媒体信息------ */
        bret = MyGetProfiles(soap, i);
        if(bret==FALSE)
        {
            printf("--ERROR: MyGetProfiles() return false!  \n");           
            continue;
        }

        /* ---- 分析是否支持该设备------ */
        bret = MyIsSupportDevice(i);
        if(bret==FALSE)
        {
            printf("--ERROR: MyIsSupportDevice() return false!  \n");   

            /* 开始修改媒体配置信息,设为能力范围内的参数。
               配置失败放弃此设备;成功就继续执行。 */
            bret = MyModifyVideoEncoderConfigurations(soap, i);
            if(bret==FALSE)
            {
                printf("--ERROR: MyModifyVideoEncoderConfigurations() return false!  \n");       
                continue;
            }
        }

        /* ---- 开始获取流媒体RTSP地址------ */       
        int sizeprofile = DLGetSizeProfile(i);
        int j=0;
        for(j=0; j<sizeprofile; j++)
        {
            bret = MyGetStreamUri(soap, i, j);
            if(bret==FALSE)
            {
                printf("--ERROR: GetStreamUri(0) return false!  \n");
            } 
        }
        PrintfNodebyIndex(i);
    }

    bret = DLSaveCfgFile();
    if(bret==FALSE)
    {
        printf("--ERROR: DLSaveCfgFile() return false!  \n");           
    }
    else
    {
        printf("-- DLSaveCfgFile() save success! \n"); 
    }

    printf("--now delete devicenode list!  \n");       
    DLDeleteAll();  
   
    //清除soap
    soap_end(soap); // clean up and remove deserialized data
    soap_free(soap);//detach and free runtime context

    return count;

}

/******************************************************************************
* Name:   MyAuthentication
*
* Desc:   开始对指定IPC鉴权,成功后获取RTSP
* Param: int index, 指定节点序号
* Return: BOOL,  TRUE: success,  FALSE: fail
* Global:  
* Note:  
* Author:   Tom-hongtao.gao
* -------------------------------------
* Log:   2013/09/25, Create this function by Tom-hongtao.gao
******************************************************************************/
BOOL MyAuthentication(int index)
{
    int sizeprofile;
    int channel;
    BOOL bret=FALSE;
    BOOL breturn=FALSE;

    /* 0 读取指定IPC的用户名+密码 */
    char username[IPCNAMEMAX+1];  //用户名   
    char password[IPCNAMEMAX+1];  //用户密码
    memset(username, 0, IPCNAMEMAX+1);
    memset(password, 0, IPCNAMEMAX+1);
    bret = ReadUsernamePassword(index,username, password);
    if(bret==FALSE)
    {
        printf("--ERROR: can't read username and password! \n");
        return FALSE;
    }

    /* 1 打开onviflist.dat文件,初始化IPC列表 */
    bret = DLInit();
    if(bret==FALSE)
    {
        printf("--ERROR: DLInit() return false! \n");
        return FALSE;
    }
    printf("%s : %d  000 \n ",__FUNCTION__, __LINE__);
   
    /* 2 对指定的IPC使用鉴权命令查询媒体信息*/
    struct soap *soap;  //soap环境变量          
    soap = soap_new(); //为soap申请变量空间,并初始化
    if(soap==NULL)
    {
        printf("%s : %d, can't create new soap! \n",__FUNCTION__, __LINE__);
        return FALSE;
    }   
    soap_set_namespaces(soap, namespaces); //设置soap的namespaces   


   /* 3---- 开始获取设备能力------ */
   /* 试验表明,每条命令都必须重新添加密码摘要。
      原因可能是接收应答时销毁Header   */
    soap_wsse_add_UsernameTokenDigest(soap, "user", username, password);
    bret = MyGetCapabilities(soap, index);
    if(bret==FALSE)
    {
        printf("--ERROR: MyGetCapabilities() return false!  \n");    
        /* MyGetCapabilities命令:有的摄像头需要鉴权,有的不需要。
           返回FALSE 认为鉴权失败。 */
        DLSetAuthorization(index, 2); 
        goto errorcode;
    }
    else
        DLSetAuthorization(index, 1); 

    printf("%s : %d  000 \n ",__FUNCTION__, __LINE__);
    //PrintfNodebyIndex(index);

    /* 4---- 开始获取媒体信息------ */   
    soap_wsse_add_UsernameTokenDigest(soap, "user", username, password);   
    bret = MyGetProfiles(soap, index);
    if(bret==FALSE)
    {
        printf("--ERROR: MyGetProfiles() return false!  \n");
       
        /* MyGetProfiles命令:有的摄像头需要鉴权,有的不需要。
           返回FALSE 认为鉴权失败。 */
        DLSetAuthorization(index, 2);
        goto errorcode;
    }
    else
        DLSetAuthorization(index, 1); 
   
    //printf("%s : %d  222 \n ",__FUNCTION__, __LINE__);
    PrintfNodebyIndex(index);
   
    /* 5 ---- 分析是否支持该设备------ */
    bret = MyIsSupportDevice(index);
    if(bret==FALSE)
    {
        printf("--ERROR: MyIsSupportDevice() return false!  \n");   

        /* 开始修改媒体配置信息,设为能力范围内的参数。
           配置失败放弃此设备;成功就继续执行。 */
        bret = MyModifyVideoEncoderConfigurations_Auth(soap, index, username, password);
        if(bret==FALSE)
        {
            printf("--ERROR: MyModifyVideoEncoderConfigurations() return false!  \n");
            goto errorcode;
        }
    }
   
    /* 6 ---- 开始获取流媒体RTSP地址------ */
    sizeprofile = DLGetSizeProfile(index);
    int i=0;
    for(i=0; i<sizeprofile; i++)
    {
        soap_wsse_add_UsernameTokenDigest(soap, "user", username, password);
        bret = MyGetStreamUri(soap, index, i);
        if(bret==FALSE)
        {
            printf("--ERROR: GetStreamUri(0) return false!  \n");           
            goto errorcode;
        } 
    }
   
    PrintfNodebyIndex(index);   
    breturn = TRUE;
    goto rightcode;

errorcode:   
    breturn = FALSE;
   
rightcode:   
    /* 7----- 保存数据--------*/   
    bret = DLSaveCfgFile();
    if(bret==FALSE)
    {
        printf("--ERROR: DLSaveCfgFile() return false!  \n");           
    }
    else
    {
        printf("-- DLSaveCfgFile() save success! \n"); 
    }
    DLDeleteAll();   
   
    //清除soap
    soap_end(soap); // clean up and remove deserialized data
    soap_free(soap);//detach and free runtime context

    return breturn;
}

 

 

 

你可能感兴趣的:(onvif)