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

From Ilianko
 
(22 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 устройство==
 +
 
 +
Задаване на правила при инициализация на 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# ==
 +
 
 +
 
 +
=== Дефиниране кодовете на събития ===
 +
*'''[https://msdn.microsoft.com/en-us/library/windows/desktop/aa363480%28v=vs.85%29.aspx 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);
 +
}
  
udevadm monitor
+
=== системен звук===
  
5. Да се разгледат параметрите на устройството
+
for (int i = 0; i < 5; i++)
 +
{
 +
  System.Threading.Thread.Sleep(1000);
 +
  System.Media.SystemSounds.Beep.Play();
 +
}
  
udevadm info --attribute-walk --path=...
+
=== изпълнение на системна команда ===
  
6. [[Udev,_динамична_инициализация_на_периферия#Изпълнение на скрипт при инициализация на usb устройство|Да се конфигурира събитие при включване на usb устройство.]]
+
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;
 +
}
  
http://stackoverflow.com/questions/15877851/the-name-wm-devicechange-does-not-exist-in-the-current-context
+
=== Добавяне на приложението в startUp===
  
http://sam.xnet.tk/2010/04/detecting-drive-insertion-and-removal-in-c/
+
%UserProfile%\Start Menu\Startup
  
https://www.youtube.com/watch?v=GFDKJfC2qw4
 
  
http://stackoverflow.com/questions/102567/how-to-shutdown-the-computer-from-c-sharp
+
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