Comment puis-je connecter correctement une application Android pour un RFCOMM socket sur un Bluetooth activé microcontrôleur Arduino?

Je travaille avec certains étudiants de mon université le développement d'un simple Bluetooth application Android qui sera utilisé pour la communication série (RFCOMM) à un microcontrôleur Arduino avec un module Bluetooth connecté.

Au meilleur de mes connaissances, je suis en utilisant la bonne adresse Bluetooth et l'UUID pour RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB. Mon application démarre un thread qui tente de se connecter à l'appareil à l'aide de BluetoothDevice.createRfcommSocketToServiceRecord(UUID). Mais pour une raison ou une autre, on ne voit pas la connexion a réussi. L'opération échoue toujours à invoquer connect() sur la BluetoothSocket qui vient de l'invocation ci-dessus.

Lors d'un essai sur mon HTC Evo, l'exécution de HTC variante de Pain d'épice, le connect() généralement appel échoue avec le message d'exception "Découverte de Service n'a Pas Pu démarrer." J'ai fait un peu de lecture et a constaté que certains ont dit que HTC mise en œuvre pour RFCOMM dans la pile Bluetooth a été buggy, nous avons donc décidé de l'essayer sur un autre étudiant Samsung Galaxy S. La première fois que le code a couru, tout a fonctionné parfaitement. Le microcontrôleur Arduino est connecté à un petit moteur électrique qui a commencé à travailler comme prévu. Je n'ai pas exclu que ce soit ou pas, le problème pourrait être sur le microcontrôleur de côté.

Des utilisations ultérieures de l'application sur l'appareil de Samsung a ensuite échoué, maintenant avec un message disant "Service de l'Échec de la Découverte". Pour moi, il semble que peut-être le module Bluetooth sur le côté du dispositif pense que le RFCOMM service est encore en usage. Mais nous avons redémarré le microcontrôleur et encore vu le même résultat.

J'ai simplement indiqué le code de thread que c'est tout ce qui est vraiment pertinent. J'ai lu qu'il y est une jolie commune de la solution de contournement (hack) pour ces questions à l'aide de la réflexion. Mes tentatives ont également échoué, mais sont là et commenté. J'espère que quelqu'un peut m'orienter dans la bonne direction ici. Notez également que je ne les autorisations nécessaires activé dans le manifeste et dans les deux cas, le dispositif a été jumelé avec succès à l'Arduino à l'aide de Android de l'interface utilisateur.

private class ClientThread extends Thread {
private String _btAddress;
/**
* A handle to the local device's Bluetooth adapter hardware.
*/
private BluetoothAdapter _btAdapter = BluetoothAdapter.getDefaultAdapter();
/**
* A handle to the remote device Bluetooth context.
*/
private BluetoothDevice _btRemoteDevice;
/**
* A handle to the Bluetooth serial socket.
*/
private BluetoothSocket _btSocket;
/**
* Constructor.
* @param btAddress The BluetoothHardware address.
*/
public ClientThread(String btAddress)
{
_btAddress = btAddress;
}
public void run()
{
//Retrieves the device identified by the _btAddress property.
_btRemoteDevice = retrieveDevice();
if ( _btRemoteDevice == null )
sendUIMessage( CONNECTION_BT_DEVICE_NOT_BONDED );
else
sendBeacon();
}
/**
* Retrieves the device associated with this client thread.
* @return
*/
private BluetoothDevice retrieveDevice()
{
Set<BluetoothDevice> btDevices = _btAdapter.getBondedDevices();
for (BluetoothDevice btd : btDevices)
{
String addr = btd.getAddress();
String name = btd.getName();
if ( addr.equalsIgnoreCase(_btAddress) )
return btd;
}
return null;
}
/**
* Sends the beacon to the Bluetooth device.
*/
private void sendBeacon()
{
//Holds the output stream of the BluetoothDevice.
OutputStream os = null;
try
{
_btSocket = _btRemoteDevice.createRfcommSocketToServiceRecord( UUID.fromString( "00001101-0000-1000-8000-00805F9B34FB" ) );
//Method m = _btRemoteDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
//_btSocket = (BluetoothSocket) m.invoke(_btRemoteDevice, 1);
_btSocket.connect();
os = _btSocket.getOutputStream();
os.write('L');
}
catch (IOException e)
{
String message = e.getMessage();
e.printStackTrace();
sendUIMessage(CONNECTION_FAILURE_IO);
}
catch (Exception e)
{
e.printStackTrace();
sendUIMessage(CONNECTION_FAILURE_UNKNOWN);
}
finally
{
try
{
if (_btSocket != null)
_btSocket.close();
}
catch (IOException e)
{
System.out.println("Failed closing Bluetooth output stream.");
e.printStackTrace();
}
}
}
}

