Cara menyambungkan ke perangkat USB (aplikasi UWP)

Di Windows, Anda dapat menulis aplikasi UWP yang berinteraksi dengan perangkat USB.

Artikel ini menjelaskan:

  • Cara menggunakan objek DeviceWatcher untuk mendeteksi perangkat
  • Cara membuka perangkat untuk komunikasi
  • Cara menutup perangkat ketika Anda selesai menggunakannya

API penting

Saat Anda menulis aplikasi UWP yang berinteraksi dengan perangkat USB, aplikasi dapat mengirim perintah kontrol, mendapatkan informasi perangkat, serta membaca dan menulis data ke/dari titik akhir massal dan mengganggu. Sebelum Anda dapat melakukan semua itu, Anda harus menemukan perangkat dan membuat koneksi.

Sebelum memulai

  • Ini adalah topik pertama dalam seri. Sebelum memulai tutorial ini, Anda harus membuat proyek Visual Studio dasar yang dapat Anda perluas dalam tutorial ini. Baca Mulai menggunakan aplikasi UWP untuk informasi selengkapnya.
  • Contoh kode didasarkan pada sampel CustomUsbDeviceAccess. Anda dapat mengunduh sampel lengkap dari halaman galeri kode ini.
  • Perangkat USB yang digunakan dalam tutorial adalah perangkat SuperMUTT.
  • Untuk menggunakan namespace Windows.Devices.Usb untuk menulis aplikasi Windows yang berinteraksi dengan perangkat USB, perangkat harus memiliki driver Winusb.sys yang dimuat sebagai driver fungsinya. Winusb.sys disediakan oleh Microsoft dan disertakan dengan Windows di folder \Windows\System32\drivers .

Bagan Alur: Menemukan perangkat

Untuk terhubung ke perangkat USB, Anda harus terlebih dahulu menemukan perangkat berdasarkan berbagai pola penemuan dan kemudian terhubung ke perangkat tersebut:

  • Sambungkan ke perangkat USB apa pun dengan GUID antarmuka perangkat tertentu.
  • Sambungkan ke perangkat USB dengan ID Vendor dan ID Produk tertentu dan yang memiliki GUID antarmuka perangkat tertentu.
  • Sambungkan ke perangkat USB dengan ID Vendor dan ID Produk tertentu tanpa mengetahui GUID antarmuka perangkat.
  • Sambungkan ke perangkat USB yang telah mengetahui kelas perangkat.

penemuan perangkat usb.

Konsep utama

Apa itu GUID antarmuka perangkat?

Driver model kernel, selama inisialisasinya, mendaftarkan dan mengekspos GUID yang disebut GUID antarmuka perangkat. Biasanya, aplikasi menggunakan GUID yang diekspos untuk menemukan driver terkait dan perangkatnya, lalu membuka handel ke perangkat. Handel yang diambil digunakan untuk operasi baca dan tulis berikutnya.

Namun, dalam kasus Winusb.sys, alih-alih driver yang mengekspos GUID antarmuka perangkat, itu dapat disediakan dengan salah satu dari dua cara:

  • Dalam deskriptor MS OS perangkat. Produsen perangkat menetapkan DeviceInterfaceGUID sebagai properti kustom di deskriptor properti yang diperluas di perangkat. Untuk detail selengkapnya, lihat dokumen "Deskriptor Properti yang Diperluas" di Deskriptor OS Microsoft.
  • Jika Anda menginstal Winusb.sys secara manual melalui INF kustom, INF mendaftarkan GUID di INF. Lihat Penginstalan WinUSB (Winusb.sys).

Jika GUID antarmuka perangkat ditemukan untuk perangkat, aplikasi UWP Anda dapat menemukan semua perangkat yang cocok dengan GUID antarmuka perangkat tersebut.

Bagaimana identifikasi perangkat USB ditampilkan di Windows?

Setiap perangkat USB harus memiliki dua informasi: ID vendor dan ID produk.

USB-IF menetapkan pengidentifikasi tersebut dan produsen perangkat harus mengeksposnya di perangkat. Jadi bagaimana kau bisa mendapatkan informasi itu?

  • Bahkan ketika perangkat tidak memiliki driver perangkat yang dimuat, yaitu, Windows mendeteksinya sebagai "Perangkat Tidak Diketahui", Anda masih dapat melihat pengidentifikasi di Manajer Perangkat di nilai properti Id Perangkat Keras . Nilai tersebut adalah kombinasi dari dua pengidentifikasi tersebut. Misalnya, untuk perangkat SuperMUTT, Id Perangkat Keras adalah "USB\VID_045E&PID_F001"; id vendor adalah "0x045E" dan id produk adalah "0xF001".

  • Jika ada INF untuk perangkat, dapatkan string tersebut dari bagian Model .

  • Anda dapat memeriksa berbagai pengaturan registri. Cara term mudah adalah dengan melihat

    <HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\id perangkat keras>

    Untuk informasi selengkapnya, lihat Entri Registri Perangkat USB.

  • ID perangkat keras digunakan oleh manifes aplikasi untuk mengidentifikasi perangkat.

    <Id Perangkat="vidpid:045e f001">

