4

我目前正在开发一个 Windows Phone 8 应用程序,它(希望)能够使用蓝牙 OBD-II 适配器通过蓝牙连接到车辆。我对 WP8 编程相当陌生,尽管我试图不尝试寻求帮助,但我有点想不通,也不知道该去哪里或该做什么。

此外,如果有人想知道我正在测试连接到汽车的设备,那就是这里的这个人

编辑:: 到目前为止,我已经设置了我的代码来检测蓝牙适配器是否已启用,我目前正在研究(或试图理解)如何向用户显示配对设备,以便他们可以选择一个。但我现在的主要脑块是,如何从 OBD-II 适配器读取(或提取)数据?它在软件文档中说:

为了表示 Kiwi Wifi 或 Kiwi 蓝牙已准备好处理命令,设备将输出一个大于号 (>)。

因此,如果我正确理解了这一点,我需要检查 > ,对吗?但是怎么做?我已经检查了大量来源,但没有一个真正解释如何。我遇到过 IBuffer 之类的东西,但我对此一无所知。

如果我所说的没有意义,那么简单地说。

  • 从 OBD 适配器读取数据
  • 将数据写入 OBD 适配器(软件文档说我需要发送 ASCII 码,我有这些)

如果我能理解如何读/写它,那么我认为我应该能够将数据操作回给用户;我希望。

编辑 2::

private async void checkBluetooth()
    {
        SolidColorBrush statuscolor = new SolidColorBrush();
        try
        {
            PeerFinder.AlternateIdentities["Bluetooth:Paired"] = "";
            var devices = await PeerFinder.FindAllPeersAsync(); 
            bluetoothStatus.Text = "Online"; 
            statuscolor.Color = Colors.Green; 
            bluetoothStatus.Foreground = statuscolor; 

            if (devices.Count == 0)
            {
                MessageBox.Show("No paired bluetooth devices have been found, please pair your OBD adapter first!");
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-bluetooth:"));
            }

            PeerInformation peerInfo = devices.FirstOrDefault(c => c.DisplayName.Contains("PLX"));
            if (peerInfo == null)
            {
                MessageBox.Show("No paired PLX adapter found, please pair the PLX OBD adapter!");
                await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings-bluetooth:"));
            }

            StreamSocket socket = new StreamSocket();
            await socket.ConnectAsync(peerInfo.HostName, "1");

            await socket.ConnectAsync(peerInfo.HostName, peerInfo.ServiceName);
        }
        catch (Exception ex) 
        {
            if ((uint)ex.HResult == 0x8007048F) 
            {
                bluetoothStatus.Text = "Offline"; 
                statuscolor.Color = Colors.Red; 
                bluetoothStatus.Foreground = statuscolor; 
            }
        }
    }
4

1 回答 1

13

我只是在解释如何通过向 OBD-II 设备发送数据来检索数据,因为据我了解,这就是您正在努力解决的问题。

OBD-II 永远不会自行发送数据,它会侦听您发送的命令并根据该命令发送答案。所以基本上,如果你有一个正在运行的连接,你必须做两件事:

  • 向 OBD-II 设备发送正确的命令。
  • 将答案解析为人类可读的数据。

您拥有的 ELM327 蓝牙连接器将 ASCII 命令转换为电压。所以你所要做的就是发送一些 ASCII 命令,然后你会得到 ASCII 值。

OBD 协议知道几种模式和参数,但我将解释获取实时数据。那是模式1。

模式 1 发送
模式 1 是“01”。在该部分之后,您必须发送一个参数 ID。0C 代表 RPM,0D 代表速度。在每个命令之后,您必须发送回车。(CR = '\r') 所以连接器知道请求何时完成。

所以基本上,为了速度,你必须发送:

'010D\r'

接收模式 1
您将从模式 1 查询中得到的答案以“41”开头。之后返回参数 ID,然后返回值。该值大部分时间为十六进制。您必须进行一些转换才能读取人类可读的值。有关更多信息,请参阅链接,因为还提供了要转换的公式。

例子:

'410D17'

所以 17 是您当前速度的十六进制值。十进制的 17 是 23,因此您以 23 公里/小时的速度行驶。

这个维基百科页面有一些很好的信息:
OBD-II 参数

对于蓝牙部分:

第 1 步:通过 RFCOMM 连接到所需设备

PeerFinder.AlternateIdentities["Bluetooth:PAIRED"] = ""; 
var available_devices = await PeerFinder.FindAllPeersAsync(); 
if (available_devices.Count == 0) 
{ 
       return false;             
} 
else
{             
       PeerInformation pi= // Get the required device using 
                          // index or searching for the device name
}
StreamSocket socket = new StreamSocket(); 
await socket.ConnectAsync(pi.HostName, "1");

第 2 步:直接 winsock 执行 SPP 查找

await socket.ConnectAsync(pi.HostName, pi.ServiceName);

来源: Windows Phone 8 蓝牙 SSP

我希望这对你有帮助,我对此感到很兴奋。^^ 如果您需要帮助,请告诉我。

于 2013-12-11T16:44:39.057 回答