Http Server / Client communication #7
3 changed files with 145 additions and 71 deletions
|
@ -3,7 +3,40 @@
|
|||
<component name="deploymentTargetDropDown">
|
||||
<value>
|
||||
<entry key="app">
|
||||
<State />
|
||||
<State>
|
||||
<targetSelectedWithDropDown>
|
||||
<Target>
|
||||
<type value="QUICK_BOOT_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="VIRTUAL_DEVICE_PATH" />
|
||||
<value value="$USER_HOME$/.android/avd/Very_Small_API_34_2.avd" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</targetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2024-03-22T12:51:27.914541423Z" />
|
||||
<targetsSelectedWithDialog>
|
||||
<Target>
|
||||
<type value="QUICK_BOOT_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="VIRTUAL_DEVICE_PATH" />
|
||||
<value value="$USER_HOME$/.android/avd/Micro_API_26.avd" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
<Target>
|
||||
<type value="QUICK_BOOT_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="VIRTUAL_DEVICE_PATH" />
|
||||
<value value="$USER_HOME$/.android/avd/Very_Small_API_34_2.avd" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</targetsSelectedWithDialog>
|
||||
</State>
|
||||
</entry>
|
||||
</value>
|
||||
</component>
|
||||
|
|
|
@ -2,6 +2,32 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools">
|
||||
|
||||
<!-- SDK -->
|
||||
|
||||
<uses-sdk
|
||||
android:minSdkVersion="14"
|
||||
tools:ignore="GradleOverrides" />
|
||||
|
||||
<!-- Permissions -->
|
||||
|
||||
<!-- Internet -->
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
<!-- Internet < Android 13 (API 33) -->
|
||||
<uses-permission
|
||||
android:name="android.permission.ACCESS_FINE_LOCATION"
|
||||
android:maxSdkVersion="32" />
|
||||
<!-- Internet >= Android 13 (API 33) -->
|
||||
<uses-permission
|
||||
android:name="android.permission.NEARBY_WIFI_DEVICES"
|
||||
android:usesPermissionFlags="neverForLocation"
|
||||
tools:targetApi="s" />
|
||||
|
||||
<!-- Applications -->
|
||||
|
||||
<application
|
||||
android:allowBackup="true"
|
||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||
|
@ -10,6 +36,7 @@
|
|||
android:label="@string/app_name"
|
||||
android:roundIcon="@mipmap/ic_launcher_round"
|
||||
android:supportsRtl="true"
|
||||
tools:ignore="RtlEnabled"
|
||||
android:theme="@style/Theme.Tasksvalider"
|
||||
tools:targetApi="31">
|
||||
<activity
|
||||
|
|
|
@ -1,24 +1,19 @@
|
|||
package com.faraphel.tasks_valider
|
||||
|
||||
import android.content.Context
|
||||
import android.net.wifi.p2p.WifiP2pConfig
|
||||
import android.net.wifi.p2p.WifiP2pManager
|
||||
import android.net.wifi.p2p.WifiP2pManager.ActionListener
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import androidx.annotation.RequiresApi
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.room.Room
|
||||
import androidx.room.RoomDatabase
|
||||
import androidx.sqlite.db.SupportSQLiteDatabase
|
||||
import com.faraphel.tasks_valider.database.Database
|
||||
import com.faraphel.tasks_valider.database.entities.Group
|
||||
import com.faraphel.tasks_valider.database.entities.GroupStudent
|
||||
import com.faraphel.tasks_valider.database.entities.Student
|
||||
import com.faraphel.tasks_valider.database.entities.Task
|
||||
import com.faraphel.tasks_valider.database.entities.TaskGroup
|
||||
import com.faraphel.tasks_valider.database.entities.Teacher
|
||||
import com.faraphel.tasks_valider.ui.widgets.WidgetTaskStudent
|
||||
import java.time.Instant
|
||||
import java.net.InetAddress
|
||||
import java.net.InetSocketAddress
|
||||
import java.net.ServerSocket
|
||||
import java.net.Socket
|
||||
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
|
@ -31,69 +26,88 @@ class MainActivity : ComponentActivity() {
|
|||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
// Reset the database
|
||||
this.deleteDatabase("local") // TODO: remove
|
||||
|
||||
// Create the database
|
||||
database = Room.databaseBuilder(
|
||||
this.applicationContext,
|
||||
Database::class.java, "local"
|
||||
)
|
||||
.allowMainThreadQueries() // TODO: remove
|
||||
.build()
|
||||
|
||||
|
||||
// Create some data
|
||||
val studentDao = database.studentDao()
|
||||
studentDao.insert(
|
||||
Student(firstName = "John", lastName = "Joe"),
|
||||
Student(firstName = "Evan", lastName = "Doe"),
|
||||
Student(firstName = "Xavier", lastName = "Moe"),
|
||||
)
|
||||
|
||||
val teacherDao = database.teacherDao()
|
||||
teacherDao.insert(
|
||||
Teacher(firstName = "Jean", lastName = "Voe")
|
||||
)
|
||||
|
||||
val groupDao = database.groupDao()
|
||||
groupDao.insert(
|
||||
Group(name = "Group 1"),
|
||||
Group(name = "Group 2"),
|
||||
)
|
||||
|
||||
val groupStudentDao = database.groupStudentDao()
|
||||
groupStudentDao.insert(
|
||||
GroupStudent(1, 1),
|
||||
GroupStudent(1, 2),
|
||||
GroupStudent(2, 3),
|
||||
)
|
||||
|
||||
val taskDao = database.taskDao()
|
||||
taskDao.insert(
|
||||
Task(title = "Task 1", description = "Do something"),
|
||||
Task(title = "Task 2", description = "Do something else"),
|
||||
Task(title = "Task 3", description = "Do something nice"),
|
||||
)
|
||||
|
||||
val taskGroupDao = database.taskGroupDao()
|
||||
taskGroupDao.insert(
|
||||
TaskGroup(1, 1),
|
||||
TaskGroup(2, 2, true, 1, Instant.now()),
|
||||
)
|
||||
// ----- CONNECTION
|
||||
|
||||
/*
|
||||
val intentFilter = IntentFilter()
|
||||
|
||||
// display some data
|
||||
this.setContent {
|
||||
Column {
|
||||
database.taskGroupDao().getAll().forEach { taskGroup ->
|
||||
WidgetTaskStudent(database, taskGroup)
|
||||
}
|
||||
}
|
||||
}
|
||||
// Indicates a change in the Wi-Fi Direct status.
|
||||
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)
|
||||
|
||||
this.registerReceiver(MyBroadcastReceiver(this), intentFilter)
|
||||
*/
|
||||
|
||||
// get the WiFi direct manager
|
||||
val manager: WifiP2pManager? = this.getSystemService(Context.WIFI_P2P_SERVICE) as WifiP2pManager?
|
||||
if (manager == null) {
|
||||
Log.e("wifi-p2p", "cannot get the manager")
|
||||
return
|
||||
}
|
||||
|
||||
val channel = manager.initialize(this, this.mainLooper, null)
|
||||
|
||||
// get the list of peers in the group
|
||||
manager.requestPeers(channel) { devices ->
|
||||
devices.deviceList.forEach { device ->
|
||||
Log.d("wifi-p2p", "peer found : [${device.deviceAddress}] ${device.deviceName}")
|
||||
}
|
||||
}
|
||||
|
||||
manager.requestGroupInfo(channel) { group ->
|
||||
val config = WifiP2pConfig().apply {
|
||||
this.deviceAddress = group.owner.deviceAddress
|
||||
}
|
||||
|
||||
if (group.isGroupOwner) {
|
||||
// the device is the host
|
||||
Log.d("wifi-p2p", "I am the owner ! (${group.owner})")
|
||||
|
||||
Thread {
|
||||
while (true) {
|
||||
// declare the server
|
||||
val serverSocket = ServerSocket()
|
||||
serverSocket.bind(InetSocketAddress(8888))
|
||||
|
||||
// accept a connection
|
||||
val clientSocket = serverSocket.accept()
|
||||
val data = clientSocket.getInputStream().read()
|
||||
|
||||
// print the data
|
||||
Log.i("wifi-p2p", "Data received (${clientSocket.inetAddress}) : $data")
|
||||
|
||||
// close the connection
|
||||
clientSocket.close()
|
||||
}
|
||||
}.start()
|
||||
|
||||
} else {
|
||||
// the device is a simple peer
|
||||
Log.d("wifi-p2p", "I am a peer !")
|
||||
|
||||
// connect to the host and send a packet
|
||||
Thread {
|
||||
manager.connect(channel, config, object : ActionListener {
|
||||
override fun onSuccess() {
|
||||
val hostAddress = InetAddress.getByName(config.deviceAddress)
|
||||
val port = 8888
|
||||
|
||||
Log.d("wifi-p2p", "Sending packet to host")
|
||||
val socket = Socket()
|
||||
socket.connect(InetSocketAddress(hostAddress, port))
|
||||
socket.outputStream.write("test".toByteArray())
|
||||
}
|
||||
|
||||
override fun onFailure(reason: Int) {
|
||||
Log.e("wifi-p2p", "Error when connecting to host : $reason")
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue