Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Podobne dokumenty
akademia androida Service, BroadcastReceiver, ContentProvider część IV

Systemy operacyjne na platformach mobilnych

Obsługa SMS i telefonii

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Zaawansowane aplikacje WWW - laboratorium

Współbieżność w środowisku Java

akademia androida Składowanie danych część VI

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Programowanie Urządzeń Mobilnych. Laboratorium nr 9,10

Instrukcja instalacji Przewód interfejsu USB

Metody dostępu do danych

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Kurs programowania. Wykład 8. Wojciech Macyna

akademia androida Intencje oraz URI część III

JAVA W SUPER EXPRESOWEJ PIGUŁCE

STWORZENIE MOBILNEJ APLIKACJI,

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Instrukcja do konwertera USB-RS232

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Tworzenie i wykorzystanie usług

Instrukcja dla instalatora systemu SMDP Enterprise/Professional

Konfigurowanie sterownika BC8150 firmy Beckhoff wprowadzenie

PRZETWORNIK USB - RS232

1. Tworzenie nowego projektu.

Systemy operacyjne na platformach mobilnych

Programowanie obiektowe

PRZETWORNIK USB - RS232

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Systemy operacyjne na platformach mobilnych

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Systemy operacyjne na platformach mobilnych

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Fragmenty są wspierane od Androida 1.6

Koncentrator USB-4xRS (HUB USB-4xRS)

Aplikacje RMI Lab4

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Instrukcja instalacji Przewód interfejsu USB

Singleton. Cel: Przykład: Zastosowanie: Zapewnienie, że klasa ma tylko jedną instancję i dostarczenie globalnego dostępu do niej.

Programowanie obiektowe

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Architektury Usług Internetowych. Laboratorium 3. Usługi w środowisku wielo-agentowym

Android pierwsza aplikacja

Aplikacje w Javie- wykład 11 Wątki-podstawy

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Aplikacje internetowe i rozproszone - laboratorium

RMI-2. Java Remote Method Invocation (RMI) na podstawie m.in. podręcznika firmy Sun Microsystems SYSTEMY ROZPROSZONE

Platformy Programistyczne Podstawy języka Java

Aplikacje RMI

VComNet Podręcznik użytkownika. VComNet. Podręcznik użytkownika Wstęp

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Aplikacje WWW - laboratorium

Programowanie obiektowe i zdarzeniowe

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Wprowadzenie do środowiska Visual Studio cz. 2 (ćwiczenie wykonywane zdalnie) Wykorzystanie Wirtualnego portu COM

Koncentrator USB-4xRS (HUB USB-4xRS)

Zaawansowane aplikacje internetowe

Wprowadzenie do języka Java

1 Atrybuty i metody klasowe

Laboratorium 7 Blog: dodawanie i edycja wpisów

Java. Programowanie Obiektowe Mateusz Cicheński

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Przykładowa dostępna aplikacja w Visual Studio - krok po kroku

[Android] Podstawy programowania

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Podstawy programowania w lejos

Konfigurowanie sterownika CX1000 firmy Beckhoff wprowadzenie. 1. Konfiguracja pakietu TwinCAT do współpracy z sterownikiem CX1000

Multimedia JAVA. Historia

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Architektury usług internetowych. Laboratorium 5. JADE

Aplikacje WWW - laboratorium

Programowanie obiektowe

Aplikacja wielowątkowa prosty komunikator

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Programowanie Multimediów. Programowanie Multimediów JAVA. wprowadzenie do programowania (3/3) [1]

Wykład 7: Pakiety i Interfejsy

Wywoływanie metod zdalnych

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Remote Method Invocation 17 listopada 2010

Java Podstawy. Michał Bereta

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Przypomnienie o klasach i obiektach

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

Wątki w Javie. Piotr Tokarski

Klasy abstrakcyjne i interfejsy

Na chwilę obecną biblioteka ElzabObsluga.dll współpracuje tylko ze sprawdzarkami RSowymi.

Transkrypt:

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o. 29.06.2015

2

Spis treści 1. Wymagania...4 2. Uprawnienia systemowe...4 3. Uprawnienie do komunikacji z urządzeniem USB...5 3.1 Uzyskiwanie uprawnienia w momencie podłączenia urządzenia...5 3.2 Uzyskiwanie uprawnienia w czasie działania aplikacji...6 4. Uzyskiwanie połączenia z wirtualnym portem szeregowym...8 5. Wysyłanie i odbiór danych...10 3

1. Wymagania Aby urządzenie mogło obsługiwać połączenie USB jako host, musi ono spełniać następujące warunki: obecność systemu Android w wersji 3.1 lub wyższej wsparcie dla specyfikacji USB On-The-Go (USB OTG) 2. Uprawnienia systemowe Następujące uprawnienia w pliku AndroidManifest.xml wymagane są do prawidłowej pracy sterownika usb-serial-for-android: android.permission.write_external_storage android.permission.read_external_storage android.permission.read_phone_state 4

