GB28181学习(九)——校时

要求

  • 联网内设备支持基于SIP方式或NTP方式的网络校时功能,标准时间为北京时间;
  • 系统运行时可根据配置使用具体校时方式;

流程

  • SIP校时在注册过程中完成,流程同注册和注销流程;
  • 在注册成功情况下,注册流程的最后一个SIP应答消息200 OK中的Date头域中携带时间信息,格式为"Date:yyyy-MM-ddTHH:mm:ss.SSS";
  • 当SIP代理通过注册方式校时,其注册过期时间宜设置为小于SIP代理与SIP服务器之间出现1s误差所经过的运行时间;

抓包

# 1.请求注册
REGISTER sip:[email protected]:5060 SIP/2.0
...

# 2.返回401未认证
SIP/2.0 401 Unauthorized
...

# 3.携带认证信息再次请求注册
REGISTER sip:[email protected]:5060 SIP/2.0
Authorization: Digest username="xxx", realm="xxx", nonce="xx", uri="sip:[email protected]: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_date_hdr_create(m_pool, &key, pj_cstr(&c, date.c_str())));
		pjsip_msg_add_hdr(tdata->msg, hdr);
		break;
     // ... 
     default:
		break;
    }
    
    // ...
}

你可能感兴趣的:(GB28181,GB28181,c++)