在没有互联网的情况下在多部手机之间传输数据的好方法(现有)是什么?

What are good ways (existing) to transmit data between multiple mobile phones without internet?

背景

我有一个度假应用程序的想法,它需要与其他 phone 使用相同应用程序进行通信。在度假时,这些 phone 可能并不都拥有互联网,因为漫游可能非常昂贵。数据不是很多:最多 500 kB 就足够了(json)。

每个 phone 都有一些其他 phone 想知道的信息,但如果有帮助,可以将信息存储在 1 phone(主 phone 从现在开始)并稍后在通过互联网回家时与其他 phone 分享。

Phones

Android、iPhone 和 Windows Phone 我们不能假设他们有 NFC、IR 或 zigbee。只是硬件几乎每个 phone 都有,比如蓝牙、摄像头、微型 phone 等

我的想法

所有这些想法都有很大的缺点。也许我忽略了更好的方法。

我会为问题添加赏金以获得最佳解决方案 用一点代码参考来解释它的答案(link 没问题)总是比仅仅更好:"use bluetooth man"

更好的方法是使用 Ble。

连接电话更容易,因为您不需要用户确认。

您似乎最多可以连接 20 台设备Maximum number of peripherals on CoreBluetooth?

传输 500KB 应该需要几分钟(可能在 2 到 5 之间)。

不要尝试二维码或声音。我认为传输500kb的数据会很痛苦。 蓝牙似乎是一个很好的解决方案,但正如您已经说过的那样,可能很难配置。

你觉得wifi怎么样?
至少每个 Android 和 iPhone 设备都可以创建移动 wifi 热点。通过使用它,您可以轻松地设置一个环境,其中 8 台设备在同一局域网中(无需通过任何设备使用互联网)。

现在您的 "master phone" 运行一个简单的服务器来同步数据(就像互联网服务器一样)。七个客户端中的每一个都可以通过扫描一个简单的二维码或发送一条短信来接收您主人的IP地址,然后进行相应的配置。

您可以在设备之间创建 Wifi 连接。连接后,它会在您的设备之间创建本地网络。在这个网络中,您当然可以使用 TCP/IP 连接在您的设备之间进行交互。它适用于 Android 和 iOS。只需在一台设备上将您的应用程序作为服务器启动

编辑 请注意,您必须使用任何网络连接您的设备。可以通过将您的设备初始化为 WiFi 路由器来连接设备。它可以是 Android 和 iOS。如果可能,您可以将设备连接到任何 wifi 连接。 然后,将您的应用程序作为服务器套接字启动,其他应用程序作为客户端启动。 对于 Android (java) 服务器使用此 link: https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

try ( 
    ServerSocket serverSocket = new ServerSocket(portNumber);
    Socket clientSocket = serverSocket.accept();
    PrintWriter out =
        new PrintWriter(clientSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream()));
) {

对于 android 设备客户端:

try (
    Socket kkSocket = new Socket(hostName, portNumber);
    PrintWriter out = new PrintWriter(kkSocket.getOutputStream(), true);
    BufferedReader in = new BufferedReader(
        new InputStreamReader(kkSocket.getInputStream()));
)

iOS (Objective-C) 的想法相同: 服务器 https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/UsingSocketsandSocketStreams.html#//apple_ref/doc/uid/CH73-SW8

和客户: https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/UsingSocketsandSocketStreams.html#//apple_ref/doc/uid/CH73-SW4

您可以在没有互联网的情况下通过 GPS 跟踪 Android 设备。

没有互联网的连接:

  • 短信

  • USSD

  • DTMF(很慢)

如何在 USSD 上设计跟踪设备在 M2M 物联网指南

How to develop a device based on Wireless Wide Area Network modules

您也可以将Androidphone用作数据记录器,存储在Micro SD卡下,通过以下方式读取卡:

  • 正在将 SD 卡更换到您的 PC

  • 通过蓝牙在本地传输数据

  • 在家通过Wi-Fi转发数据

或者可能:

您的应用可以使用 SMS API 传输数据或其他来源。

TL;DR

让多个设备相互连接的最简单(也是最受支持)的方法是使用 WiFi。由于您的目标是在没有互联网的情况下实现数据传输 运行sfer,因此最吸引人的解决方案是使用 Peer-to-Peer 网络结构。

两大智能手机 OS(Android 和 iOS)有 API 和关于创建和传输数据的文档运行通过对等网络。

这两个也有加密传输数据的方法运行。

Windows 似乎没有 API 允许多个对等点连接,但它们的 Proximity Class 一次可以为一台设备工作。


我可以概述一下每个专业的不同选项OS:


Android

Android 的 WiFi P2P(点对点)API 是为 运行 在没有互联网或其他网络的情况下传输数据而创建的。

来自他们的文档:

The Wi-Fi peer-to-peer (P2P) APIs allow applications to connect to nearby devices without needing to connect to a network or hotspot (Android's Wi-Fi P2P framework complies with the Wi-Fi Direct™ certification program). Wi-Fi P2P allows your application to quickly find and interact with nearby devices, at a range beyond the capabilities of Bluetooth.

Google 甚至在 API 上有 Documentation and training


iOS

苹果的 Multipeer Connectivity.

非常类似于Android的P2P API,他们声称:

The Multipeer Connectivity framework provides support for discovering services provided by nearby iOS devices using infrastructure Wi-Fi networks, peer-to-peer Wi-Fi, and Bluetooth personal area networks and subsequently communicating with those services by sending message-based data, streaming data, and resources (such as files).

这是关于使用 Multipeer Connectivity 的 tutorial 看起来不错的。

--编辑--

另一种 iOS 方法是使用 GameKit.

,有点误用(?)该工具

但是,我认为要让它为您的目的工作可能会导致一些破解,因为 "players" 必须使用 Game Center。


Windows

在 Windows Phone 中连接手机的唯一方法(显然)是使用 Proximity,但是,您只能选择连接不超过两部手机在一起。

他们说:

Proximity is a great way to create a shared app experience between two instances of your app running on two different devices.


这些是每个主要移动设备 OS 中的选项。

应用程序使用情况可能类似于:

  • 决定哪个设备将成为 "master",以便其他设备可以连接到它。在部署应用程序之前不需要知道这一点,但应该有一种方法让用户决定他是要成为客户端(接收数据)还是服务器(推送数据)。

  • 一旦在要推送数据的设备组之间做出决定,该设备就必须注册为服务器(在 Android P2P API,可以建立一个"group owner"),然后通过初始化服务开始寻找peer

  • 然后,一旦设备连接到主设备,就可以开始推送数据了。一个额外的好处是,当使用 Android WiFi P2P 时,所有通信都使用 WPA2 加密,并且使用 iOS,您可以使用 MCEnableEncryption 启用加密(但是他们说这会减慢数据传输速度运行传送率)。

现在您只需选择一种方法,并确保 OS 的所有电话 运行。因为这三种连接方法不能一起工作。

列出的所有三种方法都是以编程方式完成的,因此您的用户不应该做任何繁琐或奇怪的事情。搜索其他设备、连接和传输数据运行都可以在您的应用程序中完成。

如果问题缩小到特定问题,则可以提供更多帮助,但这应该足以帮助您入门。

你检查过Alljoyn了吗?

引述:

"Developers can write applications for interoperability regardless of transport layer, manufacturer, and without the need for Internet access"