activity_main.xml |
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <EditText android:id="@+id/Aentrada" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/textView1" android:layout_marginLeft="30dp" android:layout_marginTop="22dp" android:ems="10" android:focusable="false" android:focusableInTouchMode="false" android:inputType="text" android:text="@string/entrada" android:textSize="@dimen/abc_action_bar_subtitle_text_size" /> <EditText android:id="@+id/Asalida" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/Aentrada" android:layout_below="@+id/Aentrada" android:layout_marginTop="26dp" android:ems="10" android:inputType="text" android:text="@string/salida" android:textSize="@dimen/abc_action_bar_title_text_size" > </EditText> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_below="@+id/Asalida" android:layout_marginTop="60dp" android:gravity="center" > <Button android:id="@+id/Aboton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="FunSend1" android:text="@string/boton1" /> <Button android:id="@+id/Aboton2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="FunSend2" android:text="@string/boton2" /> <Button android:id="@+id/Aboton3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="FunSend3" android:text="@string/boton3" /> </LinearLayout> <Button android:id="@+id/Asalir" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/linearLayout1" android:layout_centerHorizontal="true" android:layout_marginTop="34dp" android:onClick="FunSalir" android:text="@string/salir" /> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/Aentrada" android:layout_alignParentTop="true" android:text="@string/hello_world" /> </RelativeLayout> |
AndroidManifest.xml |
<?xml version="1.0"
encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.seta43blue" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="15" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> |
El programa empieza con la función onCreate
donde se mira si el dispositivo android tiene bluetooth, y
si lo tiene activado. Después lanzamos una función FunConectar2 donde se realiza la conexión al dispositivo. |
protected
void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Wentrada=(EditText)findViewById(R.id.Aentrada); Wsalida=(EditText)findViewById(R.id.Asalida); Miblue = BluetoothAdapter.getDefaultAdapter(); if (Miblue == null) { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setMessage("Sin soporte bluetooth"); dialog.setCancelable(false); dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); dialog.show(); } if (!Miblue.isEnabled()) { AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setMessage("Activar bluetooth"); dialog.setCancelable(false); dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } }); dialog.show(); } AlertDialog.Builder dialog0 = new AlertDialog.Builder(this); dialog0.setMessage("Programa para conectar android y arduino.\nManda frases a la matriz de led.\nSETA43"); dialog0.setCancelable(false); dialog0.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { FunConectar2(); } }); dialog0.show(); } |
La función FunConectar2 es la que
realiza la conexión al dispositivo ya emparejado. |
Crea un lista de
dispositivos emparejados. ArrayList <String> list = new ArrayList<String>(); Prueba a crear un createBluetoothSocket al dispositivo emparejado. Esto me creó una confusión debido a que no daba error aunque no existiese ese dispositivo, pero lo que creo que comprueba si dispone de conexión serie. btSocket = createBluetoothSocket(device); Prueba a crear un btSocket.connect(); ,y si se se puede indica en pantalla ok->dirección desl dispositivo. btSocket.connect(); Log.d(TAG, "....Conexion ok..."); Wentrada.setText("ok->" + address); Para terminar creamos una clase donde se realiza la escritura y la lectura desde el bluetooth. ConnectedThread. mConnectedThread = new ConnectedThread(btSocket); mConnectedThread.start(); |
La clase ConnectedThread tiene varias
funciones: la própia de creación ConnectedThread
que se inicia con start, la run que no la
usamos para nuestro ejemplo, y la write utilizada
para mandar la cadena. |
private
class ConnectedThread extends Thread { private final InputStream mmInStream; private final OutputStream mmOutStream; public ConnectedThread(BluetoothSocket socket) { InputStream tmpIn = null; OutputStream tmpOut = null; try { tmpIn = socket.getInputStream(); tmpOut = socket.getOutputStream(); } catch (IOException e) { } mmInStream = tmpIn; mmOutStream = tmpOut; } public void run() { byte[] buffer = new byte[256]; int bytes; // Keep listening to the InputStream until an exception occurs while (true) { try { bytes = mmInStream.read(buffer); bytes=bytes+1; //No sirve para nada es para quitar aviso //h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); // Send to message queue Handler } catch (IOException e) { break; } } } /* Call this from the main activity to send data to the remote device */ public void write(String message) { Log.d(TAG, "...Data to send: " + message + "..."); byte[] msgBuffer = message.getBytes(); try { mmOutStream.write(msgBuffer); } catch (IOException e) { Log.d(TAG, "...Error data send: " + e.getMessage() + "..."); } } } |
Para termina creamos las funciones que mandan
la cadena mediante la pulsación de los botones. |
public
void FunSend1(View view) { mConnectedThread.write(Wsalida.getText()+ " " + "\n"); } public void FunSend2(View view) { mConnectedThread.write("/" + Wsalida.getText() + "\n"); } public void FunSend3(View view) { mConnectedThread.write("&"+ Wsalida.getText() + "\n"); } |
Notas |
Para depurar los
programas utilizamos la consola de eclipse. private static final String TAG = "bluetooth2"; Log.d(TAG, "...Conectando..."); Con el comando Log.d(TAG, "...Conectando..."); mandamos la cadena bluetooth2 ...Conectando... a la consola android. Para poder filtra todos los mensaje, que son muchos, configuramos de la siguiente forma: Observamos en la pantalla LogCat todos los mensajes que lleven la cadena bluetooth2. |