Podglądanie na ekranie (2002)


Poniższy tekst jest rozwinięciem artykułu opublikowanego na łamach czasopisma Chip Special Linux lato 2002.

Jak powszechnie wiadomo, Linux i inne "alternatywne" do Windows systemy operacyjne ciągle borykają się z brakiem sterowników do niektórych urządzeń. Czy można temu zaradzić ?

W tym artykule zostanie opisane, w jaki sposób można pobrać to, co jest wysyłane do i z urządzeń podłączonych do komputera przez port szeregowy lub złącze podczerwieni. Dane te pozwalają na odtworzenie protokołu używanego przez dane urządzenie i w konsekwencji napisanie programu do jego obsługi.

1. Kablem go...


Rozpocznijmy od "podglądania" złącza szeregowego. W tabelce obok przedstawione zostały poszczególne jego sygnały. Dla nas najbardziej interesujące są trzy z nich: GND (masa), TX (transmisja z komputera) i RX (transmisja do komputera).

Jeżeli chcemy "podejrzeć" transmisję z komputera, łączymy TX i GDN odpowiednio z sygnałami RX i GND w drugim porcie szeregowym komputera.

Od strony funkcjonalnej może to być wykonane następująco: dołączamy do siebie dwie przejściówki 9-25 pin (każda w cenie do 10 PLN) tak, że z obu stron takiego "urządzenia" mamy 9 lub 25 pinów (podłączamy je z jednej strony do "obserwowanego" portu, z drugiej dołączamy kabel do "naszego" urządzenia). Jedna przejściówka musi być rozbieralna - w środku dolutowywujemy dwa przewody do TX i GND i wyprowadzamy na zewnątrz. Przewody te łączamy z wtyczką wpiętą do drugiego portu szeregowego (odpowiednio do RX i GND).

W przypadku obserwacji transmisji do komputera, podobnie powinniśmy połączyć piny RX i GND z pinami RX i GND drugiego portu szeregowego.

Następnie potrzebujemy programu, który pokaże nam każdy znak, który pojawi się na drugim porcie szeregowym.

Nie nadaje się do tego żaden terminal - określone sekwencje znaków mogłyby wywoływać pewne działania (np. czyszczenie ekranu) i w konsekwencji być tracone.

Przykładowy program tego typu (wraz z kodem źródłowym) został dołączony na chip-cd. Jego użycie jest następujące:

sniff com2: 115200

gdzie "com2:" to nazwa obserwowanego, a 115200 to prędkość, z jaką mają być odczytywane znaki. Prędkość ta musi być taka sama jak prędkość ustawiana na obserwowanym porcie szeregowym (w przeciwnym razie będziemy obserwować na drugim porcie szeregowym wyłącznie znaki o kodzie 0x00). Nie ma oczywiście potrzeby sprawdzać wszystkich możliwych prędkości - z reguły wystarczy sprawdzenie i ustawienie jednej z najbardziej popularnych: 9600 lub 19200 lub 115200.

Program w czasie swojego działania zapisuje odczytane z portu znaki w pliku "out.trc".

Pozostała jeszcze kwestia sygnałów DTR i RTS, których włączenie jest ważne dla niektórych urządzeń (np. telefonów komórkowych). Opisana powyżej metoda w najprostszej postaci nie pozwala niestety na wykrycie ich stanu.

2. Sygnały złącza szeregowego


  Złącze 25 pin

Numer
Nazwa
Kierunek
Opis
1 SHIELD - Shield Ground
2 TXD wyjście Transmit Data
3 RXD wejście Receive Data
4 RTS wyjście Request to Send
5 CTS wejście Clear to Send
6 DSR wejście Data Set Ready
7 GND - System Ground
8 CD wejście Carrier Detect
9 niepołączone -
10 niepołączone -
11 niepołączone -
12 niepołączone -
13 niepołączone -
14 niepołączone -
15 niepołączone -
16 niepołączone -
17 niepołączone -
18 niepołączone -
19 niepołączone -
20 DTR wyjście Data Terminal Ready
21 niepołączone -
22 RI wejście Ring Indicator
23 niepołączone -
24 niepołączone -
25 niepołączone -