3. Uprawnienie do komunikacji z urządzeniem USB Aby aplikacja mogła porozumiewać się z urządzeniem USB jako host, musi ona posiadać odpowiednie uprawnienie. Nie jest ono jednak przyznawane odgórnie na podstawie uprawnień systemowych określonych w pliku AndroidManifest.xml. Musi ono zostać nadane przez użytkownika dla poszczególnej aplikacji, przy każdorazowym podłączeniu urządzenia USB. Poniżej wymienione zostały dwa sposoby pozyskania uprawnień przez aplikację. 3.1 Uzyskiwanie uprawnienia w momencie podłączenia urządzenia Uprawnienie nadawane jest przez użytkownika w oknie dialogowym, które pojawi się tylko i wyłącznie w momencie podłączenia urządzenia USB. Okno pojawi się jedynie dla aplikacji, która posiada odpowiedni wpis w pliku AndroidManifest.xml. Wpis powoduje, że aplikacja reagować będzie na zdarzenie systemowe (akcję) "android.hardware.usb.action.usb_device_attached". Zatwierdzenie okna dialogowego spowoduje uruchomienie wybranej aktywności oraz nadanie aplikacji uprawnienia do komunikacji z urządzeniem. Poniższy wpis należy umieścić w ramach aktywności, która ma zostać uruchomiona po zatwierdzeniu okna dialogowego. <intent-filter> <action android:name="android.hardware.usb.action.usb_device_attached" /> </intent-filter> <meta-data android:name="android.hardware.usb.action.usb_device_attached" android:resource="@xml/device_filter" /> Zawartość wyżej wymienionego pliku device_filter.xml musi zawierać spis urządzeń po podłączeniu których uruchomi się okno dialogowe. 5

