您的位置:首页 >GB28181协议是什么?是否收费?
发布于2025-07-31 阅读(0)
扫一扫,手机访问
在探讨GB28181协议的细节之前,让我们先了解一下与之相关的HTTP和SSDP协议的基本概念。这将帮助我们更好地理解GB28181协议的工作原理。

1、HTTP协议与SSDP协议
SSDP协议与HTTP协议在结构上非常相似,实际上,它们的相似之处主要在于协议内容的格式。然而,SSDP协议在使用时需要忽略端口和D类地址。
当我向其他员工或面试者解释时,我总是强调深入理解HTTP协议的重要性,因为掌握了HTTP协议,理解SSDP协议就变得相对容易。许多人可能会认为HTTP协议仅仅是GET、POST、PUT、DELETE等方法,但这只是冰山一角。我常问的一个问题是:“HTTP协议如何知道它已经结束了?”
大多数面试者对此问题回答得含糊不清,这确实令人惊讶。有些人会提到socket.close(),但实际上,关闭socket是因为你已经知道HTTP请求或响应已经结束,而不是因为关闭socket导致HTTP协议结束。HTTP协议内容部分的结束是由两个\r\n\r\n来标记的。对于二进制数据,则使用Content-Length字段来表示长度。
现在,让我们看看SSDP协议的实际应用:
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";这段代码代表了搜索所有设备的请求。在D类IP地址239.255.255.250的1900端口发送这个字符串,你应该能收到很多设备的响应信息,例如摄像头信息。然而,如果这段代码无法搜索到任何设备,可能是因为格式不正确。正确的写法应包含行结束符\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 = 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 = 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) { strRecv[iRet] = '\0'; printf("recv:%s\n", strRecv); } } closesocket(sock); WSACleanup(); return 0; }
通过上述代码,我们可以监听并接收来自其他设备的SSDP搜索请求,从而了解哪些设备正在尝试发现我们的服务。这对于在GB28181协议环境中管理和协调设备通信至关重要。
上一篇:UC浏览器调整页面缩放方法
下一篇:七猫小说如何退出登录 教程详解
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9