Usb упражнение

From Ilianko
Revision as of 07:32, 19 March 2015 by Anko (talk | contribs)

Теория USB

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

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

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

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

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

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

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

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

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

udevadm monitor

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

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


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

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

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