Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 117 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
117
Dung lượng
7,61 MB
Nội dung
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