Quantcast
Channel: 製造業 スマートDX推進課 スマート工場DIY日記
Viewing all articles
Browse latest Browse all 5

【C# .NET Framework 4.8】USB機器を解析して自作アプリに取り込む【Wireshook】

$
0
0

テスターのデモ機を渡され 「USB接続できるから、抵抗値の検査アプリ作って」と言われ調べてみると
専用アプリでしかデータを取り込めないご様子。

仕様を見るとリアルタイムでExcel出力が出来るので、そこから取り込むことは可能だが、、、
バグの原因にしかならないので、直接データを取得を行いたい。

という訳で、USBのやり取りを傍受し、解析してC#のプログラムに取り込みました。
何かの参考になれば幸いです。

解析にはWireshookを使用

まずは Wiredhookをインストールします。同時に USBPcapもインストール。
インストール手順はこちらが参考になります。

community.cisco.com

 

Wireshookを開き、早速USBの通信を傍受します。

USBの通信データは USBPcap1USBcap2に入ってきます。どちらかを開いてみます。
今回は「USBcap2」の方を開いてみました。

 

USBマウスを繋いでいたので、マウスをすごい勢いでデータを受信しています。
マウスのデータを取得しないよう、フィルタを掛けます。

 

Source 2.3.1Destination 2.3.1が表示されないよう、フィルタに追記

!(usb.src == "2.3.1") && !(usb.dst == "2.3.1")

Enterを押すとフィルタが適用され、マウスのデータが非表示になります。

これでスッキリしたので、目的のテスター測定値取得の通信を探ってみます。
テスター記録専用アプリの記録開始をONにしてみました。

 

上記のような通信が記録されました。
中身を確認してみましょう。

 

どうやら SET_REPORT Requestで測定値の取得リクエストを送り URB_INTERRUPT in で測定値を受信しているようです。

Data FragmentHID Data で送受信内容が確認できます。

これをプログラムに取り込んでみたいと思います。

テストコード

今回使用するライブラリが .NET Framework しか対応していない為、プロジェクト作成の際にご注意ください。

HidLibrary』を使用しますので、NuGet パッケージマネージャーよりインストールしてください。

using System;
using System.Linq;
using System.Windows.Forms;

namespace USB_TEST
{
    publicpartialclassForm1 : Form
    {
        constint VendorId =0x11AD;
        constint ProductId =0x0700;
        HidLibrary.HidDevice _device;

        public Form1()
        {
            InitializeComponent();
        }

        privatevoid button1_Click(object sender, EventArgs e)
        {
            _device = HidLibrary.HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();
            _device.OpenDevice();

            _device.ReadReport(OnReport, 100);
            _device.WriteReport(
                new HidLibrary.HidReport(3)
                {
                    Data =new byte[] { 0x00, 0x82, 0x66 }
                });
        }

        void OnReport(HidLibrary.HidReport report)
        {
            this.Invoke((MethodInvoker)(() =>
            {
                textBox1.Text = func_convert(report.Data);
            }));
_device?.ReadReport(OnReport, 100); } } }

button1クリックでデータ取得し、 textBox1に測定結果を格納というテストコードです。
func_convertは受信データの処理を行ってますが、関係ないので割愛します。

テストコード解説

constint VendorId =0x11AD;
        constint ProductId =0x0700;

該当のUSB機器の Vendor IDProduct IDを格納しておきます。

Vendor IDProduct IDの調べ方は
[デバイスマネージャー]から 該当のUSB機器を探し
[右クリック]→[プロパティ]→[詳細]→[ハードウェアID]

今回の場合は
VID (Vendor ID) = 0x11AD
PID (Product ID) = 0x0700

ドライバー削除や更新をすると、VIDPIDが変わる可能性がある為、ご注意ください。
VIDPIDなしでUSB機器を検索する方法はありますので、情報探してみてください。

 

            _device = HidLibrary.HidDevices.Enumerate(VendorId, ProductId).FirstOrDefault();
            _device.OpenDevice();

Vendor IDProduct IDを指定して、デバイスをオープンします。

 

            _device.ReadReport(OnReport, 100);
            _device.WriteReport(
                new HidLibrary.HidReport(3)
                {
                    Data =new byte[] { 0x00, 0x82, 0x66 }
                });

USB機器から受信した際のコールバック関数を指定します。

その後、USB機器にデータ(レポート)を送ります。

データ は byte配列に格納します。今回の場合はこの部分になります。

 

void OnReport(HidLibrary.HidReport report)
        {
            this.Invoke((MethodInvoker)(() =>
            {
                textBox1.Text = func_convert(report.Data);
            }));
            _device?.ReadReport(OnReport);
        }

USB機器からのコールバック関数です。

report.Dataに受信内容が byte配列で入ってきます。
func_convert(); は受信データの処理なので割愛します。

_device.ReadReport(OnReport, 100);

最後に再度コールバックを登録します。引数2はタイムアウトです。

あとがき

HIDデバイスの通信方法を調べると、大体が WinAPIを使用する方法で
1から作ると面倒臭いので、HidLibraryを使用しました。

.NET用の HIDライブラリは恐らくなくて、UWPだと HIDが簡単に実装出来るらしいので、恐らくそれを使えという事なんだと思います。


Viewing all articles
Browse latest Browse all 5

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>