2010-10-14 10 views
0

Nous avons un matériel hérité qui se connecte aux téléphones cellulaires via Bluetooth en utilisant le profil DUN. Il émet ensuite des commandes AT pour lire les SMS à des fins de surveillance.Émulateur d'ensemble de commande AT de téléphone mobile: syntaxe appropriée pour les codes de réponse

Les téléphones Android ne prennent pas en charge AT sur DUN. C'est pourquoi j'écris cette application. Le problème est le suivant: pendant que le matériel hérité se connectera au téléphone, il n'acceptera pas mes réponses à ses commandes. Plus précisément, il semble ne pas accepter ma réponse à la commande AT + CGMI. Je suppose que quelque chose ne va pas avec mon utilisation des caractères de contrôle CR et LF, mais je ne peux pas comprendre ce qui se passe.

Voici un exemple de journal chat:

10-14 14:14:49.674: DEBUG/PROG(2663): Server started, object is [email protected] 
10-14 14:17:07.264: DEBUG/PROG(2663): From Device:ATE0 
10-14 14:17:07.264: DEBUG/PROG(2663): To Device: 
10-14 14:17:07.264: DEBUG/PROG(2663): OK 
10-14 14:17:07.868: DEBUG/PROG(2663): From Device:ATE0 
10-14 14:17:07.868: DEBUG/PROG(2663): To Device: 
10-14 14:17:07.868: DEBUG/PROG(2663): OK 
10-14 14:17:10.774: DEBUG/PROG(2663): From Device:AT+CGMI 
10-14 14:17:10.774: DEBUG/PROG(2663): To Device: 
10-14 14:17:10.774: DEBUG/PROG(2663): "Sony Ericsson" 
10-14 14:17:10.774: DEBUG/PROG(2663): 
10-14 14:17:10.774: DEBUG/PROG(2663): OK 
10-14 14:17:11.434: DEBUG/PROG(2663): From Device:ATE0 
10-14 14:17:11.434: DEBUG/PROG(2663): To Device: 
10-14 14:17:11.434: DEBUG/PROG(2663): OK 
10-14 14:17:12.025: DEBUG/PROG(2663): From Device:ATE0 
10-14 14:17:12.025: DEBUG/PROG(2663): To Device: 
10-14 14:17:12.025: DEBUG/PROG(2663): OK 
10-14 14:17:14.827: DEBUG/PROG(2663): From Device:AT+CGMI 
10-14 14:17:14.827: DEBUG/PROG(2663): To Device: 
10-14 14:17:14.827: DEBUG/PROG(2663): "Sony Ericsson" 
10-14 14:17:14.827: DEBUG/PROG(2663): 
10-14 14:17:14.827: DEBUG/PROG(2663): OK 
10-14 14:17:15.454: DEBUG/PROG(2663): From Device:ATE0 
10-14 14:17:15.454: DEBUG/PROG(2663): To Device: 
10-14 14:17:15.454: DEBUG/PROG(2663): OK 
10-14 14:17:16.084: DEBUG/PROG(2663): From Device:ATE0 
10-14 14:17:16.084: DEBUG/PROG(2663): To Device: 
10-14 14:17:16.084: DEBUG/PROG(2663): OK 
10-14 14:17:18.444: DEBUG/PROG(2663): IOException: all aboard the failboat! 
10-14 14:17:18.444: DEBUG/PROG(2663): java.io.IOException: Connection reset by peer 
10-14 14:17:18.444: DEBUG/PROG(2663):  at android.bluetooth.BluetoothSocket.readNative(Native Method) 
10-14 14:17:18.444: DEBUG/PROG(2663):  at android.bluetooth.BluetoothSocket.read(BluetoothSocket.java:307) 
10-14 14:17:18.444: DEBUG/PROG(2663):  at android.bluetooth.BluetoothInputStream.read(BluetoothInputStream.java:96) 
10-14 14:17:18.444: DEBUG/PROG(2663):  at java.io.InputStreamReader.read(InputStreamReader.java:275) 
10-14 14:17:18.444: DEBUG/PROG(2663):  at java.io.BufferedReader.fillBuf(BufferedReader.java:155) 
10-14 14:17:18.444: DEBUG/PROG(2663):  at java.io.BufferedReader.readLine(BufferedReader.java:404) 

L'exception se produit lorsque le dispositif réinitialise la connexion.

Voici quelques code:

private static final String REPLY_OK = "\r\nOK\r\n"; 
private static final String REPLY_MANUFACTURER = "\r\n\"Sony Ericsson\"\r\n\r\nOK\r\n"; 
private static final String ECHO_OFF = "ATE0"; 
private static final String GET_MANUFACTURER = "AT+CGMI"; 
public static String handleCommand(String command) { 

if (command.equals(ECHO_OFF)) { 
    return REPLY_OK; 
} else if (command.equals(GET_MANUFACTURER)) { 
    return REPLY_MANUFACTURER; 
} 
// base case 
return REPLY_OK; 
} 
// bts is a BluetoothSocket instance 
OutputStream out = this.bts.getOutputStream(); 
InputStream is = this.bts.getInputStream(); 
InputStreamReader isr = new InputStreamReader(is); 
BufferedReader br = new BufferedReader(isr); 
String currentLine = null; 
while ((currentLine = br.readLine()) != null) { 
    Log.d(LOGTAG, "From Device:" + currentLine); 
    String response = handleCommand(currentLine); 
    Log.d(LOGTAG, "To Device: " + response); 
    out.write(response.getBytes("ASCII")); 
    //out.flush(); 
} 

Répondre

0

Que diriez-vous tourner les choses et en utilisant l'appareil Android pour émuler le périphérique matériel existant, se connecter à un téléphone bluetooth héritage, et faire un hexdump exactement ce que le téléphone donne à réponse?

Ou peut-être pourriez-vous même utiliser le téléphone android pour faire une sorte de proxy homme-dans-le-milieu et enregistrer et hexdump l'échange entier?

+0

Bonne prise. J'ai un N95. Je vais me connecter de mon ordinateur portable au profil DUN sur le N95 et vider ce qui se passe. – MHaas

+0

Ouais .. J'ai branché mon ordinateur portable sur rfcomm et j'ai immédiatement vu le problème. Les enfants, soyez intelligents à propos de l'utilisation de BufferedReader :: readLine(). Apparemment, cela ne retournait que lorsque le périphérique hérité envoyait la deuxième commande. Il a donc fallu un caractère supplémentaire après la commande envoyée par l'appareil. Je suis maintenant en train de lire() à partir de BufferedReader et de faire ma propre division de ligne. Fonctionne comme un charme. Merci encore! – MHaas

Questions connexes