2016-04-24 10 views
3

クライアント - サーバーネットワークで20台以上のアンドロイドデバイスを接続する必要があります。各クライアントAndroidデバイスはサーバーAndroidデバイスと通信し、その逆もあります。クライアントデバイスは、互いに通信する必要はありません。 サーバーデバイスは、クライアントに接続している間、短期間インターネットにアクセスする必要があります。Wi-Fi P2Pに接続できるデバイスの数はいくつですか?

私の質問は、Wi-Fi P2Pが多くの接続を確実にサポートできるかどうかです。もしそうなら、私はそれらを実装するためにどうやって行くのですか? また、すべてのデバイスが同じWLAN上にあることを確認する必要がありますか?

+0

どのように2つのAndroid搭載端末間でwifi p2pを開始しますか?または、2つのアンドロイドデバイスで2つのアプリの間で?あなたはwifi P2Pで何を思いついていますか? – greenapps

+0

@greenapps:私はアンドロイドのドキュメント[here](http://developer.android.com/guide/topics/connectivity/wifip2p.html)に従って、サンプルコードを使って構築したいと考えていました。私はネットワークプログラミングに慣れていません。 UIを更新するクライアント/サーバー間の命令を送信するには、デバイスを接続する必要があります。 – Ritz

+0

私はあなたのリンクに従いません。わかりやすい説明文をここに投稿してください。 – greenapps

答えて

1

実際のAndroid Wi-Fi Directアプリケーションの展開では、20台のデバイスで問題になることはありません。

理論的には、GOがAndroidデバイスであるWi-Fi P2Pグループの最大デバイス数は254です。グループ所有者にはIP、192.168.49.1が割り当てられています。クライアントには、192.168.49.2〜192.168.49.254の範囲のIPが割り当てられます。

グループ所有者アドレスは、次WifiP2pServiceImpl.java中で定義される。

WifiP2pServiceImpl.javaにおいて、startDhcpServer(String intf)方法は、DHCPサーバを起動します。次のようにクライアントの範囲を決定

/* Is chosen as a unique address to avoid conflict with 
    the ranges defined in Tethering.java */ 
private static final String SERVER_ADDRESS = "192.168.49.1"; 

が行われ与えられたインターフェース - 驚きではありません。このメソッドは、グループが開始され、そのデバイスがグループ所有者であるときに呼び出されます。

このコードを詳しく見てみると、InterfaceConfigurationオブジェクトのリンクアドレスは192.168.49.1に設定され、プレフィックスの長さは24(プレフィックスの長さはサブネットマスクに設定されたビットの数です。ここでは255.255.255.0に相当) - これは答えを意味しますが、少し詳しく調べることができます。

ifcg = mNwService.getInterfaceConfig(intf); 
ifcg.setLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress(
        SERVER_ADDRESS), 24)); 
ifcg.setInterfaceUp(); 
mNwService.setInterfaceConfig(intf, ifcg); 

次に、次のコマンド文字列[]、tetheringDhcpRangesによって指定されたDHCP範囲と係留再起動します。 mNwService(Network Management Service)メソッドの呼び出しは、適切なnetdコマンドを実行します。

ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(
    Context.CONNECTIVITY_SERVICE); 
String[] tetheringDhcpRanges = cm.getTetheredDhcpRanges(); 
if (mNwService.isTetheringStarted()) { 
    if (DBG) logd("Stop existing tethering and restart it"); 
    mNwService.stopTethering(); 
} 
mNwService.tetherInterface(intf); 
mNwService.startTethering(tetheringDhcpRanges); 

そしてcm.getTetheredDhcpRanges()最終的に下記(ConnectivityManager.getTetheredDhcpRanges() - > ConnectivityService.getTetheredDhcpRanges() - > Tethering.getTetheredDhcpRanges())への参照である:

// USB is 192.168.42.1 and 255.255.255.0 
// Wifi is 192.168.43.1 and 255.255.255.0 
// BT is limited to max default of 5 connections. 192.168.44.1 to 192.168.48.1 
// with 255.255.255.0 
// P2P is 192.168.49.1 and 255.255.255.0 

private String[] mDhcpRange; 
private static final String[] DHCP_DEFAULT_RANGE = { 
    "192.168.42.2", "192.168.42.254", "192.168.43.2", "192.168.43.254", 
    "192.168.44.2", "192.168.44.254", "192.168.45.2", "192.168.45.254", 
    "192.168.46.2", "192.168.46.254", "192.168.47.2", "192.168.47.254", 
    "192.168.48.2", "192.168.48.254", "192.168.49.2", "192.168.49.254", 
} 

と:

mDhcpRange = context.getResources().getStringArray(
    com.android.internal.R.array.config_tether_dhcp_range); 
if ((mDhcpRange.length == 0) || (mDhcpRange.length % 2 ==1)) { 
    mDhcpRange = DHCP_DEFAULT_RANGE; 
} 

com.android.server.connectivity.Tethering

もちろん、デバイスメーカーがこのコードを変更することは可能ですので、これも検討する価値があります。

ユーザーが多い場所にアプリケーションを展開する予定の場合は、複数のデバイスをGOにするメカニズムが必要です。デバイス間でデータを同期させる必要がある場合は、「チャーン」をシミュレートしてGOをある期間GOにしてから、別のGOへのクライアントになり、データを同期させることができます。

0

デバイスをネットワークに接続してお互いに接続する必要はありません。 Wi-Fi Directにより直接接続することができます。ここで

は、あなたが役に立つかもしれないのWi-Fiダイレクトリソースのリストです:https://groups.google.com/forum/#!topic/wi-fi-direct/uWpuOzHY6y0

私はAndroidのService Discovery Demo以下をお勧めしますし、それを自分で実装してみたいです。デモ用のsource codeはここにあります。

1

私が知る限り、最大の数字は指定されていないので、それを確かめるためにテストする必要があります。また、ハードウェアに違いがあるかもしれません。

とにかく、基本的な実装はやや簡単です。サーバーはGreateGroupを呼び出すため、すべてのケースでGroupownerになります。そして、地元のサービス広告を開始します。クライアントは広告を探し、一度それを見ると、サーバーへの接続プロセスを開始します。サーバー接続がWifi経由で行われると、クライアントからサーバーへのソケット通信を開始するだけです(サーバーは常にソケットを待機します)。

クライアントがグループ所有者に接続しようとしたときに表示されるダイアログをユーザーがクリックする必要があることに注意してください。そして、あなたがこれを取り除きたいのであれば。次に、GreateGroupによって作成されたアクセスポイントを実際に使用して、アクセスポイント名とパスワードを広告に追加することができます。クライアントは実際にアクセスポイントを使用して(Wlanアクセスポイントと同様に)接続することができます。

Wifiの直接接続はWifiの接続を妨げることはありませんが、必要ではありません。しかし、アクセスポイントの方法は、クライアントからの既存のWifi接続が切断されることを意味し、そのデバイスは、サーバーへの接続が通常のインターネット接続を提供すると考えています。