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();
}
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
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