I have an Android app where I'd like to send data between 2 devices using Android's WiFi Direct P2P feature. My app is created based on WiFi Direct Demo. The problem is, I want to send data from the my server (group owner) to the client but some how connection is refused.
java.net.ConnectException: failed to connect to /192.168.49.1 (port 9999) from /192.168.49.195 (port 35364) after 2000ms: isConnected failed: ECONNREFUSED (Connection refused)
Code snippet pest is mentioned as below :
BroadCastReceiver :
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
} else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
if (mManager != null) {
mManager.requestPeers(mChannel, mPeersListener);
}
} else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
if (mManager == null) {
return;
}
NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
if (networkInfo.isConnected()){
WifiP2pGroup group = intent.getParcelableExtra(WifiP2pManager.EXTRA_WIFI_P2P_GROUP);
List<WifiP2pDevice> clientList = new ArrayList<>(group.getClientList());
mManager.requestConnectionInfo(mChannel, mConnectionInfoListener);
} else {
int c = 1;
}
} else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
}
}
Fragment code ::
class WifiDirectBottomSheetFragment : BottomSheetDialogFragment() {
....
var mHandler = Handler { message ->
when (message.what) {
1 -> {
val readBuff = message.obj as ByteArray
val msg = String(readBuff, 0, message.arg1)
if (!msg.isEmpty()) {
if (msg == SPECIAL_MSG || msg == PaymentStatus.PAYMENT_DECLINED) {
val disconnect = Disconnect()
disconnect.start()
Handler().postDelayed({ discoverPeers() }, 500)
} else {
}
LogWriter.write("Bottomsheet :: handleMessage : $msg")
}
}
}
true
}
@RequiresApi(Build.VERSION_CODES.S)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
...
mManager = requireActivity().getSystemService(AppCompatActivity.WIFI_P2P_SERVICE) as WifiP2pManager
mChannel = mManager!!.initialize(requireContext(), requireActivity().mainLooper, null)
WiFiDirectUtils.getInstance().manager = mManager
WiFiDirectUtils.getInstance().channel = mChannel
}
....
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init(view)
discover!!.setOnClickListener { discoverPeers() }
}
private fun discoverPeers() {
adapter!!.data = ArrayList()
progressMessage!!.text = ""
mManager!!.discoverPeers(mChannel, object : WifiP2pManager.ActionListener {
override fun onSuccess() {
status!!.text = "Discovery Started"
progressBar!!.visibility = View.VISIBLE
}
override fun onFailure(i: Int) {
status!!.text = "Failed to Start Discovery"
progressBar!!.visibility = View.INVISIBLE
}
})
}
private fun init(view: View) {
....
mIntentFilter = IntentFilter()
mIntentFilter!!.addAction(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION)
mIntentFilter!!.addAction(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION)
mIntentFilter!!.addAction(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION)
mIntentFilter!!.addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION)
discoverPeers()
}
override fun onResume() {
super.onResume()
Log.d("BottomSheet", "onResume")
mPeersListener = WifiP2pManager.PeerListListener { peerList ->
if (peerList.deviceList !== peers) {
peers!!.clear()
peers!!.addAll(peerList.deviceList)
}
if (peers != null && peers!!.isEmpty()) {
status!!.text = "No Device Found"
adapter!!.data = ArrayList()
} else {
status!!.text = peers!!.size.toString() + " Device found"
adapter!!.data = peers
}
progressBar!!.visibility = View.INVISIBLE
}
mConnectionInfoListener =
WifiP2pManager.ConnectionInfoListener { wifiP2pInfo ->
LogWriter.write("Connected to device : ${p2pDeviceName}")
showProgressView()
val groupOwnerAddress = wifiP2pInfo.groupOwnerAddress
isServer = wifiP2pInfo.groupFormed && wifiP2pInfo.isGroupOwner
progressMessage!!.text =
"Connected to " + p2pDeviceName
//CONNECTING WITH DEVICE
if (isServer!!) {
serverClass = ServerClass(mHandler)
serverClass!!.start()
isServer = true
} else if (wifiP2pInfo.groupFormed) {
// status.setText("Client");
clientClass = ClientClass(groupOwnerAddress, mHandler)
clientClass!!.start()
isServer = false
}
Handler().postDelayed({
val mySendReceive = MySendReceive(mVivaWalletUri)
mySendReceive.start()
}, 500)
}
mReceiver = WifiDirectBR(mPeersListener, mConnectionInfoListener)
requireActivity().registerReceiver(mReceiver, mIntentFilter)
}
override fun onPause() {
super.onPause()
requireActivity().unregisterReceiver(mReceiver)
}}
I use ServerClass, ClientClass, Disconnect, SendReceive, and MySendReceive classes from the demo