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

Posted

技术标签:

【中文标题】在没有互联网的情况下在多部手机之间传输数据的好方法(现有)是啥?【英文标题】:What are good ways (existing) to transmit data between multiple mobile phones without internet?在没有互联网的情况下在多部手机之间传输数据的好方法(现有)是什么? 【发布时间】:2016-02-09 10:02:14 【问题描述】:

背景

我有一个想法,要在度假时开发一款应用,该应用需要与具有相同应用的其他手机进行通信。在度假期间,这些手机可能并非全部都有互联网,因为漫游可能非常昂贵。数据不多:最大 500 kB 就足够了(在 json 中)。

每部手机都有一些其他手机都想知道的信息,但如果有帮助,这些信息可以存储在一部手机上(从现在开始为主手机),然后在回家后分享给其他手机互联网。

电话

android、iPhone 和 Windows Phone 我们不能假设他们有 NFC、IR 或 zigbee。只是几乎每部手机都有的硬件,比如蓝牙、摄像头、麦克风等。

我的想法

根据新信息更改的二维码:如果扫描第一部手机,则第二部手机的二维码包含来自第一部手机及其自身的数据,第三部手机具有来自第一部、第二部和第三部的数据(本身) 直到它到达保存所有数据的主电话。

数据传输通过我们听不到(或者我们可以)听到的声音。缺点是我不知道移动平台是否存在这样的东西,写它就像一个 3 年的硕士论文项目。

http://nearbytes.com

https://applidium.com

https://developer.chirp.io/

蓝牙。我们可以连接 8 台设备吗?工作是否一致(连接我的耳机也可能很麻烦,8 部手机同时尝试连接呢)

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

我将在问题中添加赏金以获得最佳解决方案 用一点代码参考(链接没问题)来解释它的答案总是比仅仅更好:“使用蓝牙人”

【问题讨论】:

我的回答中是否遗漏了什么? @CaptJak 别担心,我只是觉得在更多人有机会回答之前提供赏金不太好。 好的,没问题。我只是想知道我是否严重误解了您的问题(并且没有进行任何研究......):P. 【参考方案1】:

TL;DR

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

两个主要的智能手机操作系统(Android 和 ios)都有 API 和有关通过对等网络创建和传输数据的文档。

Android WiFi P2P

Apple Multipeer Connectivity

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

Windows 似乎没有允许连接多个对等点的 API,但它们的 Proximity Class 一次只能用于一台设备。


我可以概述每个主要操作系统中的不同选项:


安卓

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

来自他们的文档:

Wi-Fi 点对点 (P2P) API 允许应用程序连接到附近的设备,而无需连接到网络或热点(Android 的 Wi-Fi P2P 框架符合 Wi-Fi Direct™ 认证计划) . Wi-Fi P2P 允许您的应用程序在蓝牙功能之外的范围内快速查找附近的设备并与之交互。

Google 甚至在这个 API 上有 Documentation 和 training。


iOS

Apple 的Multipeer Connectivity。

他们声称与 Android 的 P2P API 非常相似:

Multipeer Connectivity 框架支持使用基础设施 Wi-Fi 网络、对等 Wi-Fi 和蓝牙个人区域网络发现附近 iOS 设备提供的服务,然后通过发送基于消息的数据与这些服务进行通信、流数据和资源(例如文件)。

这是一个不错的 tutorial 使用 Multipeer Connectivity。

--编辑--

另一种 iOS 方法是使用 GameKit,这有点误用(?)工具。

但是,我认为让它为您的目的工作可能会导致一些黑客攻击,因为“玩家”必须使用 Game Center。


Windows

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

他们说:

Proximity 是在两个不同设备上运行的应用的两个实例之间创建共享应用体验的好方法。


这些是每个主要移动设备操作系统中的选项。

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

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

李>

一旦确定了将要推送数据的设备组,该设备必须注册为服务器(在 Android P2P API 中,您可以建立“组所有者”),然后通过初始化服务开始寻找对等点。

然后,一旦设备连接到主设备,您就可以开始推送数据了。另一个好处是,在使用 Android WiFi P2P 时,所有通信都使用 WPA2 加密,而在 iOS 中,您可以使用 MCEnableEncryption 启用加密(但他们说这会降低数据传输速率)。

