【发布时间】:2016-06-25 18:15:46
【问题描述】:
我正在开发一个从 OBD II 蓝牙适配器接收数据的 Android 应用程序。设置应用程序和适配器之间的连接是可行的,但是当我向适配器发送命令时,我不会得到正确的结果。它要么返回:
+连接
或者我刚刚发送给适配器的命令。
应用在 Visual Studio 中编码,使用 Xamarin 为 Android 开发。 该代码仅显示应用程序的简化版本,并仅发送 01 -1f 之间支持的 PID 的代码。
BluetoothAdapter myAdapter;
BluetoothSocket socket = null;
string rawData;
public BluetoothConnect()
{
myAdapter = BluetoothAdapter.DefaultAdapter;
if (myAdapter == null)
{
//Device has no Bluetooth
}
if (!myAdapter.IsEnabled)
{
myAdapter.Enable();
}
BluetoothDevice d = myAdapter.GetRemoteDevice("AA:BB:CC:11:22:33");
socket = d.CreateRfcommSocketToServiceRecord(UUID.FromString("00001101-0000-1000-8000-00805F9B34FB"));
socket.Connect();
byte[] cmd = Encoding.ASCII.GetBytes("AT D");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("AT Z");
socket.OutputStream.Write(cmd, 0, cmd.Length);
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("AT E0");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("AT L0");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("AT S0");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("AT H0");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("AT SP 0");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
socket.OutputStream.Flush();
cmd = Encoding.ASCII.GetBytes("0100");
socket.OutputStream.Write(cmd, 0, cmd.Length);
ReadAnswer();
}
private void ReadAnswer() {
try {
rawData = "";
int a = 0;
System.Text.StringBuilder b = new System.Text.StringBuilder();
char c;
while (((a = (byte)socket.InputStream.ReadByte()) > -1))
{
c = (char)a;
if (c == '>')
{
break;
}
b.Append(c);
}
rawData = b.ToString();
Log.Info("-----------------------------------", "RawData: " + rawData);
socket.InputStream.Flush();
}
catch(System.Exception e)
{
Log.Info("", "" + e.Message);
}
}
我已经尝试过不同的初始化命令组合。
我可以想象问题与我读取输入流的方法或发送命令有关,但我不知道该怎么做,因为我是 Visual Studio、Xamarin 和 Android 开发的新手。
希望大家能给我一些建议!
【问题讨论】:
-
尝试将您的蓝牙启用和初始化套接字连接代码封装在 try catchs 中。
-
验证您是否拥有正确的蓝牙权限,或者在未经明确同意的情况下使用它来启用它。 developer.android.com/reference/android/bluetooth/…ASCII 是正确的编码吗?
-
@Terrance 感谢您的快速回复!刚试过你的建议。 try catch 构造工作正常 - 没有异常。检查权限(启用蓝牙和蓝牙管理) - 应该是我发送和接收所需的全部。在单独的类中尝试了 ASCII 方法,似乎该方法按预期工作。
标签: c# android xamarin bluetooth obd-ii