商城首页欢迎来到中国正版软件门户

您的位置:首页 >GB28181协议是什么?是否收费?

GB28181协议是什么?是否收费?

  发布于2025-07-31 阅读(0)

扫一扫,手机访问

在探讨GB28181协议的细节之前,让我们先了解一下与之相关的HTTP和SSDP协议的基本概念。这将帮助我们更好地理解GB28181协议的工作原理。

gb28181协议详解_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协议环境中管理和协调设备通信至关重要。

本文转载于:https://cloud.tencent.com/developer/article/2153318 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注