Przykładowa zawartość pliku device_filter.xml dla urządzeń Elzabu: <?xml version="1.0" encoding="utf-8"?> <resources> <usb-device vendor-id="1155" /> </resources> 3.2 Uzyskiwanie uprawnienia w czasie działania aplikacji Opisana tutaj metoda w porównaniu do wcześniejszej, nie wymaga każdorazowego podłączania urządzenia w celu uzyskania uprawnień do wymiany danych. Pozwoli na uzyskanie uprawnień w dowolnym momencie działania programu, gdy urządzenie zostało wcześniej podłączone. Wymaga za to modyfikacji kodu źródłowego aplikacji. Podobnie jak w pierwszej metodzie, nadanie uprawnienia odbywa się przy pomocy okna dialogowego. W pierwszym kroku należy zdefiniować metodę wywoływaną w momencie potrzeby uzyskania uprawnień. Spowoduje ona wyświetlenie użytkownikowi okna dialogowego z zapytaniem o udzielenie aplikacji uprawnienia do komunikacji z urządzeniem USB. public static void RequestForPermission(Context context, UsbDevice usbdevice) { UsbManager usbmanager = (UsbManager) context.getsystemservice(context.usb_service); if(!usbmanager.haspermission(usbdevice) ) usbmanager.requestpermission(usbdevice, getpermissionintent(context)); Widoczna tu metoda requestpermission bezpośrednio odpowiada za wyświetlenie okna dialogowego. Wymaga podania obiektu klasy PendingIntent, który określa akcję (zdarzenie) zgłaszaną aplikacji dopiero po udzieleniu przez użytkownika odpowiedzi w oknie dialogowym. Należy zdefiniować metodę, która rejestruje w aplikacji obiekt BroadcastReceiver nasłuchujący akcje (zdarzenia) z systemu operacyjnego oraz z aplikacji. Akcję, która aktywna będzie w momencie zamknięcia okna można nazwać dowolnie w poniższym przykładzie będzie to "pl.elzab.virtualcomsample.usb_permission". Ponieważ obiekt BroadcastReceiver rejestrowany w programie jest jednokrotnie, poniższa metoda jest singletonem, zwraca ona obiekt statyczny klasy PendingIntent. 6

public static synchronized PendingIntent getpermissionintent(context context) { if( spermissionintent!= null) return spermissionintent; return RegisterBroadcastReceiver(context); Metoda odpowiedzialna za rejestrację obiektu BroadcastReceiver, wygląda następująco: public static PendingIntent RegisterBroadcastReceiver(Context context) { smybroadcastreceiver = new MyBroadcastReceiver(); spermissionintent = PendingIntent.getBroadcast( context, 0, new Intent(sMyBroadcastReceiver.ACTION_USB_PERMISSION), 0); IntentFilter filter = new IntentFilter(sMyBroadcastReceiver.ACTION_USB_PERMISSION); context.registerreceiver(smybroadcastreceiver, filter); return spermissionintent; Obiekt statyczny smybroadcastreceiver zawiera w sobie metodę onreceive, która wywoływana jest w momencie, gdy użytkownik udzieli odpowiedzi na zapytanie wyświetlone w oknie dialogowym. Mówiąc inaczej, metoda ta zareaguje na akcję "pl.elzab.virtualcomsample.usb_permission". W przypadku, gdy wynik odpowiedzi jest pozytywny, można dla przykładu wykonać połączenie z urządzeniem USB, do komunikacji z którym aplikacja otrzymała uprawnienie. Przykładowa klasa MyBroadcastReceiver dziedziczy po klasie BroadcastReceiver i może wyglądać następująco: public class MyBroadcastReceiver extends BroadcastReceiver { public final String ACTION_USB_PERMISSION = "pl.elzab.virtualcomsample.usb_permission"; public final String TAG = "ElzabUSB"; @Override public void onreceive(context context, Intent intent) { String action = intent.getaction(); musbmanager.requestpermission(device, mpermissionintent) if (ACTION_USB_PERMISSION.equals(action)) { synchronized (this) { UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); if (intent.getbooleanextra(usbmanager.extra_permission_granted, false)) { if(device!= null) { Log.d(TAG, "Permission granted for device " + device); USBConnection.getConnection(context, device); else { Log.d(TAG, "Permission denied for device " + device); USBConnection.closeConnection(context); 7

4. Uzyskiwanie połączenia z wirtualnym portem szeregowym Poniżej przedstawiono kroki implementacji sterownika w kodzie źródłowym aplikacji, które wymagane są do uzyskania połączenia z wirtualnym portem szeregowym urządzenia USB. 4.1. uzyskanie usługi USB systemu Android UsbManager usbmanager = (UsbManager) getsystemservice(context.usb_service); 4.2. uzyskanie listy dostępnych sterowników wirtualnego portu szeregowego final List<UsbSerialDriver> drivers = UsbSerialProber.getDefaultProber().findAllDrivers(usbManager); W przypadku, gdy obiekt UsbDevice jest znany, w celu znalezienia pojedynczego sterownika dla tego urządzenia, można użyć metody probedevice. UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(usbDevice); 4.3. uzyskanie listy dostępnych wirtualnych portów szeregowych final List<UsbSerialPort> result = new ArrayList<UsbSerialPort>(); for (final UsbSerialDriver driver : drivers) { final List<UsbSerialPort> ports = driver.getports(); result.addall(ports); 4.4. otwarcie połączenia z jednym z urządzeń USB, które sklasyfikowano jako wirtualny port szeregowy UsbSerialPort serialport = result.get(0); UsbDeviceConnection connection = usbmanager.opendevice(serialport.getdriver().getdevice()); serialport.open(connection); Przed wywołaniem metody opendevice, należy sprawdzić, czy aplikacja uzyskała uprawnienie do komunikacji z danym urządzeniem USB. Brak uprawnień uniemożliwi wymianę danych. Jeżeli poniższa funkcja zwróci wartość true, oznacza to, że uprawnienie zostało nadane. usbmanager.haspermission(serialport.getdriver().getdevice()) Informacje dotyczące uprawnienia do komunikacji z urządzeniem opisane zostały w sekcji trzeciej. 8

4.5. określenie parametrów komunikacji portu szeregowego Od strony urządzenia z systemem Android, należy ustawić następujące parametry przesyłu danych: szybkość transmisji: 115200 baud liczba bitów danych: 8 liczba bitów stopu: 1 ignorowanie bitu parzystości serialport.setparameters(115200, 8, UsbSerialPort.STOPBITS_1, UsbSerialPort.PARITY_NONE); 4.6. zamknięcie połączenia serialport.close(); 9

5. Wysyłanie i odbiór danych Wysyłanie danych możliwe jest poprzez metodę write obiektu UsbSerialPort. Jako parametry funkcji, należy podać tablicę bajtów oraz timeout wyrażany w milisekundach. Przykład: serialport.write(new byte[] {0x05, 0x06, 0x07, 1000); W celu umożliwienia odbioru danych, można wykorzystać klasę SerialInputOutputManager oraz SerialInputOutputManager.Listener. Dla klasy SerialInputOutputManager.Listener należy nadpisać metodę onnewdata, oraz onrunerror. Pierwsza metoda wywołuje się za każdym razem, gdy do portu napłyną dane z zewnątrz. Dane dostępne są jako tablica bajtów występująca w parametrze metody. Druga metoda wywoływana jest w przypadku wystąpienia błędu wątku nasłuchującego port. W poniższym przykładzie, jako reakcja na przypływ danych, wywoływana jest funkcja updatereceiveddata aktywności Prima2TestActivity. SerialInputOutputManager.Listener listener = new SerialInputOutputManager.Listener() { @Override public void onnewdata(final byte[] data) { Prima2TestActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Prima2TestActivity.this.updateReceivedData(data); ); ; @Override public void onrunerror(exception e) { Log.d(TAG, e.getmessage()); W następnym kroku należy powiązać obiekt otwartego wcześniej połączenia szeregowego z obiektem reagującym na przypływ danych. SerialInputOutputManager serialiomanager = new SerialInputOutputManager(serialPort, listener); Zdefiniowane zadanie pracujące w tle, można uruchomić w ramach obiektu ExecutorService. ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(serialiomanager); Po zakończeniu połączenia z wirtualnym portem szeregowym, należy zakończyć pracę obiektu SerialInputOutputManager za pomocą poniższej instrukcji. mserialiomanager.stop(); 10