Pázmány Péter Katolikus Egyetem Információs Technológiai Kar
Mobil alkalmazások fejlesztése Vonalkód leolvasó Symbian alapú mobiltelefonra
Készítette:
Tóth Balázs Viktor
Témavezető:
Dr. Takács György
2006. december
Tartalomjegyzék: 1.
A feladat leírása, elképzelések ........................................................................................... 3
2.
A telefon (Nokia 6680) bemutatása ................................................................................... 4
3.
4.
5.
6.
7.
8.
2.1.
Jellemzők.................................................................................................................... 4
2.2.
Leírás.......................................................................................................................... 4
A Symbian története, mai helye a piacon, érdekességek ................................................... 5 3.1.
A Symbian története................................................................................................... 5
3.2.
A Symbian szavakban ................................................................................................ 6
3.3.
A Symbian mai helye a piacon................................................................................... 6
3.4.
Érdekességek.............................................................................................................. 7
Symbian programozás, Python for S60.............................................................................. 8 4.1.
A kezdetek.................................................................................................................. 8
4.2.
A Python programozási nyelv .................................................................................... 8
4.3.
A Python for S60 története......................................................................................... 9
4.4.
A programozás menete Pythonban............................................................................. 9
4.5.
Néhány egyszerű parancs a Pythonból..................................................................... 10
Vonalkód típusok, DataMatrix kód.................................................................................. 11 5.1.
Vonalkód, típusok .................................................................................................... 11
5.2.
A DataMatrix kód, dekódolása................................................................................. 11
Hol tartok? Hogyan működik a program? Mi a cél? ........................................................ 13 6.1.
A nehézségek............................................................................................................ 13
6.2.
Az elért eredmény .................................................................................................... 13
6.3.
Célok ........................................................................................................................ 14
A feladat alkalmazhatósága, eladhatósága ....................................................................... 15 7.1.
Ötletek, felhasználhatóság........................................................................................ 15
7.2.
Már létező rendszerek .............................................................................................. 15
Irodalomjegyzék............................................................................................................... 17
2
1. A feladat leírása, elképzelések A cél egy olyan alkalmazás kifejlesztése Symbian alapú mobiltelefonra, amely képes egy két dimenziós DataMatrix vonalkódot feldolgozni, az eredeti információt abból visszanyerni. Az eredeti elképzelés alapján a mobiltelefon fényképezőjén keresztül történt volna a feldolgozás, azaz a felhasználó lefényképezte volna telefonjával a másik telefon kijelzőjén megjelenő vonalkódot és az már a belekódolt szöveget mutatta volna ki. Ezzel az volt a probléma, hogy a kép mindig nagyon életlen lett, azt feldolgozni szinte lehetetlen. A lenti ábrán egy ilyen kép található.
1. ábra
Az újabb elképzelés szerint a vonalkód Bluetooth-on, infrán, vagy akár MMS-ben érkezik meg a telefonra, így az algoritmus is sokkal biztosabb végeredményt ad. Gondoljunk csak bele mennyivel hatékonyabb ez a megoldás, mint akár több képet is készíteni egy kijelzőről, amiből vagy megkapunk valamit vagy nem, de a legrosszabb is megtörténhet, hogy rossz megoldásra jutunk. Ha viszont a vonalkódot nem kijelzőről fényképezzük le az algoritmus jó megoldást adhat, sőt erre már léteznek implementációk is. Későbbi terveim egyike között szerepel ez utóbbi megvalósítása. A végső séma tehát: 1. A mobiltelefonunkra megérkezik a vonalkódot tartalmazó kép a fentebb említett módok egyikében. 2. A programot lefuttatjuk a képre. 3. A kijelzőn a vonalkódba kódolt információt látjuk.
3
2. A telefon (Nokia 6680) bemutatása 2.1. Jellemzők • • • • • • • • • • • • • • • • • • • • • •
3G (2100 MHz)+Tri-band ( 900/1800/1900 MHz) 1,23 megapixeles külső CMOS kamera (6x smartzoom, időzítő, sorozatkép) + flash LED a sötétben való fotózáshoz 640*480 (VGA) használó felöli kamera (2x zoom) Videotelefonálás Videorögzítés és -szerkesztés "Forró" RS-MMC(1,8 V-os) csatlakoztathatóság 262144 színű (18bit) grafikus aktív mátrix (176x208) kijelző 3GPP video streaming Real Player USB 2.0 sebesség kompatibilis Pop-port Beépített Bluetooth eszköz SyncML Push To Talk (adó-vevő) Symbian 8.0a operációs rendszer WAP 2.0 XHTML / HTML böngésző 3G-2100 - Maximumális letöltés 384 kbps; feltöltés 128 kbps EGPRS (Class B, Multislot class 10) - Maximális letöltés 236,8 kbps; feltöltés 118,4 kbps Java MIDP 2.0, CLDC 1.1, 3D API , PIM API Hangvezérlés/hangtárcsázás/hangfelvétel Desktop (kéz nélküli) kihangosíthatóság Quick office alkalmazások + PDF olvasó Data mover alkalmazás
2.2. Leírás A Nokia 6680-nal már elérhető a mobilkommunikáció harmadik generációja, azaz a videotelefon, gyors mobilinternet, Mobil Tv, kiváló minőségű videó- és zeneletöltések. A készülék ezen felül kiemelkedően sokoldalú: nagyméretű kijelző, MMS, e-mail, határidőnapló, java játékok, hogy csak néhányat említsünk a funkciók közül. A Nokia 6680 két beépített kamerával rendelkezik, az előlapon található kifejezetten a videotelefonálásra, a hátoldali pedig 1,3 megapixeles optikájával fotózásra is alkalmas. A telefon memóriától függően akár egy órányi videofelvétel rögzíthető és azonnal szerkeszthető is.
4
3. A Symbian története, mai helye a piacon, érdekességek 3.1. A Symbian története • • • • • • • • • • • •
• •
1980: David Potter megalapította a Psion-t. EPOC16. A Psion számos Series 3 eszközt forgalmazott 1991 és 1998 között, amelyek az EPOC16 operációs rendszert használták. EPOC OS Releases 1–3. A Series 5 alapú 1997-ben kibocsátott eszközök használták először az EPOC32-t. EPOC Release 4. Az Oregon Osaris és a Geofox 1 használta az ER4-t. 1998-ban megalakult a Symbian Ltd., az Ericsson, a Nokia, a Motorola és a Psion együttműködéseként, céljuk volt, hogy biztosítsák a konvergenciát a PDA-k és a mobiltelefonok között. EPOC Release 5 - Symbian OS v5. Psion Series 5mx, Series 7, Psion Revo, Psion Netbook, netPad, Ericsson MC218 jelent meg 1999-ben az ER5-t használva. ER5u - Symbian OS v5.1. u = Unicode. Az első telefon – az Ericsson R380 -, amely az ER5-t használta 2000-ben jelent meg. Symbian OS v6.0 and v6.1. Néha ER6-nak is hívják. Megjelent az első valódi nyílt Symbiant használó telefon, a Nokia 9210. Symbian OS v7.0 and v7.0s. 2003-ban mutatták be. Minden típusú interfésszel megjelent: UIQ (Sony Ericsson P800, P900, P910, Motorola A925, A1000), Series 80 (Nokia 9300, 9500), Series 90 (Nokia 7710), Series 60 (Nokia 6600, 7310). 2004-ben a Psion eladta részesedését a Symbianből. Úgyszintén 2004-ben megjelent az első féreg Symbianre, a Cabir, amely a Bluetooth kapcsolatot használta fel, hogy átterjedjen a többi telefonra. Symbian OS v8.0. 2004-ben mutatták be, egyik fő újdonsága, hogy két különböző kernel alkalmazását támogatta (EKA1 vagy EKA2). Az EKA2 csak a későbbi Symbian v8.1b verziójánál lett alkalmazva. A két kernel felhasználói szempontból nem sokban különbözik, viszont képességüket tekintve nagyon különbözőek, az EKA1 régebbi driverekhez készült, az EKA2 az újabbakhoz. A v8.0b-t 2003-ban adták ki. Symbian OS v8.1. A 8.0 átgondoltabb verziója, 8.1a és 8.1b verzióban jelent meg, előbbi EKA1, utóbbi EKA2 felhasználásával. Symbian OS v9.0. Belső használatra, 2004-ben készült. A v9.0 jelentette az EKA1 végét, az EKA1 utolsó verziója a v8.1a lett.
5
3.2. A Symbian szavakban A Symbian operációs rendszert főként mobil eszközökben (PDA, mobiltelefon) alkalmazzák. Jellemzője az egyfelhasználós, többfeladatos végrehajtás, grafikus kezelői felület. Egyéni igények szerint alakítható, szoftverekkel fejleszthető szemben az operációs rendszerrel nem rendelkező telefonokkal. Alkalmas a dinamikus memória kezelésére, melynek lényege hogy a rendelkezésre álló összes memória felhasználható bármilyen célra, nincs felosztva, hogy mely alkalmazási területen kell adatokat tárolni benne. Bár egyéb operációs rendszerrel nem rendelkező telefonok is képesek erre, a Symbian operációs rendszerek lényegesen több lehetőséget nyújtanak.
3.3. A Symbian mai helye a piacon A Symbiant jelenleg a Nokia (47,9%), Ericsson (15,6%), Sony Ericsson (13,1%), Panasonic (10,5%), Siemens (8,4%), és a Samsung (4,5%) birtokolja. A BenQ a Siemens AG mobil részlegét megvásárolva nem szerezte meg automatikusan a Siemens részesedését a Symbianben, ehhez a Symbian Supervisory Board jóváhagyása szükséges. A lenti ábrán a cégek részesedése látható a Symbianben.
2. ábra
Immáron 250 országban, összesen 100 milliónál is több azon mobiltelefonok száma, amelyen Symbian operációs rendszer fut, jelentette be nemrég a Symbian Limited. A Symbian a világ egyik legkedveltebb operációs rendszere, amelyet a legnagyobb készülékgyártók használnak. Az okostelefonok most egy új kategória, az alacsony árú és magas darabszámban eladható modellek felé nyitnak. A legújabb elemzések szerint 2011-ben eléri az 1 milliárdot a világszerte használt Symbian okostelefonok mennyisége. Az első Symbian operációs rendszerű mobiltelefon az Ericsson R380 smartphone (3. ábra) volt, amely 2000-ben jelent meg.
6
3. ábra
3.4. Érdekességek Manapság rengeteg hasznos és érdekes programot lehet Symbian alapú mobiltelefonunkra szereznünk: • Adobe Reader • Skype (hamarosan!) • Útvonaltervező programok • F-Secure Mobile Antivirus • Mobil lámpa • Régi klasszikusok, mint például a Carmageddon • …
7
4. Symbian programozás, Python for S60 4.1. A kezdetek Amikor kezembe kaptam a Nokia 6680-ast és a feladatot, hogy a vonalkód leolvasót valósítsam meg azt sem tudtam hol kezdjem. Több ismerősömtől hallottam már róla, hogy mobiltelefont és PDA-t elég nehéz programozni. Aztán ahogy mindenki más is tette volna, elkezdtem az Interneten keresgélni. Első találataim között volt egy Symbian tutorial oldal, ami megrémített a különös szintaxisával és bonyolultságával. Egyre mélyebbre ástam magam és megtaláltam egy érdekes gondolatmenetet: Why use C++ • • • • • • •
you're masochistic you need full access to the phone's APIs you want to develop middleware libraries need the speed (e.g. computer vision algorithms) Can't do it in Java. Can't do it in Python You like really bizarre naming conventions.
Why not use C++ •
Can do it in Java or Python
Ezen oldal alapján elkezdtem keresgélni a Symbian-es Python, a Python for S60 után. Egy magyar fórumon ráadásul találtam ilyen irányú témát, így belevetettem magam a Python programozásba. Egyből megtetszett, hogy egy „Hello World!” kiíratása nem jár több fájllal és több tíz sorral, mint C++-ban: import appuifw appuifw.note(u"Hello World!", 'info')
A Python for S60 telepítéséhez az alábbi programokra volt szükségem 1. A Python for S60 telefonunkkal kompatibilis változata (nekem a 2nd Editon FP2re volt szükségem). 2. A megfelelő verziójú SDK (Software Development Kit). A Nokia 6680-as telefonhoz a 2nd Edition FP2-t kellett letöltenem. Arra nagyon ügyelnem kellett, hogy a két verzió ugyanolyan verziójú legyen, ugyanis ha nem azok, akkor egyáltalán nem működik a Python for S60.
4.2. A Python programozási nyelv A Python egy hatékony és könnyen tanulható programozási nyelv. Nem utasítás-zárójeleket használ, hanem tabulátorok vagy szóközök segítségével tagolja a kódot, ezért kényszeríti a programozót jól formázott kód írására. Vannak, akik ettől a tulajdonságától idegenkednek.
8
Előnyei: • • • • •
•
• • •
Magasszintű adatstruktúrák Egyszerű megközelítésű objektum-orientáltság Elegáns szintaxis Dinamikus típusosság „Script nyelv”, de a Javahoz hasonlóan egy virtuális gép hajtja végre az ún. bájtkódot. A Javatól eltérően a bájtkód nem publikus, definiált szabvány, az egyes Python verziók között a bájtkód változik. Ezért a Pythonban írt programokat forráskóddal célszerű és szokásos terjeszteni. Lehetséges azonban „exe”-t is készíteni, ekkor a futtató környezetet is mindig külön tartalmazza az adott program. A Python platformfüggetlen, a Windows-on megírt Python program változtatás nélkül futtatható pl. Linuxon vagy Mac-en (feltéve, hogy a program nem használ csak az adott operációs rendszerre jellemző szolgáltatásokat, ill. az útvonalneveket platformfüggetlen módon kódolja a programozó). C, C++ vagy más C-ből hívható nyelven megírt függvényekkel és adattípusokkal az értelmező könnyen bővíthető. Könyvtárát szinte teljes mértékben rögtön magával hozza, általában nem kell külön modulokat installálni. Rövid programok írása gyors, egyszerű és jól áttekinthető.
Ezek a tulajdonságok teszik alkalmassá gyors fejlesztői munkákra (extrém programozás, prototípuskészítés).
4.3. A Python for S60 története A Python for S60 a Python programozási nyelv Nokia által megvalósított Series60 mobiltelefonokra írt változata. A Python nyelv alap tudásán felül a telefon több okostelefon funkcióját is kezelni tudja, pl. kamera, kapcsolatok, naptár, hang felvevés és lejátszás, TCP/IP és Bluetooth kommunikáció. • • • •
A 2004-es év közepén a Nokia bemutatta az akkor még Amaretto-nak nevezett Python for S60 pre-release változatát. 2004.12.26-án megjelent a Python for S60 1.0. 2005.10.22-én megjelent a Python for Series 60 1.2 számos új funkcióval: kamera kezelés, kapcsolatok, audio kezelés, grafika. A Nokia új N70 és N90 telefonjait is támogatta. 2006.01.27-én a Python for S60 a Nokia nyílt forráskódú rendszerének részévé vált az 1.3.1 verzióval.
4.4. A programozás menete Pythonban 1. A program megírása egy szövegszerkesztő programban történik, lehetőleg egy olyanban, ami tud highlight-okat a jobb áttekinthetőség érdekében. Én a Scintilla Text Editort használtam. 2. Lehetőség van a program lefuttatására egy emulátoron. 3. A program lefordítása SIS fájlra. 9
4. A SIS fájl feltöltése és telepítése a telefonra. A program a telefonon kétféle módon futtatható: 1. A py fájlt a telefonra felrakva és a py kiterjesztésű fájlt lefuttatva a Python programban. 2. A SIS fájllá alakított py fájlt a telefonra telepítve. Ekkor úgy viselkedik a program, mint egy teljesen független alkalmazás.
4.5. Néhány egyszerű parancs a Pythonból •
A „cím” kiíratása, mint az alkalmazás neve
appuifw.app.title = u"cím"
•
Query ablak kiíratása
appuifw.query(u"Írj valamit:", "text")
•
Választólista készítése
Menu = [u'elsõ', u'második', u'harmadik'] test = appuifw.selection_list(choices=Menu , search_field=1)
•
Saját függvény definiálása
def valamifuggveny(): Data = appuifw.query(u”Írj egy szót:”, "text") Appuifw.note(u”A szó amit írtál: ” +data, "info") valamifuggveny()
•
Multi-választólista:
Menu = [u'elsõ', u'második', u'harmadik', u'negyedik', u'ötödik', u'hatodik', u'hetedik', u'nyolcadik'] test = appuifw.multi_selection_list(Menu , style='checkbox', search_field=1) print test
•
Kijelzõméret beállítása
appuifw.app.screen='large' , ahol:
Teljes kijelzõs: 'full' Nagy kijelző: ’large’ Normál kijelző: ’normal’ •
Ablaktörzs beállítása
appuifw.app.body = appuifw.Text(u"Tartalom") app_lock = e32.Ao_lock() app_lock.wait()
10
5. Vonalkód típusok, DataMatrix kód 5.1. Vonalkód, típusok A vonalkód egy gép által olvasható reprezentációja az információnak vizuális formában. Eredetileg a vonalkódok a vonalak és az azok közti üres részekben hordozták az információkat, manapság viszont már léteznek újabb szabványok is. Szkennerekkel lehet őket leolvasni, vagy speciális erre készült szoftverekkel. Amíg a régebbi vonalkódok csak számokat kódolhattak, az újabb szabványok már a teljes ASCII táblát is tartalmazhatják. A mátrix kódok –amelyek már nem vonalakból, hanem négyzetekből állnak - sokkal több információt tudnak kódolni sokkal kisebb helyen. Néhány vonalkód típus •
EAN-8:
•
EAN-13:
•
Code128:
•
DataMatrix:
5.2. A DataMatrix kód, dekódolása A DataMatrix egy két dimenziós mátrix vonalkód, amely fekete és fehér négyzetekből áll négyzet vagy téglalap alakba rendezve. A kódolható információ lehet szöveg vagy nyers adat, a szokásos adatméret néhány bájttól 2 kilobájtig terjed. Hibajavító kódok adják a szimbólumok megbízhatóságát: ha részben sérültek is, attól még leolvashatók. A DataMatrix kód 2335 karaktert tud maximum kódolni. A szimbólumok négyzetek, amelyek modulokat alkotva reprezentálják a biteket. A Szimbólum méret 8×8-tól 144×144-ig terjedhet..
11
A dekódolás az alábbi módon történik •
Minden modulnak van egy kerete:
•
A kereten belüli négyzetből a 0 vagy 1 értéket az alábbi ábra alapján kapjuk meg:
•
Tehát a dekódolást egy kisebb mátrixszal végezzük, a 0-1 sorozatokat azokból folyamatosan kiolvasva. Minden kisebb mátrix egy bájtnak felel meg, aminek így 8 értéke van. Elvégezve a kijött kettes számrendszerbeli számoknak tízes számrendszerbeli számmá való alakítását alap esetben ASCII kódokat kapunk. Ezeket az ASCII táblából kinézve megkapjuk a kódolt üzenetet.
• •
12
6. Hol tartok? Hogyan működik a program? Mi a cél? 6.1. A nehézségek •
• •
• •
A Python for S60 számítógépre való telepítésével nagyon sokat bajlódtam, a leszedett verziók sehogy sem akartak kompatibilisek lenni. A magyar és külföldi fórumokat végignézve egy darabig semmilyen segítséget nem találtam, csak annyit, hogyha a telepítés során „EPOCROOT folder” címen „NULL”-t ír ki, azt nem tudják hogy miért de nem működik. Sok szenvedés és utánajárás után szerencsére találtam egy weblapot, ahol a szerző lépésről lépésre leírta, hogy milyen verziókat telepítsek fel. Ezt a problémát körülbelül két hetembe tellett megoldanom. A következő akadály a Python programozási nyelv szintaktikája volt, nincs pontosvessző a sorok végén például, a tagolás alapján történik a kód értelmezése. Az egyes alap modulok hiánya is megnehezítette a munkámat. Nehézkes volt a hibakeresés is, mert ha a programot mint külön alkalmazást futtatok és hiba van a kódban, akkor a program mindenféle hibaüzenet nélkül kilép. Később rájöttem, hogyha nem SIS, hanem a py fájlt rakom fel a telefonra, akkor mint scriptet lefuttatva a Python programban kiírja a hibaüzeneteket. Amikor már készen volt a program képleolvasó része, azaz egy fekete-fehér kép 1-0 alapú eltárolása sokáig nem találtam a DataMatrix dekódoló algoritmusát. A legnehezebb feladatnak viszont a dekódoló algoritmus megtalálása után annak megírása bizonyult, főleg Python szintaktikával, nem a szokásos adatszerkezetekkel.
6.2. Az elért eredmény Tehát a vonalkód leolvasó program 3 részből áll 1. A vonalkódot tartalmazó kép beolvasása, eltárolása. 2. A dekódoló algoritmus lefuttatása. 3. Az ASCII kódok karakterekké való konvertálása. A képben található információ 0-1 alapú eltárolása tökéletesen működik. Az alábbi képen a mobiltelefon kijelzőjén látható az eredmény, az első képen az eredeti, beolvasandó kép, a második képen a 0-1 mátrix látható. A dekódoló algoritmust az idő hiányában nem sikerült tökéletesen megírnom.
13
Jól látható, hogy a bal oldali képen látható „H” betű megjelenik a jobb oldali képen is. Hatékonyság Az alábbi ábrán is látható, hogy a program futása közben nem foglal sok memóriát.
6.3. Célok • • •
A dekódoló algoritmust megvalósítani. Céljaim között szerepel egy olyan rendszer kialakítása, ahol a felhasználó a képeket mint egy fájl böngészőben kezelheti és például egy Opciók→Dekódolás kombinációval egyből megkaphatja a vonalkódból visszanyerhető információt. A fényképezővel történő leolvasás a feladatnak egy különös megvilágítást adna, tehát a következőkben érdemes lenne egy ilyen irányban is elindulnom. A következő fejezetben részletesebben írok a fényképezővel történő leolvasás előnyeiről.
14
7. A feladat alkalmazhatósága, eladhatósága 7.1. Ötletek, felhasználhatóság A program beléptető rendszereknél és olyan helyeken lehet hasznos, ahol valamilyen jogosultságot kell egy embernek ellenőriznie. Ilyen lehet például egy menetjegy ellenőrzése is, amelyet nem lehet egy géppel egyelőre megoldani. A későbbi fényképezős megoldás sokkal messzebbre vezet • • • • •
Áruk megbízhatóságának növelése, olyan információkat tartalmazna a vonalkód, mint például a farm neve ahol készült. Egy hirdetésen lévő vonalkóddal akár internet címre is ugorhatunk. Ugyanakkor az összetevőkről is tájékoztathatná a vevőt. Mozifilmet reklámozó plakáton elhelyezve tartalmat is meg lehetne vele jeleníteni. Az online vásárlást is segítheti: a vevő csak akkor léphetne tovább egy bizonyos ponton, ha a vonalkódot lefényképezte és ezáltal egy emeltdíjas SMS-t küldött. Egy hírportálon például minden hírhez tartozna egy vonalkód és azt a telefonnal lefényképezve a mobilon is olvashatnánk a hírt.
7.2. Már létező rendszerek Az Interneten számos megvalósítását találtam hasonló rendszereknek. Kaywa Reader
• • •
http://reader.kaywa.com/ A letöltés regisztrációhoz kötött, ingyenes Ha a program vonalkódot „lát” fél percen belül, egyből végrehajtja annak tartalmát, például az alábbi képet észlelve a Google oldalára lép:
15
Semapedia
• •
http://semapedia.org/ Az elképzelés az, hogy a Wikipedia által szolgáltatott információkat ki lehetne tenni például a híresebb helyekre és azt lefényképezve a mobilon olvashatnánk arról a helyről.
Lavasphere for Smartphones
• •
Hasonló rendszer, mint az előbbiek. A következőket említi felhasználási területének: o M-Commerce o Mobile marketing and advertising o Access to multimedia HTML, XHTML, WAP information and services o Print-to-web integration o Content linking o Data collection o E-Ticketing o Price comparison o Logistics
16
8. Irodalomjegyzék
http://www.t-mobile.hu/egyeni/vasarlas/telefonismertetok/ismertetok/keszulek_364.shtml http://www.mobilport.hu/?r=8023 http://wiki.opensource.nokia.com/projects/PyS60_history http://en.wikipedia.org/wiki/Symbian_OS http://org.csail.mit.edu/mode/index.php/Symbian_development_general_notes http://www.symbianforum.hu/content.php?article.24 http://mikcsabee.uw.hu/index.php?&lang=hun&modul=leirasok&read=1 http://hu.wikipedia.org/wiki/Python_programoz%C3%A1si_nyelv http://en.wikipedia.org/wiki/Barcode http://en.wikipedia.org/wiki/Datamatrix http://grandzebu.net/informatique/codbar-en/datamatrix.htm http://semapedia.org/ http://reader.kaywa.com/
17