先做个大致分析:这篇文章是把Android设备当做摄像机,通过onvif协议,
可以让nvr进行访问,传输rtsp流。
先说下我的思路:
第一步:先看文档,了解到onvif协议是通过http建立的连接。
第二步:找个可以和nvr连接的IPC,通过Wireshark抓包,可以看到他们之间
建立连接的过程,需要传输的报文。
第三步:建立http服务端,构建响应消息。
大致流程就这样
服务端我用的serverSocket,nanohttp的源码,之后再做分析。
onvif的响应消息是通过http和soap构建的,我手动拼写的,这是我的一部分像这样:
buffer.append("<SOAP-ENV:Body>\n" +
" <tds:GetDeviceInformationResponse>\n" +
" <tds:Manufacturer>\n" +
" Network Digital Video" +
" </tds:Manufacturer>\n" +
" <tds:Model>\n" +
" HIHD_T" +
" </tds:Model>\n" +
" <tds:FirmwareVersion>\n" +
" 2.1.0.3.4.19_5.0.67 Beta" +
" </tds:FirmwareVersion>\n" +
" <tds:SerialNumber>\n" +
" 717330" +
" </tds:SerialNumber>\n" +
" <tds:HardwareId>\n" +
" IPCamera" +
" </tds:HardwareId>\n" +
" </tds:GetDeviceInformationResponse>\n" +
" </SOAP-ENV:Body>\n" +
" </SOAP-ENV:Envelope>");
响应消息是通过看抓包然后自己写了个一样回复过去的。
nvr看到的错误分析:
在nvr上,刚开始可能会说参数错误,然后你抓包看到nvr给你发的接口,你回对应的消息,回复一两个接口应该会说用户名密码错误,这时候你可以在header中写安全认证,也可以不写鉴权、安全认证,他发什么你回复什么就可以,因为他不是双向的认证,只要我们服务端承认就可以,接着下来可能是IP通道异常,这时候你看你的GetStreamUri的接口,里面的rtsp流是否是有效的,之后基本上就能看到在nvr上显示在线了,剩下的接口自己建立回复,调试接口的时候可能会遇到各种错,一般都是写的配置不对,这个就要你自己调了我建议用onvif工具先看抓包情况。
之后在具体分析服务、抓包方面吧。
一份代码可以参考:https://download.csdn.net/download/weixin_44796633/12299336,这分代码中的rtsp的服务有点老
我自己感觉写的应该能看明白