OGeek|极客世界-中国程序员成长平台

标题: ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 05:57
标题: ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机

我正在尝试为我的 iPhone 构建一个小程序,它可以检测本地网络上的设备(尤其是 IP 摄像机)。我知道其中一些支持协议(protocol),例如 UPnP,我也一直在尝试,但我现在想完全自己实现 iPhone 和相机之间的通信,而不依赖于库。

我的方法是将广播消息发送到本地网络并解析收到的响应。例如,为了检测本地网络上的 UPnP 设备,广播的消息需要具有以下内容:

M-SEARCH * HTTP/1.1\r\nHOST:255.255.255.255:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:1\r\n\r\n

我对 C 中的网络编程有点熟悉,所以我想用 C 编写通信代码,并在以后集成到我的 Objective-C 中。

我目前正在做以下事情:

// Create socket
int sd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

// Enable broadcast messaging
int broadcastEnable = 1;
int ret = setsockopt(sd, SOL_SOCKET, SO_BROADCAST, &broadcastEnable, sizeof(broadcastEnable));

// Configure the port and ip we want to send to
struct sockaddr_in broadcastAddr; // Make an endpoint
memset(&broadcastAddr, 0, sizeof broadcastAddr);
broadcastAddr.sin_family = AF_INET;
inet_pton(AF_INET, "255.255.255.255", &broadcastAddr.sin_addr); // Set the broadcast IP address
broadcastAddr.sin_port = htons(1900); // Set port 1900

// Create the broadcast UPnP request
char *request = "M-SEARCH * HTTP/1.1\r\nHOST:255.255.255.255:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:1\r\n\r\n";

// start the broadcast
success = sendto(sd, request, strlen(request), 0, (struct sockaddr*)&broadcastAddr, sizeof broadcastAddr);

现在,我被困在这一点上,因为我不知道如何处理任何答案。来自 UPnP 设备的回复会来自同一个套接字吗?我相信它应该能够使用 recvfrom() 的 recv() 接收传入的回复,但我不确定如何准确地实现它们。我必须创建一个新的套接字还是可以只创建一个现有的?套接字是否必须使用 bind() 绑定(bind)?



Best Answer-推荐答案


首先,您正在尝试发送 SSDP 数据包以进行服务发现。所以你应该将此数据包发送到组播地址 239.255.255.250 而不是 255.255.255.255。

除此之外,您可以在同一个套接字上接收对发现请求的响应。只需在此套接字上调用 recv() 函数即可。

此外,我希望您使用的是 Mac OS X(因为您正在为 iOS 开发),因此您已经安装了 Python。只需打开终端并输入 python 并复制粘贴以下 python 代码,

import sys
import socket

SSDP_ADDR = "239.255.255.250";
SSDP_PORT = 1900;
SSDP_MX = 1;
SSDP_ST = "ssdp:all";

ssdpRequest = "M-SEARCH * HTTP/1.1\r\n" + \
                "HOST: %s:%d\r\n" % (SSDP_ADDR, SSDP_PORT) + \
                "MAN: \"ssdp:discover\"\r\n" + \
                "MX: %d\r\n" % (SSDP_MX, ) + \
                "ST: %s\r\n" % (SSDP_ST, ) + "\r\n";

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(ssdpRequest, (SSDP_ADDR, SSDP_PORT))
print sock.recv(1000)

此代码将发送一个发现数据包并打印它从网络接收到的第一个响应。我只是分享此代码,因为即使您不了解 python,您也可以轻松地对其进行测试并理解代码。当然,这可以很容易地翻译成 C。

希望对你有帮助。

关于ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138530/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4