Tài liệu Internet of things
Internet of Things (IoT) là gì?
Internet of Things (IoT) - Mạng lưới vạn vật kết nối Internet là một kịch bản
của thế giới, khi mà mỗi đồ vật, con người được cung cấp một định danh của
riêng mình, và tất cả có khả năng truyền tải, trao đổi thông tin, dữ liệu qua
một mạng duy nhất mà không cần đến sự tương tác trực tiếp giữa người với
người, hay người với máy tính. IoT đã phát triển từ sự hội tụ của công nghệ
không dây, công nghệ vi cơ điện tử và Internet[1]. Nói đơn giản là một tập
hợp các thiết bị có khả năng kết nối với nhau, với Internet và với thế giới bên
ngoài để thực hiện một công việc nào đó. Internet of things (IoT) dùng để chỉ các đối tượng có thể được nhận biết cũng như chỉ sự tồn tại của
chúng trong một kiến trúc tổng hòa mang tính kết nối: Mạng lưới vạn vật kết nối Internet, hay gọi đơn
giản hơn là Things.
IoT có thể là bộ cảm ứng được lắp ráp trong một chiếc tủ lạnh để ghi lại nhiệt độ, là một trái tim được
cấy ghép trong cơ thể con người, Hiểu đơn giản, IoT có thể khiến mọi vật giờ đây có thể giao tiếp với
nhau dễ dàng hơn và ưu điểm lớn nhất của “Thông minh” là khả năng phòng ngừa và cảnh báo tại
bất kì đâu.
Cụm từ Internet of things được đưa ra bởi Kevin Ashton vào năm 1999, tiếp sau đó nó cũng được dùng
nhiều trong các ấn phẩm đến từ các hãng và nhà phân tích. Họ cho rằng IoT là một hệ thống phức
tạp, bởi nó là một lượng lớn các đường liên kết giữa máy móc, thiết bị và dịch vụ với nhau. Ban đầu,
IoT không mang ý nghĩa tự động và thông minh. Về sau, người ta đã nghĩ đến khả năng kết hợp giữa
hai khái niệm IoT - Autonomous control lại với nhau. Nó có thể quan sát sự thay đổi và phản hồi với
môi trường xung quanh, cũng có thể tự điều khiển bản thân mà không cần kết nối mạng. Việc tích
hợp trí thông minh vào IoT còn có thể giúp các thiết bị, máy móc, phần mềm thu thập và phân tích
các dữ liệu điện tử của con người khi chúng ta tương tác với chúng. Xu hướng tất yếu trong tương lai,
con người có thể giao tiếp với máy móc chỉ qua mạng internet không dây mà không cần thêm bất cứ
hình thức trung gian nào khác.
Trang 1
Trang 2
Trang 3
Trang 4
Trang 5
Trang 6
Trang 7
Trang 8
Trang 9
Trang 10
Tải về để xem bản đầy đủ
Tóm tắt nội dung tài liệu: Tài liệu Internet of things
tin và khắc /* Handler sẽ được gọi khi master yêu cầu dữ liệu */ * phục sự cố khi không kết nối đến net work WiFi onRequest(handler) */ /* In ra serial các chuẩn đoán thông tin của network */ /************************************************* WiFi.printDiag(Serial); * ESP8266 * /* Enable chế độ debug */ *************************************************/ Serial.setDebugOutput(true); 150/155 /* WEBSERVER */ mqtt.unSubscribe("/qos0"); /* Máy chủ TCP tại port 80 sẽ phản hồi các HTTP request /* Thực hiện subscribe topic và publish các message */ được gửi lên từ client */ mqtt.onSubscribe([](int sub_id) ESP8266WebServer server (80); /* Publish 1 message "qos0" đến topic /qos0 với QoS =0, /* Server bắt đầu lắng nghe các client */ và Retain = 0 */ server.begin(); mqtt.publish("/qos0", "qos0", 0, 0); /* Viết dữ liệu đến các client */ /* Kết nối đến server MQTT */ server.write(buf, len) mqtt.onConnect([]() /* Khởi tạo server ở địa chỉ URL, handleRoot là nội /* Subscribe topic và nhận message tại topic /qos0 */ dung hoặc hàm sẽ thực hiện */ mqtt.subscribe("/qos0", 0) server.on ( "URL", handleRoot ); /* Bắt đầu truyền nhận dữ liệu với broker MQTT có url /* Server tương tác với client để gửi, nhận dữ liệu */ mqtt://test.mosquitto.org tại port 1883 */ server.handleClient(); mqtt.begin("mqtt://test.mosquitto.org:1883") /* Trả về 1 nếu biến val có tồn tại trên server */ /* Hàm được gọi trong loop() nhằm khởi tạo MQTT, kiểm server.hasArg(val) tra xử lí các dữ liệu từ các topic, kiểm tra các thuộc /* Lấy giá trị của biến val trên server */ tính của giao thức như gói keep-a-live, QoS... */ server.arg(val); mqtt.handle(); /* Gửi yêu cầu cập nhật dữ liệu từ server: code : HTTP code /* Các hàm của thư viện PubSubClient*/ text/html : Định dạng trả về là file HTML /* Khai báo biến espClient thuộc đối tượng client trong content: Nội dung sẽ trả về từ phía server */ class PubSubClient */ server.send (code, "text/html",content); PubSubClient client(espClient); /* Publish gói tin "Connected!" đến topic ESP8266 */ /* MQTT */ client.publish("ESP8266", "Connected!"); /* /* Subscribe để nhận các message từ topic ESP8266 */ Các thư viện hỗ trợ giao thức MQTT dành cho ESP8266 client.subscribe("ESP8266"); trên arduino thường sử dụng là ESP8266MQTTClient /* Cài đặt server lắng nghe client ở port 1883 */ và PubSubClient. Phần này giải thích các hàm của các client.setServer(url_server, 1883); thư viện /* Gọi hàm callback để thực hiện các chức năng */ publish/subcribe */ /* Các hàm của thư viện ESP8266MQTTClient*/ client.setCallback(callback); /* Khai báo 1 biến mqtt thuộc class MQTTClient */ /* Hàm được gọi trong loop() nhằm khởi tạo MQTT, kiểm MQTTClient mqtt; tra /* Lấy dữ liệu nhận được từ topic đã subcribe */ xử lí các dữ liệu từ các topic, kiểm tra các thuộc tính mqtt.onData([](String topic, String data, bool cont) của giao thức như gói keep-a-live, gói tin QoS... */ /* Hủy subcribe topic /qos0 */ client.loop(); iotmaker.vn Internet Of Things (IoT) cho người mới bắt đầu 151/155 C - Cheatsheet /* CẤU TRÚC CƠ BẢN */ 123L Số nguyên có dấu 4 bytes Viết chú thích trên 1 dòng dùng // 123UL Số nguyên không dấu 4bytes ex: x++ ; // tăng x 1 đơn vị 123.0 Số thực /* */ Viết chú thích trên nhiều dòng. 1.23e6 Số thực dùng cơ số mũ ex: 1.23*10^3 = 1230 ex : /************************* /* định nghĩa hằng số a kiểu nguyên, có giá trị là 1 */ * Chú thích được viết * const int a = 1; * trên nhiều dòng * /* Định nghĩa hằng số x kiểu thực, có giá trị là 4.0 */ ************************/ const float x = 4; /* CẤU TRÚC 1 CHƯƠNG TRÌNH */ /* Định nghĩa hằng số c kiểu integer có giá trị 49 */ #include //include thư viện chuẩn của C const c = ‘1’; // Kí tự 1 trong mã ASCII là 49 #include "iLib.h" //include thư viện tạo bởi người dùng /* Định nghĩa str là hằng số kiểu con trỏ, trỏ tới int global_var; //biến được dùng trong chương trình chuỗi “Cheasheet C” */ /* Khai báo hàm bắt đầu của 1 chương trình C với kiểu const char * str = “Cheasheet C”; trả về là integer. Đối số arg kiểu int được truyền vào hàm */ /* KHAI BÁO BIẾN */ int main (int arg){ /* Khai báo biến a kiểu nguyên và không gán giá trị */ float local_var ; // Biến chỉ được dùng trong hàm main int a; Lệnh 1 /* khai báo a kiểu binary, b kiểu base8, c kiểu số ... nguyên, d kiểu số nguyên và không gán giá trị */ Lệnh n ; int a = 0b01111011, b = 0123, c = 1, d; return 0; //chương trình thực hiện thành công và thoát /* Khai báo biến fa thuộc kiểu số thực float */ } float fa = 1.0f; /* Khai báo biến da thuộc kiểu số thực double */ /*KIỂU DỮ LIỆU VÀ PHẠM VI */ double da = 1.0; boolean true | false /* Khai báo biến con trỏ và trỏ đến 1 vùng nhớ không char -128 - 127, 'a' '$' etc. xác định */ unsigned char 0 - 255 char *pointer; byte 0 - 255 /* Khai báo biến con trỏ và trỏ về NULL (0)*/ int -32768 - 32767 char *other_pointer = NULL; unsigned int 0 - 65535 word 0 - 65535 /* CHUỖI KÍ TỰ */ long -2147483648 - 2147483647 /* Chuỗi bao gồm kí tự kết thúc chuỗi \0 (null) */ unsigned long 0 - 4294967295 char str1[8] = {'A','r','d','u','i','n','o','\0'}; float -3.4028e+38 - 3.4028e+38 /* Trình biên dịch tự động thêm kí tự \0 vào cuối double -3.4028e+38 - 3.4028e+38 chuỗi */ void i.e., no return value char str2[8] = {'A','r','d','u','i','n','o'}; /* Khai báo chuỗi ,không khai báo số phần tử và gán giá /* ĐẶT TÊN BIẾN */ trị chuỗi */ /* Đặt tên đúng */ char str3[] = "Arduino"; int x; // Một biến /* Khai báo và gán giá trị cho chuỗi */ int x = 1; // Biến được khai báo và khởi tạo char str4[8] = "Arduino"; float x, y, z; // Nhiều biến cùng kiểu dữ liệu const int x = 88; // Biễn tĩnh, không ghi được /* Các hàm xử lí chuỗi thường dùng */ int tenBien1ok; // Đặt tên biến này đúng /* Nối các kí tự từ chuỗi source tiếp vào vị trí cuối int ten_bien_nay_ok; của chuỗi dest */ /* Đặt tên sai */ strcat(dest, source) int 2001_tensai; // Vì số ở đầu /* Tìm vị trí xuất hiện đầu tiên của kí tự c trong int ten-sai; // Dấu '-' không phải là alphanumberic source, trả về con trỏ chỉ tới vị trí đó hoặc null nếu int while; // Sai, vì dùng từ khóa vòng lặp while không tìm thấy c trong source */ strchr(source, c) /* HẰNG SỐ VÀ KIỂU DỮ LIỆU */ /* Hàm trả về độ dài của chuỗi st */ 123 Số thập phân strlen(st) 0b0111 Số nhị phân /* copy và thay các kí tự của chuỗi soure vào dest */ 0173 Số Octal - base 8 strcpy(dest, source) 0x7B Số thập lục phân base 16 /* chép kí tự từ đầu đến n từ chuỗi source vào dest */ 123U Số nguyên không dấu strncpy(dest, source, n) 152/155 /* MẢNG */ /* for : Khởi tạo và gán giá trị cho i, thực hiện code /* Khai báo mảng 1 chiều 6 phần tử kiểu integer và gán tăng i nếu i < 10 */ giá trị cho mỗi phần tử */ for (int i = 0; i < 10; i++) { code }; int myPins[] = {2, 4, 8, 3, 6}; /* Khai báo mảng 1 chiều 6 phần tử kiểu integer và /* PHÉP TOÁN VÀ TOÁN TỬ THƯỜNG DÙNG không gán giá trị */ /* Các toán tử thường dùng */ int myInts[6]; = toán tử bằng myInts[0] = 42; // Gán giá trị 42 cho phần tử đầu tiên + toán tử cộng myInts[6] = 12; // LỖI ! chỉ số của mảng chỉ từ 0 đến 5 - toán tử trừ /* Lấy giá trị của phần tử thứ 3 trong mảng myInts */ * toán tử nhân int c = myInts[2]; // Có thể dùng *(myInts + 2) / toán tử chia lấy phần nguyên /* Lấy địa chỉ của phần tử thứ 3 trong mảng myInts */ % toán tử chia lấy phần dư int c = &myInts[2]; // Có thể dùng int c = myInts + int == phép so sánh bằng /* Trả về chiều dài của mảng myInts */ != phép so sánh không không bằng (khác) int length = sizeof(myInts) / sizeof(myInts[0]); < phép so sánh nhỏ hơn /* Khai báo 2 mảng kiểu float, arr1 có 5 phần tử, arr2 > phép so sánh lớn hơn có 10 phần tử */ <= phép so sánh nhỏ hơn hoặc bằng float arr1[5], arr2[10]; >= phép so sánh lớn hơn hoặc bằng /* Khai báo mảng số nguyên arr có 2 dòng, 5 cột. Tổng && phép toán logic (AND) cộng có 10 phần tử */ || phép toán logic (OR) int a[2][5]; ! phép toán logic (NOT) /* KHỐI LỆNH VÀ CÁC LỆNH DÙNG TRONG VÒNG LẶP */ /* Các toán tử hợp nhất */ {} // bao gồm nhiều lệnh, thường được sử dụng trong h ++ tăng 1 đơn vị àm -- giảm 1 đơn vị /* Goto : chương trình sẽ nhảy đến nhãn (nhãn phải có += phép toán cộng và gán giá trị mặt trong câu lệnh chứa goto) */ ex: x = 5; x+= 1; //x = 6 goto nhãn; -= phép toán trừ và gán giá trị /* Continue : Chỉ dùng trong các lệnh có vòng lặp sẽ ex: x = 5; x-= 1; //x = 4 chuyển qua chu kì mới của vòng lặp trong cùng nhất */ *= phép toán nhân và gán giá trị continue; /* ex: x = 5; x*= 3; //x = 15 /* Break : Dùng với các vòng lặp thoát khỏi vòng lặp /= phép toán chia lấy phần nguyên và gán giá trị trong cùng nhất, hoặc dùng trong cấu trúc switch..case ex: x = 6; x/= 2; //x = 3 để thoát ra khỏi case tương ứng */ &= phép toán logic AND và gán giá trị break; /* ex: x = 0b1010; x&= 0110; //x =0b0010 /* Return */ |= phép toán logic OR và gán giá trị /* Dùng cho hàm không có kiểu trả về (void) */ ex: x = 0b1010; x&= 0110; //x =0b1110 return; /* Value có thể là hằng số, biến, biểu thức hoặc gọi /* Các toán tử trên bit */ đến 1 hàm khác để trả về giá trị */ & and ^ xor return ; > dịch phảii | or ~ not /* LỆNH RẺ NHÁNH */ if (x < 5) // thực thi code nếu x<5 /* THỰC THI VỚI CON TRỎ */ { code } &reference: // lấy địa chỉ của biến mà con trỏ trỏ tới else if (x > 10)// thực thi code nếu x>10 *dereference:// lấy giá trị của biến mà con trỏ trỏ tới { code } /* khai báo biến con trỏ kiểu int trỏ tới địa chỉ của else { code } // thực thi code các trường hợp còn lại biến a */ int a = 5; int *pointer = &a; switch (var) { // thực thi case có giá trị var case 1: /* CÁC KÍ TỰ ĐIỀU KHIỂN VÀ KÍ TỰ ĐẶC BIỆT */ ... \n Nhảy xuống dòng kế tiếp canh về cột đầu tiên break; \t Canh cột tab ngang. case 2: \r Nhảy về đầu hàng, không xuống hàng. ... \a Tiếng kêu bip. break; \\ In ra dấu \ default: \" In ra dấu " ... \' In ra dấu ' } %%: In ra dấu % \b ~ backspace (xóa 1 ký tự ngay trước) /* CÁC KIỂU VÒNG LẶP */ /* While: Thực hiện code nếu x<5 */ /* HÀM VÀ CÁC VẤN ĐỀ LIÊN QUAN */ while (x < 5) { code }; /* Khai báo prototype của hàm max, có 2 đối số đầu vào /* Do-While : Thực hiện code, so sánh, nếu x<0 tiếp tục là a và b thuộc kiểu số nguyên, kết quả trả về của hàm thực hiện code */ kiểu số nguyên */ do { code } while(x < 0); int max(int a, int b); iotmaker.vn Internet Of Things (IoT) cho người mới bắt đầu 153/155 /* Khai báo biến c là giá trị trả về của hàm max */ SINHVIEN */ int c = max(5,4); typedef struct sinhVien SINHVIEN; /* Khai báo prototype của hàm không có đối số và không /* Khai báo biến sinhVienA thuộc struct SINHVIEN */ có kiểu trả về (void) */ SINHVIEN sinhVienA; void none(); /* CÁC LỆNH XỬ LÝ TẬP TIN (#include ) */ /* TYPEDEF- Định nghĩa kiểu dữ liệu */ /* Khai báo 1 biến con trỏ là đường dẫn của 1 file */ /* Định nghĩa kiểu unsigned char là BYTE, khai báo các const char *filePath = "Đường/dẫn/file/document.txt"; biến a, b thuộc kiểu BYTE */ /* Tạo 1 biến con trỏ thuộc kiểu FILE */ typedef unsigned char BYTE; BYTE a, b; FILE *file; /* Mở 1 file ở đường dẫn filePath và đọc dữ liệu */ /* KIỂU LIỆT KÊ - ENUMERATION (enum) */ file = fopen(filePath, "r");// Trả về NULL nếu thất bại /* khai báo kiểu dữ liệu enum là các ngày trong tuần */ /* Đóng 1 file đã mở, trả về 0 nếu thành công , ngược enum daysOfWeek { sunday, monday, tuesday, wednesday }; lại trả về EOF */ /* Tạo biến toDay thuộc daysOfWeek và gán giá trị */ fclose(file); daysOfWeek toDay = wednesday; /* Viết kí tự c lên file đang mở, trả về EOF nếu ghi thất bại, trả về mã ASCII của c nếu thành công */ /* STRUCT - KIỂU DỮ LIỆU DO NGƯỜI DÙNG ĐỊNH NGHĨA */ int fputc(int c, FILE *f); /* Khai báo struct sinhVien */ /* Viết chuỗi "hello" lên file đang mở */ struct sinhVien{ int c = fputs("hello", file); char tenSinhVien; /* Đọc (255-1) kí tự từ file đang mở, kết quả đọc char MSSinhVien; được int tuoiSinhVien; sẽ lưu vào mảng str, việc đọc bị dừng nếu gặp kí tự }; '\n' hoặc EOL */ /* Truy xuất đến thành phần MSSinhVien trong struct fgets(str, 255, file); sinhVien */ /* Thay đổi vị trí trỏ đến trong file của con trỏ sinhVien.MSSinhVien; internal file position indicator về lại đầu file */ /* Đổi tên struct sinhVien thành 1 biến duy nhất là int fseek(file, 0, SEEK_SET); /* Trả về kích thước của nội dung có trong file */ ftell(file); www.cheatography.com/ashlyn-black/cheat-sheets/c-reference/ 154/155 Lời kết Các thành viên tham gia đóng góp. Để hoàn thiện nội dung của sách còn có sự đóng góp của các thành viên sau: • 1. Phạm Minh Tuấn (TuanPM) - Chủ biên • 2. Lâm Nhật Quân - Kĩ sư làm việc tại IoT Maker Việt Nam. • 3. Trịnh Hoàng Đức - Kĩ sư làm việc tại IoT Maker Việt Nam. • 4. Lê Phương Trình - Thực tập sinh tại IoT Maker Việt Nam - Sinh viên Đại Học Bách Khoa, chuyên ngành điện tử viễn thông, khóa học 2014. • 5. Trần Phúc Vinh - Thực tập sinh tại IoT Maker Việt Nam - Sinh viên Đại Học Bách Khoa, chuyên ngành kĩ thuật điện, khóa học 2014. Và sự đóng góp của cộng đồng tại arduino.esp8266.vn Lời kết. Thật vui khi bạn đã đồng hành cùng chúng tôi đi đến hết cuốn sách này. Mục đích của cuốn sách là giúp những người mới bắt đầu tìm hiểu về Internet Of Things (IoT) có kiến thức cơ bản và hướng đi chính xác để nghiên cứu về IoT một cách nhanh chóng hơn. Hi vọng cuốn sách sẽ đến tay thật nhiều bạn đam mê lĩnh vực công nghệ còn mới mẻ nhưng rất tiềm năng này. Chúc các bạn thành công trên con đường mà mình đã chọn. Mặc dù đã cố gắng để hoàn thành tốt nhất nội dung cho cuốn sách, tuy nhiên vẫn không tránh khỏi những thiếu sót. Mọi ý kiến đóng góp xin gửi mail về địa chỉ support@iotmaker.vn Ngoài ra các bạn có thể tương tác với chúng tôi qua 1 số địa chỉ: • 1. Webstore : iotmaker.vn/ • 2. Facebook : www.facebook.com/iotmaker.vn/ Một số trang web đóng góp cho cộng đồng (mong nhận được sự chia sẻ và đóng góp của các bạn để cộng đồng IoT Việt Nam nói riêng cũng như cộng đồng kĩ thuật Việt Nam nói chung ngày một phát triển hơn): • 1. Về ESP8266 với Arduino : arduino.esp8266.vn/ iotmaker.vn Internet Of Things (IoT) cho người mới bắt đầu 155/155 • 2. Về ESP32 : esp32.vn • 3. Facebook Group: www.facebook.com/groups/iotmaker/ Giấy phép sử dụng tài liệu. • Tài liệu tuân theo giấy phép CC-BY-NC-SA (creativecommons.org/licenses/by-nc-sa/4.0/ legalcode) • Bản quyền toàn bộ tài liệu này thuộc về IoT Maker Việt Nam, bạn được miễn phí sử dụng cho mục đích cá nhân, học tập và sử dụng trong các dự án của mình, không được sử dụng cho mục đích thương mại. Nếu bạn muốn sửa chữa, phân phối lại, bạn bắt buộc phải giữ nguyên giấy phép và cần có sự đồng ý của IoT Maker Việt Nam. • Chỉ duy nhất các các nhân, tổ chức được liệt kê tại iota.edu.vn là được phép sử dụng tài liệu cho mục đích thương mại.
File đính kèm:
- tai_lieu_internet_of_things.pdf