GB28181目錄訂閱記錄

  SIP域可通過訂閱方式訂閱其他SIP域的全部或部分目錄的離線、上線、增加、刪除、更新等變更信息。被訂閱域在目錄變更後應將變更事件通知訂閱域

1、訂閱流程

在這裏插入圖片描述
   A發送初始訂閱消息訂閱B的目錄時Expires頭域攜帶訂閱過期時間,默認是600s,該時間應可配置。A在訂閱過期時間到來之前訂閱域應該刷新訂閱。B在過期時間到來時若未收到刷新訂閱的消息,則移除A的訂閱狀態。
刷新訂閱消息的初始訂閱消息屬於同一個會話,會話ID應該一致。

2、抓包消息

服務器A(192.168.0.33)訂閱海康NVR(192.168.0.64)目錄

《1》、A初始訂閱

在這裏插入圖片描述

《2》、NVR回覆200 ok然後回覆NOTIFY消息

(這個消息截圖與初始化截圖的是兩個不同時間內獲得的,所以有會話不一致,實際上同一個流程notify的會話ID和初始訂閱的是一樣的)
在這裏插入圖片描述
在這裏插入圖片描述

   服務器回覆200 OK(這個流程也是不同時間跑的,所以會話ID與初始化訂閱抓包截圖的不一樣,實際上應該是一致的)
在這裏插入圖片描述

《3》、訂閱刷新的抓包

在這裏插入圖片描述

回覆200 OK
在這裏插入圖片描述

由初始化訂閱和訂閱刷新可知,會話ID是要保持一致的,若刷新註冊使用不同的ID在exoisp中創建刷新信息會出現錯誤碼-6(NOFOUND)。

3、demo

《1》、初始化訂閱

char rsp_xml_body[4096];
osip_message_t *rsp_msg = NULL;
char sour_call[128] = {0};
char dest_call[128] = {0};


sprintf(sour_call, "sip:%s@%s:%d", deviceInfo.server_id, deviceInfo.server_ip,deviceInfo.server_port);
sprintf(dest_call, "sip:%s@%s:%d", deviceInfo.ipc_id, deviceInfo.ipc_ip, deviceInfo.ipc_port);


eXosip_subscription_build_initial_subscribe(g_context_eXosip, &rsp_msg, dest_call, sour_call, NULL, "Catalog", 600);
snprintf(rsp_xml_body, 4096, "<?xml version=\"1.0\"?>\r\n"
"<Query>\r\n"
"<CmdType>Catalog</CmdType>\r\n"
"<SN>%s</SN>\r\n"
"<DeviceID>%s</DeviceID>\r\n"
"</Query>\r\n",
"25",
deviceInfo.ipc_id
);


osip_message_set_body(rsp_msg, rsp_xml_body, strlen(rsp_xml_body));
osip_message_set_content_type(rsp_msg, "Application/MANSCDP+xml");


eXosip_lock(g_context_eXosip);
eXosip_subscription_send_initial_request(g_context_eXosip, rsp_msg);
eXosip_unlock(g_context_eXosip);

會話id保存

//發送成功之後NVR回覆200 OK,在這個200 OK 的event處理流程中需要保存會話ID用於刷新註冊
case EXOSIP_SUBSCRIPTION_ANSWERED:
{
     m_SubCatalogId = g_event->did;  //保存會話ID
}break;

《2》、刷新訂閱

{
    //refresh
    osip_message_t * sub = NULL;
    char rsp_xml_body[1024];
    memset(rsp_xml_body,0,1024);
    
    eXosip_lock(this->g_context_eXosip);
    int ret = eXosip_subscription_build_refresh_request(this->g_context_eXosip, this->m_SubCatalogId, &sub); /* 使用保存下來的會話ID */
    if(ret != OSIP_SUCCESS)
    {
      LOG_DEBUG << "eXosip_subscription_build_refresh_request FAILE! Error code: " << ret;
      return;
    }

    snprintf(rsp_xml_body, 1024, "<?xml version=\"1.0\"?>\r\n"
        "<Query>\r\n"
        "<CmdType>Catalog</CmdType>\r\n"
        "<SN>%s</SN>\r\n"
        "<DeviceID>%s</DeviceID>\r\n"
        "</Query>\r\n",
        "25",
        deviceInfo.ipc_id
        );

        osip_message_set_body(sub, rsp_xml_body, strlen(rsp_xml_body));
        osip_message_set_content_type(sub, "Application/MANSCDP+xml");

    ret = eXosip_subscription_send_refresh_request(this->g_context_eXosip, this->m_SubCatalogId, sub);
    eXosip_unlock(this->g_context_eXosip);
    if(ret != OSIP_SUCCESS)
    {
      LOG_DEBUG << "eXosip_subscription_send_refresh_request FAILE! Error code: " << ret;
      return;
    }
    LOG_DEBUG << "eXosip_subscription_send_refresh_request Success !!! ";
}

4、參考

[1]、GBT 28181-2016公共安全視頻監控聯網系統信息傳輸、交換、控制技術要求.pdf
[2]、exosip開發手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章