• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在 LAN 中广播 UDP 消息以检测 IP 摄像机

[复制链接]
菜鸟教程小白 发表于 2022-12-13 05:57:22 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试为我的 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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap