我有2部Android手机,都连接到同一个wifi,都带有蓝牙。
我想要一些方法以某种方式同步手机并在两部手机上同时启动功能。
例如同时播放歌曲。
我已经尝试过使用蓝牙,但它有滞后,有时是0.5秒。如果可能的话,我想要+ - 0.01秒的东西。
有人建议将来播放时间为2-3秒,发送时间戳,但是如何同步设备的内部时钟呢?
答案 0 :(得分:4)
在调用该特定方法之前,请尝试测量两个设备之间的延迟:
1.首先设备说Hi(存储当前时间)
2.第二台设备收到Hi。
3.第二台设备回来嗨!!
4.第一台设备收到Hi。((storedTime - currentTime)/ 2)
现在您有延迟,将您的请求发送到第二台设备以启动您的特定方法,并在延迟后的第一台设备上启动它。
尝试将延迟测量5至10倍以更准确。
答案 1 :(得分:3)
你有办法在设备之间传输数据吗? 如果是这样你可以发送一个将来的时间戳, 例如:如果当前时间戳是1421242326,则发送1421242329或其他东西,然后在两台设备上启动该功能。
答案 2 :(得分:2)
基本上使用@Dula的建议(设备1向设备2发送命令并给出将来的“开始时间”)。然后两个设备同时(将来)启动操作。
要确保设备已同步,您可以使用基于服务器的时间同步(假设两个设备都可以访问Internet)。为此,每台设备都联系同一台服务器(使用NTP或基于HTTP的NTP,或联系已知的HTTP服务器,如www.google.com,并使用HTTP响应的“Date”标头中的值)。将“server-date”与设备上的系统时钟进行比较,差异是“与服务器时间的时间偏移”。时间偏移可用于在“服务器时间”上进行同步,然后将其用作实际操作的时间基准(播放媒体等)。
答案 3 :(得分:0)
如果您的WiFi路由器允许客户端相互通信(许多公共热点禁用此功能),您可以在一个(或每个)设备上实现一个简单的套接字侦听器,并让发起设备广播一条消息。
对于更复杂的事情和网络灵活性,我使用AllJoin在关联会话方面取得了很大成功。做有趣的事情有一点学习曲线,但是一旦理解了架构,简单的东西就很容易了。
答案 4 :(得分:0)
使用服务器向两个已声明其相互关联性的客户端提供同步事件(随机作为parm和对序列化程序Partner-1或Partner-2,在他们尊重同步事件的调用之前共享)
假设同一子网上的两个客户端(来自服务器上序列化的2个事件的数据包,在客户端同时通过网络到达2个客户端)这提供了2个绑定客户端的同步PLAY。
服务器发送的事件是确认播放排队的选定曲目或广播(解耦,更正式)
唯一棘手的事情是服务器端algorythm实现这个:
排队一对请求或错误
第1部分,具有相同随机值的第2部分构成有效对,如果两者都在超时之前收到。
在有效的对中安排两个相同的未来事件在他们各自的,已提交的响应中。
OnSchedule为2个配对请求执行实际IO。相应的数据包将同时返回各自的客户端,每个响应都受到相同的网络延迟
Ng如果涉及两个diff载波4G或lte网络。 (糟糕)
答案 5 :(得分:0)
这件事可以通过套接字,你将通过套接字发送一个事件,然后其他设备接收该事件。用于学习socket io chat
答案 6 :(得分:0)
也许它不是你想要的答案,但我认为由于你想要的高精度,你应该寻找推技术,我建议你看看SignalR。它是实时技术,可以为您提供发送方法的抽象,它有一些内置的方法,如Clients.All.Broadcast,可以满足您的需求。
答案 7 :(得分:-1)
您可以尝试使用某个MQTT框架在两个设备之间发送消息,或者在具有更多设备数量的集合中发送消息。