ssdp协议搜索GB28181设备
1、http协议和ssdp协议
ssdp协议近似于http协议,事实上,和http协议相似得地方就是他得协议内容,当然,我们要去除他得端口和d类地址。
为什么我在给其他员工或者面试得时候要他人深入一些,理解一下http协议,是因为理解了http协议,掌握ssdp也就不远了,很多人可能会问:http协议有啥内容,无非就是get,post,put,delete 么,还能怎么样,我经常问他们一点:http协议怎么知道他结束了?
大部分面试者支支吾吾答不出来,就这么奇怪,有一部分人说socket.close(), socket 关闭是因为你知道结束了才关闭,不是因为关闭知道http协议结束。两个\r\n\r\n代表http协议内容部分结束,至于二进制,当然有content-length 字段去表述了。我们来看一下ssdp协议:
static const char* ssdp_search =
"M-SEARCH * HTTP/1.1"
"HOST: 239.255.255.250:1900"
"MAN: \"ssdp:discover\""
"MX: 5"
"ST: ssdp:all";
这代表了搜索所有设备,这样对否,能出结果否,在239.255.255.250 这种d类ip地址上,端口1900发出该字符串,应该收到很多设备发出得信息,例如摄像头信息,你一定会搜到,不过,这一段代码搜索不到?为什么?看正确得写法:
static const char* ssdp_search =
"M-SEARCH * HTTP/1.1\r\n"
"HOST: 239.255.255.250:1900\r\n"
"MAN: \"ssdp:discover\"\r\n"
"MX: 5\r\n"
"ST: ssdp:all\r\n\r\n";
虽然ssdp是udp协议,但是他依然需要\r\n来代表行结束,\r\n\r\n代表协议内容部分结束。这样,就会搜索到所有信息,当然了,我们可以使用过滤,只搜索部分协议,比如就是摄像头,其他设备忽略。
2、发现谁在发现
除了搜索设备,我们还需要知道谁往我们得服务地址发送了搜索地址得需求,因为我们是一个设备,其他在gb28181 服务中,我们需要知道sip 网守和网关得设备,可能有多个这种设备,我们则需要知道谁正需要发现设备,我们写出以下代码:
#include <stdio.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")int main_2()
{int iRet = 0;WSADATA wsaData;WSAStartup(MAKEWORD(2, 2), &wsaData);SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0);sockaddr_in addr;addr.sin_family = AF_INET;//addr.sin_addr.S_un.S_addr = INADDR_ANY;addr.sin_addr.S_un.S_addr = inet_addr("192.168.0.129");addr.sin_port = htons(1900);bool bOptval = true;iRet = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&bOptval, sizeof(bOptval));if (iRet != 0) {printf("setsockopt fail:%d", WSAGetLastError());return -1;}iRet = ::bind(sock, (sockaddr*)&addr, sizeof(addr));if (iRet != 0) {printf("bind fail:%d", WSAGetLastError());return -1;}printf("socket:%d bind success\n", sock);// 加入组播ip_mreq multiCast;//multiCast.imr_interface.S_un.S_addr = INADDR_ANY;multiCast.imr_interface.S_un.S_addr = inet_addr("192.168.0.129");multiCast.imr_multiaddr.S_un.S_addr = inet_addr("239.255.255.250");iRet = setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&multiCast, sizeof(multiCast));if (iRet != 0) {printf("setsockopt fail:%d", WSAGetLastError());return -1;}printf("udp group start\n");int len = sizeof(sockaddr);char strRecv[1500] = { 0 };while (true){memset(strRecv, 0, sizeof(strRecv));iRet = recvfrom(sock, strRecv, sizeof(strRecv) - 1, 0, (sockaddr*)&addr, &len);if (iRet <= 0) {printf("recvfrom fail:%d", WSAGetLastError());return -1;}printf("recv data:%s\n", strRecv);}closesocket(sock);WSACleanup();return 0;
}
以上代码是windows示例,也可以用asio来制作,都一样。
可以看出有很多设备正在发ssdp协议,这样,找到自己感兴趣得ssdp设备,给他回信息就行。
3、标明我是谁
ssdp 简单服务发现协议最本质得关键还是在于服务得发现,反过来,不就是让对方发现我是谁,
static const char* ssdp_resinfo =
"HTTP/1.1 200 OK\r\n"
"CACHE-CONTROL:max-age=seconds\r\n"
"DATE:2022-07-09\r\n"
"EXT:\r\n"
"LOCATION: URL for UPnP description for root device\r\n"
"SERVER : OS / Version UPNP / 1.0 product / version\r\n"
"ST:search target\r\n"
"USN:advertisement UUID\r\n\r\n";
以下是摄像头返回得信息
HTTP/1.1 200 OK
CACHE-CONTROL: max-age=3600
DATE: Tue, 02 Aug 2022 14:44:45 GMT
EXT:
LOCATION: http://192.168.0.64:49152/upnpdevicedesc.xml
SERVER: Linux/4.9.37, UPnP/1.0, Portable SDK for UPnP devices/1.6.21
ST: urn:schemas-upnp-org:service:EmbeddedNetDeviceControl:1
USN: uuid:Upnp-iDS-ECD8012-M/E-1_0-F84224570::urn:schemas-upnp-org:service:EmbeddedNetDeviceControl:1
使用http协议解析以后,在获取LOCATION 地址,使用httpclient 访问地址,返回如下xml内容
<root xmlns="urn:schemas-upnp-org:device-1-0">
<specVersion>
<major>1</major>
<minor>0</minor>
</specVersion>
<device>
<deviceType>urn:schemas-upnp-org:device:DigitalSecurityCamera:1</deviceType>
<friendlyName>HIKVISION iDS-ECD8012-M/E - F84224570</friendlyName>
<manufacturer>HIKVISION</manufacturer>
<manufacturerURL>http://www.hikvision.com</manufacturerURL>
<modelDescription>IP Camera</modelDescription>
<modelName>HIKVISION iDS-ECD8012-M/E</modelName>
<modelNumber>iDS-ECD8012-M/E</modelNumber>
<modelURL>http://www.hikvision.com</modelURL>
<serialNumber>F84224570</serialNumber>
<UDN>uuid:Upnp-iDS-ECD8012-M/E-1_0-F84224570</UDN>
<serviceList>
<service>
<serviceType>urn:schemas-upnp-org:service:EmbeddedNetDeviceControl:1</serviceType>
<serviceId>urn:upnp-org:serviceId:EmbeddedNetDeviceControl</serviceId>
<controlURL>/</controlURL>
<eventSubURL>/</eventSubURL>
<SCPDURL>/</SCPDURL>
</service>
</serviceList>
<presentationURL>http://192.168.0.64:80</presentationURL>
</device>
</root>
从中可以发现很多信息
那么现在我们得GB28181 服务有sip 服务,网关服务,中心节点服务,存储服务,推理服务,我们就必须标明自己得设备,并且写好XML文件,让对方获取,我们当然不必墨守成规,可以改成其他形式得文件,不过要考虑兼容性。
封装测试
在ssdp协议封装过程中,最为重要得一定是这个注意点,就是本机IP和主播地址IP,我们必须设置两个地址,在windows里面和linux下表现不同,必须要注意
int main(int argc, char* argv[])
{asio::io_context io_service;receiver r(io_service,asio::ip::address::from_string("192.168.0.129"),asio::ip::address::from_string("239.255.255.250"));thread t([&r,&io_service] {r.do_init("192.168.0.129");r.StartTimer();io_service.run();});while (1){Sleep(3000);}return 0;
}
ssdp协议搜索GB28181设备相关推荐
- SSDP协议编程 upnp设备查找方法
SSDP协议编程 upnp设备查找方法 [cpp] view plaincopy int ssdp_discovery() { struct sockaddr_in addrin ; st ...
- ssdp协议 upnp_SSDP 简单服务发现协议
SSDP 简单服务发现协议,是应用层协议,是构成UPnP(通用即插即用)技术的核心协议之一.它为网络客户端(network client)提供了一种发现网络服务(network services)的机 ...
- ssdp协议 upnp_SSDP,简单服务发现协议
SSDP 简单服务发现协议,是应用层协议,是构成UPnP(通用即插即用)技术的核心协议之一.它为网络客户端(network client)提供了一种发现网络服务(network services)的机 ...
- C实现SSDP协议的设备发现及设备搜索
/** ===========================================================================** Filename: ssdpServ ...
- SkeyeVSS国标视频汇聚云服务使用Onvif、GB28181协议对监控摄像机设备进行PTZ云台控制
SkeyeVSS平台可在复杂的网络环境中,将分散的各类视频资源进行统一汇聚.整合.集中管理,实现视频资源的鉴权管理.按需调阅.全网分发.智能分析等.平台可支持多协议.多类型设备接入,包括国标GB281 ...
- wireshark-协议分析【初见】(NBNS协议,SSDP协议、IGMPv2)
写在前面 win7:192.168.2.150(00-0c-29-CF-D3-0F) kali:192.168.2.120(00:0c:29:e7:1c:e5) (均使用的vmware虚拟机平台) 该 ...
- 利用 SSDP 协议生成 100 Gbps DDoS 流量的真相探秘
原文地址 https://www.4hou.com/technology/5979.html 上个月我们分享过一些反射型DDoS攻击数据,SSDP攻击的平均大小是12 Gbps,我们记录的最大的反射式 ...
- Android BLE学习(一): Android搜索BLE设备
http://my.csdn.net/lidec 背景 总结一下最近ble的学习情况.自从入手ble 51822开发板后就开始不停加班,中途出于好奇,业余时间写了一些单片机上json解析相关的东西,妄 ...
- 视频播放压缩的相关知识点:I帧、P帧、B帧、RTMP协议、RTSP协议、GB28181协议等学习记录
I帧.P帧.B帧.RTMP协议.RTSP协议.GB28181协议等学习记录 引言 1. I帧.P帧.B帧 1.1 P帧 1.2 B帧 1.3 I帧 2.ONVIF协议与GB28181协议,RTMP与R ...
- LiveGBS国标GB/T28181流媒体平台接入GB28181设备作为下级支持级联到共享到海康大华宇视等第三方国标平台支持对接政务公安内网国标视频平台
LiveGBS国标GB/T28181流媒体平台接入GB28181设备作为下级支持级联到共享到海康大华宇视等第三方国标平台支持对接政务公安内网国标视频平台 1.什么是GB/T28181级联 2.搭建GB ...
最新文章
- avcodec_decode_video2 第三个参数 got_picture_ptr 的含义
- PAT甲级1085 Perfect Sequence :[C++题解]双指针
- STM32外设之GPIO的推挽输出和开漏输出模式详解
- fisher判别_经典模式识别:Fisher线性判别
- C#面向对象(一):明确几个简单的概念作为开胃菜
- JZOJ 3807. 【NOIP2014模拟8.25】地砖铺设
- 【Linux】一步一步学Linux——free命令(80)
- 多个线程访问统一对象的不同方法_分析| 你未必真的了解线程安全,别骗自己,来看下怎么实现线程安全...
- 有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!
- C语言实现万年历(附代码)
- won10qualcomm atheros无线网卡驱动安装不了
- linux 鼠标光标由箭头变成十字形恢复方法
- docker添加新的环境变量_DockerFile 设置环境变量
- xcode清理缓存瘦身方法整理
- 速率bps(kbps、Mbps)和每秒字节传输B/s(KB/s、MB/s)的关系如下
- webim【LayIM】开发者文档
- win10使用VMware Workstations安装CentOS
- 如何制作图片一句话木马
- 题目选自《第八届图灵杯》-------买花
- Palabos用户手册翻译及学习(四)非本地操作的数据处理器和块之间的耦合