1

我必须将数据从一台 Android 设备发送到许多其他 Android 设备。这可能是一种单向通信,因为发送方会将数据“推送”到接收方,接收方接收数据,对其进行一些修改并保存本地副本。

我环顾了网络(包括stackoverflow)并意识到那里有许多解决方案:wifi P2P,通过服务器发送数据等。理想情况下,我想做wifi P2P,但恐怕我的硬件不支持因此,我正在考虑使用无线热点功能。

所以这里有一个问题:想象将广播 wifi 热点的设备作为“主设备”,而连接到它的设备作为“从设备”(它只是从主设备接收数据)。如何将数据从主机(一台设备)广播到从机(多台设备)?我是网络/套接字编程的新手,所以一个简单的解决方案和大量示例将非常有用。此外,可以安全地假设用户将手动连接到 wifi 热点(进入设置、找到正确的 SSID、连接等),并且应用程序应该只发送数据。

非常感谢您的宝贵时间!

4

3 回答 3

1

除了wifi,你也可以试试蓝牙,或者NFC。所有这些的问题是它们都需要相当多的设置,启用这个和那个。

NFC 非常酷,而且设置相对容易。可能值得一试。

根据您发送的数据,您还可以做一些神奇的事情,例如通过 SMS 对它们进行编码,或者创建一个 2D 条形码,然后另一部手机通过摄像头对其进行扫描。


现在如果你真的要广播,它与热点无关。您只能使用 UDP,并将其广播到您的子网。其他客户端应该正在侦听端口,他们只会得到它。做一些谷歌搜索,看看如何使用套接字发送广播。

于 2013-10-05T06:35:03.533 回答
1

下面的示例显示了一种完成您想要完成的工作的方法。通过对其进行试验,您至少会感觉到它在工作时的样子。

+---------+    +---------+    +---------+
| Receive |    | Receive |    |  Send   |
| Browser |    | Browser |    | Browser |
+----+----+    +----+----+    +----+----+
     |              |              |
     |              |              |
     +-------+------+--------------+        +---------+
             |                              | telnet  |
             |   +--------------------------+  CLI    |
             |   |                          | session |
             |   |                          +---------+
          +--+---+--+
          | Accord  |    +------------------------+
          | Cloud   +----+ C/Java/Perl/Python etc |
          | Service |    | Program Language APIs  |
          +---------+    +------------------------+

有几种方法可以在浏览器和 Web 服务之间建立双向通信通道。例如 WebSocket、AJAX 等。

在下面的示例中,当单击发送按钮时,下面的发送浏览器会发送输入的文本。

在此处输入图像描述

当接收浏览器收到通知时,它会使用计数器值和新的文本字符串更新浏览器内容。每次收到更新时,它都会递增计数器。

在此处输入图像描述

在下面的 send.html 和 receive.html 代码中,Accord.js 在浏览器和 Accord 云服务之间建立了一个通信通道。发送和接收浏览器使用 ActiveML(JSON 和 XML 元语言的混合体)与 Accord 云服务交互。

prompt> cat send.html
<html>
<head>
<title>Accord Software, Inc.</title>
<link rel="icon" href="/favicon.gif"/>
</head>
<body>
<script type="text/javascript" src="http://ac.accord.com/src/Accord.js"></script>
<script type="text/javascript">
var rpc; 

function run() {
    if (typeof AccordAmlHttpRpc != 'function' ||
                    typeof checkSessionId != 'function') {
        setTimeout(function(){run();}, 100);
        return;
    }

    rpc = new AccordAmlHttpRpc();
}

/*
 * Send the text string when 'Click to Send' button is acted upon.
 * This ActiveML command will update the string value and any
 * sessions that have outstanding 'wait for an update' will unblock
 * and receive the update notification.
 */

function sendMessage() {
    var elem = document.getElementById("SendMsg");

    rpc.call('aml set string Demo.Msg = "' + elem.value + '";');
}

run();
</script>
<br>
Enter text: 
<input id="SendMsg" type="text" value="" maxlength="50" />
<button onclick="sendMessage()">Click to Send</button>
</body>
</html>

prompt> cat recv.html
<html>
<head>
<title>Accord Software, Inc.</title>
<link rel="icon" href="/favicon.gif"/>
</head>
<body>
<div id="Page"></div>
<script type="text/javascript" src="http://ac.accord.com/src/Accord.js"></script>
<script type="text/javascript"> 
var rpc; 
var div = document.getElementById('Page');

/*
 * Display the string and increment counter.
 */

var count = 0;

function DisplayMsg(s) {
    div.innerHTML = count + ': ' + s;
    count++;
}

/*
 * Event is received as 'ActiveML set string Demo.Msg = "hello, world";' 
 */

function RecvMsg(s) {
    var eq = s.indexOf(' = ');

    /* 
     * Remove quotes and semico at the end.
     */

    s = s.substring(eq+4, s.length-2);

    DisplayMsg(s);
}

/*
 * DisplayString() is called initially to display the current value
 * followed by RecvMsg() for each subsequent update.
 */

function run() {
    if (typeof AccordAmlHttpRpc != 'function' ||
                    typeof checkSessionId != 'function') {
        setTimeout(function(){run();}, 100);
        return;
    }

    rpc = new AccordAmlHttpRpc();

    /*
     * Communication with the back-end service by using
     * ActiveML.
     */

    rpc.call('aml print string Demo.Msg;', DisplayMsg, RecvMsg);
    rpc.call('aml wait for an update to print string Demo.Msg;', 0, 0);
}

run();
</script>
</body>
</html>

为了让浏览器与 Accord Cloud Service 通信,需要从每个浏览器登录。您可以通过单击 ac.accord.com 上的登录按钮来创建一个临时免费帐户来尝试一下。创建帐户后,您需要远程登录到 ac.accord.com 并在执行任何“发送”或“接收”之前执行以下操作。在 Windows 上下载并使用 PuTTY。在 linux/bsd 上使用 telnet。

prompt> telnet ac.accord.com
Connected to ac.accord.com.
Escape character is '^]'.

Accord ActiveML - Version 1.0.0.0
Copyright (c) 2001-2013, Accord Software, Inc. All rights reserved.

ActiveML Uid: <email>
Password: <password>

Welcome !

aml> create aobject Demo;
aml> create string Demo.Msg;
aml> set string Demo.Msg = "hello, world";

每次从“发送”浏览器或通过 telnet CLI 接收到设置命令时,“接收”浏览器都会更新它们的显示。

除了使用 telnet CLI 模式外,您还可以使用 C/C++、Java、Perl、Python 等各种编程语言与雅阁云服务进行交互。

如果此任务有预算,则基于订阅的解决方案可能值得评估。订阅基于云的解决方案可能是一种具有成本效益的解决方案。(有时它的成本可能低于您在咖啡上的花费!)。披露:我为雅阁工作。

于 2013-10-20T18:37:55.120 回答
0

热点本质上是网络设备。他们通常不知道应用程序在做什么。

为了将数据从一个设备发送到许多其他设备,您将需要一个服务器,您“提交”或“发送”数据,然后服务器会将数据“推送”给连接到服务器的所有其他用户并表达有兴趣接收更新。

我已经实现了一个解决方案,正是这样做的。如果你想让我在这里发布示例代码,请告诉我。然后,您可以玩耍并了解实现它所涉及的内容。您可以使用基于浏览器的设备/远程登录会话来查看它是否正常工作。

于 2013-10-04T23:42:59.227 回答