Aplikasi UWP Anda dapat menemukan semua perangkat yang cocok dengan vendor dan id produk tertentu. Anda dapat mempersempit hasil pencarian dengan menentukan GUID antarmuka perangkat.

Apa itu kelas perangkat USB?

Sebagian besar perangkat USB sesuai dengan spesifikasi kelas perangkat yang disetujui oleh USB-IF. Dengan menggunakan spesifikasi tersebut, perangkat dengan sifat yang sama dapat menunjukkan fungsionalitasnya dengan cara standar. Keuntungan terbesar dari pendekatan ini adalah perangkat dapat menggunakan driver kelas dalam kotak yang disediakan Microsoft atau driver Winusb.sys generik.

Beberapa perangkat mungkin tidak mengikuti spesifikasi USB-IF. Sebaliknya, mereka mengekspos fungsionalitas yang ditentukan vendor . Untuk perangkat tersebut, vendor harus menyediakan driver perangkat atau Winusb.sys dapat digunakan.

Apakah perangkat ditentukan vendor atau sesuai dengan kelas perangkat, perangkat harus menjelaskan informasi terkait kelas perangkat ini:

  • Kode kelas: Menunjukkan kelas perangkat tempat perangkat berada.
  • Kode subkelas: Dalam kelas perangkat, menunjukkan subkelas perangkat.
  • Kode protokol: Protokol yang digunakan perangkat.

Misalnya, perangkat SuperMUTT adalah perangkat yang ditentukan vendor dan informasi tersebut ditunjukkan oleh kode kelas adalah FF. Jika perangkat Anda menunjukkan kode kelas sebagai FEh, kode subkelas sebagai 02h, dan kode protokol 00h, Anda dapat menyimpulkan bahwa perangkat tersebut adalah perangkat penghubung IrDA yang mematuhi kelas. Aplikasi UWP Anda dapat berkomunikasi dengan perangkat milik kelas perangkat ini:

  • Exchange activesync
  • CdcControl
  • DeviceFirmwareUpdate
  • Irda
  • Pengukuran
  • PalmSync
  • PersonalHealthcare
  • Fisik
  • VendorSpecific

Aplikasi UWP Anda dapat menemukan semua perangkat yang cocok dengan sekumpulan kelas, subkelas, dan kode protokol tertentu.

Mendapatkan string Advanced Query Syntax (AQS) untuk perangkat

Buat string kueri tingkat lanjut (AQS) yang berisi informasi identifikasi tentang perangkat yang ingin Anda deteksi. Anda dapat membuat string baik dengan menentukan ID vendor/produk, GUID antarmuka perangkat, atau oleh kelas perangkat.

  • Jika Anda ingin memberikan ID vendor/ID produk atau GUID antarmuka perangkat, panggil kelebihan beban GetDeviceSelector.

    Dalam contoh perangkat SuperMUTT, GetDeviceSelector mengambil string AQS yang mirip dengan string ini:

    "System.Devices.InterfaceClassGuid:="{DEE824EF-729B-4A0E-9C14-B7117D33A817}" AND System.Devices.InterfaceEnabled:=System.StructuredQueryType.Boolean#True AND System.DeviceInterface.WinUsb.UsbVendorId:=1118 AND System.DeviceInterface.WinUsb.UsbProductId:=61441"

    Catatan Perhatikan bahwa GUID antarmuka perangkat yang muncul dalam string bukan yang Anda tentukan. GUID tersebut adalah GUID antarmuka perangkat aktual yang didaftarkan oleh Winusb.sys untuk aplikasi UWP.

  • Jika Anda mengetahui kelas perangkat perangkat atau kelas, subkelas, dan kode protokolnya, panggil GetDeviceClassSelector untuk menghasilkan string AQS.

    Buat objek UsbDeviceClass dengan menentukan nilai properti ClassCode, SubclassCode, dan ProtocolCode . Atau, jika Anda mengetahui kelas perangkat perangkat, Anda dapat memanggil konstruktor dengan menentukan properti UsbDeviceClasses tertentu.

Menemukan perangkat—Cara dasar