EDIT:
Le module Bluetooth est une MDFLY RF-BT0417CB. Je sais que le code qui s'exécute sur l'arduino n'est pas beaucoup et qui est tout simplement communiquer avec le BT module à l'aide de Série.disponible (en) et de la Série.read(). Toutefois, j'ai un nouvel élément d'information qui peut être de plus l'utilisation. Quand mon application a été installée sur l'appareil de Samsung, il a travaillé en une seule fois et échoué sur les essais ultérieurs. A tout à l'arrière, l'autre étudiant, je suis travailler avec, utilisé Android App Inventor (un glisser-déposer outil graphique qui peut également créer des logiques de travail artefacts) pour créer une simple application qui se connecte de la même BT module/carte arduino, ce qui a fonctionné. Il a dit que lorsque mon application a été installée, que l'autre demande a été incapable de jamais se connecter au module BT, ce qui m'amène à croire que le système est resté en pensant que les ressources ont été allouées à ma demande. Après, il a désinstallé mon application, l'autre a été en mesure de se connecter. Il n'a pas le code source de l'application, mais je vais essayer de l'App Inventor moi-même pour voir si le code source, il génère qu'il génère est en train de faire quelque chose de différent. Au meilleur de ma connaissance, je me conforme avec la plupart de la norme de pratiques définies dans Android documentation, alors peut-être que c'est quelque chose d'étrange à propos de la BT module ou le fait que le code arduino n'est pas nécessairement par programme de contrôle de la BT module.

UN AUTRE EDIT:
Je ne suis pas un Bluetooth expert, mais nous avons été en mesure de trouver un travail autour de. Comme certains le savent, il existe un tas de public BluetoothDevice de l'API, caché au moment de la compilation, mais juridiquement public lors de l'exécution à l'aide de la réflexion. L'un d'eux est createRfCommSocket(int). Cette API n'est pas dans la documentation officielle, car il est caché, mais vous pouvez le lire ici. Je n'ai pas encore essayé avec la documentation de l'API pris en charge, mais le problème semble être quelque chose d'un problème de concurrence entre le combiné de série et le conseil d'administration. Le combiné a envoyé un message, ce qui est évidemment un appel bloquant, et quand il est revenu, a fermé la connexion. Le bouclier de la série du conseil d'administration serait alors aussi fermer la connexion, et donc les données ne sont pas disponibles à l'arduino application. Nous avons réalisé ce que lorsque le témoin de la réussite de la communication en mode débogage sur le côté android, mais l'échec en mode release. L'ajout d'une demi-seconde de retard sur le côté android, entre la transmission et la fermeture de la BluetoothSocket résolu le problème. Je ne sais pas si ce problème a été attribué par le code arduino ou pas car je ne suis pas très familier avec l'architecture, mais nous en tant qu'étudiants en manque d'expérience donc il ne serait pas une surprise pour moi.

  • Qui module bluetooth et le logiciel est en cours d'exécution sur l'Arduino appareil ? Vous pouvez poster une référence à l'appareil que vous utilisez. Aussi, si vous pouvez poster le journal complet sur l'Android côté de l'aide.
  • Dennis, Merci pour votre réponse et veuillez accepter mes excuses pour avoir pris tant de temps pour revenir à vous, les examens et les autres obligations ont été la détention de moi. Je suis à la recherche dans le modèle et la version du logiciel de l'arduino, mais j'ai posté quelques informations sur le BT de l'appareil et des informations nouvelles sur le problème.
  • Salut, j'ai un problème similaire... j'essaie de connecter un téléphone de LG pour un TI PAN1315 Dev. conseil d'administration, j'ai le socket avec le même UUID, mais connect() jette toujours un IOException. Lors du débogage intégré PAN1315, j'ai imprimé quelques journaux de la console, à essayer de comprendre si j'ai foiré quelque chose de l'original de la conception de l'application, je vois qu'une hci/acl demande de déconnexion vient du téléphone, et non à partir du périphérique intégré, après l'envoi d'une clé de liaison à partir du périphérique intégré au téléphone... pourriez-vous d'accord?
  • Salut TacB0sS, voir mon commentaire ci-dessus. Le android Bluetooth API est apparemment assez inégale pour carte série connexion, donc il y a un certain nombre de solutions de contournement utilisé. Celui que je mentionne ici est assez commun, mais à part que nous avons vécu quelque chose d'un problème de concurrence entre le conseil et le combiné. Cela peut ou peut ne pas être quelque chose que vous voulez étudier. Concernant la connexion de fermeture et de lien d'échange de clé, je suis sûr que chaque appareil peut demander un connecter ou de la fermeture, et les clés de liaison sont stockés sur les appareils de sorte que l'un ou l'autre peuvent se connecter l'un à l'autre plus tard.Bonne Chance
  • Même si j'avoue que je n'ai absolument aucune idée de comment l'aider, vous voudrez peut-être essayer electronics.stackexchange.com. 🙂
InformationsquelleAutor Joey Carson | 2011-11-02