Luận Văn Ứng dụng Wear OS trong việc hỗ trợ người già

117 58 0
Luận Văn Ứng dụng Wear OS trong việc hỗ trợ người già

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TR NG B B GIÁO D C & ÀO T O I H C S PH M K THU T TP H CHÍ MINH KHOA I N – I N T MÔN I N T CÔNG NGHI P – Y SINH - ÁN T T NGHI P NGÀNH K THU T I N T TRUY N THÔNG TÀI: H TH NG NG D NG WEAR OS TRONG VI C H TR NG I GIÀ GVHD: ThS Nguy n V n Hi p SVTH 1: Tr n V n Ba MSSV: 14141013 SVTH 2: Nguy n Lê Trung Hi u MSSV: 14141100 Tp H Chí Minh – 06/2018 i TR B NG H SPKT TP H CHÍ MINH KHOA I N- I N T MƠN I N T CÔNG NGHI P – Y SINH C NG HÒA XÃ H I CH NGH A VI T NAM C L P - T DO - H NH PHÚC o0o -Tp HCM, ngày 29 tháng n m 2018 NHI M V H tên sinh viên: Chuyên ngành: H đào t o: Khóa: I TÊN ÁN T T NGHI P Tr n V n Ba Nguy n Lê Trung Hi u i n t công nghi p i h c quy 2014 TÀI: H TH NG NG I GIÀ MSSV: 14141013 MSSV: 14141100 Mã ngành: 141 Mã h : L p: 14141DT3B NG D NG WEAR OS TRONG VI C H TR II NHI M V Các s li u ban đ u: - S d ng m t Asus ZenWatch - S d ng m t n tho i h u hành Android - S d ng m t Module wifi ESP8266 NodeMCU Mini D1 - S d ng m t Module Relay N i dung th c hi n: - Tìm hi u v firebase đ c p nh t d li u u n, c ng nh chia s quy n u n cho thi t b - Tìm hi u thi t k giao di n cho ng d ng ch y thi t b android - Tìm hi u cách u n module ESP8266 NodeMCU Mini D1 thông qua firebase - Thi công đ c mơ hình - Cân ch nh, hồn thi n đ c mơ hình - ánh giá k t qu th c hi n III NGÀY GIAO NHI M V : 20/03/2018 IV NGÀY HOÀN THÀNH NHI M V : 27/06/2018 V H VÀ TÊN CÁN B H NG D N: ThS Nguy n V n Hi p CÁN B H NG D N BM I N T CÔNG NGHI P – Y SINH ii TR B NG H SPKT TP H CHÍ MINH KHOA I N- I N T MÔN I N T CÔNG NGHI P – Y SINH C NG HÒA XÃ H I CH NGH A VI T NAM C L P - T DO - H NH PHÚC o0o -Tp HCM, ngày 27 tháng 03 n m 2018 L CH TRÌNH TH C HI N ÁN T T NGHI P H tên sinh viên 1: Tr n V n Ba L p:14141DT3B MSSV:14141013 H tên sinh viên 2: Nguy n Lê Trung Hi u L p:14141DT3B MSSV:14141100 Tên đ tài: H TH NG NG D NG WEAR OS TRONG VI C H TR NG Tu n/ngày N i dung 1-2/ 20-03 đ n G p GVHD trao đ i xác nh n đ tài 27-03 2-3/ 27-03 đ n Hoàn thành đ c ng 03-04 3-4/ 03-04 đ n Liên k t firebase đ u n qua n tho i 17-04 thông minh đ ng h thông minh I GIÀ Xác nh n GVHD 4-6/ 17-04 đ n K t n i module esp module relay, đ u 02-05 n đèn chuông, thông qua n tho i đ ng h thông minh 6-10/ 02-05 đ n 30-05 10-12/ 30-05 đ n 13-06 12-14/ 13-06 đ n 27-06 Vi t ng d ng kh n c p Hoàn thành ch y th nghi m h th ng Hoàn thi n h th ng báo cáo đ án t t nghi p GV H NG D N (Ký ghi rõ h tên) iii L I CAM OAN tài nhóm tơi t th c hi n d a vào m t s tài li u tr chép t tài li u hay cơng trình có tr c Nh ng ng Tr n V n Ba c không i th c hi n đ tài Nguy n Lê Trung Hi u iv L IC M N Em xin g i l i c m n sâu s c đ n Th y Nguy n V n Hi p _ Gi ng viên b môn i n t công nghi p – y sinh tr c ti p h ng d n t n tình giúp đ t o u ki n đ hoàn thành t t đ tài Chúng em xin g i l i chân thành c m n th y cô Khoa i n- i n T t o nh ng u ki n t t nh t cho chúng em hoàn thành đ tài Chúng c ng g i l i đ ng c m n đ n b n l p 14141DT3B chia s trao đ i ki n th c c ng nh nh ng kinh nghi m quý báu th i gian th c hi n đ tài C m n đ n cha m , ch d a tinh th n v ng ch c cho chúng con, an i đ ng viên nh ng lúc chúng khó kh n nh t su t nh ng n m tháng h c hành Xin chân thành c m n! Nh ng ng Tr n V n Ba i th c hi n đ tài Nguy n Lê Trung Hi u v M CL C Trang bìa i Nhi m v đ án ii L ch trình iii Cam đoan iv L i c m n v M c l c vi Li t kê hình v viii Li t kê b ng xi Tóm t t xii CH NG T NG QUAN 1.1 t v n đ 1.2 M c tiêu 1.3 N i dung nghiên c u 1.4 Gi i h n 1.5 B c c CH NG C 2.1 Ng S LÝ THUY T i cao tu i 2.2 L ch s h u hành Android 2.3 Gi i thi u v Wear OS 2.4 Gi i thi u v Wifi 2.5 Gi i thi u v Bluetooth 11 2.6 Gi i thi u v Google Firebase 13 CH NG TÍNH TỐN VÀ THI T K 18 3.1 Gi i thi u 18 3.1.1 Th c tr ng nhu c u 18 3.1.2 Bài toán đ t 18 3.2 Tính tốn thi t k m ch 18 3.2.1 Thi t k đ ng h 19 3.2.2 Thi t k n tho i 20 vi 3.2.3 Thi t k m ch u n đèn, chuông 22 a/ Vi u n 22 b/ Module Relay 5V 24 c/ Ngu n nuôi m ch u n 25 d/ Các thi t b khác 26 CH NG THI CÔNG H TH NG 28 4.1 Gi i thi u 28 4.2 Xây d ng ng d ng u n đèn, chuông smartwatch 28 4.2.1 Gi i thi u ph n m m Android Studio 28 4.2.2 L u đ l p trình ng d ng 42 4.3 Xây d ng ng d ng kh n c p SOS n tho i 48 4.4 Thi công m ch u n đèn, chuông 59 4.5 H ng d n s d ng thao tác 74 CH NG K T QU _NH N XÉT_ ÁNH GIÁ 80 5.1 K t qu 80 5.2 Nh n xét đánh giá 85 CH NG K T LU N VÀ H NG PHÁT TRI N 87 6.1 K t lu n 87 6.2 H ng phát tri n 87 TÀI LI U THAM KH O xiii PHU L C xv vii LI T Kể HÌNH V Hình Trang Hình 2.1: Các phiên b n c a h u hành Android Hình 2.2: Thi t b s d ng Wear OS Hình 2.3: H th ng thi t b k t n i wifi Hình 2.4: Hình nh ký hi u c a Bluetooth 11 Hình 2.5: Thơng s c a lo i Bluetooth 12 Hình 2.6: Các ng d ng c a Google Firebase 14 Hình 3.1: S đ kh i t ng quát h th ng 19 Hình 3.2: Thi t k ng d ng đ ng h 20 Hình 3.3: Giao di n b t đ u ng d ng n tho i 21 Hình 3.4: Giao di n ng d ng n tho i kh i ch y thành công 21 Hình 3.5: Module ESP8266 23 Hình 3.6: Module Relay 24 Hình 3.7: Adapter 5V/2A 25 Hình 3.8: èn led 5W/220VAC - èn led 9W/220VAC 26 Hình 3.9: Chng n 220VAC 27 Hình 3.10: S đ k t n i kh i 27 Hình 4.1: Ph n m m Android Studio 28 Hình 4.2: T i ph n m m Android Studio 30 Hình 4.3: Ti n hành trình cài đ t ph n m m Android Studio 30 Hình 4.4: K t thúc trình cài đ t ph n m m Android Studio 31 Hình 4.5: C a s “Welcome to Android Studio” 32 Hình 4.6: Màn hình Create Android Project 33 Hình 4.7: Màn hình Target Android Devices 33 viii Hình 4.8: Màn hình Add an Activity to Wear 34 Hình 4.9: Màn hình Configure Activity 35 Hình 4.10: Màn hình th MainActivity.java 35 Hình 4.11: Màn hình th AndroidManifest.xml 36 Hình 4.12: Màn hình th app 36 Hình 4.13: Màn hình th Design 37 Hình 4.14: Màn hình th Text 37 Hình 4.15: Giao di n hi n th c a Firebase 38 Hình 4.16: C a s Add a project 39 Hình 4.17: i n thông tin package c a ng d ng 39 Hình 4.18: T i t p tin google-services.json 40 Hình 4.19: Các dòng l nh c n thi t 41 Hình 4.20: C a s Security rules for Realtime Database 41 Hình 4.21: Giao di n làm vi c Database 42 Hình 4.22: L u đ ng d ng đ c kh i đ ng 43 Hình 4.23: Giao di n c a ng d ng 47 Hình 4.24: Giao di n nh p s n tho i kh n c p 49 Hình 4.25: Giao di n xác nh n s n tho i kh n c p 50 Hình 4.26: Giao di n thông báo SOS ho t đ ng 51 Hình 4.27: L u đ startActivity.java 52 Hình 4.28: L u đ MainActivity.java 53 Hình 4.29: L u đ x lý handler 54 Hình 4.30: L u đ ho t đ ng c a ch ng trình g i tin nh n 55 Hình 4.31: L u đ kh i t o s n tho i kh n c p 56 Hình 4.32: L u đ ho t đ ng c a ch ng trình v trí 57 Hình 4.33: Thi t k b n v PCB sau thi công 58 ix Hình 4.34: M ch u n hoàn ch nh 60 Hình 4.35: C a s l p trình c a Arduino 62 Hình 4.36: C a s tính hành cài đ t Driver Arduino 63 Hình 4.37: C a s hồn thành q trình cài đ t Driver Arduino 64 Hình 4.38: Thêm th vi n cho Arduino 64 Hình 4.39: C a s Library Manager 65 Hình 4.40: L u đ u n c a vi u n 65 Hình 4.41: L u đ x lý hàm void setup() 67 Hình 4.42: Giao di n Database 69 Hình 4.43: L y authCode c a Firebase 69 Hình 4.44: L u đ hàm voidloop() 71 Hình 4.45: Giao di n firebase th c t 74 Hình 4.46: Màn hình đ u tiên c a ng d ng 75 Hình 4.47: Màn hình th hai c a ng d ng 75 Hình 4.48: Màn hình c a ng d ng đ ng h 76 Hình 4.49: Giao di n Firebase 77 Hình 4.50: C a s đ ng nh p tài kho n Google 78 Hình 4.51: Giao di n c a project Firebase 78 Hình 4.52: Giao di n làm vi c c a Database 79 Hình 5.1: Hình nh th c t đ ng h 81 Hình 5.2: Giao di n g i tin nh n, n i dung tin nh n 81 Hình 5.3: Cu c g i t t o 82 Hình 5.4: i u n ch a c p ngu n ph n c ng 82 Hình 5.5: i u n c p ngu n ph n c ng 83 Hình 5.6: Thi t b t t 84 Hình 5.7: Thi t b b t 84 x PH L C } }); myswitch3.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener(){ @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if(isChecked) {myfirebase.child("den13").child("trangthai").setValue("sang");} else {myfirebase.child("den13").child("trangthai").setValue("tat");} } }); setAmbientEnabled(); } } Activity_main.xml < ?xml version="1.0" encoding="utf-8"?> B MÔN I N T CÔNG NGHI P xvii PH L C androidManifest.xml < ?xml version="1.0" encoding="utf-8"?> B MÔN I N T CÔNG NGHI P xix PH L C Build.gradle(App) apply plugin: 'com.android.application' android { compileSdkVersion 27 defaultConfig { applicationId "com.example.s46c.dongho3" minSdkVersion 25 targetSdkVersion 27 versionCode versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguardrules.pro' } } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.google.android.support:wearable:2.3.0' implementation 'com.google.android.gms:play-services-wearable:12.0.1' implementation 'com.android.support:percent:27.1.0' implementation 'com.android.support:support-v4:27.1.0' implementation 'com.android.support:recyclerview-v7:27.1.0' implementation 'com.android.support:wear:27.1.0' compileOnly 'com.google.android.wearable:wearable:2.3.0' compile 'com.google.firebase:firebase-database:12.0.1' compile 'com.google.firebase:firebase-core:12.0.1' compile 'com.firebase:firebase-client-android:2.5.2' } apply plugin: 'com.google.gms.google-services' B MÔN I N T CÔNG NGHI P xx PH L C Code n tho i: startActivity: package com.example.s46c.sos_firebase; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; public class startActivity extends AppCompatActivity { Button btn; private EditText edt_sdt; public static final String SDT = "SDT"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_start); btn = findViewById(R.id.btnstart); edt_sdt = findViewById(R.id.edt_nhap); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { String sdt = edt_sdt.getText().toString(); byExtras(sdt); } }); } public void byExtras(String sdt) { Intent intent = new Intent(startActivity.this, MainActivity.class); intent.putExtra(SDT, sdt); startActivity(intent); finish(); } } MainActivity: package com.example.s46c.sos_firebase; import android.content.ActivityNotFoundException; B MÔN I N T CÔNG NGHI P xxi PH L C import android.content.Intent; import android.content.pm.PackageManager; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.net.Uri; import android.os.Handler; import android.provider.Settings; import android.support.v4.app.ActivityCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.telephony.SmsManager; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.firebase.client.DataSnapshot; import com.firebase.client.Firebase; import com.firebase.client.FirebaseError; import com.firebase.client.ValueEventListener; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; public class MainActivity extends AppCompatActivity { Firebase myfirebase; private LocationManager locationManager; private LocationListener locationListener; private TextView TVSDT; private DatabaseReference mData; private String message ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TVSDT = (TextView) findViewById(R.id.tvsdt); Intent intent = getIntent(); B MÔN I N T //lay du lieu tu startActivity qua CÔNG NGHI P xxii PH L C final String sdt = intent.getStringExtra(startActivity.SDT); TVSDT.setText(sdt); Firebase.setAndroidContext(this); myfirebase = new Firebase("https://android-vanba.firebaseio.com"); mData = FirebaseDatabase.getInstance().getReference(); location(); myfirebase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(((String)dataSnapshot.child("toa do").getValue()) != null){ String toado = dataSnapshot.child("toa do").getValue().toString(); message = "Tôi c n s giúp đ ! Tơi v trí"+toado; } if (((String) dataSnapshot.child("SENT").getValue()).equals("yes")) { sendSMSMessage(sdt); Handler j = new Handler(); j.postDelayed(new Runnable() { @Override public void run() { myfirebase.child("SENT").setValue("no"); call(sdt); } }, 5000); } } @Override public void onCancelled(FirebaseError firebaseError) { Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_LONG).show(); } }); } private void sendSMSMessage(String sdt) { Log.i("Send SMS", ""); String phoneNo = sdt; try { SmsManager smsManager = SmsManager.getDefault(); B MÔN I N T CÔNG NGHI P xxiii PH L C smsManager.sendTextMessage(phoneNo, null, message, null, null); Toast.makeText(getApplicationContext(), "SMS sent.", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(getApplicationContext(), "SMS faild, please try again.", Toast.LENGTH_LONG) show(); e.printStackTrace(); } } private void call(String sdt) { try { String phoneNumber = sdt; Intent it = new Intent(Intent.ACTION_CALL); it.setData(Uri.parse("tel:" + phoneNumber)); startActivity(it); } catch (ActivityNotFoundException e) { // Exceptions } } private void location() { locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { myfirebase.child("toa do").setValue((+location.getLatitude() + " ," + location.getLongitude())); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { Intent intent = new B MÔN I N T CÔNG NGHI P xxiv PH L C Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); startActivity(intent); } }; if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission See the documentation // for ActivityCompat#requestPermissions for more details return; } locationManager.requestLocationUpdates("gps", 60000, 0, locationListener); } } Activity_start.xml: < ?xml version="1.0" encoding="utf-8"?> Activity_main.xml: Androidmanifest.xml: < ?xml version="1.0" encoding="utf-8"?> B MÔN I N T CÔNG NGHI P xxvi PH L C Build.gradle(App): apply plugin: 'com.android.application' android { compileSdkVersion 27 defaultConfig { applicationId "com.example.s46c.sos_firebase" minSdkVersion 22 targetSdkVersion 27 versionCode versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguardrules.pro' } B MÔN I N T CÔNG NGHI P xxvii PH L C } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.2' implementation 'com.google.firebase:firebase-database:11.8.0' compile 'com.google.firebase:firebase-core:11.8.0' compile 'com.firebase:firebase-client-android:2.5.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espressocore:3.0.2' } apply plugin: 'com.google.gms.google-services' Code vi u n: #include #include #define wifiName "KTX SV" // ây SSID c a m ng wifi b n mu n ESP k t n i t i #define wifiPass "67896789" // ây password #define DEN1 D4 #define DEN2 D3 #define DEN3 D2 #define BELL D1 String IDden1 = "den11"; String IDden2 = "den12"; String IDden3 = "den13"; String IDbell = "bell"; #define firebaseURl "android-vanba.firebaseio.com" //https://androidvanba.firebaseio.com/ #define authCode "0a4VRqqXeo7r9BaWJ3beDMbJy1w00gwVYcQrf8hf" int onlyt1=1,onlys1=1; int onlyt2=1,onlys2=1; int onlyt3=1,onlys3=1; int onlyt4=1,onlys4=1; void setupFirebase() { Firebase.begin(firebaseURl, authCode); } void setupWifi() { //k t n i wifi v i tên m t kh u t hai m ng l u B MÔN I N T CÔNG NGHI P xxviii PH L C WiFi.begin(wifiName, wifiPass); Serial.println("Hey i 'm connecting "); while (WiFi.status() != WL_CONNECTED) { Serial.println("."); delay(500); } Serial.println(); Serial.println("I 'm connected and my IP address: "); Serial.println(WiFi.localIP()); } void setup() { pinMode(DEN1, OUTPUT); pinMode(DEN2, OUTPUT); pinMode(DEN3, OUTPUT); pinMode(BELL, OUTPUT); WiFi.mode(WIFI_OFF); delay(50); Serial.begin(115200); delay(10); setupWifi(); setupFirebase(); } void getData() { FirebaseObject object = Firebase.get(IDden1); String trangthai = object.getString("trangthai"); Serial.println("TRANG THAI DEN: "); Serial.println(trangthai); if(trangthai!="\0") { if(trangthai=="sang") { if(onlys1==1) { Firebase.setString(IDden1+"/TT","sang"); onlys1=0; onlyt1=1; }; digitalWrite(DEN1,LOW); }else { if(onlyt1==1) { Firebase.setString(IDden1+"/TT","tat"); onlyt1=0; B MÔN I N T CÔNG NGHI P xxix PH L C onlys1=1; }; digitalWrite(DEN1,HIGH); } } FirebaseObject object2 = Firebase.get(IDden2); String trangthai2 = object2.getString("trangthai"); Serial.println("TRANG THAI DEN 2: "); Serial.println(trangthai2); if(trangthai2!="\0") { if(trangthai2=="sang") { if(onlys2==1) { Firebase.setString(IDden2+"/TT","sang"); onlys2=0; onlyt2=1; }; digitalWrite(DEN2,LOW); }else { if(onlyt2==1) { Firebase.setString(IDden2+"/TT","tat"); onlyt2=0; onlys2=1; }; digitalWrite(DEN2,HIGH); } } FirebaseObject object3 = Firebase.get(IDden3); String trangthai3 = object3.getString("trangthai"); Serial.println("TRANG THAI DEN 3: "); Serial.println(trangthai3); if(trangthai3!="\0") { if(trangthai3=="sang") { if(onlys3==1) { Firebase.setString(IDden3+"/TT","sang"); onlys3=0; B MÔN I N T CÔNG NGHI P xxx PH L C onlyt3=1; }; digitalWrite(DEN3,LOW); }else { if(onlyt3==1) { Firebase.setString(IDden3+"/TT","tat"); onlyt3=0; onlys3=1; }; digitalWrite(DEN3,HIGH); } } FirebaseObject object4 = Firebase.get(IDbell); String trangthai4 = object4.getString("trangthai"); Serial.println("TRANG THAI BELL :"); Serial.println(trangthai4); if(trangthai4!="\0") { if(trangthai4=="sang") { if(onlys4==1) { Firebase.setString(IDbell+"/TT","sang"); onlys4=0; onlyt4=1; }; digitalWrite(BELL,LOW); }else { if(onlyt4==1) { Firebase.setString(IDbell+"/TT","tat"); onlyt4=0; onlys4=1; }; digitalWrite(BELL,HIGH); } } } void loop() { getData(); } B MÔN I N T CÔNG NGHI P xxxi ... LG, HTC Asus cơng b đ i tác th c Trong n m 2014, có 720.000 thi t b Android Wear đ c bán c a hãng LG, Motorola Samsung[3] Hình 2.2: Thi t b s d ng Wear OS Wear OS v n d a core Linux c a ng i anh... ng h thông minh h u hành Wear OS ngày ph bi n thi t b đeo tay có th bên ng tr ng 3.2 i già 24/24 h tr r t t t Vì v y nhóm ch đ ng xây d ng ng d ng h i già n n t ng Wear OS TÍNH TỐN VÀ THI T K T... h tr t i u nh t cho nh ng v n đ thi t y u cho ng tài mang tên: H TR NG TH NG i già NG D NG WEAR OS TRONG VI C H I GIÀ tài s d ng thi t b đ ng h thông minh, n tho i thông minh, website có k t n

Ngày đăng: 16/11/2019, 15:19

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan