在多个Android设备之间发送数据

时间:2013-11-26 10:32:12

标签: android networking wifi p2p

我需要一种在双向约50英尺内的多个Android设备之间发送数据的方法。 基本上这个想法是,一个设备向该区域内的所有其他设备发送少量数据,而所有其他设备发回少量数据。

经过几个小时的研究,我遇到了多种实现方法:Wi-Fi p2p,外部服务器等。

据我所知,Wi-Fi P2P只允许你一次连接到一个设备,这不是我想要完成的,因为我需要设备同时与多个设备通信。此外,这种方式限制了我的应用程序强制设备在同一个无线网络中。

使用外部服务器将允许尽可能多的设备彼此通信,但我不知道一个设备如何使用此方法检测附近的设备。我想也许设备可以将他们的坐标传达给服务器并让服务器分析连接设备的接近程度,但我并不完全确定。

我对Android编程以及网络编程都很陌生,所以任何有助于指导我正确方向的帮助都会受到赞赏。

谢谢。


编辑:

这是我到目前为止所拥有的。它还没有网络元素。它只是访问股票音乐应用程序并检索当前的曲目信息。我希望能够将此信息发送到附近的所有设备。

public class MainActivity extends Activity {

public static final String SERVICECMD = "com.android.music.musicservicecommand";
public static final String CMDNAME = "command";
public static final String CMDTOGGLEPAUSE = "togglepause";
public static final String CMDSTOP = "stop";
public static final String CMDPAUSE = "pause";
public static final String CMDPREVIOUS = "previous";
public static final String CMDNEXT = "next";
public String song_artist = "";
public String song_track = "";
public String song_album = "";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    IntentFilter iF = new IntentFilter();
    iF.addAction("com.android.music.metachanged");
    iF.addAction("com.android.music.playstatechanged");
    iF.addAction("com.android.music.playbackcomplete");
    iF.addAction("com.android.music.queuechanged");

    registerReceiver(mReceiver, iF);    
}

private BroadcastReceiver mReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent)
    {
        String action = intent.getAction();
        String cmd = intent.getStringExtra("command");
        Log.d("mIntentReceiver.onReceive ", action + " / " + cmd);
        String artist = intent.getStringExtra("artist");
        String album = intent.getStringExtra("album");
        String track = intent.getStringExtra("track");
        TextView music_info = (TextView) findViewById(R.id.musicview);
        music_info.setText("Track: "+track+
                            "\nArtist: "+artist+
                            "\nAlbum: "+album);
    }
};
}

1 个答案:

答案 0 :(得分:1)

我刚刚做到了这一点。这可能对你来说太过分了,但对我们来说是必需的,所以无论如何共享。我写了一个TCP服务器,它对命令做出了反应。不幸的是,这并不理想,因为它不够对话。我之后选择了XMPP。使用OpenFire XMPP服务器(http://www.igniterealtime.org/projects/openfire/)(想想谷歌的云消息服务) - 我创建了一个小型客户端机器人,它仍然作用于命令并发送回每个请求信息的设备。您也可以向所有连接的客户进行大规模广播。设置起来是多么容易,实在令人震惊。

您还需要适用于Java / Android应用程序的API,可在此处找到:http://www.igniterealtime.org/projects/smack/

它确实增加了中间人服务器的开销,但所有设备都能轻松通信,如果任何设备“离线”(无论出于何种原因),服务器将汇集消息并发送一次他们已经重新联系了。

希望这有帮助!

RE:每个设备的位置,你可以发送地理位置坐标,并有一个小算法计算出更精细的细节。这至少是一个开始。