Usb упражнение

From Ilianko

Теория USB

==Задачи за изпълнение: Задачите се изпълняват на виртулна машина предварително подготвена от ръководителя на приложението.

0. Включване на usb устройство към виртуалната машина.

1. Да се проверят наличните usb устройства:

  • Иползвайте инструмента lsusb

2. Да се разгледат параметрите на различни USB устройства като се определят

  • текущ адрес на устройството
  • брой на конфигурациите
  • заявена мощност
  • брой на интерфейсите
    • типа на устройство (class)
    • конфигурирани канали
    • тип предаване на данни
lsusb -s Bus#:Device# -v|less

3. С wireshark да се проследи предаване на данни на usb устройството.

  • активира се usbmon
modprobe usbmon
  • стартира се wireshark
wireshark


4. Да се наблюдават събитията при включване на usb устройство с udevadm

udevadm monitor

5. Да се разгледат параметрите на устройството

udevadm info --attribute-walk --path=... 

6. Да се конфигурира събитие при включване на usb устройство.

Изпълнение на скрипт при инициализация на usb устройство

Задаване на правила при инициализация на USB устройство

  • Може да използваме атрибутите на хардуерното устройство, за да го идентифицираме пред операционната система, с което ще могат да се зададат специални правила при неговата инициализация. Примерно с мишката, може да вземем наименованието и физическото място, където е включена мишката. Примерно:
$udevadm info --attribute-walk --name=/dev/input/mouse1
   ...
   ATTRS{name}=="Logitech USB Optical Mouse" 
   ATTRS{phys}=="usb-0000:00:1d.0-2/input0" 
   ...
  • Дадените стойности зависят от модела на мишката и USB порта на включване. Правилото се описва с файл в директория
/etc/udev/rules.d

със следния формат на името xx-ime.rules, където:

  • xx – приоритет на изпълнение, първо ще се изпълнят правилата с по-малка стойност;
  • ime – произволно име;
  • .rules – задължително разширение.

С цел да разглеждаме информацията пристигаща от мишката, без тя да се предава към системата управляваща прозорците на операционната система, ще дадем ръчно наименование на нода, с който мишката ще бъде представена в /dev.

  • Примерно може да инициализираме мишката като друго устройство се създава файл със следното съдържание:
SUBSYSTEMS=="input", ATTRS{name}=="Logitech USB Optical Mouse", NAME="testMouse"

Файлът се записва в /etc/udev/rules.d с име в съответствие с формата xx-ime.rules. Ако мишката е с USB интерфейс, след изключване и включване, тя вече няма да управлява курсора и ще можем да видим новосъздадено устройство /dev/testMouse. Може да тестваме дали мишката работи, като четем това устройство -

$cat /dev/testMouse.
  • Може да стартираме изпълнение на скрипт към правилото на устройството. Към правилото на устройството ще добавим RUN+="/root/program". Правилото за изпълнение на скрипта program при включване на мишка, би изглеждало така:
SUBSYSTEMS=="input", ATTRS{name}=="Logitech USB Optical Mouse",RUN+="/root/program"

Трябва да се създаде и скрипта за изпълнение в съответна директория. Създава се текстов файл

nano /root/program

със следното съдържание:

#!/bin/bash
eject
eject -t

и се променят правата му, за да бъде изпълним

chmod +x /root/program

Събитие при хардуерни промени в C#

Дефиниране кодовете на събития

  • WM_DEVICECHANGE - известява за хардуерни промени
  const int WM_DEVICECHANGE = 0x0219;
  const int DBT_DEVICEARRIVAL = 0x8000; // Открито ново устрой
  const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //Премахнато устройство
  const int DBT_DEVNODES_CHANGED = 0x0007;  // Промяна в състоянието на устройството
 

права за достъп

using System.Security.Permissions;

[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
protected override void WndProc(ref Message m)
{
  if (m.Msg == WM_DEVICECHANGE 
 //     && m.WParam.ToInt32() != DBT_DEVNODES_CHANGED 
      && m.WParam.ToInt32() == DBT_DEVICEARRIVAL)
  {
    MessageBox.Show("xxx");
  }
  base.WndProc(ref m);
}

системен звук

for (int i = 0; i < 5; i++)
{
  System.Threading.Thread.Sleep(1000);
  System.Media.SystemSounds.Beep.Play();
}

изпълнение на системна команда

var psi = new System.Diagnostics.ProcessStartInfo("shutdown", "/s /f /t 0");
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
System.Diagnostics.Process.Start(psi);

скриване прозореца на приложението

public Form1()
{
  InitializeComponent();
  this.WindowState = FormWindowState.Minimized;
  this.ShowInTaskbar = false;
}

Добавяне на приложението в startUp

%UserProfile%\Start Menu\Startup