Złącze 9 pin

Numer
Nazwa
Kierunek
Opis
1 CD wejście Carrier Detect
2 RXD wejście Receive Data
3 TXD wyjście Transmit Data
4 DTR wyjście Data Terminal Ready
5 GND - System Ground
6 DSR wejście Data Set Ready
7 RTS wyjście Request to Send
8 CTS wejście Clear to Send
9 RI wejście Ring Indicator

3. Spójrz mi w oczko


Troszkę inaczej wygląda sprawa w przypadku podczerwieni. Tutaj potrzebne będą dwa komputery ze złączem podczerwieni (mogą to być oczywiście komputery przenośne lub stacjonarne).

Tym razem dołączony program działa tylko w Linuxie i tylko z prędkością 9600. Należy wobec tego albo ustawić taką prędkość w komputerze, którego port podczerwieni będziemy obserwowali albo zmienić następującą linię w kodzie źródłowym:

#define INIT_BAUDRATE B9600

Jeżeli mamy włączoną obsługę podczerwieni w jądrze systemu, należy ją wyłączyć przed jego uruchomieniem (np. komendą "rcirda stop" w SuSe Linux).

Następnie kierujemy złącze podczerwieni na komputer, który odbiera dane od obserwowanego urządzenia albo na obserwowane urządzenie (w zależności od tego, która transmisja nas interesuje).

Wywołujemy program komendą "irda_intercept". Interesujące nas dane trafią do pliku "out.trc".

Jeżeli mamy bajty wysyłane "do" lub "z" urządzenia w pliku, należy otworzyć go w jakimś edytorze binarnym.

Szukamy pewnych prawidłowości. Interesują nas szczególnie sekwencje powtarzających się znaków - będą one na pewno stanowić nagłówek każdej komendy. W reszcie znaków należy również szukać pewnych prawidłowości - np. tekstów lub tekstów zakodowanych w Unikodzie. Zapewne w trakcie takiej analizy znajdziemy pewne komendy, które mogą wywoływać pewne funkcje lub być odpowiedzią na pewne zapytania wysłane do urządzenia. Najczęściej, aby się w tym upewnić, należy powtórzyć sesję "podglądania" i wysłać daną komendę kilka razy.

Może się również tak zdarzyć, iż mamy transmisję z danym urządzeniem w pliku i znamy już ogólny format jego komend. W takiej sytuacji można polecić napisanie takiej procedury, która na podstawie pliku z transmisją będzie "odtwarzała" i wypisywała jedynie treść kolejnych komend (pomijając nagłówek). Przykład takiej procedury można znaleźć np. w projekcie mygnokii2. Ponieważ firma Nokia nie zmienia tam ogólnych zasad komunikacji z jej telefonami, takie rozwiązanie znakomicie ułatwia "rozpracowywanie" komend użytych w kolejnych modelach (są one ciągle zmieniane z różnych względów).

4. Alternatywy


Opisane w tekście metody oczywiście nie są oczywiście jedyne. Mają jednak zaletę: są bardzo proste oraz działają niezależnie od użytego systemu operacyjnego i oprogramowania.

Alternatywą jest np. użycie programów monitorujących bezpośrednio używany przez urządzenie port szeregowy (nie jest wtedy oczywiście wymagane tworzenie żadnych dodatkowych opisanych w tekście "urządzeń").

Taką możliwością dysponujemy np., gdy uruchamiamy "podglądane" oprogramowanie np. w jakimś emulatorze systemu operacyjnego, w którym ono działa i wykorzystujemy funkcje diagnostyczne emulatora.

Można również wykorzystać mechanizmy samego systemu operacyjnego. W ten sposób działa PortMon dla różnych wersji Windows (http://www.sysinternals.com/ntw2k/freeware/portmon.shtml). Pozwala na pełne monitorowanie stanu portu szeregowego (włącznie ze stanem linii DTR, RTS, zmianami prędkości portu, itp.). Jest on darmowy, ale niestety bez kodu źródłowego.

Możliwe jest także użycie np. dostępnego np. w dystrybucji Mandrake pakietu i programu "statserial"