Contenidos
Servidor en IntelliJ IDEA que se mueve según recibe movimiento (izquierda, derecha, arriba, abajo)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
import java.awt.MouseInfo import java.net.InetAddress import java.net.ServerSocket import java.io.BufferedReader import java.io.InputStreamReader import java.awt.Robot import java.awt.event.InputEvent fun main() { val puerto = 6000 // Puerto del servidor try { val inetAddress: InetAddress = InetAddress.getByName("192.168.0.14") val servidor = ServerSocket(puerto, 6000, inetAddress) println("Escuchando en ${servidor.localPort}") val robot = Robot() while (true) { val cliente = servidor.accept() val inputStream = cliente.getInputStream() val bufferedReader = BufferedReader(InputStreamReader(inputStream)) val mensajeRecibido = bufferedReader.readLine() println("Mensaje recibido del cliente ${cliente.inetAddress.hostAddress}:${cliente.port}: $mensajeRecibido") interpretarDireccion(mensajeRecibido, robot) bufferedReader.close() cliente.close() } // servidor.close() // No alcanzable con el ciclo while(true) } catch (e: Exception) { e.printStackTrace() } } fun interpretarDireccion(direccion: String?, robot: Robot) { direccion?.let { val currentPosition = MouseInfo.getPointerInfo().location val x = currentPosition.x val y = currentPosition.y println(it) when (it) { "izquierda" -> { robot.mouseMove(x - 10, y) // Mueve el cursor hacia la izquierda } "derecha" -> { robot.mouseMove(x + 10, y) // Mueve el cursor hacia la derecha } "arriba" -> { robot.mouseMove(x, y - 10) // Mueve el cursor hacia arriba } "abajo" -> { robot.mouseMove(x, y + 10) // Mueve el cursor hacia abajo } else -> { } } } } |
Cliente en Android Studio que envía la posición según el acelerómetro
AndroidManifest.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.MyApplication" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.MyApplication"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
MainActivity.kt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
package com.example.myapplication import android.content.Context import android.hardware.Sensor import android.hardware.SensorEvent import android.hardware.SensorEventListener import android.hardware.SensorManager import android.os.Bundle import android.widget.Toast import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import com.example.myapplication.ui.theme.MyApplicationTheme import java.net.Socket class MainActivity : ComponentActivity() { private lateinit var sensorManager: SensorManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MyApplicationTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { val context = LocalContext.current Posicion(context) } } } sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager registerAccelerometerListener() } private fun registerAccelerometerListener() { val accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) val accelerometerListener = object : SensorEventListener { override fun onSensorChanged(event: SensorEvent) { val x = event.values[0] val y = event.values[1] val z = event.values[2] val direction = determineDirection(x, y, z) if (direction != "quieto") { sendDirectionToServer(direction) } } override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) { // No es relevante para este ejemplo } } sensorManager.registerListener( accelerometerListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL ) } private fun determineDirection(x: Float, y: Float, z: Float): String { return when { x > 2 -> "izquierda" x < -2 -> "derecha" y > 2 -> "abajo" y < -2 -> "arriba" else -> "quieto" } } private fun sendDirectionToServer(direction: String) { Thread { val host = "192.168.0.14" // Cambia esta dirección por la del servidor val puerto = 6000 // Puerto del servidor try { val cliente = Socket(host, puerto) val outputStream = cliente.getOutputStream() val mensaje = "$direction" outputStream.write(mensaje.toByteArray()) outputStream.flush() cliente.close() } catch (e: Exception) { e.printStackTrace() } }.start() } private fun showToast(context: Context, message: String) { Toast.makeText(context, message, Toast.LENGTH_SHORT).show() } } @OptIn(ExperimentalComposeUiApi::class) @Composable fun Posicion(context: Context) { Toast.makeText(context, "Movimiento detectado", Toast.LENGTH_SHORT).show() } |