当前位置: 首页 > news >正文

网站开发顶岗报告中建八局一公司官网

网站开发顶岗报告,中建八局一公司官网,wordpress 多用户商城主题,html成品模板搭建CG28181 服务端#xff0c;也即 SIP Server#xff0c;这正是我们要实现的。实现CG28181服务端可以借助于现有的开源库 PJSIP#xff0c;具体的实现步骤如下#xff1a; 1、启动GB28181服务端#xff0c;接收客户端消息请求 bool Init(std::string concat, int logL…搭建CG28181 服务端也即 SIP Server这正是我们要实现的。实现CG28181服务端可以借助于现有的开源库 PJSIP具体的实现步骤如下 1、启动GB28181服务端接收客户端消息请求 bool Init(std::string concat, int logLevel) {this-concat concat;pj_log_set_level(logLevel);auto status pj_init();status pjlib_util_init();pj_caching_pool_init(cachingPool, pj_pool_factory_default_policy, 0);status pjsip_endpt_create(cachingPool.factory, nullptr, endPoint);status pjsip_tsx_layer_init_module(endPoint);status pjsip_ua_init_module(endPoint, nullptr);pool pj_pool_create(cachingPool.factory, proxyapp, 4000, 4000, nullptr);auto pjStr StrToPjstr(GetAddr());pj_sockaddr_in pjAddr;pjAddr.sin_family pj_AF_INET();pj_inet_aton(pjStr, pjAddr.sin_addr);auto port GetPort();pjAddr.sin_port pj_htons(static_castpj_uint16_t(GetPort()));status pjsip_udp_transport_start(endPoint, pjAddr, nullptr, 1, nullptr);if (status ! PJ_SUCCESS) return status;auto realm StrToPjstr(GetLocalDomain());return pjsip_auth_srv_init(pool, authentication, realm, lookup, 0) PJ_SUCCESS ? true : false; } 以上是PJSip初始化的代码需要将服务将要监听的端口传给PJSIP,这样服务就在监听的端口接收SIP 消息了。 2、应答注册消息 摄像机端发送来Register消息后如果服务端不应答摄像机端会一直发送直到收到服务端应答为止。如果服务器端重新运行需要手动再次开启设备。 服务端应答注册消息代码如下 bool OnReceive(pjsip_rx_data* rdata) override {if(rdata-msg_info.cseq-method.id PJSIP_REGISTER_METHOD){auto expires static_castpjsip_expires_hdr*(pjsip_msg_find_hdr(rdata-msg_info.msg, PJSIP_H_EXPIRES, nullptr));auto authHdr static_castpjsip_authorization_hdr*(pjsip_msg_find_hdr(rdata-msg_info.msg, PJSIP_H_AUTHORIZATION, nullptr));if(expires expires-ivalue 0 ){if(authHdr){ cout receive register infoendl;response(rdata, PJSIP_SC_OK, DateHead);QureryDeviceInfo(rdata);}else{response(rdata, PJSIP_SC_UNAUTHORIZED, AuthenHead);}return true; }}return false; } OnReceive 是服务端接收注册消息以后的响应方法也就是说要将OnReceive作为入参传给PJSIP完成此项功能在初始化brPJSIP Moudle时。至于PJSIP moudle细节的话可以查看PJSIP文档代码如下 bool Init(std::string concat, int loglevel) {bool ret false;if(!mainModule){ret context.Init(concat,loglevel);if(!ret) return ret;static struct pjsip_module moudle {nullptr, nullptr,{ MainModule, 10 },-1,PJSIP_MOD_PRIORITY_APPLICATION,nullptr,nullptr,nullptr,nullptr,nullptr,CGSipMedia::OnReceive,nullptr,nullptr,nullptr,};mainModule moudle;pjsip_inv_callback callback;pj_bzero(callback, sizeof(callback));callback.on_state_changed onStateChanged;callback.on_new_session onNewSession;callback.on_tsx_state_changed onTsxStateChanged;callback.on_rx_offer onRxOffer;callback.on_rx_reinvite onRxReinvite;callback.on_create_offer onCreateOffer;callback.on_send_ack onSendAck;ret context.RegisterCallback(callback);if(!ret ) return ret;context.InitModule();ret context.RegisterModule(mainModule);if(!ret ) return ret;CGSipModule::GetInstance().Init();ret context.CreateWorkThread(proc,workthread,nullptr,proxy);}return ret;} OnReceive方法内Resonse方法实现了发送响应数据到客户端(设备): 接到PJSIP发送一些字符串给客户端: void Response(pjsip_rc_data* rdata, int st_code, int headType) { std::lock_guardmutex lk(lock); pjsip_tx_data* tdata; pjsip_endpt_create_response(endPoint, rdata, st_code, nullptr, tdata); auto date DateTimeFormatter::format(LocalDateTime(), Y-%m-%dT%H:%M:%s); pj_str_t c; pj_str_t key; pjsip_hdr * hdr; switch(headType) { case DateHead: key pj_str(Date); hdr reinterpret_castpjsip_hdr*(pjsip_date_hdr_create(poll, key, pj_cstr(c, date.c_str()))); pjsip_msg_add_hdr(tdata-msg, hdr); break; case AuthenHead:pjsip_auth_srv_challenge(authentication, nullptr, nullptr, nullptr, PJ_FALSE, tdata); break; default: break; }pjsip_response_addr addr;pjsip_get_response_addr(pool, rdata, addr);pjsip_endpt_send_response(endPoint, addr, tdata, nullptr, nullptr);} SIP服务端响应注册命令后发送Invite请求请求catalog信息也就是设备基本信息具体的方法上面已 给出具体的内容是 bool OnReceive(pjsip_rx_data* rdata) override {if (rdata-msg_info.cseq-method.id PJSIP_OTHER_METHOD){CGXmlParser xmlParser(context.GetMessageBody(rdata)); CGDynamicStruct dynamicStruct;dynamicStruct.Set(xmlParser.GetXml());auto cmd xmlParser.GetXml()-firstChild()-nodeName();auto cmdType dynamicStruct.Getstd::string(CmdType);if (cmdType ! Catalog) return false;auto DeviceID dynamicStruct.Getstd::string(DeviceID);Vector deviceList dynamicStruct.GetVector(DeviceList);for (auto x : deviceList){CGCatalogInfo devinfo;try{devinfo.PlatformAddr rdata-pkt_info.src_name;devinfo.PlatformPort rdata-pkt_info.src_port;devinfo.Address x[Address].convertstring();devinfo.Name WstringToString(x[Name].convertwstring());devinfo.Manufacturer x[Manufacturer].convertstring();devinfo.Model x[Model].convertstring();devinfo.Owner x[Owner].convertstring();devinfo.Civilcode x[CivilCode].convertstring();devinfo.Registerway x[RegisterWay].convertint();devinfo.Secrecy x[Secrecy].convertint();//devinfo.IPAddress x[IPAddress].convertstring();devinfo.DeviceID x[DeviceID].convertstring();devinfo.Status x[Status].convertstring();}catch (...){//continue;}if(callback){callback(user, devinfo);}//SipControlModule::GetInstance().CatalogCallBack(devinfo);}response(rdata, PJSIP_SC_OK,NoHead);return true; } SIP服务端获取设备端的信息后就可以发送请求视频信息了请求视频最为关键的是SDP下面看下SDP信息如何填写 static string createSDP(MediaContext mediaContext) {char str[500] { 0 };pj_ansi_snprintf(str, 500,v0\no%s 0 0 IN IP4 %s\nsPlay\ncIN IP4 %s\nt0 0\nmvideo %d RTP/AVP 96 98 97\narecvonly\nartpmap:96 PS/90000\nartpmap:98 H264/90000\nartpmap:97 MPEG4/90000\ny0100000001\n,mediaContext.GetDeviceId().c_str(),mediaContext.GetRecvAddress().c_str(),mediaContext.GetRecvAddress().c_str(),mediaContext.GetRecvPort());return str; } 发送请求视频命令到设备端也是通过PJSIP API实现实现代码如下 bool Invite(pjsip_dialog *dlg, MediaContext mediaContext, string sdp){pjsip_inv_session *inv;if (PJ_SUCCESS ! pjsip_inv_create_uac(dlg, nullptr, 0, inv)) return false;pjsip_tx_data *tdata;if (PJ_SUCCESS ! pjsip_inv_invite(inv, tdata)) return false;pjsip_media_type type;type.type pj_str(application);type.subtype pj_str(sdp);auto text pj_str(const_castchar *(sdp.c_str()));try{tdata-msg-body pjsip_msg_body_create(pool, type.type, type.subtype, text);auto hName pj_str(Subject);auto subjectUrl mediaContext.GetDeviceId() : SiralNum , GetInstance().GetCode() : SiralNum;auto hValue pj_str(const_castchar*(subjectUrl.c_str()));auto hdr pjsip_generic_string_hdr_create(pool, hName, hValue);pjsip_msg_add_hdr(tdata-msg, reinterpret_castpjsip_hdr*(hdr));pjsip_inv_send_msg(inv, tdata);}catch (...){}return true;} 设备端收到Invite请求后会将视频数据以rtp的方式推送到指定的端口端口在invite消息指定。这样在指定的地址ip port就可以拿到数据了。 交流联系 微信 LiveMedia视频汇聚平台www.houhangkeji.com QQ技术交流群698793654
http://www.w-s-a.com/news/868167/

相关文章:

  • 网站开发具备的相关知识wordpress简约文字主题
  • asp网站伪静态文件下载seo外包公司哪家好
  • 淘宝客网站根目录怎么建个废品网站
  • 网站备案更改需要多久百度免费网站空间
  • 外发加工是否有专门的网站wordpress主页 摘要
  • 企业网站优化系统浙江建设信息港证书查询
  • 很多年前的51网站如何做跨境电商需要哪些条件
  • 网站建设中 请稍后访问互联网营销设计
  • 软文网站名称用户浏览网站的方式
  • 大兴模版网站搭建哪家好网站建设与管理管理课程
  • 四川成都网站制作微信广告平台推广
  • 网站价格网页制作网站开发实训步骤
  • cms 导航网站鹤壁做网站价格
  • 微信营销软件免费版郑州关键词优化费用
  • 邢台专业做网站哪家好临沂网站建设中企动力
  • 建设网站是主营成本吗wordpress 后台
  • 猎头可以做单的网站企业网站建设
  • 建小程序需要网站吗在putty上怎样安装wordpress
  • 天津智能网站建设找哪家WordPress相册插件pro
  • 电脑网站页面怎么调大小济宁网站建设软件开发
  • 亿玛酷网站建设广州增城区最新消息
  • 企业网站视频栏目建设方案中企动力网站模板
  • 网站页面策划国外注册域名的网站
  • 百中搜如何做网站排名网站维护一年一般多少钱
  • 镇江地区做网站的公司wordpress说说加分类
  • 深圳高端网站设计免费的关键词优化软件
  • 视频网站公司沈阳网站建设服务
  • 网站全屏代码做网站必须用对方服务器
  • 网站速度慢wordpressssl正式申请后wordpress
  • 那个网站做玉石最专业西瓜创客少儿编程加盟