现在您只需选择一种方法,并确保所有手机都运行该操作系统。因为这三种连接方法不能一起使用。

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

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

【讨论】:

您好@CaptJak 是否可以使用 Peer2Peer android 连接多个设备?我试过了,但它对我没有帮助。任何帮助都将得到应用。 你好@AmitJayaswal。是的,这是可能的,正如我在上面的回答中所概述的那样。如果您在尝试实现此功能时遇到特定问题,我建议您发布一个新问题,说明您正在尝试实现什么,您尝试过什么,以及什么不正确。【参考方案2】:

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

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

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

【讨论】:

但是即使在 iOS 上,我也可以从我的应用程序启动/连接所有设备吗?谷歌搜索没有给出明确的答案,但实际上我担心苹果不会允许。对于“普通”用户(UX whise)来说,手工操作是不可行的 没有越狱就不行。但是您可以在您的主控手机上显示二维码,并在二维码中编码 wifi 名称、密码和主控 IP 地址。然后向用户解释如何连接。 如何设置热点本身?我希望即使是最受技术挑战的用户也能够使用我的应用 您可以使用 android 以编程方式设置热点。我不知道iOS上的情况。据我所知,您至少可以通过编程方式打开匹配设置屏幕 如果你为所有 3 个平台提供了一些不错的代码参考或示例,在这些平台上用户必须自己完成最少的工作,那么赏金可能就是你的了。【参考方案3】:

你检查过Alljoyn吗?

如引用:

“无论传输层、制造商如何,开发人员都可以编写互操作性应用程序,并且无需访问 Internet”

【讨论】:

请注意,连接的设备仍然必须在同一个网络上(不一定是互联网),所以必须先建立。【参考方案4】:

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

编辑 请注意,您必须使用任何网络连接您的设备。可以通过将设备初始化为 WiFi 路由器来连接设备。它可以是Android和iOS。如果可能,您可以将设备连接到任何 wifi 连接。 然后,将您的应用程序作为服务器套接字启动,其他作为客户端。 对于 Android (java) 服务器,请使用此链接: 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()));
) 

对于安卓设备客户端:

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

【讨论】:

如果您为所有 3 个平台提供了一些不错的代码参考或示例,用户必须自己完成最少的工作,那么赏金可能就是您的了。【参考方案5】:

更好的方法是使用 Ble。

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

好像你最多可以连接20台设备Maximum number of peripherals on CoreBluetooth?。

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

【讨论】:

感谢您的思考,但其中一项要求是:We can't assume they have NFC, IR or zigbee. Just the hardware almost every phone has like bluetooth, camera, microphone etc. BLE 尚未对所有人开放。【参考方案6】:

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

没有互联网的连接:

短信

USSD

DTMF(非常慢)

如何在 USSD 上设计跟踪设备在 M2M 物联网手册

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

您还可以将 Android 手机用作数据记录器并存储在 Micro SD 卡下并通过以下方式读取卡:

将 SD 卡更换到您的 PC

通过蓝牙在本地流式传输数据

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

或者可能:

您的应用可以使用 SMS API 来传输 DATA 或其他 SOURCES。

【讨论】:

SMS 在国外非常昂贵,据我所知,USSD 和 DTFM 不可编程(除了我认为没有理由会更好)。交换 SD 卡:对于 UX 来说太多了。蓝牙:请提供 8 部手机同时共享数据且运行良好的示例(因为我知道即使通过 BT 连接 2 台设备也可能很糟糕) 转发:它没有回答问题,我们想要数据在国外时至少有 1 部手机在使用的所有手机中。

以上是关于在没有互联网的情况下在多部手机之间传输数据的好方法(现有)是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有可信 SSL 证书的情况下在 Intranet 中运行 PWA?

是否有任何可能的方法可以在没有任何操作的情况下在互联网连接时自动关闭 android 小吃店(LENGTH_INDEFINITE)?

在 Swift 3 中使用 didSelect 和 navigationController 在没有情节提要的情况下在 TableViewControllers 之间传递数据

Azure Databricks:在没有 Internet 访问的情况下在虚拟网络下导入 PyPI 库

在没有显式命令的情况下在函数调用之间清除数组指针数据?

如何在没有互联网连接的情况下在android中获取当前纬度和经度?