本文主要是介绍GB28181学习(九)——校时,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
要求
- 联网内设备支持基于SIP方式或NTP方式的网络校时功能,标准时间为北京时间;
- 系统运行时可根据配置使用具体校时方式;
流程
- SIP校时在注册过程中完成,流程同注册和注销流程;
- 在注册成功情况下,注册流程的最后一个SIP应答消息200 OK中的Date头域中携带时间信息,格式为"Date:yyyy-MM-ddTHH:mm:ss.SSS";
- 当SIP代理通过注册方式校时,其注册过期时间宜设置为小于SIP代理与SIP服务器之间出现1s误差所经过的运行时间;
抓包
# 1.请求注册
REGISTER sip:xxx@192.168.0.107:5060 SIP/2.0
...# 2.返回401未认证
SIP/2.0 401 Unauthorized
...# 3.携带认证信息再次请求注册
REGISTER sip:xxx@192.168.0.107:5060 SIP/2.0
Authorization: Digest username="xxx", realm="xxx", nonce="xx", uri="sip:xxx@192.168.0.107:5060", response="xxx", algorithm=MD5, opaque="xx"
...# 返回注册成功 携带“Date: 2023-10-19T10:23:03”
SIP/2.0 200 OK
...
Date: 2023-10-19T10:23:03
Content-Length: 0
代码
void CMySipContext::Response(pjsip_rx_data* rdata, int st_code, int headType)
{pjsip_tx_data* tdata = nullptr;pj_status_t status = pjsip_endpt_create_response(m_endPoint, rdata, st_code, nullptr, &tdata);if (PJ_SUCCESS != status)return;std::string date = "";pj_str_t c;pj_str_t key;pjsip_hdr* hdr = nullptr;std::stringstream ss;time_t t;switch (headType){case DateHead:key = pj_str((char*)"Date");t = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());ss << std::put_time(std::localtime(&t), "%FT%T");date = ss.str();hdr = reinterpret_cast<pjsip_hdr*>(pjsip_date_hdr_create(m_pool, &key, pj_cstr(&c, date.c_str())));pjsip_msg_add_hdr(tdata->msg, hdr);break;// ... default:break;}// ...
}
这篇关于GB28181学习(九)——校时的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!