Menulis Driver Di Android Things? Inilah Caranya!
Selasa, 26 Februari 2019
Edit
Dalam artikel ini Anda akan berguru Android Things dengan menulis kelas-kelas gres yang dikenal sebagai driver, yang membuat antarmuka dengan periferal semakin mudah. Artikel ini akan memfokuskan pada tipe driver yang bisa ditulis untuk Android Things.
Driver User-Space Android Things
Driver user-space mengizinkan pengembang untuk memasukkan perangkat keras gres ke dalam framework Android, memungkinkannya berinteraksi dengan Android API yang sudah ada. Meskipun Anda bisa berkomunikasi pribadi langsung dengan perangkat melalui standar input/output API, menulis suatu driver kustom akan memungkinkan aplikasi Anda mendukung bermacam-macam profil perangkat keras dan secara pribadi bekerja dengan Android OS. Selain itu, kode Anda akan lebih terstruktur dan dengan gampang mendukung daur ulang kode.Ada tiga pembagian terstruktur mengenai primer driver yang akan Anda pelajari di artikel ini: driver GPS, driver Human Input Device (HID), dan driver sensor.
Driver GPS
Jika perangkat Anda membutuhkan informasi lokasi, maka Anda membutuhkan perangkat GPS ke dalam aplikasi Anda. Dengan pendaftaran periferal GPS Anda keUserDriverManager
, Anda akan bisa menginjeksikan data lokasi perangkat Anda ke framework Android, mengizinkannya untuk dimanfaatkan oleh layanan lokasi Android. Ini akan mengombinasikan data GPS dan WiFi serta sumber lokasi lainnya untuk menyediakan hasil data yang lebih akurat untuk aplikasi Anda.Biasanya modul GPS Anda akan terhubung dengan suatu perangkat Android Things melalui koneksi UART. Kita tidak akan terlalu dalam membahas UART dalam tutorial ini, tetapi Anda bisa berguru segala sesuatu perihal cara kerjanya dalam tutorial sebelumnya di seri ini.
Untuk bekerja dengan modul GPS, Anda harus membuat suatu komponen Java gres untuk berkomunikasi dengan perangkat gres Anda. Akan kita namai kelas ini
GpsDriverService
.Untuk meregistrasi modul GPS Anda dengan framework Andoid untuk data lokasi, sebelumnya Anda harus membuat suaatu objek
GpsDriver
dalam GpsDriverService
Anda. Objek ini bisa diregistrasikan dengan UserDriverManager
dengan panggilan registerGpsDriver()
.private GpsDriver mDriver; @Override public void onCreate() { super.onCreate(); mDriver = new GpsDriver(); UserDriverManager manager = UserDriverManager.getManager(); manager.registerGpsDriver( mDriver ); }
Begitu modul GPS Anda telah mendapatkan data lokasi dan mengirimkannya ke perangkat Android Things melalui koneksi serial UART, Anda harus mem-parse-nya dan menambahkannya ke objek
Location
.Kebanyakan modul GPS akan mengembalikan data lokasi dalam format NMEA, meskipun parsing data berada di luar lingkup pembahasan tutorial ini. Ada empat jenis item data yang disyaratkan untuk objek Location Anda: akurasi, waktu, garis lintang, dan garis bujur. Anda juga bisa menentukan untuk memasukkan ketinggian, posisi, dan kecepatan (jika perangkatnya sedang bergerak).
private Location parseLocationFromString(String gpsData) { Location result = new Location(LocationManager.GPS_PROVIDER); //parse gpsData //required result.setAccuracy( getAccuracyFromGpsData( gpsData ) ); result.setTime( getTimeFromGpsData( gpsData ) ); result.setLatitude( getLatitudeFromGpsData( gpsData ) ); result.setLongitude( getLongitudeFromGpsData( gpsData ) ); //optional result.setAltitude( getAltitudeFromGpsData( gpsData ) ); result.setBearing( getBearingFromGpsData( gpsData ) ); result.setSpeed( getSpeedFromGpsData( gpsData ) ); return result; }
Sekalinya objek
Location
Anda terisi, Anda bisa memasukkannya ke GpsDriver
dengan memanggil reportLocation()
.Location location = parseLocationFromString( rawGpsData ); mDriver.reportLocation( location );
Begitu komponen Anda selesai dibuat, Anda harus menginstansiasinya, mulai membaca data, dan mendengarkan pembaruannya di aplikasi Anda.
private LocationListener mLocationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { Log.v("Test", "Location update: " + location); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { Log.e("Test", "onstatuschanged"); } @Override public void onProviderEnabled(String provider) { Log.e("Test", "onproviderenabled"); } @Override public void onProviderDisabled(String provider) { Log.e("Test", "onproviderdisabled"); } }; ... mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE); // Create and start the GPS component mGpsDriver = new GpsDriverService(); mGpsDriver.register(); // Register for location updates mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
Apabila aplikasinya sudah selesai, Anda harus unregister driver tersebut dan menghapus listener lokasinya.
@Override protected void onDestroy() { super.onDestroy(); if (mGpsDriver != null) { mGpsDriver.unregister(); mLocationManager.removeUpdates(mLocationListener); try { mGpsDriver.close(); } catch (IOException e) { } } }
Sebagai tambahan, Anda juga harus memastikan bahwa aplikasi Anda mempunyai izin
ACCESS_FINE_LOCATION
. Anda bisa menemukan detail untuk memastikan aplikasi mempunyai izin yang disyaratkan dalam tutorial ini.Ketika bekerja pertama kali dengan aplikasi yang memakai izin gres di Android Things, Anda harus me-reboot perangkat Anda sehabis memasang aplikasinya untuk memastikan bahwa izin telah diberikan.
Driver Human Input Device
Framework Android dilengkapi dengan suatu pipeline yang built-in untuk menangani masukan dari tombol pengguna dan even-even gerakan, yang dipakai untuk hal-hal menyerupai tombol media, kontroler joystick, dan tekanan pada tombol keyboard. Dengan membuat
InputDriver
, Anda bisa mengikat interaksi insan Anda sendiri ke pipeline input Android standar sehingga perangkat Anda bisa bereaksi secara sempurna dengan pengguna Anda.Supaya lebih sederhana, kita hanya akan melihat even input tombol dan bagaimana mengikatnya dengan framework Android, meskipun even gerakan juga ditangani dengan cara yang sangat serupa. Hampir sama dengan bab simpulan tutorial ini, kita akan mengabaikan perincian implementasi yang lebih spesifik dari perangkat input dan berfokus pada mengikat even yang diterima ke platform Android.
Even-Even Tombol
Ketika suatu even tombol terjadi dari tombol yang telah Anda lekatkan ke perangkat Android Things, Anda akan merekamnya dan mengirimkannya ke pipeline Android Anda.
Hal pertama yang akan Anda butuhkan ialah membuat suatu objek
InputDriver
dengan memakai Service
gres dan menginisialisasinya. Drivernya bisa diinisialisasi dengan builder yang mendapatkan tipe input, nama input Anda, sebuah versi, dan suatu kode kunci yang diwakili tombol tersebut.private InputDriver mDriver; @Override public void onCreate() { super.onCreate(); mDriver = InputDriver.builder(InputDevice.SOURCE_CLASS_BUTTON) .setName("ButtonInputDriver") .setVersion(1) .setKeys(new int[] {KeyEvent.KEYCODE_SPACE}) .build(); }
Sekalinya
InputDriver
Anda diinisialisasi, Anda bisa meregistrasinya dengan UserDriverManager
dengan memakai panggilan registerInputDriver()
.UserDriverManager manager = UserDriverManager.getManager(); manager.registerInputDriver(mDriver);
Begitu Anda selesai pendaftaran dengan
InputDriver
Anda, layanan driver sanggup menunggu even yang dikirim dari kelas implementasi tombol Anda. Jika tombol kustom Anda ditekan, Anda bisa memberitahu layanannya dan membuat KeyEvent
baru, yang bisa ditempatkan di pipeline masukan Android dengan memakai metode emit(KeyEvent)
. Metode ini akan mengembalikan nilai true jikalau KeyEvent
sanggup mengirim ke framework Android, dan false jikalau terjadi kesalahan.if( buttonPressed ) { KeyEvent[] events = new KeyEvent[] {new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SPACE)}; if (!mDriver.emit(events)) { //something went wrong } }
Hal terakhir yang akan Anda butuhkan ialah unregister objek
InputDriver
Anda dari UserDriverManager
ketika aplikasi Anda sudah selesai berjalan.@Override public void onDestroy() { super.onDestroy(); UserDriverManager manager = UserDriverManager.getManager(); manager.unregisterInputDriver(mDriver); }
Mendengarkan Event Input
Sekarang Anda udah bisa memancarkan even input tombol ke pipeline input Android, saatnya mendengarkannya. Di sinilah semua pekerjaan untuk menyalurkan even tombol gres Anda ke framework Android alhasil terbayar. Yang perlu Anda tambahkan di Activity aplikasi Anda ialah metode untuk ketika
KeyEvent
sedang down, dan satu metode lagi untuk ketika KeyEvent
sedang up. Di metode-metode tersebut, Anda bisa mengecek kode kunci KeyEvent
dan menangani evennya dengan benar.@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if( event.getKeyCode() == KeyEvent.KEYCODE_SPACE ) { //handle it } return true; } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { return true; }
Driver Sensor
Beberapa komponen paling umum yang akan Anda gunakan dengan suatu papan Android Things ialah sensor. Karena Android mempunyai framework sensor yang hebat, masuk nalar jikalau kita ingin bisa menambahkan data dari komponen eksternal kita ke dalam pipeline tersebut.
Untuk memulai, Anda harus membuat suatu kelas Java gres yang berinteraksi dengan sensor perangkat keras Anda. Kelas ini harus memperluas
UserSensorDriver
dan mengimplementasikan metode read()
. Selain itu, jikalau sensor Anda mendukung rendah daya atau mode tidur, Anda bisa mengesampingkan metode setEnabled()
dan bertindak sesuai dengan itu.Kutipan kode berikut ialah versi yang stubbed dari komponen kelas yang akan membaca data melalui Peripheral I/O API untuk mendapatkan nilai data X, Y, Z dan mengembalikan
UserSensorReading
yang baru. Jika datanya dikala ini tidak tersedia, kelas tersebut akan melemparkan IOException
baru.public class ExampleSensorComponent extends UserSensorDriver { float x, y, z; @Override public UserSensorReading read() throws IOException{ try { // Read data from the sensor hardware and return it x = getXValueFromHardware(); y = getYValueFromHardware(); z = getZValueFromHardware(); return new UserSensorReading(new float[]{x, y, z}); } catch (Exception e) { // Error occurred reading the sensor hardware throw new IOException("Unable to read sensor"); } } //Used if supporting low power/sleep mode @Override public void setEnabled(boolean enabled) throws IOException { super.setEnabled(enabled); } }
Sekalinya kelas komponen Anda tercipta, Anda bisa membuat
Service
gres yang akan menginstansiasinya, sekaligus membuat objek UserSensor
gres dan melekatkannya ke pipeline sensor Android.Ada dua tipe sensor yang bisa Anda tambahkan ke pipeline ini. Pertama ialah tipe yang predefined, menyerupai gyroscope, accelerometer, pencahayaan, dan proximity, dan bisa ditambahkan ke pipeline dengan cara itu:
private ExampleSensorComponent mExampleSensor; private UserSensor mSensor; private SensorManager mSensorManager; @Override public void onCreate() { super.onCreate(); mExampleSensor = new ExampleSensorComponent(); mSensor = UserSensor.builder() .setName("ExampleSensorComponent") .setVendor("VendorName") .setType(Sensor.TYPE_ACCELEROMETER) .setDriver(mExampleSensor) .build(); UserDriverManager manager = UserDriverManager.getManager(); // Register the new driver with the framework manager.registerSensor(mSensor); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensorManager.registerDynamicSensorCallback(new SensorCallback()); } private class SensorCallback extends SensorManager.DynamicSensorCallback { @Override public void onDynamicSensorConnected(Sensor sensor) { //Sensor connected mSensorManager.registerListener(SensorDriverService.this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override public void onDynamicSensorDisconnected(Sensor sensor) { //Sensor disconnected mSensorManager.unregisterListener(SensorDriverService.this); } }
Anda akan menemui bahwa
SensorManager.DynamicSensorCallback
dipakai untuk teladan di ata. Ini akan memberitahu aplikasi Anda bahwa sensor sudah siap untuk frameworknya, alasannya ialah pendaftaran butuh sekian waktu, sehingga framework tidak akan mencoba untuk membaca data dari perangkat yang tidak ada.Tipe kedua ialah custom, yang meliputi apa saja yang belum didukung di Android. Beberapa teladan ialah tingkat pH air, kecepatan angin, deteksi gerakan, atau apa saja yang bisa Anda ukur dengan perangkat keras yang baru.
Dengan mengganti parameter builder
setType()
dengan setCustomType()
, Anda bisa mengganti nama perangkat dan mode pelaporan untuk mengontrol bagaimana akan menjadi pemicu di pipeline.mSensor = UserSensor.builder() .setName("ExampleSensorComponent") .setVendor("VendorName") .setType(Sensor.TYPE_ACCELEROMETER) .setCustomType(Sensor.TYPE_DEVICE_PRIVATE_BASE, "com.tutsplus.examplesensor", Sensor.REPORTING_MODE_ON_CHANGE) .setDriver(mExampleSensor) .build();
Terakhir, apabila aplikasi Anda sudah selesai berjalan, Anda harus unregister komponen gres Anda dari
UserDriverManager
.@Override public void onDestroy() { super.onDestroy(); UserDriverManager manager = UserDriverManager.getManager(); manager.unregisterSensor(mSensor); }
Kesimpulan
Di tutorial ini, Anda telah berguru bagaimana memakai komponen yang dibentuk dengan Peripheral I/O API dan mengikatnya ke framework Android yang sesuai untuk dipakai di aplikasi Android Things Anda.
Di titik ini, dalam seri ini, Anda telah mempunyai semua sarana yang diharapkan untuk membuat proyek-proyek Android Things yang lebih mendalam lainnya. Selain menulis driver Anda sendiri, Anda bisa menemukan driver yang sudah ditulis dan implementasikan ke proyek Anda sendiri. Anda bisa menemukan sumber untuk driver-driver itu dari repo GitHub Android Things, atau pelajari beberapa contoh kerja dengan memakai driver-driver tersebut.
dillansir dari tutsplus.com/tutorials
diterjemahkan dari bahasa Inggris oleh Kurniawan Sugi Purwanto