Ini adalah cara paling sederhana untuk menemukan perangkat USB. Untuk detailnya, lihat Mulai Cepat: menghitung perangkat yang umum digunakan.

  1. Teruskan string AQS yang diambil ke FindAllAsync. Panggilan mengambil objek DeviceInformationCollection .
  2. Perulangan melalui koleksi. Setiap perulangan mendapatkan objek DeviceInformation .
  3. Dapatkan nilai properti DeviceInformation.Id . Nilai string adalah jalur instans perangkat. Misalnya, "\\\\?\USB#VID_045E&PID_078F#6&1b8ff026&0&5#{dee824ef-729b-4a0e-9c14-b7117d33a817}".
  4. Panggil FromIdAsync dengan meneruskan string instans perangkat dan dapatkan objek UsbDevice . Anda kemudian dapat menggunakan objek UsbDevice untuk melakukan operasi lain, seperti mengirim transfer kontrol. Setelah aplikasi selesai menggunakan objek UsbDevice , aplikasi harus merilisnya dengan memanggil Tutup. Catatan Saat aplikasi UWP ditangguhkan, perangkat ditutup secara otomatis. Untuk menghindari penggunaan handel kedaluarsa untuk operasi di masa mendatang, aplikasi harus merilis referensi UsbDevice .
    private async void OpenDevice()
    {
        UInt32 vid = 0x045E;
        UInt32 pid = 0x0611;

        string aqs = UsbDevice.GetDeviceSelector(vid, pid);

        var myDevices = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(aqs);

        try
        {
            usbDevice = await UsbDevice.FromIdAsync(myDevices[0].Id);
        }
        catch (Exception exception)
        {
            ShowStatus(exception.Message.ToString());
        }
        finally
        {
            ShowStatus("Opened device for communication.");
        }

    }

Menemukan perangkat—menggunakan DeviceWatcher

Atau, Anda dapat menghitung perangkat secara dinamis. Kemudian, aplikasi Anda dapat menerima pemberitahuan jika perangkat ditambahkan atau dihapus, atau jika properti perangkat berubah. Untuk informasi selengkapnya, lihat Cara mendapatkan pemberitahuan jika perangkat ditambahkan, dihapus, atau diubah.

Objek DeviceWatcher memungkinkan aplikasi mendeteksi perangkat secara dinamis saat ditambahkan dan dihapus dari sistem.

  1. Buat objek DeviceWatcher untuk mendeteksi kapan perangkat ditambahkan atau dihapus dari sistem. Anda harus membuat objek dengan memanggil CreateWatcher dan menentukan string AQS.

  2. Terapkan dan daftarkan handler untuk peristiwa Ditambahkan dan Dihapus pada objek DeviceWatcher . Penanganan aktivitas tersebut dipanggil saat perangkat (dengan informasi identifikasi yang sama) ditambahkan atau dihapus dari sistem.

  3. Mulai dan hentikan objek DeviceWatcher .

    Aplikasi harus memulai objek DeviceWatcher dengan memanggil Mulai sehingga dapat mulai mendeteksi perangkat saat ditambahkan atau dihapus dari sistem. Sebaliknya, aplikasi harus menghentikan DeviceWatcher dengan memanggil Hentikan, ketika tidak lagi diperlukan untuk mendeteksi perangkat. Sampel memiliki dua tombol yang memungkinkan pengguna untuk memulai dan menghentikan DeviceWatcher.

Contoh kode ini menunjukkan cara membuat dan memulai pengamat perangkat untuk mencari instans perangkat SuperMUTT.

void CreateSuperMuttDeviceWatcher(void)
{
    UInt32 vid = 0x045E;
    UInt32 pid = 0x0611;

    string aqs = UsbDevice.GetDeviceSelector(vid, pid);

    var superMuttWatcher = DeviceInformation.CreateWatcher(aqs);

    superMuttWatcher.Added += new TypedEventHandler<DeviceWatcher, DeviceInformation>
                              (this.OnDeviceAdded);

    superMuttWatcher.Removed += new TypedEventHandler<DeviceWatcher, DeviceInformationUpdate>
                            (this.OnDeviceRemoved);

    superMuttWatcher.Start();
 }

Buka perangkat

Untuk membuka perangkat, aplikasi harus memulai operasi asinkron dengan memanggil metode statis FromIdAsync dan melewati jalur instans perangkat (diperoleh dari DeviceInformation.Id). Hasil dari operasi tersebut adalah objek UsbDevice , yang digunakan untuk komunikasi di masa mendatang dengan perangkat, seperti melakukan transfer data.

Setelah selesai menggunakan objek UsbDevice , Anda harus merilisnya. Dengan merilis objek , semua transfer data yang tertunda dibatalkan. Rutinitas panggilan balik penyelesaian untuk operasi tersebut masih dipanggil dengan kesalahan yang dibatalkan atau operasi selesai.

Aplikasi C++ harus merilis referensi dengan menggunakan kata kunci hapus . Aplikasi C#/VB harus memanggil metode UsbDevice.Dispose . Aplikasi JavaScript harus memanggil UsbDevice.Close.

FromIdAsync gagal jika perangkat sedang digunakan atau tidak dapat ditemukan.