Difference between revisions of "Usb упражнение"
Line 75: | Line 75: | ||
chmod +x /root/program | chmod +x /root/program | ||
− | == == | + | == Събитие при хардуерни промени == |
− | *'''WM_DEVICECHANGE''' - известява за хардуерни промени | + | |
+ | === Дефиниране кодовете на събития === | ||
+ | *'''[https://msdn.microsoft.com/en-us/library/windows/desktop/aa363480%28v=vs.85%29.aspx WM_DEVICECHANGE]''' - известява за хардуерни промени | ||
const int WM_DEVICECHANGE = 0x0219; | const int WM_DEVICECHANGE = 0x0219; | ||
− | const int DBT_DEVICEARRIVAL = 0x8000; // | + | const int DBT_DEVICEARRIVAL = 0x8000; // Открито ново устрой |
− | const int DBT_DEVICEREMOVECOMPLETE = 0x8004; // | + | const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //Премахнато устройство |
− | const int DBT_DEVNODES_CHANGED = 0x0007; // | + | const int DBT_DEVNODES_CHANGED = 0x0007; // Промяна в състоянието на устройството |
− | + | ||
− | === === | + | === права за достъп === |
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 102: | Line 103: | ||
} | } | ||
− | == == | + | === системен звук=== |
for (int i = 0; i < 5; i++) | for (int i = 0; i < 5; i++) | ||
Line 110: | Line 111: | ||
} | } | ||
− | == == | + | === изпълнение на системна команда === |
var psi = new System.Diagnostics.ProcessStartInfo("shutdown", "/s /f /t 0"); | var psi = new System.Diagnostics.ProcessStartInfo("shutdown", "/s /f /t 0"); | ||
Line 117: | Line 118: | ||
System.Diagnostics.Process.Start(psi); | System.Diagnostics.Process.Start(psi); | ||
− | == == | + | === скриване прозореца на приложението=== |
public Form1() | public Form1() | ||
{ | { | ||
Line 124: | Line 125: | ||
this.ShowInTaskbar = false; | this.ShowInTaskbar = false; | ||
} | } | ||
+ | |||
+ | === Добавяне на приложението в startUp=== | ||
+ | |||
+ | %UserProfile%\Start Menu\Startup |
Revision as of 07:28, 19 March 2015
Contents
Теория 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
Събитие при хардуерни промени
Дефиниране кодовете на събития
- 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