在本地网络中发现嵌入式设备?

3
我试图构建一台嵌入式设备,该设备将连接到路由器。但我希望能够使用PC或移动设备知道该设备是否已连接到路由器。
例如: PC如何检测Google Chromecast是否连接到同一网络?
我需要依次与网络中的每个IP通信并询问特定端口吗? 还是我需要让嵌入式设备每N秒广播一些信息?
谢谢。

稍微退后一步。该设备使用什么协议,如果是TCP,它是客户端还是服务器? - Martin James
一个场景可能是你知道嵌入式设备的网络地址(IP地址MAC地址),并且你尝试通过像ICMP这样的ping协议从PC或移动设备“ping”你的设备。如果该设备连接到路由器并在你的网络上可访问,则会“回显”。如果你在超时时间内没有收到“回显”消息,则该设备未连接。这对你适用吗? - xmojmr
2
在我的情况下,我希望嵌入式设备在不知道IP的情况下向网络介绍自己。此外,同一类型的多个设备可能存在于网络中,我希望明确地检测到它们。 - Xedar
1
嵌入式设备使用Wifi与路由器通信,是否有任何网络协议可以帮助该设备进行自我介绍? - Xedar
1
如果在您的设备和PC之间有太多的通用路由元素,可能会出现克服“跳跃”的一些问题。似乎您可以利用某种网络拓扑发现协议,例如http://en.wikipedia.org/wiki/Simple_Service_Discovery_Protocol或http://en.wikipedia.org/wiki/Secure_Neighbor_Discovery,一旦PC能够看到目标设备,则http://en.wikipedia.org/wiki/Simple_Network_Management_Protocol可能是以统一方式查询/更新设备配置的方法。 Android特定的答案? 有用的Google关键字? 我不知道。 - xmojmr
显示剩余2条评论
1个回答

3

无论如何,你应该考虑在嵌入式设备上执行自发的 ARP。自发的ARP会向局域网中的所有设备宣布新设备已加入,以便它们可以更新其ARP缓存。

至于PC /移动设备如何发现您的嵌入式设备,您有几个选项:

选项1

如果我们可以假设这是一个典型的家庭网络,其中所有设备都在单个子网上,并且有一个网关路由器*,那么您可以为嵌入式设备分配一个唯一的OUI。如果您打算销售此设备,则需要向IEEE申请OUI,除非制造芯片组的公司已经提供了MAC地址。您的PC /移动应用程序可以定期检查其ARP缓存,以查找与您期望的唯一OUI匹配的OUI。

如果网络不是平面的,有多个路由子网或VLANS,则此方法将无法正常工作。这里是可能的情况:假设您的嵌入式设备连接到客户端桥接器范围扩展器。如果您的PC /移动应用程序在主要接入点上,它永远不会看到嵌入式设备的MAC地址-相反,它将看到客户端桥接器的MAC地址。多个IP将映射到客户端桥接器,因为客户端桥接器和客户端桥接器将切换数据包。
*我将路由器一词放在斜体中,因为大多数家庭路由器仅在WAN / LAN之间执行NAT,而路由器的LAN侧则像第2层交换机一样运行。
选项2
您可以进行广播ping请求,例如ping xxx.xxx.xxx.255。您将从所有接受广播ping请求的设备那里收到响应。只需确保您的设备支持即可。然后,一旦您拥有IP地址列表,就可以尝试使用所选择的任意端口打开所有这些IP地址的TCP套接字,然后发送一些唯一的握手数据包。您的嵌入式设备应该在此端口上侦听,并且应该对此唯一数据包有某些唯一回复。大多数局域网上的设备通常不允许打开此套接字,但如果允许,则不应理解您发送的唯一握手消息。
选项3
发送一个带有独特握手负载的广播UDP数据报。然后,您的嵌入式设备应该向此广播UDP数据包的发送者回复一些独特的响应。在您的PC/Mobile应用程序接收到此响应后,您可以使用响应所来自的IP地址打开TCP套接字。

太好了,这应该会大大简化问题!另一个建议是,是否有意义通过发送“hello”消息来与每个IP上的特定端口通信,以查看它是否为设备。这是行业惯例吗?你的回答很棒,非常感谢! - Xedar
@Xedar 是的,你可以这样做,而且在工业界已经实现了。这正是我们在其中一个产品上所做的。该设备充当 WiFi 接入点,我们有一个特殊的应用层协议。我们尝试在给定端口上打开 TCP 套接字,如果成功,我们将发送第一个查询以启动会话,如果失败,我们将抛出异常并向用户显示一条消息,说明我们无法连接到设备。通常在此时,基于 SSID,可以安全地假设该设备是我们的设备之一,因此它已经在我们的 UI 设备列表中,但你明白我的意思。 - Nick
@Xedar 我有另一个想法。你可以发送一个广播 Udp 数据报 "hello",并让你的设备直接回复 "hi from sn1234" 给发送者。然后你就会拥有所有设备的 IP 地址,因为它们知道要响应那个数据报。然后你就可以开始你的 TCP 会话了。 - Nick
非常感谢你的帮助,现在这个想法在我的脑海中更加成熟了。请问能否把你最后的评论添加到答案中呢? - Xedar
@xedar,我重构了我的答案。 - Nick
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接