如何在Wi-Fi设备之间同步数据

11

我正在开发一款iOS和Android的应用程序。基本功能是在Wi-Fi网络中保持一组特定数据在所有设备之间同步,而无需中央服务器。每个设备都可以修改该组数据。

目前的方法是通过Bonjour/Zeroconf发现其他设备,然后通过ZeroMQ将“更改消息”发送到所有设备。

由于这两个框架实现起来存在很多问题,因此我想问这是否是实现这一功能的正确方式。

我使用Bonjour和HTTP请求向所有设备发送大部分逻辑。问题在于即使进行了三次尝试,仍然无法接收到网络请求,因为网络失败。我希望有一种重建一般状态或更可靠的消息框架的方法。

使用某种流言飞舞(Gossip)方法来扩散信息并发现所有设备是否会更好?


分散化始终是一个问题,你无法做太多改变。我只会选择网络中的一个设备,然后它将作为服务器,并且所有其他设备都与该设备通信。这确实使事情变得更容易,但我仍然不认为它很容易。您可以展示一些相关代码或更详细地解释一下您尝试过什么以及出了什么问题吗? - Xaver Kapeller
我意识到这一点,但你不能否认,在分散的网络中,尝试有一些事务一致性要比这容易得多。如果没有人来决定每个更改的顺序和有效性,那么你将会遇到无法解决的问题。想象一下,同时在两个不同的设备上进行了两个修改。谁决定修改是否可能(想象它们正在修改同一件事情)。谁决定哪一个在先。如果没有中央机构来做出这些决定,那么你会遇到很多麻烦。 - Xaver Kapeller
我理解你的意思,但是在我的数据集中,有一个项目列表,每个用户可以对一个项目进行投票或不投票,因此设备之间没有直接冲突。 - Lukas Leitinger
最可靠的方法是设备与一个专用设备通信。如果它们修改了某些内容,服务器会决定是否可能,并且如果可以,服务器会将其同步到其他设备。如果服务器消失,则选择另一个设备,从那时起充当服务器。当然,这里棘手的部分是选择服务器和所有这些内容,但只要你做对了,我认为你会发现它比其他选项容易得多。 - Xaver Kapeller
好的,谢谢你的帮助! - Lukas Leitinger
显示剩余13条评论
3个回答

6

简单的方案并不能完全满足所有要求。

既不能像 "Survey (Everybody Votes)"(图示来自 nanomsg.org)中那样临时变成服务器以决定更改,也不能像"Bus Pattern"中的节点联盟角色对称性一样满足所有要求。

Survey / Vote Pattern

Bus / Routing Pattern


持续发现“阶段”

是一项持续的自我识别任务,以便为节点联盟提供有关在投票期间等待哪些人和不等待哪些人的相关信息。反之,当公平地广播 <aListITEM> 更改并期望其联盟内的节点支持投票时。

Pieter Hintjens 的 400 多页书籍 The ZeroMQ Guide - for Python Developers, Chapter 8.3 将为您提供有关自主预防性和/或协作发现的初始见解,以及前几章节中有关 WiFi 的一些评论。还请注意,在 >>> Limitations on WiFi SSID L3 ARP based discovery 中有关 ISO-OSI-L2/L3 不确定性的结论。


<aListITEM> 更改在当前节点联盟中的传播方法

只是要在节点联盟内部实现的另一个子协议(层)。

sub-protocol

总线或某些混合可扩展正式通信模式与“Survey”投票是否满足所有要求?

可能是,也可能不是。

首先列出所有要求,以便能够针对此强制功能集进行设计。

其次,验证该功能集对于每个动态成为/停止成为节点联盟成员的节点都是合法且可行的。

第三,设计非阻塞、自恢复的社区——一个具有适当的握手、重新同步/看门狗/超时和 <aListITEM> 更新和投票机制传播的高阶-FSA-of-FSAs——以满足强制设计特征集。

不要依赖现成的基元(以满足库可用的基元为代价"弯曲"强制设计特征集,而是开发另一种新的、更高阶的正式通信模式信号,从库基元中组装而成,以满足整个规范。)


谢谢您详尽的回答,但我认为最好的方法是使用AllJoyn。如果我能让它正常工作,我相信这比从头开始编写自己的协议要简单得多(无论从哪个层面开始)。 - Lukas Leitinger

2

我不知道你的问题具体是什么,但是:

  • 如果你没有大量的数据
  • 如果你的更新不是非常频繁(> 1 req/s)

一个广播UDP消息是否可行?

如果你查询网络并获取广播地址,那么这可能是一种在不需要将信息单独发送到每个设备的情况下分发/查询信息的简单方法。当然,UDP不可靠,因此您需要实现某种“查询”机制,在该设备重新连接到网络时会要求更新。

我能想到的唯一其他更可靠的选项是使用平台的推送通知。在这种情况下,苹果/谷歌将确保您的消息被传送,您的工作只是保留“组”中设备的列表(例如在同一个wifi上)。但是,这个解决方案再次包括拥有一个中央服务器,甚至更多的是访问互联网。


我没有太多的数据(只有文本),但请求非常快,并且每个设备可以自行发送超过1个请求/秒。我还会继续研究它。 - Lukas Leitinger

1
实现客户端服务器的可靠工作可能非常具有挑战性,特别是跨平台; 总似乎还有一个需要解决的边缘情况。与其重建轮子,我建议使用已经解决了所有问题的现有库。我尚未将其用于除原型之外的任何内容,但 AllJoyn 开源项目 看起来非常有前途。另一个选项是 Google Nearby APIs,目前仅适用于 Android 和 iOS。

我已经有几个人提议使用AllJoyn,看起来很有前途,我一定会去了解一下! - Lukas Leitinger
页面未找到异常 :( - Ranjithkumar
我更新了链接并添加了一个指向Google Nearby的参考/链接。 - scottt

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