4

私は現在、Bluetooth OBD-IIアダプターを使用してBluetooth経由で車両に接続する機能を備えたWindows Phone 8アプリケーションに取り組んでいます。私はWP8のプログラミングにかなり慣れていませんが、助けを求めようとはしていませんが、どこに行くべきか、何をすべきかを考えたり理解したりできない部分にぶつかりました。

さらに、車に接続するために私がテストしているデバイスを知りたい人がいれば、ここにいるこの人です

編集:: これまでのところ、Bluetooth アダプターが有効になっているかどうかを検出するようにコードを設定しました。現在、ペアリングされたデバイスをユーザーに表示して選択できるようにする方法を調べています (または理解しようとしています)。しかし、現時点での私の主な頭脳は、OBD-II アダプターからどのようにデータを読み取る (またはプルする) ことができるかということです。ソフトウェアのドキュメントには、次のように書かれています。

Kiwi Wifi または Kiwi Bluetooth がコマンドを処理する準備ができていることを示すために、デバイスは大なり記号 (>) を出力します。

したがって、これを正しく理解していれば、 > を確認する必要がありますよね? しかし、どのように?たくさんのソースをチェックしましたが、実際にその方法を説明しているものはありません。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 はそれ自体でデータを送信することはありません。送信したコマンドをリッスンし、そのコマンドに基づいて応答を送信します。したがって、基本的に、実行中の接続がある場合は、次の 2 つのことを行う必要があります。

  • OBD-II デバイスに正しいコマンドを送信します。
  • 回答を人間が読めるデータに解析します。

お持ちの ELM327-bluetooth-connector は、ASCII コマンドを電圧に変換します。したがって、ASCII コマンドを送信するだけで、ASCII 値が返されます。

OBD プロトコルはいくつかのモードとパラメータを知っていますが、リアルタイム データを取得するために説明します。それがモード1です。

モード 1 送信
モード 1 は「01」です。その部分の後、パラメーター ID を一緒に送信する必要があります。0C は RPM、0D は速度です。そして、各コマンドの後、キャリッジ リターンを送信する必要があります。(CR = '\r') したがって、コネクターは要求がいつ完了するかを認識します。

したがって、基本的に、速度を上げるために、次のものを送信する必要があります。

'010D\r'

モード 1 の受信 モード 1
のクエリから返される応答は、'41' で始まります。その後、パラメーター ID が返され、次に値が返されます。ほとんどの場合、値は 16 進数です。人間が読める値を読み取るには、何らかの変換を行う必要があります。詳細については、変換する数式も提供されているので、リンクを参照してください。

例:

'410D17'

したがって、17 は現在の速度を 16 進数で表した値です。17 を 10 進数にすると 23 になるので、時速 23 km で運転していることになります。

このウィキペディアのページには、それに関するいくつかの良い情報があります:
OBD-II パラメータ

そしてBluetooth部分について:

ステップ 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: SPP ルックアップを実行するように winsock に指示する

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

ソース: Windows Phone 8 Bluetooth SSP

これがあなたの助けになることを願っています、私はそれに興奮しています。^^ 助けが必要な場合は、私に知らせてください。

于 2013-12-11T16:44:39.057 に答える