You are on page 1of 7

Urzdzenia peryferyjne

Laboratorium 14
Bluetooth komunikacja z telefonem komrkowym

Strona: 1/7

1. Zadania do wykonania
Celem wiczenia byo napisanie programu realizujcego komunikacj midzy adapterem Bluetooth, a
telefonem posiadajcym tak technologi. W ramach realizacji wiczenia naleao zaimplementowa
metody wykrywajce adaptery Bluetooth podczone do komputera, szukajce w pobliu aktywnych
urzdze, autoryzujce poczenie midzy komputerem a wybranym urzdzeniem oraz przesyajce
pliki do urzdzenia Bluetooth.

2. Wstp teoretyczny
Technologia

Bluetooth

jest

technologi

komunikacji

krtkiego

zasigu

pomidzy

rnymi

urzdzeniami elektronicznymi takimi jak komputer, telefon komrkowy czy inne urzdzenia
peryferyjne. Kade urzdzenie komunikujce si poprzez Bluetooth posiada specjalny adapter
umoliwiajcy bezprzewodowe porozumiewanie si. Technologia oparta jest na czu radiowym
dziaa w pamie 2,4GHz, wykorzystuje modulacj FSK i zapewnia przepustowo do 5MB/s (Bluetooth
3.1 + High Speed). Urzdzenia Bluetooth charakteryzuj si stosunkowo maym poborem mocy i
ograniczonym zasigiem (odpowiednio 100m klasa 1, 10m klasa II, lub 1m klasa III w otwartej przestrzeni).

W projekcie wykorzystane zostay funkcje zawarte w bibliotekach:


winsock2.h biblioteka zawierajca funkcje umoliwiajce tworzenie zaawansowanych

pocze sieciowych bez wzgldu na uywany protok sieciowy i warstw, w ktrej dziaa aplikacja.

BluetoothAPIs.h

Bluetooth API,

zawiera

midzy

innymi

funkcje

zarzdzajce

urzdzeniami Bluetooth, wykrywajce adaptery oraz autoryzujce urzdzenia.


ws2bth.h rozszerzenia Winsock dla Bluetooth

3. Opis programu
W ramach wykonywania wiczenia zosta napisany program konsolowy realizujcy zagadnienia
wymienione w punkcie 1 niniejszego sprawozdania.
3.1 Wykrywanie adapterw
Pierwsz rzecz, ktr trzeba byo oprogramowa byo wykrywanie aktywnych adapterw Bluetooth.
Do

tego

wykorzystywana

jest

tablica

uchwytw

adaptery[MAX_ILOSC_ADAPTEROW],

gdzie

MAX_ILOSC_ADAPTEROW jest sta okrelajc ile adapterw moemy maksymalnie obsugiwa oraz
struktur BLUETOOTH_FIND_RADIO_PARAMS

pozwalajc numerowa poszczeglne, zainstalowane

adaptery Bluetooth. Wykryte urzdzenie przechowuje uchwyt uchwyt_adaptera. Jeli jest on rwny
NULL

to

komputer

nie

znalaz

adnych

podczonych

Strona: 2/7

adapterw.

Korzystamy

funkcji

BluetoothFindFirstRadio, ktra jak sama nazwa wskazuje szuka pierwszego aktywnego urzdzenia
Bluetooth:
Listing 1: Szukanie pierwszego adaptera Bluetooth
BLUETOOTH_FIND_RADIO_PARAMS struktura_BFRP = { sizeof(BLUETOOTH_FIND_RADIO_PARAMS) };

BLUETOOTH_RADIO_FIND uchwyt_adaptera = NULL;


HBLUETOOTH_DEVICE_FIND uchwyt_urzadzenia = NULL;
//()
uchwyt_adaptera = BluetoothFindFirstRadio(&struktura_BFRP, &adaptery[0]);

Jeeli wynik dziaania funkcji BluetoothFindFirstRadio bdzie rny od NULL prowadzimy dalsze
poszukiwania podczonych adapterw (jeli takie istniej). W tym celu korzystamy z funkcji
BluetoothFindNextRadio. Kady znaleziony adapter dodajemy do tablicy adapters.
Listing 2: Wykrywanie pozostaych adapterw
if (uchwyt_adaptera == NULL)
cout << "Brak dostepnych adapterow" << endl;
else
{
znalezione_adaptery++;
while (BluetoothFindNextRadio(&struktura_BFRP, &adaptery[znalezione_adaptery]))
{
znalezione_adaptery++;

if (znalezione_adaptery == MAX_ILOSC_ADAPTEROW - 1)
{
cout << "Nie mozna podlaczyc wiecej adapterow";
break;
}
}
}

for (int i = 0; i < znalezione_adaptery; i++)


wyswietl_info_adaptera(adaptery[i], i);

BluetoothFindRadioClose(uchwyt_adaptera);

Listing 2 zawiera rwnie obsug bdw a take ptl drukujc informacje o dostpnych
adapterach poprzez wywoywanie metody wywietl_info_adaptera. Ciao tej funkcji przedstawia
Listing 3. Kolejny raz uywamy gotowej funkcji, tym razem BluetoothGetRadioInfo pozwalajcej
uzyska informacje na temat konkretnego adaptera Bluetooth.
Strona: 3/7

Listing 3: Drukowanie informacji o adapterze


void wyswietl_info_adaptera(HANDLE adapter, int i)
{
BluetoothGetRadioInfo(adapter, &struktura_info_adaptera);

cout << "Adapter " << i << " - " << struktura_info_adaptera.szName <<endl;
cout << " MAC: " << hex << (int)struktura_info_adaptera.address.rgBytes[0] << ":" <<
(int)struktura_info_adaptera.address.rgBytes[1] << ":"
<< (int)struktura_info_adaptera.address.rgBytes[2] << ":" <<
(int)struktura_info_adaptera.address.rgBytes[3] << ":"
<< (int)struktura_info_adaptera.address.rgBytes[4] << ":" <<
(int)struktura_info_adaptera.address.rgBytes[5] << endl;
cout << "Klasa adaptera: " << struktura_info_adaptera.ulClassofDevice << endl;
cout << "Producent: " << struktura_info_adaptera.manufacturer << endl;
}

Uytkownik otrzyma informacje na temat adapterw, moe wic zdecydowa, z ktrego chce
korzysta:

Listing 4: Wybr adaptera


int wybrane_urzadzenie = 0;
cout << "Wprowadz numer wybranego urzadzenia: ";
cin >> wybrane_urzadzenie;
cout << endl;

3.2 Wykrywanie urzdze i autoryzacja


Za porednictwem wybranego adaptera moemy rozpocz wyszukiwanie urzdze Bluetooth
znajdujcych si w pobliu. Wyszukiwanie urzdze odbywa si z uwzgldnieniem parametrw
szukania. Parametry te przechowuje struktura BLUETOOTH_DEVICE_SEARCH_PARAMS:

Listing 5: Struktura BLUETOOTH_DEVICE_SEARCH_PARAMS


