segunda-feira, abril 28, 2014

Comunicação Bluetooth entre Arduino e Android - Software do Android, parte 1

Vamos começar a ver a programação no lado Android. O uso do Bluetooth é razoavelmente complexo, exigindo o cuidado com vários detalhes. Por este motivo, optei por dividir isto em três partes: a iniciação do Bluetooth, a descoberta dos dispositivos próximo e a conexão e comunicação propriamente ditas.

Antes de mais nada, para poder usar as funções de Bluetooth você deve colocar no manifesto que usará as permissões BLUETOOTH e BLUETOOTH_ADMIN:
  1. <uses-permission android:name="android.permission.BLUETOOTH"/>  
  2. <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>  

O ponto de partida para controle do Bluetooth é obter um objeto BluetoothAdapter:
  1. private BluetoothAdapter mBluetoothAdapter;  
  2.   
  3. //...  
  4.   
  5. mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();  
Se o objeto for null, o device Android não dispõe de interface Bluetooth. Nada pode ser feito neste caso, fora avisar ao usuário.

Se o objeto for null, temos uma interface Bluetooth, mas ela pode estar desligada. Neste caso, devimos pedir ao usuário para ligá-la. A forma correta de fazer é pedir ao sistema Android apresentar a solicitação e, se o usuário concordar, ligar o Bluetooth:
  1. private static final int REQUEST_ENABLE_BT = 1;  
  2.   
  3. if (mBluetoothAdapter != null) {  
  4.     if (!mBluetoothAdapter.isEnabled()) {  
  5.         // Pede para ligar o Bluetooth  
  6.         Intent enableBtIntent = new Intent(  
  7.                 BluetoothAdapter.ACTION_REQUEST_ENABLE);  
  8.         startActivityForResult (enableBtIntent, REQUEST_ENABLE_BT);  
  9.         return false;  
  10.     }  
  11. }  
Reparar que estamos disparando uma nova Activity através de startActivityForResult.Desta forma, a nossa atividade será suspensa até que o usuário faça a opção de ligar o Bluetooth ou recusar a solicitação. Após a opção será chamado o método onActivityResult. O parâmetro requestCode conterá a identificação da Activity (REQUEST_ENABLE_BT no meu exemplo) e o parâmetro resultCode informará a opção do usuário:
  1. public boolean onActivityResult(int requestCode, int resultCode) {  
  2.     if (requestCode == REQUEST_ENABLE_BT) {  
  3.         if (resultCode == Activity.RESULT_OK) {  
  4.             // Autorizado acesso ao Bluetooth  
  5.         } else if (resultCode == Activity.RESULT_CANCELED) {  
  6.             // Negado acesso ao Bluetooth  
  7.         }  
  8.         return true;  
  9.     }  
  10.     return false;  
  11. }  

Uma dificuldade adicional é que o usuário pode ligar ou desligar o Bluetooth quando quiser. Para termos uma aplicação mais robusta é importante estarmos atentos para estas alterações. Isto é feito registrando um Receiver para esta ação:
  1. // registra mReceiverBT para receber avisos da mudança de estado do BT  
  2. IntentFilter filter = new IntentFilter();  
  3. filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);  
  4. registerReceiver(mReceiverBT, filter);  
  5.   
  6. // trata notificaçoes de mudança de estado do BT  
  7. private final BroadcastReceiver mReceiverBT = new BroadcastReceiver() {  
  8.     public void onReceive(Context context, Intent intent) {  
  9.         String action = intent.getAction();  
  10.         if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {  
  11.             // estado mudou  
  12.             int estado = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1);  
  13.             if ((estado == BluetoothAdapter.STATE_ON)) {  
  14.                 // Ligou Bluetooth  
  15.             } else if (estado == BluetoothAdapter.STATE_OFF) {  
  16.                 // Desligou Bluetooth"  
  17.             }  
  18.         }  
  19.     }  
  20. };  

Somente após confirmarmos que temos uma interface Bluetooth e que ela está ligada podemos ir em frente, tipicamente procurando os dispositivos que estão no alcance - o que veremos na próxima parte.

Nenhum comentário: