Android Things: Dự án đầu tiên của bạn
Vietnamese (Tiếng Việt) translation by Dai Phong (you can also view the original English article)
Android Things, nền tảng mới của Google để tạo ra các thiết bị kết nối Internet of Things (IOT), là một cách dễ dàng để lần đầu tiên trải nghiệm một trong những công nghệ quan trọng của tương lai. Trong hướng dẫn này, bạn sẽ tìm hiểu cách làm thế nào để thiết lập với Android Things. Bạn sẽ tạo ra dự án đơn giản đầu tiên của bạn và bước đầu sử dụng GPIO (General Purpose Input/Output) để đọc nút bấm và ánh sáng của một đèn LED.
Để tìm hiểu cơ bản về Android Things, hãy đọc bài viết của tôi ở đây trên Envato Tuts+.
Flash Bo mạch của bạn
Trước khi bạn có thể bắt đầu lập trình cho Android Things, bạn sẽ cần phải thiết lập một bo mạch vật lý để chạy hệ điều hành.
Hiện tại có ba tùy chọn bo mạch:
- Raspberry Pi
- Intel Edison cùng với Arduino Breakout Board
- NXP Pico i.MX6UL
Trong bài này, tôi sẽ hướng dẫn cho bạn cách làm thế nào để thiết lập với Raspberry Pi, vì nó là phổ biến nhất và giá cả phải chăng so với các mẫu bo mạch hiện đang được hỗ trợ. Nếu bạn đang sử dụng một môi trường phát triển khác, bạn có thể tìm thấy hướng dẫn cụ thể để flash bo mạch của bạn trên trang tài liệu hướng dẫn Android Things chính thức.
Raspberry Pi
Để đặt Android Things lên trên Pi, bạn sẽ cần Raspberry Pi 3 B và phần cứng bổ sung sau đây:
- Cáp HDMI và một màn hình (giống như một màn hình máy tính)
- Cáp Ethernet để kết nối internet của bạn
- Cáp Micro-USB
- Thẻ nhớ Micro SD với ít nhất 8GB trống, và một bộ chuyển đổi thẻ SD



- Một máy tính có thể đọc và ghi vào một thẻ SD
Một khi bạn đã tập hợp tất cả các thành phần cần thiết, bạn sẽ cần phải tải về tập tin hệ thống mới nhất cho Raspberry Pi từ Google. Tất cả những tập tin hệ thống mới nhất có thể được tìm thấy trên trang Android Things System Image Downloads.
Một khi bạn đã tải về tập tin, bạn sẽ cần phải giải nén nó để lấy tập tin .img. Do kích thước của tập tin, một số chương trình có thể gặp vấn đề về giải nén, chẳng hạn như Archive Utility tiêu chuẩn trên OS X, sẽ trả về một .cpgz hoặc .zip trong một vòng lặp đi lặp lại. Nếu điều này xảy ra, bạn có thể cài đặt Unarchiver cho OS X hoặc 7zip cho Windows để giải nén tập tin chính xác.
Với tập tin .img đã được giải nén, bạn sẽ cần phải đặt nó trên thẻ SD của bạn. Quá trình này có thể khác tùy theo hệ điều hành. Phần này sẽ thực hiện trên OS X, mặc dù hướng dẫn cũng có cho Linux và Windows.
Đầu tiên, lắp thẻ SD vào máy tính của bạn. Nếu thẻ SD của bạn không được định dạng là FAT-32, thì bạn sẽ cần phải làm điều này ngay bây giờ. Tiếp theo, bạn sẽ cần phải chạy lệnh diskutil list
để tìm đường dẫn đến thẻ SD của bạn.



Trong hình trên, toàn bộ thẻ SD có đường dẫn /dev/disk3 (không nên nhầm lẫn với định danh phân vùng disk3s1). Sử dụng đường dẫn này, chạy lệnh diskutil unmountDisk
để đĩa có thể được flash.



Bước cuối cùng trong việc flash Android Things cho Raspberry Pi là sao chép tập tin hệ thống vào thẻ SD của bạn với lệnh sau đây (cập nhật đường dẫn chính xác cho tập tin và số ổ đĩa của bạn): sudo dd bs=1m if=image.img of=/dev/rdisk# from diskutil>