BLUETOOTH_DEVICE_SEARCH_PARAMS parametry_szukania_urzadzen = {
sizeof(BLUETOOTH_DEVICE_SEARCH_PARAMS), //rozmiar struktury
1, //bool: czy zwraca urzdzenia uwierzytelnione
0, //bool: czy zwraca urzdzenia zapamitane
1, //bool: czy zwraca urzdzenia nieznane
1, //bool: czy zwraca urzdzenia poczone
1, //bool: czy zwraca kolejne urzdzenie
2, //czas szukania urzdze - wielokrotno 1.28 sekundy NULL };

Strona: 4/7

W tym momencie moemy przej do waciwej czci programu odpowiedzialnej za wyszukiwanie


aktywnych urzdze Bluetooth. Postpujemy podobnie jak w przypadku szukania adapterw.
Najpierw wykrywamy pierwsze urzdzenie, a gdy takowe si pojawi dalej skanujemy otoczenie
w celu odnalezienia kolejnych urzdze. Informacje o urzdzeniach bd przechowywane w tablicy
struktur BLUETOOTH_DEVICE_INFO. Uytkownik moe dokona wyboru tym razem urzdzenia,
z ktrym bdzie chcia uzyska poczenie. Wybr uatwiaj informacj o danym urzdzeniu
wywietlone na ekranie za porednictwem funkcji wyswietl_info_urzadzenia, ktra jest bardzo
podobna
do wczeniej wymienionej metod wywietl_info_adaptera. Funkcj wyswietl_info_urzadzenia
prezentuje Listing 7.

Listing 6: Wykrywanie urzdze, autoryzacja, wybr urzdzenia


parametry_szukania_urzadzen.hRadio = adaptery[wybrany_adapter];
struktura_info_urzadzenia[0].dwSize = sizeof(BLUETOOTH_DEVICE_INFO);

uchwyt_urzadzenia = BluetoothFindFirstDevice(&parametry_szukania_urzadzen,
&struktura_info_urzadzenia[0]);
//autoryzacja
BluetoothAuthenticateDeviceEx(NULL, adaptery[wybrany_adapter],
&struktura_info_urzadzenia[znalezione_urzadzenia], NULL, MITMProtectionRequired);

if (uchwyt_urzadzenia == NULL){cout << "Nie znaleziono urzadzen.";}


else{
znalezione_urzadzenia++;
struktura_info_urzadzenia[znalezione_urzadzenia].dwSize =
sizeof(BLUETOOTH_DEVICE_INFO);
while (BluetoothFindNextDevice(uchwyt_urzadzenia,
&struktura_info_urzadzenia[znalezione_urzadzenia]))
{
znalezione_urzadzenia++;
struktura_info_urzadzenia[znalezione_urzadzenia].dwSize =
sizeof(BLUETOOTH_DEVICE_INFO);
//autoryzacja
BluetoothAuthenticateDeviceEx(NULL, adaptery[wybrany_adapter],
&struktura_info_urzadzenia[znalezione_urzadzenia], NULL,
MITMProtectionRequired);
}
}

BluetoothFindDeviceClose(uchwyt_urzadzenia);

for (int i = 0; i < znalezione_urzadzenia; i++)


wyswietl_info_urzadzenia(struktura_info_urzadzenia[i], i);

Strona: 5/7

int wybrane_urzadzenie = 0;
cout << "Wprowadz numer wybranego urzadzenia: ";
cin >> wybrane_urzadzenie;
cout << endl;

Listing 7: Drukowanie informacji o urzdzeniu Bluetooth


void wyswietl_info_urzadzenia(BLUETOOTH_DEVICE_INFO urzadzenie, int i)
{
cout << "Urzadzenie: " << i << " - " << urzadzenie.szName << endl;
cout << "MAC: " << hex << (int)urzadzenie.Address.rgBytes[0] << ":" <<
(int)urzadzenie.Address.rgBytes[1] << ":" << (int)urzadzenie.Address.rgBytes[2] << ":"
<< (int)urzadzenie.Address.rgBytes[3] << ":" << (int)urzadzenie.Address.rgBytes[4]
<< ":" << (int)urzadzenie.Address.rgBytes[5] << endl;
cout << "Klasa urzadzenia: " << urzadzenie.ulClassofDevice << endl;
cout << "Polaczony: " << urzadzenie.fConnected << endl;
cout << "Autoryzowany: " << urzadzenie.fAuthenticated << endl;
cout << "Zapisany: " << urzadzenie.fRemembered << endl;
}

3.4 Przesyanie pliku


Aby przesa plik do urzdzenia najpierw musimy si z nim poczy. Operacj czenia poprzedza
utworzenie nowego gniazda Winsock przystosowanego do komunikacji w technologii Bluetooth. W tym
celu po pomylnym utworzeniu gniazda inicjalizujemy struktur SOCKADDR_BTH. Wpisujemy w ni
m.in. adres urzdzenia Bluetooth oraz numer portu komunikacyjnego. Nastpnie wykonujemy prb
poczenia wywoujc funkcj connect.

Lisitng 8: czenie z urzdzeniem Bluetooth


WSADATA dane_wsa;
int wynik = WSAStartup(MAKEWORD(2, 2), &dane_wsa);
if (wynik != NO_ERROR) {
cout << "Blad WSAStartup: " << wynik;
return 0;
}

SOCKET gniazdo = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);

if (gniazdo == INVALID_SOCKET){
cout << "Wystapil blad - niewlasciwe gniazdo" << endl;
return 0;}
}

Strona: 6/7

else {
SOCKADDR_BTH sa;
sa.addressFamily = AF_BTH;
sa.btAddr = struktura_info_urzadzenia[wybrane_urzadzenie].Address.ullLong;
sa.port = (ULONG)BT_PORT_ANY;
sa.serviceClassId = OBEXObjectPushServiceClass_UUID;

r = connect(gniazdo, (SOCKADDR *)&sa, sizeof(sa));


if (r == 0) cout << "Udane polaczenie";

_getch();

if (r != 0) {
cout << "Wystapil blad podczas laczenia" << endl;
cout << r;
_getch();
closesocket(gniazdo);
WSACleanup();}

Dane mona wysya na przykad korzystajc z protokou OBEX. Niestety wysyanie plikw nie dziaao
do koca poprawnie. O ile kolejne bity byy wysyane to problem polega na braku odbioru paczek ze
strony urzdzenia odbierajcego dane. Z tego powodu fragment kodu odpowiadajcy za wysyanie
jest pominity.

4. Podsumowanie i wnioski
Realizacja zaj laboratoryjnych pozwolia nam zapozna si z moliwociami pisania programw
zapewniajcych komunikacj w technologii Bluetooth midzy komputerem a odbiornikiem - w naszym
przypadku telefonem komrkowym. Korzystanie z gotowych plikw nagwkowych znacznie uatwiao
osignicie niektrych celw, jednak najwicej problemw sprawiao poprawne wysyanie plikw
protokoem OBEX. Wymaga to od dewelopera oprogramowania wszystkich etapw przesyania pliku
poczynajc od sprawdzenia rozmiaru i zawartoci pliku a koczc na przesyaniu kolejnych pakietw,
w tym odpowiednio dobranych paczek z daniami connect czy disconnect.

Strona: 7/7

You might also like