要实现点对点通信,过程其实很简单,首先要建立连接,接着取得对方节点的ip地址,最后通过socket通信即可实现。
通过Android提供的WiFi直连技术,可获得同一WiFi下的设备列表,选择其中一台即可实现连接。
首先要在AndroidManifest.xml文件中添加权限,如下所示:
<uses-permission
android:required="true"
android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission
android:required="true"
android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission
android:required="true"
android:name="android.permission.INTERNET"/>
之后在activity中建立相应的广播接收器和点对点管理器
private final IntentFilter intentFilter=new IntentFilter();
WifiP2pManager.Channel mChannel;
private WifiP2pManager mManager;
private p2pReceiver receiverP2p;
.........
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
intentFilter.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
mManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
mChannel = mManager.initialize(this, getMainLooper(), null);
}
在onResume中注册此intentfilter和receiverP2p:
@Override
protected void onResume() {
super.onResume();
receiverP2p=new p2pReceiver(mManager,mChannel,SecondActivity.this);
registerReceiver(receiverP2p,intentFilter);
}
记得在onDestroy中解除广播:
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiverP2p);
}
发现周围设备:
mManager.discoverPeers(mChannel,new WifiP2pManager.ActionListener(){
@Override
public void onSuccess() {
}
@Override
public void onFailure(int reason) {
}
});
监听状态变化:
@Override
public void onReceive(final Context context, Intent intent) {
String action=intent.getAction();
//P2P功能是否打开
if(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)){
}
//可连接peer改变
else if(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)){
if(mManager!=null){
mManager.requestPeers(mChannel,peerListListener);
}
}
//P2P连接状态改变
else if(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)){
}
设备设置改变
}else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
}
peerListListener=new WifiP2pManager.PeerListListener() {
@Override
public void onPeersAvailable(WifiP2pDeviceList peerlist) {
//在这里可选择设备进行连接
}
};
}
设备连接方法如下:
private void connectPeer(WifiP2pDevice device) {
final WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
mManager.connect(mChannel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
//连接成功
}
@Override
public void onFailure(int reason) {
// 连接失败
}
});
}
通过以上步骤便可在两台Android设备之间建立连接,若要取得GroupOwner地址,在receiverP2p中的onReceive方法中,当intent.getAction()等于WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION时,代表P2P连接状态发生改变,此时可获得IP地址,方法如下:
NetworkInfo info=intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if(info.isConnected()){
mManager.requestConnectionInfo(mChannel, new WifiP2pManager.ConnectionInfoListener() {
@Override
public void onConnectionInfoAvailable(WifiP2pInfo info) {
String address=null;
if(info.groupFormed&&info.isGroupOwner){
address=info.groupOwnerAddress.getHostAddress().toString();
}else if(info.groupFormed){
address=info.groupOwnerAddress.getHostAddress();
}else {
}
}
});
}else {
}
注意:这里取得的ip地址永远是192.168.49.1,查看源码后发现这是info.groupOwnerAddress的默认值,但是这并不影响。在初次发送消息时,非GroupOwner设备将自己的实际ip地址及消息发送到192.168.49.1,GroupOwner设备即可获得另一台设备的ip地址,之后再将自己的ip地址发送给另一台设备,两台设备之间即可自由通信。