Điều quan trọng cần lưu ý là hoạt động này có thể mất một vài phút. Bạn có thể kiểm tra tiến độ hiện tại với lệnh Control-T.
Khi tập tin hệ thống của bạn đã được flash vào thẻ SD, hãy tháo thẻ micro SD khỏi adapter của bạn và nhét nó vào dưới cùng của Raspberry Pi.



Tiếp theo, kết nối Raspberry Pi của bạn đến màn hình thông qua cáp HDMI, kết nối mạng với cáp ethernet, và một nguồn điện (như máy tính của bạn) bằng cáp micro USB type-B.



Khi Raspberry Pi của bạn đã khởi động, bạn sẽ thấy những thứ sau đây trên màn hình của bạn.



Bạn sẽ thấy địa chỉ IP của thiết bị ở dưới cùng của màn hình. Bạn sẽ cần điều này để kết nối đến bo mạch Android Things của bạn với lệnh adb connect <địa chỉ IP>
.
Tại thời điểm này, bạn sẽ có thể kết nối đến bo mạch Android Things vừa mới được flash của bạn và tải các ứng dụng vào trong đó, đó là những gì mà chúng ta sẽ thảo luận trong phần tiếp theo. Nếu bạn muốn ngắt kết nối Raspberry Pi của bạn khỏi kết nối mạng và sử dụng chip WiFi tích hợp, bạn sẽ cần phải chạy lệnh sau đây.
adb shell am startservice \ -n com.google.wifisetup/.WifiSetupService \ -a WifiSetupService.Connect \ -e ssid <Network_SSID> \ -e passphrase <Network_Passcode>
Điều này sẽ cho phép bạn khởi động lại thiết bị của bạn và truy cập qua mạng WiFi mà không cần kết nối Ethernet.
Một dự án đơn giản đầu tiên
Trước khi bạn bắt đầu viết code cho ứng dụng Android Things mới của bạn, bạn nên chắc chắn rằng phần cứng của bạn được thiết lập cho dự án mà bạn muốn xây dựng. Đối với dự án giới thiệu của chúng tôi, chúng tôi sẽ tạo ra một thiết bị đơn giản cho phép người dùng nhấn một nút, mà sẽ bật một đèn LED. Khi thôi nhấn nút, đèn LED sẽ tắt. Bạn sẽ cần các thành phần phần cứng như sau:
- một bo mạch tương thích với Android Things được flash với phiên bản mới nhất của hệ điều hành
- một đèn LED
- một nút bấm
- một điện trở 10k Ω (điện trở có dải màu nâu, đen, cam)
- một điện trở 470 Ω (điện trở có dải màu vàng, tím, nâu)
- dây nối
- bảng cắm dây
Một khi bạn đã có đủ các thành phần, bạn có thể bắt đầu cắm mọi thứ vào. Tôi đã bao gồm hai sơ đồ cho dự án đầu tiên của bạn: một sơ đồ nối dây cho Intel Edison với Arduino Breakout Board, và một cho Raspberry Pi.






