Difference between revisions of "Usb упражнение"

From Ilianko
 
(8 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
==Теория [[USB]]==
 
==Теория [[USB]]==
  
Задачи за изпълнение:
+
==Цел==
 +
Диагностика на usb устройства в Linux с инструментите
 +
*lsusb
 +
*udevadm
 +
*dmesg
 +
*wireshark
 +
 
 +
Създаване на правила, които се изпълняват при инициализация на usb устройства
 +
 
 +
Прихващане на събития при инициализация в Windows с С#
 +
 
 +
 
 +
==Задачи за изпълнение==
 
Задачите се изпълняват на виртулна машина предварително подготвена от ръководителя на приложението.
 
Задачите се изпълняват на виртулна машина предварително подготвена от ръководителя на приложението.
  
Line 20: Line 32:
 
  lsusb -s Bus#:Device# -v|less
 
  lsusb -s Bus#:Device# -v|less
  
 +
3. Да се проследят промените с командата '''''dmesg'''''
 +
 +
4. Да се наблюдават събитията при включване на usb устройство с '''udevadm'''
 +
udevadm monitor
 +
 +
5. Да се разгледат параметрите на устройството
 +
 +
udevadm info --attribute-walk --path=...
 +
udevadm info --attribute-walk --name=/dev/input/mouse1
 +
 +
6. Да се конфигурира събитие при включване на usb устройство.
  
3. С wireshark да се проследи предаване на данни на usb устройството.
+
7. С wireshark да се проследи предаване на данни на usb устройството.
 
*активира се '''usbmon'''
 
*активира се '''usbmon'''
 
  modprobe usbmon
 
  modprobe usbmon
Line 28: Line 51:
  
  
4. Да се наблюдават събитията при включване на usb устройство с '''udevadm'''
+
==Изпълнение на скрипт при инициализация на usb устройство==
 
 
udevadm monitor
 
  
5. Да се разгледат параметрите на устройството
+
Задаване на правила при инициализация на USB устройство
  
udevadm info --attribute-walk --path=...  
+
*Може да използваме атрибутите на хардуерното устройство, за да го идентифицираме пред операционната система, с което ще могат да се зададат специални правила при неговата инициализация. Примерно с мишката, може да вземем наименованието и физическото място, където е включена мишката. Примерно:
  
6. [[Udev,_динамична_инициализация_на_периферия#Изпълнение на скрипт при инициализация на usb устройство|Да се конфигурира събитие при включване на usb устройство.]]
+
$udevadm info --attribute-walk --name=/dev/input/mouse1
  
==Изпълнение на скрипт при инициализация на usb устройство==
+
    ...
[[Udev,_динамична_инициализация_на_периферия#Задаване на правила при инициализация на USB устройство|Kъм правилото на устройството]] се добавя скрипта за изпълнение ''RUN+="/root/program"''. Правилото за изпълнение на скрипта ''program'' при включване на мишка, би изглеждало така:
+
    ATTRS{name}=="Logitech USB Optical Mouse"  
SUBSYSTEMS=="input", ATTRS{name}=="Logitech USB Optical Mouse", NAME="testMouse", RUN+="/root/program"
+
    ATTRS{phys}=="usb-0000:00:1d.0-2/input0"  
 +
    ...
  
Трябва да се създаде и скрипта за изпълнение в съответна директория. Създава се текстов файл
+
*Дадените стойности зависят от модела на мишката и USB порта на включване. Правилото се описва с файл в директория
  nano /root/program
+
  /etc/udev/rules.d
със следното съдържание:
+
със следния формат на името xx-ime.rules, където:
#!/bin/bash
+
*xx – приоритет на изпълнение, първо ще се изпълнят правилата с по-малка стойност;
halt
+
*ime – произволно име;
и се променят правата му, за да бъде изпълним
+
*.rules – задължително разширение.
chmod +x /root/program
 
  
  
 +
*Може да стартираме изпълнение на скрипт към правилото на устройството. Към правилото на устройството ще добавим ''RUN+="/root/program"''. Правилото за изпълнение на скрипта ''program'' при включване на мишка, би изглеждало така:
 +
SUBSYSTEMS=="input", ATTRS{name}=="Logitech USB Optical Mouse",RUN+="/root/program"
  
==Изпълнение на скрипт при инициализация на usb устройство==
 
[[Udev,_динамична_инициализация_на_периферия#Задаване на правила при инициализация на USB устройство|Kъм правилото на устройството]] се добавя скрипта за изпълнение ''RUN+="/root/program"''. Правилото за изпълнение на скрипта ''program'' при включване на мишка, би изглеждало така:
 
SUBSYSTEMS=="input", ATTRS{name}=="Logitech USB Optical Mouse", NAME="testMouse", RUN+="/root/program"
 
  
 
Трябва да се създаде и скрипта за изпълнение в съответна директория. Създава се текстов файл
 
Трябва да се създаде и скрипта за изпълнение в съответна директория. Създава се текстов файл
Line 60: Line 80:
 
със следното съдържание:
 
със следното съдържание:
 
  #!/bin/bash
 
  #!/bin/bash
  halt
+
  eject
 +
eject -t
 
и се променят правата му, за да бъде изпълним
 
и се променят правата му, за да бъде изпълним
 
  chmod +x /root/program
 
  chmod +x /root/program
  
 +
== Събитие при хардуерни промени в C# ==
  
  
== ==
+
=== Дефиниране кодовете на събития ===
 
+
*'''[https://msdn.microsoft.com/en-us/library/windows/desktop/aa363480%28v=vs.85%29.aspx WM_DEVICECHANGE]''' - известява за хардуерни промени
*'''WM_DEVICECHANGE''' - известява за хардуерни промени
 
  
 
   const int WM_DEVICECHANGE = 0x0219;
 
   const int WM_DEVICECHANGE = 0x0219;
   const int DBT_DEVICEARRIVAL = 0x8000; // system detected a new device
+
   const int DBT_DEVICEARRIVAL = 0x8000; // Открито ново устрой
   const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //device was removed
+
   const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //Премахнато устройство
   const int DBT_DEVNODES_CHANGED = 0x0007; //device changed
+
   const int DBT_DEVNODES_CHANGED = 0x0007; // Промяна в състоянието на устройството
  const int DBT_DEVTYP_VOLUME = 0x00000002; // logical volume
+
 
  
=== ===  
+
=== права за достъп  ===  
  
 
  using System.Security.Permissions;
 
  using System.Security.Permissions;
 
   
 
   
 
  [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
 
  [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)]
 
 
  protected override void [[WndProc]]([[ref]] Message m)
 
  protected override void [[WndProc]]([[ref]] Message m)
 
  {
 
  {
Line 93: Line 113:
 
  }
 
  }
  
== ==
+
=== системен звук===
  
 
  for (int i = 0; i < 5; i++)
 
  for (int i = 0; i < 5; i++)
Line 101: Line 121:
 
  }
 
  }
  
== ==
+
=== изпълнение на системна команда ===
  
 
  var psi = new System.Diagnostics.ProcessStartInfo("shutdown", "/s /f /t 0");
 
  var psi = new System.Diagnostics.ProcessStartInfo("shutdown", "/s /f /t 0");
Line 108: Line 128:
 
  System.Diagnostics.Process.Start(psi);
 
  System.Diagnostics.Process.Start(psi);
  
== ==
+
=== скриване прозореца на приложението===
 
  public Form1()
 
  public Form1()
 
  {
 
  {
Line 115: Line 135:
 
   this.ShowInTaskbar = false;
 
   this.ShowInTaskbar = false;
 
  }
 
  }
 +
 +
=== Добавяне на приложението в startUp===
 +
 +
%UserProfile%\Start Menu\Startup
 +
 +
 +
http://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devices

Latest revision as of 09:04, 10 February 2016

Теория USB

Цел

Диагностика на usb устройства в Linux с инструментите

  • lsusb
  • udevadm
  • dmesg
  • wireshark

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

Прихващане на събития при инициализация в Windows с С#


Задачи за изпълнение

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

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

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

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

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

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

3. Да се проследят промените с командата dmesg

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

udevadm monitor

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

udevadm info --attribute-walk --path=... 
udevadm info --attribute-walk --name=/dev/input/mouse1

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

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

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


Изпълнение на скрипт при инициализация на 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 – задължително разширение.


  • Може да стартираме изпълнение на скрипт към правилото на устройството. Към правилото на устройството ще добавим 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


http://www.codeproject.com/Articles/60579/A-USB-Library-to-Detect-USB-Devices