Wysyłanie zdarzeń z oprogramowania Android – Wybór z listy
Artykuł ten opisuje sposób pisania oprogramowania dla paneli sterujących systemem eHouse pracujących na platformie ANDROID.
Mogą to być:
- Tablety
- Panele Mobilne
- Telefony Komórkowe GSM
- SmartPhone’y
- TouchPhone’y
- PDA
- PalmTop’y
- Telewizory – SMART TV
- Tunery TV SAT
- sprzęt Audio-Video
- dowolny sprzęt z zainstalowanym systemem operacyjnym Android
Inteligentny Dom eHouse może być sterowany poprzez wybór urządzenia oraz zdarzenia z listy.
Zdarzenie jest automatycznie wysyłane (po naciśnięciu przycisku „Send”) po WiFi do systemu lub przez internet jeśli opcja połączenia internetowego jest uaktywniona.
Jeśli z jakichkolwiek powodów występuje brak komunikacji TCP/IP (WIFI, INTERNET (GSM,EDGE, 3G, 4G lub innej zależnej od typu panela sterującego ) Zdarzenie jest dodawane do kolejki, która może zostać przesłana manualnie do sterowników na 1 z dostępnych sposobów w systemie eHouse i możliwym do uzyskania w danym typie panela oraz zasięgu łączy komunikacyjnych i protokołów transmisji.
Do tego celu została stworzona klasa „RunEvent.class”, która wykorzystuje samodzielnie wszystkie operacje:
- Wczytuje listę urządzeń (sterowników) i ich ustawienia wygenerowane z aplikacji eHouse.exe
- Wczytuje listę zdarzeń dla każdego sterownika
- Umożliwia dokonanie wyboru dowolnego zdarzenia z list do wysłania do systemu eHouse
- Pozwala na przesłanie zdarzenia do sterownika po naciśnięciu przycisku „Send”
Wykorzystanie sterowania tą metodą nie wymaga utworzenia skomplikowanej wizualizacji i jest najprostszą metodą zdalnego sterowania inteligentnym domem eHouse.
Zrzuty ekranu formularza:
Rozwinięcie list kalendarza i zdarzeń wielokrotnych.
Rozwinięcie listy urządzeń (sterowników) –
z końcówką ” – E” zdarzenia zwykłe,
z końcówką ” – P” zdarzenia – programy,
bez suffix’u wszystkie zdarzenia
Rozwinięcie listy zdarzeń dla sterownika zabezpieczeń CommManagera (Stref Ochrony i zabezpieczeń).
Wysłanie zdarzeń przez WiFi, Internet (3G, GPRS, 4G, EDGE lub inne łącze w zależności od dostępności) po naciśnięciu przycisku
„Run Event” lub „Run Event And Hide”.
Opisy pobierane są z tekstowego pliku konfiguracyjnego aby można było tworzyć inne wersje językowe i własne indywidualne opisy.
Użycie modułu wymaga tylko kilku linijek kodu źródłowego.
Przykładowy kod źródłowy umożliwiający sterowanie inteligentnym domem z paneli dotykowych, smartphonów, tabletów Android. Wykorzystuje także wizualizację, aby pokazać sposób jej integracji z formularzem sterującym
/* eHouse For ANDROID panels, tablets, PDAs, Smartphones template API for communication to the eHouse system
* ONLY FOR REGISTERED USERS, VENDORS, COOPERATIVES Copyright iSys.Pl All Rights Reserved
*
* Requires classes:
* !!!!!! ehousecommunication.class :
* Sending Events to eHouse system via:
* SMS, eMail, WIFI, INTERNET, ETHERNET, TCPIP
* !!!!!! EhouseTCP.class :
* initiate TCP Communication for updating current status of devices
* Performing Query status from eHouse microcontrollers
* Assuring challange-response authorisation to the system and communication
*
* !!!!!! StatusEhouse.class :
* Organize classes of devices (names, actual status values etc)
* Fill up with actual values and data of eHouse1 controllers
* (RS485)
* !!!!!! StatusCommManager.class :
* Organize classes of devices (names, actual status values etc)
* Fill up with actual values and data of Ethernet eHouse controllers
* (Ethernet)
*
*
* Szablon Aplikacji Sterującej (API) dla platformy ANDROID do komunikacji z systemem eHouse oraz Wizualizacji stanu systemu
* TYLKO Dla zarejestrowanych użytkowników systemu eHouse, Firm Współpracujących All Rights Reserved
*
* Wymaga class:
*
* !!!!! ehousecommunication.class :
* Wysyła zdarzenia systemowe (komendy) do sterowników systemu eHouse przez:
* SMS, eMail, WIFI, INTERNET, ETHERNET, TCPIP
*
* !!!!! EhouseTCP.class :
* Inicjuje i utrzymuje komunikację TCP/IP ze sterownikami do aktualizacji stanu
* sterowników eHouse – wyjść, wejść pomiarowych eHouse
* Zapewnia autoryzację metodą challange-response do podłączenia się do systemu
*
* !!!!! StatusEhouse.class :
* Klasa zawiera wszystkie ustawienia oraz aktualne dane dla każdego sterownika eHouse
* do dalszego przetwarzania (nazwy, wartości, status) aktualizowane na bieżąco przez komunikację TCP/IP
* dla sterowników eHouse1 (RS485)
* !!!!! StatusCommManager.class :
* Klasa zawiera wszystkie ustawienia oraz aktualne dane dla każdego sterownika eHouse
* do dalszego przetwarzania (nazwy, wartości, status) aktualizowane na bieżąco przez komunikację TCP/IP
* dla sterowników eHouse2 (Ethernet)
*
* !!!!!! RunEvent.class Wysyłanie zdarzeń do systemu z formularza umożliwiającego wybór urządzenia z listy oraz zdarzenienia oraz jego wysłanie po naciśnięciu przycisku przez WiFi, Internet lub dodanie do kolejki w przypadku braku połączenia ( Może być następnie wysłane manualnie przez SMS, email lub inne metody dostępne w systemie).
// Opcjonalnie wymaga klasy dla wizualizacji i sterowania graficznego
//
* !!!!! visulization.class : klasa implementuje kompletną wizualizację graficzną w standardzie eHouse oraz sterowanie graficzne zgodne z formatem plików wejściowych ehouse
* dla wizualizacji.
* Rysuje podstawowe krzywe (prostokąt, prostokąt zaokrąglony, elipsę, linię, text
* Uruchamia zdarzenia powiązane z obiektami graficznymi po ich naciśnięciu (przesyłanie po WiFi lub Internet dostępne łącze GSM lub inne).
* Wizualizacja jest automatycznie uaktualniany po każdorazowym odebraniu statusu sterowników.
* Moduł obsługuje gesty przesunięcie palcem – powoduje przesunięcie obrazu w określonych kierunkach gestem
* Przy ekranach multitouch obsługuje także skalowanie (powiększenie i pomniejszenie)
*
*
*/
package ehouse.android;
import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
import java.util.Date;
import android.content.Context;
public class ehouseandroid extends Activity
{
public visualization vs; //object for visualisation optional/ opcjonalny moduł dla wizualizacji wyremować jak nie używany
static boolean firsttime=true; //first run flag
boolean TerminatedUpdates=false;
Date date;
Context context;
RunEvent RE=null; //Formularz wysyłania zdarzeń do sterowników wybór z listy
////////////////////////////////////////////////////////////////////////////////
// Set Form to display
// Wybór formularza do wyświetlenia na ekranie Wizualizacja lub Formularz z listą zdarzeń
//
void SetView()
{
try
{
switch (ehousecommunication.CurrentForm)
{
case ehousecommunication.TEXT_EVENTS: //wyświetla formularz z listą zdarzeń do przesłania
setContentView(RE.sv);break;
case ehousecommunication.VISUALIZATION: //optional visualization, opcjonalna wizualizacja i sterowanie graficzne
setContentView(vs);break;
default: setContentView(RE.sv);break;
}
}
catch (Exception e)
{
MessageBox(e.getMessage());
}
}
////////////////////////////////////////////////////////////////////////////////
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (firsttime==true) ehousecommunication.init();
vs=new visualization(this,100,100,1); //Instancja opcjonalnej wizualizacji i sterowania graficznego
RE=new RunEvent();
RE.Init(this);
if (firsttime==true)
{
/* Initate and setup Android Application from config files generated from eHouse.exe appliaction
*
* Inicjuje ustawienia aplikacji na platformę Android wygenerowane z aplikacji eHouse.exe
*/
/*
* Setup and Init List of Devices class containing:
* Names and Values digital input , adc inputs, outputs,
* {StatusEhouse for eHouse 1 devices, StatusCommManager for eHouse 2}
*
* Iniciuje urządzenia (Class) sterowników {Class StatusEhouse dla sterowników eHouse1, Class StatusCommManager dla sterowników eHouseTCPIP}
* Ustawia nazwy wyjść cyfrowych, wejść cyfrowych, wejść pomiarowych dla sterowników oraz zmienne statusu odbierane ze sterowników przez panele
*/
EhouseTCP.AllDevsStatus();
EhouseTCP.AllDevsTCPStatus();
EhouseTCP.ReadViewFile(ehousecommunication.currentview); //Czyta plik dla wizualizacji (Opcjonalnie)
///Visualisation
/* Start infinite loop for reading query from eHouse controllers and putting to
* StatusEhouse and StatusCommManager Classes.
* Can be interrupted by EhouseTCP.TerminateQuery(); function
* Inicjuje pętlę nieskończoną pobierania danych bieżącego statusu (query) ze sterowników i
* ładowanie do class StatusEhouse i StatusCommManager
* Może zostać przerwane przez funkcje EhouseTCP.TerminateQuery()
*/
/*Query start*/
EhouseTCP.Query.start();
/*
* Terminate query eHouse controllers for information
*
* Przerwanie aktualizacji danych ze sterowników dla informacji jak to zrobić
*
*/
//EhouseTCP.TerminateQuery();
/*
* Clear Event Queue do wysłania (after successful transmition via any metod) performed automatically
*
* Czyści kolejkę zdarzeń do wysłania (automatycznie usuwane są zdarzenia po przasłaniu dowolną metodą)
*
*/
//ehousecommunication.ClearEventQueue();
setTitle(„eHouse: „+ehousecommunication.currentview); //wyświetla Tytuł aplikacji z nazwą widoku graficznego wizualizacji
}
else //not first time
{
setTitle(„eHouse: „+ehousecommunication.currentview); //wyświetla Tytuł aplikacji z nazwą widoku graficznego wizualizacji
// EhouseTCP.UpdateVisualization();
// EhouseTCP.UpdateViews();
// vs.inav();
}
SetView(); //ustawia SetContextView dla wybranego ekranu
firsttime=false; //wyłącza flagę pierwszego uruchomienia inicjalizacyjnego
}
///////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
public void cap(String str)
{
setTitle(str);
}
////////////////////////////////////////////////////////////////////////////////
public void MessageBox(String message)
{
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
//////////////////////////////////////////////////////////////////////////
// Przykładowe Oprogramowanie przycisków hardwarowych telefonu komórkowego
@Override
public boolean onKeyDown(int keycode, KeyEvent event )
{
if(keycode == KeyEvent.KEYCODE_MENU) //menu dostępne
{
MessageBox(„Menu”);
}
if (keycode==KeyEvent.KEYCODE_BACK) //back dla smartphonów
{
MessageBox(„Back”);
}
if (keycode==KeyEvent.KEYCODE_HOME) //nadrzędny nie obsługuje
{
MessageBox („Home”);
}
if (keycode==KeyEvent.KEYCODE_SEARCH) //search krótki długi automatycznie obsługa wyszukiwarki
{
MessageBox(„Search”);
}
if (keycode==KeyEvent.KEYCODE_VOLUME_DOWN)
{ ///przełączenie wizualizacja / Formularz i inne do tyłu
if (ehousecommunication.CurrentForm<ehousecommunication.FORM_MAX) ehousecommunication.CurrentForm++;
else ehousecommunication.CurrentForm=1;
SetView();
}
if (keycode==KeyEvent.KEYCODE_VOLUME_UP)
{ //przełączenie wizualizacja / Formularz i inne do przodu
if (ehousecommunication.CurrentForm>0) ehousecommunication.CurrentForm–;
else ehousecommunication.CurrentForm=ehousecommunication.FORM_MAX;
SetView();
}
return false; //inaczej tracimy back z aplikacji i wychodzi
// super.onKeyDown(keycode,event);
}
}