Một khi bo mạch của bạn đã được nối dây, là lúc để viết ứng dụng đầu tiên của bạn.
Thiết lập ứng dụng
Android Things đòi hỏi dự án được xây dựng với SDK tối thiểu là 24. Bạn có thể bắt đầu hướng dẫn này bằng cách tạo ra một dự án mới với yêu cầu tối thiểu đó và một Activity
rỗng.
Khi dự án cơ bản của bạn đã được tạo ra, hãy mở tập tin build.gradle trong mô-đun của ứng dụng. Ở dưới dependencies, bao gồm thư viện Android Things. Tại thời điểm viết bài này, thư viện vẫn còn trong phiên bản developer preview.
provided 'com.google.android.things:androidthings:0.1-devpreview'
Tiếp theo, mở tập tin AndroidManifest.xml của bạn. Bạn sẽ cần phải khai báo rằng ứng dụng của bạn sử dụng thư viện Android Things bằng cách thêm dòng sau đây vào trong phần application
.
<uses-library android:name="com.google.android.things"/>
Điều cuối cùng cần làm trong tập tin manifest của bạn là thêm một intent-filter
vào MainActivity
của bạn cho phép thiết bị của bạn biết rằng nó phải chạy Activity
này khi khởi động. Bởi vì Android Things chạy ứng dụng lúc khởi động, nên bạn sẽ thường chỉ muốn một ứng dụng được cài đặt trên một thiết bị tại một thời điểm.
<activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.IOT_LAUNCHER"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
Một khi bạn đã thực hiện xong với manifest, bạn có thể mở MainActivity.java, vì đây là nơi đặt logic cốt lõi cho dự án Android Things đầu tiên. Đối tượng sẽ khởi tạo các kết nối đầu vào và đầu ra của bạn được gọi là PeripheralManagerService
, vì vậy, hãy bắt đầu bằng cách lấy một tham chiếu đến nó trong onCreate()
.
PeripheralManagerService service = new PeripheralManagerService();
Bây giờ bạn có PeripheralManagerService
, hãy làm một điều nữa trước khi đi vào viết code kiểm soát của chúng ta. Trước đó bạn đã nối dây tất cả các thành phần với nhau vào bo mạch sử dụng các chân kế nối cụ thể. Để kiểm soát các thiết bị ngoại vi mà bạn đã gắn vào các chân cắm này, bạn sẽ cần phải biết tên của mỗi chân trên bo mạch của bạn. Bạn có thể in một danh sách của mỗi thành phần sử dụng PeripheralManagerService
như sau:
Log.e("AndroidThings", "GPIOs: " + service.getGpioList() );
Dòng ở trên sẽ in ra những thứ sau đây trên một Raspberry Pi:
E/AndroidThings: GPIOs: [BCM12, BCM13, BCM16, BCM17, BCM18, BCM19, BCM20, BCM21, BCM22, BCM23, BCM24, BCM25, BCM26, BCM27, BCM4, BCM5, BCM6]
Trong sơ đồ nối dây của Raspberry Pi trước đó, bạn kết nối nút vào BCM21
và đèn LED vào BCM6
. Trong Intel Edison với sơ đồ nối dây Arduino Breakout, bạn kết nối nút vào IO12
và LED vào IO13
. Hãy lưu các giá trị này như là các phần tử String
ở phía trên của Activity
. Mẫu này sẽ sử dụng các giá trị Raspberry Pi, mặc dù bạn có thể sử dụng bất cứ tên chân nối thích hợp cho hệ thống dây và bo mạch của bạn.
private final String PIN_LED = "BCM6"; private final String PIN_BUTTON = "BCM21";
Trong hai phần tiếp theo, chúng ta sẽ sử dụng thông tin này để giao tiếp với cả hai thành phần.
Xuất sang đèn LED
Các thành phần cơ bản, chẳng hạn như đèn LED, có thể được truy cập bằng cách sử dụng đối tượng Gpio
của Android Things. Ở phía trên cùng của Activity
, tạo ra một đối tượng Gpio
. Điều này sẽ được sử dụng để tham chiếu kết nối tới các đèn LED trong ứng dụng của chúng ta.
private Gpio mLedGpio;
Một khi bạn đã có đối tượng tham chiếu, bạn sẽ cần phải khởi tạo nó trong onCreate()
. Bạn có thể làm điều này bằng cách gọi openGpio
với tên chân nối từ đối tượng PeripheralManagerService
của bạn. Bạn cũng sẽ cần khai báo trạng thái ban đầu của thành phần, mà trong trường hợp này là DIRECTION_OUT_INITIALLY_LOW
(cơ bản là "tắt"). Bạn sẽ cần phải bọc việc gọi thiết lập I/O trong một khối try/catch
trong trường hợp một IOException
xảy ra.
try { mLedGpio = service.openGpio(PIN_LED); mLedGpio.setDirection(Gpio.DIRECTION_OUT_INITIALLY_LOW); } catch (IOException e){ }
Bây giờ thì chúng ta đã tạo ra tham chiếu đến đèn LED của chúng ta, bạn sẽ cần phải có khả năng thay đổi trạng thái của đèn LED (bật và tắt). Bạn có thể sử dụng phương thức setValue(boolean)
trên Gpio
để thay đổi trạng thái của một thành phần.
private void setLedState(boolean isOn) { try { mLedGpio.setValue(isOn); } catch (IOException e) { } }
Cuối cùng, khi Activity
của bạn bị phá hủy, bạn sẽ cần phải đóng tất cả các kết nối và vô hiệu hóa các tham chiếu phần cứng của bạn trong onDestroy()
.
@Override protected void onDestroy(){ super.onDestroy(); if (mLedGpio != null) { try { mLedGpio.close(); } catch (IOException e) { } finally{ mLedGpio = null; } } }
Và đó là tất cả để ghi vào một thành phần cơ bản. Mặc dù ứng dụng có thể điều khiển một đèn LED, nhưng không có logic để thay đổi trạng thái của đèn LED. Trong bước tiếp theo, chúng ta sẽ đọc việc bấm nút để bật hoặc tắt thành phần này.
Đọc đầu vào của nút
Mặc dù các nút là các thành phần khá đơn giản, nhưng Google vẫn phát hành một tập các thư viện điều khiển giúp dễ dàng sử dụng các nút và các thành phần khác. Đối với phần này bạn sẽ sử dụng trình điều khiển nút bấm để kết nối tới nút bấm và đọc trạng thái của nó, nhưng trước tiên bạn cần phải nhập trình điều khiển nút bấm vào trong tập tin build.gradle của bạn.
compile 'com.google.android.things.contrib:driver-button:0.2'
Tiếp theo, khai báo một đối tượng ButtonInputDriver
như là một biến thành viên cho lớp MainActivity
của bạn.
private ButtonInputDriver mButtonInputDriver;
Bạn có thể khởi tạo đối tượng này và đăng ký nó bên trong khối try
được sử dụng trong phương thức onCreate()
cho thành phần LED của bạn.
mButtonInputDriver = new ButtonInputDriver( BoardDefaults.getGPIOForButton(), Button.LogicState.PRESSED_WHEN_LOW, KeyEvent.KEYCODE_SPACE); mButtonInputDriver.register();
Khi ButtonInputDriver
của bạn được tạo ra, nó sẽ gửi các sự kiện bấm nút cho các phương thức onKeyDown()
và onKeyUp()
với code mà bạn chỉ định lúc tạo trình điều khiển, nó có thể được override trong Activity
của bạn để thay đổi trạng thái của đèn LED.
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_SPACE) { setLEDState(true); return true; } return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_SPACE) { setLEDState(false); return true; } return super.onKeyUp(keyCode, event); }
Cuối cùng, bạn sẽ cần phải hủy đăng ký và vô hiệu hóa ButtonInputDriver
của bạn trong onDestroy()
, giống như bạn đã làm với LED của bạn.
if (mButtonInputDriver != null) { mButtonInputDriver.unregister(); try { mButtonInputDriver.close(); } catch (IOException e) { Log.e(TAG, "Error closing Button driver", e); } finally{ mButtonInputDriver = null; } }
Tổng kết
Trong hướng dẫn này, bạn đã học được cách để flash một Raspberry Pi với Android Things, thiết lập một mạch đơn giản bao gồm một nút và đèn LED, và viết một ứng dụng Android để điều khiển đèn LED dựa trên việc bấm nút bằng cách sử dụng một thư viện trình điều khiển.
Tại thời điểm này, bạn sẽ có thể sử dụng các thư viện trình điều khiển khác và tạo ra các mạch phức tạp hơn của riêng bạn. Trong phần tiếp theo của loạt bài này, chúng ta sẽ xem xét các kiểu khác nhau của đầu vào/đầu ra trên thiết bị ngoại vi mà có sẵn trong Android Things, và sau đó chúng ta tiếp tục tạo ra trình điều khiển của riêng mình cho các thành phần!
Trong lúc đó, hãy kiểm tra một số khóa học và hướng dẫn khác của chúng tôi về phát triển Android!