You are on page 1of 161

Internet Of Things (IoT)

cho ngi mi bt u
IoT Maker Vit Nam
Mc lc
Li m u . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

i li v tc gi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Thut ng hay s dng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

Gii thch code trong bi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Gii thiu ni dung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Ai c th s dng? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Mc tiu mang li cho ngi c. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Chun b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

Kin thc c bn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

Internet Of Things (IoT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

Internet of Things (IoT) l g?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

H thng Internet of Things (IoT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

Nhng ng dng thc t trong cuc sng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

S chn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

Thng s phn cng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

SDK h tr chnh thc t hng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

ESP8285 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Module v Board mch pht trin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Board mch pht trin ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Arduino l g?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Mt s c im ca Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Cc li ch khi s dng Arduino. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Cng ng Arduino trn th gii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Arduino cho ESP8266 & board mch ESP8266 WiFi Uno . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

L do s dng Node.js trong cun sch ny. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Cun sch ny c hng dn Node.js ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Sublime Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Ci t v chun b. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Arduino IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

Ci t th vin Arduino . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

USB CDC driver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Chn Board ESP8266 WiFi Uno trong Arduino IDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

Np chng trnh xung board dng Arduino IDE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Xut firmware binary trong Arduino IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

Serial Terminal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

Node.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Sublime Text . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Chp tt bng LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

Kin thc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

u ni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

M ngun chp tt dng Delay . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

M ngun chp tt dng nh thi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Digital IO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Kin thc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

M ngun dng hi vng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

M ngun dng ngt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

Cc khi nim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

OLED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Mn hnh OLED. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Mn hnh OLED SSD1306 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

Giao tip I2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38


Hin th mn hnh OLED vi ESP8266. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

ESP8266 WiFi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43

Ch WiFi Station . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Kin thc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

Kt ni vo mng WiFi ni b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

S dng WiFiMulti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

HTTP Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

Giao thc HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

ng dng xem gi Bitcoin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Ch WiFi Access Point. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

ESP8266 hot ng ch Access Point . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Khi to mng WiFi s dng ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Web Server l g? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

HTML - Javascript - CSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

ng dng iu khin n LED thng qua Webserver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

ESP8266 Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

Kt hp WiFi AP v Web Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

Trao i d liu gia 2 ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Yu cu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Hng dn thc hin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

D n c cm bin DHT11 v gi v Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67

Thit k ng dng. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
Yu cu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

Phn tch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

Kin thc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

Thc hin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

Server Nodejs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

Code ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

Chun b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

ng dng m rng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Dng ESP8266 nh 1 Web Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

Cc ch cu hnh WiFi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

Smartconfig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Kin thc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Thc hin SmartConfig vi ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

WPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

WPS l g?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

Thc hin WPS vi ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

Wifi Manager. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Hot ng c bn WifiManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

Chun b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

M rng . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

MQTT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Publish, subscribe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

QoS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Retain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

LWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

MQTT Client. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

MQTT Lens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

MQTT.js . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

ESP8266 MQTT Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

MQTT Broker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

MOSCA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

Mt s MQTT Broker s dng cho sn phm thc t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

Websocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

u im . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Nhc im . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

S dng ESP8266 nh Websocket Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Yu cu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Chun b . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
on code Javascript to kt ni Web Socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Nhng file HTML cha on code JS vo ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Chng trnh hon chnh cho ESP8266 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

Kt qu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Video kt qu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

S dng ESP8266 nh Websocket Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Javascript Websocket Client trn trnh duyt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Node.js Websocket Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

ESP8266 Websocket Client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

Tng kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

Firmware update over the air (FOTA). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

Cp nht firmware t xa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

Bo mt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129

An ton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Yu cu cn bn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

Update process - memory view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

OTA s dng Arduino IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Bc 1: np firmware h tr OTA thng qua cng Serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

Bc 2: La chn cng np thng qua OTA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

Bc 3: Sa firmware mi v np li thng qua WiFi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135

S dng mt khu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Nhng s c thng gp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Cp nht Firmware dng Web Browser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

Thc hin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138


Bo mt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

HTTP Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

ESP8266 ESPhttpUpdate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

Node.js OTA Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Cheatsheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

Arduino - ESP8266 Cheatsheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

C - Cheatsheet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

Li kt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Cc thnh vin tham gia ng gp. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Li kt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

Giy php s dng ti liu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155


Internet Of Things (IoT) cho ngi mi bt u 1/155

Li m u
Internet Of Things (IoT) Internet vn vt dng nh ang ng trc mt bc ngot i n
giai on tip theo cho mt th gii hin i, vn minh. l vin cnh m mi vt u c th kt ni
vi nhau thng qua Internet khng dy. Cc doanh nghip ang c xu hng ng dng sn phm
cng ngh IoT vo sn xut ngy cng nhiu bi th trng sng to tim nng v chi ph sn xut
ngy cng thp.

Chng kin s pht trin nh v bo ca cc sn phm ng dng cng ngh IoT v th trng cng
ngh Start up tim nng ang ngy cng si ng hn bao gi ht, quyn sch ny cung cp cc
ni dung v IoT vi trit l Khng ch l thc t khng ri rc, hng n nhng ngi tr tui ,
ang v mun tp trung nng lc ca mnh cho khng gian Internet Of Things. Mong mun cho ra i
nhng sn phm c o, sng to, ngy cng hon thin v ng b c th p ng nhu cu
ca cuc sng.

Ni dung c thit k mt cch c bn gip hc vin c ci nhn tng quan v vic xy dng h
thng, sn xut thit b v d dng tham gia vo lnh vc IoT mi m.

i li v tc gi

Ch bin ca cun sch l ng Phm Minh Tun(TuanPM), c nhiu nm kinh nghim lm vic trong
mng IoT v pht trin cc th vin m ngun m cho cng ng. Tc gi xy dng cun sch ny
vi mc ch ng gp 1 phn nh nhng kin thc ca mnh vo s pht trin ca ngnh cng
nghip vn cn mi m nhng rt tim nng ny.

Thut ng hay s dng

IoT - Internet Of Things hay internet vn vt.

ESP8266 - Chip x l tch hp thu pht WiFi.

Git - Trnh qun l phin bn.

Github - Mng x hi dnh cho lp trnh vin.

IDE - Vit tt ca Integrated Development Enviroment - mi trng pht trin tch hp.

Compiler - Trnh bin dch.

Logic Level - Mc in p chip hiu c (1 hay 0).


2/155

Gii thch code trong bi

void setup()
{
//comment
int a = 1;
a ++;
}

Dng ny gii thch y l comment (ch thch).

Dng ny gii thch bin a tng thm 1 n v.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 3/155

Gii thiu ni dung


Ni dung quyn sch ny bao gm cc hng dn chi tit cho ngi c lp trnh ng dng IoT s
dng Chip WiFi ph bin hin ny l ESP8266 kt ni vi Server, gi, nhn d liu v thc thi cc
lnh t Server. Internet Of Things da v cc kt ni Internet kh nhiu, do vy cc ni dung cng
tp trung nhiu vo cc giao thc (prototcol), cc phng php qun l cng nh cu hnh kt ni.

Phn cng s dng chnh l System On Chip (SoC) ESP8266 - c kh nng kt ni WiFi v lp trnh
c vi gi thnh r v ph bin trn th gii. Board mch s dng l board phn cng m. IoT WiFi
Uno c s chn tng thch vi cc board Arduino Uno.

Phn mm s dng lp trn my tnh cho Chip ESP8266 l Arduino, ngn ng lp trnh C/C++.

Cc phn lin quan n Server chy trn my tnh s dng NodeJS vi ngn ng lp trnh
Javascript.

Ngoi ra, bn s cn tm hiu mt s cng c v khi nim thng xuyn c s dng trong quyn
sch ny nh sau:

Git - Trnh qun l phin bn s dng rt rng ri trn th gii, Github l mt mng x hi cho
lp trnh vin da trn Git. Git gip bn qun l c m ngun, lm vic nhm, x l cc thao
tc hp nht, lch s m ngun C th trong qu trnh lm vic vi quyn sch ny, bn s
cn s dng cc th vin m ngun m cho Arduino t Github, nn vic ci t v s dng cng
c kh cn thit cho vic . Cha k, n s gip bn qun l m ngun v d n ngy cng
chuyn nghip hn.

Sublime Text - L mt trnh son tho ph bin, nhanh, nh v nhiu tnh nng hay. S dng
lp trnh. Javascript (NodeJS)

Code formater - Dng nh dng m ngun ph hp, d c, d sa cha.

Editorconfig - L mt cng c cng thm vo cho cc Editor, gip vic ng b ha cc tiu


chun nh Indent, Align, Space m bo code khi c m cc Editor khng b thay i.

Tuy phn cng chnh thc s dng l board mch phn cng m IoT WiFi Uno,

nhng bn hon ton c th s dng bt k board ESP8266 no khc trn th


trng cho cun sch ny, v d nh: NODEMCU, Wemos,

Cc ni dung trong quyn sch ny tp trung vo hng dn cc giao thc,

cch thc lm vic vi c h thng vi board ESP8266, Server , cn cc d n


mu, hng dn chi tit c th tm thm ti arduino.esp8266.vn.

Tt c cc phn Code u khng gii thch r chi tit API cho mi tnh nng. M
thay vo c cung cp ti ph lc Cheat Sheet (Arduino v C).
4/155

Ai c th s dng?

Cc lp trnh vin phn mm/Mobile App, Web App mun tham gia lm sn phm IoT.

Sinh vin mun nng cao k nng, b sung kin thc.

C nhn mun t mnh lm cc sn phm phc v cuc sng, phc v cng vic.

Startup Tech khng chuyn v phn cng hoc phn mm.

Mc tiu mang li cho ngi c

Gip cho ngi khng chuyn v phn cng tip cn lm sn phm IoT d dng.

C th t pht trin h thng tch hp cho sn phm IoT.

Hiu bit v quy trnh to ra sn phm phn cng, i vo mng sn xut thit b.

Trnh nhng sai st khng ng c khi pht trin v thit k sai h thng.

Chun b

t nht bn cn 1 board mch ESP8266 lp trnh c, tt nht nn s dng cc board mch


tng tch vi Arduino IDE ( c cc module np cho chip).

Nn c thm cc module khc nh cm bin, ng c thc hnh, mt b StarterKit l ph


hp.

1 my tnh c nhn (Windows, MacOS hoc Linux).

C & Arduino ESP8266 Cheatsheet (Mc lc cui quyn sch ny).

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 5/155

Kin thc c bn
Trong phn ny, chng ta s bt u bng vic tm hiu tng quan v h thng IoT, tng quan v
dng chip ESP8266, ri n vic ci t cng c pht trin Arduino trn my tnh ca bn. Tip n
l vic bin dch cc d n mu, la chn trnh th vin, trnh son tho s lm vic. Kt thc chng
ny chng ta s c c ci nhn tng qut v h thng IoT, lm th no v s dng cng c g
lp trnh ng dng vi ESP8266.

im qua phn ny nh sau:

IoT v ng dng thc t.

Tm hiu v chip WiFi ESP8266.

Arduino IDE v s dng Arduino vi ESP8266.

Starter Kit b cng c khi ng vic hc lp trnh IoT.

Node.js - Javascript ngn ng lp trnh Server Side.

Ci t tt c cc cng c.

Vi nhng ai tng hiu r ESP8266, tng lm v h thng IoT, chuyn nghip trong lp trnh
C/C++ c th b qua chng ny.
6/155

Internet Of Things (IoT)

Internet of Things (IoT) l g?

Internet of Things (IoT) - Mng li vn vt kt ni Internet l mt kch bn


ca th gii, khi m mi vt, con ngi c cung cp mt nh danh ca
ring mnh, v tt c c kh nng truyn ti, trao i thng tin, d liu qua
mt mng duy nht m khng cn n s tng tc trc tip gia ngi vi
ngi, hay ngi vi my tnh. IoT pht trin t s hi t ca cng ngh
khng dy, cng ngh vi c in t v Internet[1]. Ni n gin l mt tp
hp cc thit b c kh nng kt ni vi nhau, vi Internet v vi th gii bn
ngoi thc hin mt cng vic no . Link: vi.wikipedia.org/wiki/
Mang_lui_van_vt_kt_ni_Internet

Wikipedia

Internet of things (IoT) dng ch cc i tng c th c nhn bit cng nh ch s tn ti ca


chng trong mt kin trc tng ha mang tnh kt ni: Mng li vn vt kt ni Internet, hay gi n
gin hn l Things.

IoT c th l b cm ng c lp rp trong mt chic t lnh ghi li nhit , l mt tri tim c


cy ghp trong c th con ngi, Hiu n gin, IoT c th khin mi vt gi y c th giao tip vi
nhau d dng hn v u im ln nht ca Thng minh l kh nng phng nga v cnh bo ti
bt k u.

Cm t Internet of things c a ra bi Kevin Ashton vo nm 1999, tip sau n cng c dng


nhiu trong cc n phm n t cc hng v nh phn tch. H cho rng IoT l mt h thng phc
tp, bi n l mt lng ln cc ng lin kt gia my mc, thit b v dch v vi nhau. Ban u,
IoT khng mang ngha t ng v thng minh. V sau, ngi ta ngh n kh nng kt hp gia
hai khi nim IoT - Autonomous control li vi nhau. N c th quan st s thay i v phn hi vi
mi trng xung quanh, cng c th t iu khin bn thn m khng cn kt ni mng. Vic tch
hp tr thng minh vo IoT cn c th gip cc thit b, my mc, phn mm thu thp v phn tch
cc d liu in t ca con ngi khi chng ta tng tc vi chng. Xu hng tt yu trong tng lai,
con ngi c th giao tip vi my mc ch qua mng internet khng dy m khng cn thm bt c
hnh thc trung gian no khc.

Cu hi t ra l, iu g gip IoT thng minh v hiu con ngi? Ban u, ngi ta cho rng
Internet ca vn vt ch yu xoay quanh giao tip M2M (cc thit b kt ni vi nhau thng qua mt
thit b khc iu khin). Nhng khi hng n s thng minh ha, khng ch l giao tip gia
M2M na m cn phi cp n cc cm bin (sensor). V cng ng lm tng rng Sensor l

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 7/155

mt c my hot ng di s vn hnh ca cc thit b khc m thc cht, n tng t nh i mt


v i tai ca loi ngi vi s ghi nhn lin tc nhng o lng, nh lng, thu thp d liu t th
gii bn ngoi. Suy cho cng, Internet of things em n s kt ni gia my mc v cm bin, v
nh n d liu in ton m my m ha d liu. Nhng ng dng in ton m my l mt
xch quan trng gip cho Internet of things c th hot ng nh s phn tch, x l v s dng d
liu m cc cm bin thu thp c.

Tnh hnh trn th gii hin nay, tc ng ca IOT rt a dng v tch cc nhiu lnh vc: qun l h
tng, y t, xy dng v t ng ha, giao thng. John Chambers (CEO ca Cisco) cng b: Cho
n nm 2024 s c 500 t thit b c kt ni. Thc t, con s ny ln hn gn 100 ln s ngi
trn Tri t, iu cho thy vn vt nhiu hn con ngi rt nhiu. Chng ta u bit ng dng
IoT c th ni chuyn vi con ngi thng qua bn phm, thit b cng c thit k ngy cng
hon thin vi nhiu cm bin hn c th giao tip mt cch nhanh nht v chnh xc nht vi
con ngi, thu thp d liu n gin t mi ngi chng ta. Nhng quan trng nht, tuy giao tip vi
con ngi nhng ng dng IoT khng phi l con ngi.

Ngi ta cho rng, IoT l cha kha ca s thnh cng, l bc ngot v c hi ln ca tng lai.
khng b tt li pha sau, cc chnh ph v doanh nghip cn c s i mi v u t mnh tay hn
pht trin cc sn phm ng dng cng ngh Internet of things.

Cc hashtag: #IoT #InternetOfThings

H thng Internet of Things (IoT)

H thng IoT cho php ngi dng tin su hn vo vic t ng ha, phn tch, tch hp. Gip cho
vic ci thin tm nhn, tnh chnh xc, nng tm cc cng ngh v cm bin, kt ni, robot t
hiu qu cao nht.

Cc h thng IoT pht trin, khai thc cc tin b ca phn mm, gim gi thnh khi xy dng phn
cng v tn dng cc cng ngh hin i. Nhng ci tin ny lm thay i cch vn hnh ca qu
trnh sn xut sn phm, dch v, x hi, kinh t v nh hng n c chnh tr

Nhng im mu cht ca IoT

Nhng vn quan trng nht ca h thng IoT bao gm tr thng minh nhn to, kt ni, cm bin
v cc thit b nh nhng mang tnh c ng cao, chng c m t s lc nh bn di:

AI (Artifical Intelligence) - H thng IoT v c bn c hiu l lm cho mi thit b tr nn


thng minh, ngha l n gip nng cao mi kha cnh ca cuc sng bng nhng d liu thu
thp c, thng qua cc thut ton tnh ton nhn to v kt ni mng. Mt v d n gin nh
hp ng go ca bn, khi bit rng go sp ht, h thng t ng t mt n hng mi cho
nh cung cp.

Connectivity - L mt c trng c bn ca IoT, hin nay cc mng thit b ang tr nn ph


8/155

bin, nhiu mng thit b ngy cng nh hn, r hn v c pht trin ph hp vi thc t
cng nh nhu cu ca ngi dng .

Sensors - IoT s mt i s quan trng ca mnh nu khng c sensors. Cc cm bin hot


ng ging nh mt cng c gip IoT chuyn t mng li cc thit b th ng sang mng li
cc thit b tch cc, ng thi c th tng tc vi th gii thc.

Active Engagement Ngy nay, phn ln cc tng tc ca nhng cng ngh kt ni xy ra 1


cch th ng. IoT c cho l s em n nhng h thng mang tch tch cc v ni dung, sn
phm cng nh cc dch v gn kt.

Small Devices - Nh c d on t trc, cc thit b ngy cng c ti u vi mc ch


nng cao chnh xc, kh nng m rng cng nh tnh linh hot. N c thit k ngy cng
nh hn, r hn v mnh m hn theo thi gian.

IoT Nhng li ch mang li

Nhng li ch m IoT em li c dn tri hu ht n cc tt c cc lnh vc trong i sng, kinh


doanh Di y lit k ngn gn mt s tnh nng hu ch ca IoT:

Ci thin vic gn kt khch hng - H thng IoT gip phn tch cc im m hin ti, tm ra
nhng sai st v chnh xc. IoT thay i iu ny mang li nhiu s gn kt hn v hiu
qu hn vi ngi dng. Mt ng dng ti cc ca hng, dch v iBeacon gip tng s lng
sn phm ti ngi tiu dng bng cch ch dn ngi dng ti khu vc c th trong ca hng
v a ra cc gi v sn phm. Chng cung cp cc thng tin chi tit, cc nh gi v sn
phm, Bn cnh chng cng c kh nng cho php ngi dng chia s cc sn phm qua
mng x hi

Ti u ha cng ngh - gip nng cao tri nghim ca khch hng cng nh ci thin vic s
dng thit b v h tr ci tin cng ngh.

Gim s hao ph - IoT gip vic qun l ti nguyn cc lnh vc c ci thin 1 cch r rng.
Cc phn tch hin ti thng cung cp cho chng ta ci nhn kha cnh bn ngoi, trong khi
IoT cung cp cc d liu, thng tin thc t qun l ti nguyn mt cch hiu qu hn.

Tng cng vic thu thp d liu - Thng thng, vic thu thp d liu b hn ch do thit
k h thng mang tnh th ng. IoT ph v s rng buc, gii hn ca thit k v to ra 1 hnh
nh chnh xc ca tt c mi th.

IoT Nhng thch thc gp phi

Mc d IoT mang li kh nhiu li ch n tng, n cng gp phi nhng thch thc ng k. Di


y l 1 s vn chnh ca IoT :

Kim sot an ninh - IoT to ra 1 h sinh thi m cc thit b kt ni lin tc v giao tip vi
nhau qua mng li cc kt ni. Tuy nhin, h thng thng cha ch trng n cc bin php

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 9/155

an ninh nhm bo mt thng tin, dn n n c th gp phi cc cuc tn cng nhm ly cp


thng tin ca ngi dng.

Tnh bo mt - Do tnh bo mt cha cao cng vi bn cht ca IoT l khng cn nhiu s


tng tc ca con ngi nn cc k tn cng c th cung cp cc thng tin ngi dng gi
mo.

Tnh phc tp - Mt s h thng IoT c phc tp v thit k v trin khai ng dng cng
nh kh khn trong vic bo tr, nng cp h thng do s dng nhiu cng ngh cn kh mi
m.

Tnh linh hot - C nhiu s lo ngi khi cp n tnh linh hot ca h thng IoT khi tch hp
vi cc h thng khc bi cc h thng khi kt hp c th xy ra xung t v cc tnh nng s b
kha ln nhau.

Tun th cc tiu chun - Ging nh cc cng ngh khc trong lnh vc thng mi, IoT cng
phi tun th cc tiu chun, quy nh t ra trc . Tnh phc tp ca IoT lm cho vic
tun th cc tiu chun l mt th thch thc s

Hnh 1. Hnh minh ha


10/155

Hnh 2. S pht trin ca iot d on n nm 2020

Nhng ng dng thc t trong cuc sng

Nhng ng dng ca IoT vo cc lnh vc trong i sng l v cng phong ph v a dng. Chng ta
s cng im qua mt s ng dng in hnh mang li "ting tm" cho IoT:

Smart Home - Theo thng k, smart home l ng dng lin quan n IoT c tm kim nhiu
nht trn Google. Smart Home l 1 ngi nh vi rt nhiu tnh nng t ng nh bt my iu
khng kh khi bn sp v ti nh, tt n ngay khi bn ri khi nh, m kha khi ngi thn trong
gia nh ang ca nh, m garage khi bn li xe i lm v cn rt nhiu nhng tnh nng
gip nng cao cht lng cuc sng khi s dng smart home.

Vt dng mang theo trn ngi - C th k n mt s thit b nh Dashbon Mask, y l 1


chic smart headphone gip bn va c th nghe nhc vi m thanh c trung thc cao va
c th xem phim HD vi my chiu o , hoc AMPL SmartBag ba l c pin d phng c th sc
in cho cc thit b di ng, k c my tnh.

Connected cars - Gip nng cao nhng tri nghim cho ngi dng xe t, 1 chic Connected
car c th ti u cc hot ng ca n nh thng bo khi ht nhin liu, a ra cc cnh bo
khi c vt ti gn hoc mi y nht l xe in t li ca hng Tesla

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 11/155

ESP8266
ESP8266 l dng chip tch hp Wi-Fi 2.4Ghz c th lp trnh c, r tin c sn xut bi mt cng
ty bn dn Trung Quc: Espressif Systems.

c pht hnh u tin vo thng 8 nm 2014, ng gi a ra th trng dng M dun ESP-01, c


sn xut bi bn th 3: AI-Thinker. C kh nng kt ni Internet qua mng Wi-Fi mt cch nhanh
chng v s dng rt t linh kin i km. Vi gi c c th ni l rt r so vi tnh nng v kh nng
ESP8266 c th lm c.

ESP8266 c mt cng ng cc nh pht trin trn th gii rt ln, cung cp nhiu Module lp trnh
m ngun m gip nhiu ngi c th tip cn v xy dng ng dng rt nhanh.

Hin nay tt c cc dng chip ESP8266 trn th trng u mang nhn ESP8266EX, l phin bn
nng cp ca ESP8266

S chn
26 GPIO1 SPI_CS1 U0TXD
25 GPIO3 U0RXD

LU :
32 EXT_RSTT
31 RES12K

27 XTALO
29 VDDD
30 VDDA

28 XTALI

Dng trn mi chn 6mA,ln nht 12mA


Cho ch ng ni tt GPIO16 v
EXT_RSTB. wakeup, GPIO16 s xut mc
THP khi ng li h thng
Khi khi ng/khi ng li/weakup, gi GPIO15 THP
v GPIO2 CAO.
VDDA 1
23 GPIO8 SDIO
LNA 2 DATA1 SPI_MOSI U1RXD

22 GPIO7 SDIO
VDD3P3 3 DATA0 SPI_MISO

VDD3P3 4 21 GPIO6 SDIO SPI_CLK


CLK

20 GPIO11 SDIO
VDD_RTC 5 CMD
SPI_CS0

19 GPIO10 SDIO
TOUT ADC 6 DATA3 SPIWP HSPIWP
18 GPIO9 SDIO
CHIP_EN CHIP_EN 7 DATA2 SPIHD HSPIHD
TOUT GPIO16 8 17 VDDPST

SP. FUNCTION(S)
COMM. INTERFACE
GPIO12 10
MTMS GPIO14 19

SPI_CS2 GPIO0 15

GPIO4 16
U0RTSHSPI_CS MTDO GPIO15 13
MTCK GPIO13 12

U1TXD GPIO2 14
VDPST11

PIN NUMBER
PWM
MTDI

POWER
I/O
MISO
HSPI

MOSI
HSPI

HSPI
CLK

ADC
CONTROL
U0CTS

N/C

Hnh 3. S chn ESP8266EX


12/155

Thng s phn cng

32-bit RISC CPU : Tensilica Xtensa LX106 chy xung nhp 80 MHz

H tr Flash ngoi t 512KiB n 4MiB

64KBytes RAM thc thi lnh

96KBytes RAM d liu

64KBytes boot ROM

Chun wifi EEE 802.11 b/g/n, Wi-Fi 2.4 GHz

Tch hp TR switch, balun, LNA, khuch i cng sut v matching network

H tr WEP, WPA/WPA2, Open network

Tch hp giao thc TCP/IP

H tr nhiu loi anten

16 chn GPIO

H tr SDIO 2.0, UART, SPI, IC, PWM,IS vi DMA

1 ADC 10-bit

Di nhit hot ng rng : -40C ~ 125C

Hnh 4. Mt module tch hp ph bin (Module ESP12E)

SDK h tr chnh thc t hng

Espressif hin h tr 3 nn tng SDK (Software Development Kit - Gi pht trin phn mm) c
lp, l: NONOS SDK, RTOS SDK v Arduino. C 3 u c nhng u im ring ph hp vi tng ng
dng nht nh, v s dng chung nhiu cc hm iu khin phn cng. Hin nay Arduino ang
c s dng rng ri bi tnh d s dng, kin trc phn mm tt v tn dng c nhiu th vin

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 13/155

cng ng

ESP8266 NONOS SDK

Hin nay, NONOS SDK phin bn t 2.0.0 tr ln n nh v cung cp gn nh l y tt c


cc tnh nng m ESP8266 c th thc hin:

Cc API cho Timer, System, Wifi, c ghi SPI Flash, Sleep v cc Module phn cng: GPIO, SPI, IC,
PWM, IS vi DMA.

Smartconfig: H tr cu hnh thng s Wi-Fi cho ESP8266 nhanh chng.

Sniffer API: Bt cc gi tin trong mng khng dy 2.4Ghz.

SNTP API: ng b thi gian vi My ch thi gian.

WPA2 Enterprise API: Cung cp vic qun l kt ni Wi-Fi bng ti khon s dng cc my ch
RADIUS.

TCP/UDP API: Cho kt ni internet v h tr cc Module da trn cc giao thc nh: HTTP, MQTT,
CoAP.

mDNS API: Gip tm ra IP ca thit b trong mng ni b bng tn (hostname).

MESH API: Lin kt cc module ESP8266 vi cu trc mng MESH

FOTA API: Firmware Over The Air - cp nht firmware t xa cho thit b .

ESP-Now API: S dng cc gi tin Wireless 2.4GHz trao i trc tip vi ESP8266 khc m khng
cn kt ni ti Access Point.

Simple Pair API: Thit lp kt ni bo mt gia 2 thit b t ng.

ESP8266 RTOS SDK

RTOS SDK s dng FreeRTOS lm nn tng, ng thi hu ht cc API ca NON OS SDK u c th


s dng vi RTOS SDK.

ESP8285

ESP8285 l mt phin bn khc sau ny ca ESP8266EX, ging hon ton ESP8266EX ngoi tr vic
thay v dng SPI FLASH bn ngoi th ESP8285 tch hp 1MiB Flash bn trong gip gim din tch phn
cng v n gin ha qu trnh sn xut.
14/155

Module v Board mch pht trin

ESP8266 cn t nht thm 7 linh kin na mi c th hot ng, trong phn kh nht l Antena.
i hi phi c sn xut, kim tra vi cc thit b hin i. Do , trn th trng xut hin nhiu
Module v Board mch pht trin m ng ht ngi dng n gin nht trong vic pht trin
ng dng. Mt s Module v Board pht trin ph bin:

Bng 1. Mt s module ESP8266 trn th trng

Tn S chn Pitch LEDs Antenna Shielded Dimensions


ESP-01 6 0.1" Yes PCB No 14.3 24.8
ESP-02 6 0.1" No U-FL No 14.2 14.2
ESP-03 10 2mm No Ceramic No 17.3 12.1
ESP-04 10 2mm No None No 14.7 12.1
ESP-05 3 0.1" No U-FL No 14.2 14.2
ESP-06 11 misc No None Yes 14.2 14.7
ESP-07 14 2mm Yes Ceramic+U- Yes 20.0 16.0
FL
ESP-08 10 2mm No None Yes 17.0 16.0
ESP-09 10 misc No None No 10.0 10.0
ESP-10 3 2mm No None No 14.2 10.0
ESP-11 6 0.05" No Ceramic No 17.3 12.1
ESP-12 14 2mm Yes PCB Yes 24.0 16.0
ESP-12E 20 2mm Yes PCB Yes 24.0 16.0
ESP-12F 20 2mm Yes PCB Yes 24.0 16.0
ESP-13 16 1.5mm No PCB Yes 18.0 x 20.0
ESP-14 22 2mm No PCB Yes 24.3 x 16.2

Board mch pht trin ESP8266

Module ESP8266 ch bao gm Chip ESP8266 v cc linh kin gip chip c th hot ng c, tuy
nhin, trong qu trnh pht trin sn phm, chng ta cn phi np chng trnh cho chip trc khi
a vo hot ng thc t. Qu trnh ny l qu trnh gi d liu Binary ( bin dch trn my tnh)
xung b nh Flash ca ESP8266. a ESP8266 vo ch Np (Program) th cn phi t mc
logic 0 (0V - GND) vo chn GPIO0, ng thi RESET chip. Ri sau c th dng cc cng c np
gi Firmware t my tnh xung.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 15/155

Hnh 5. Mt mch np t ng s dng chip USB CDC

Hin nay cc Board mch pht trin u tch hp cc mch np t ng, ngha l phn mm s t
ng iu chnh cc chn DTR v RTS ca chip USB CDC, a ESP8266 vo ch np, sau s gi
firmware xung. Arduino IDE cng vy, n s iu chnh da trn vic khai bo Board mch s dng.

Nu bn l ngi mi bt u v cha r v phn cng, th tt nht nn s dng


mt Board mch pht trin sn c cc ch np t ng. Khi bn chuyn

sang sn xut phn cng cho cc ng dng c th, th c th tch ri phn np


t ng ny ra tit gim chi ph. Cc mch in ny u c cng b rng
ri.
16/155

Arduino l g?

Hnh 6. Board mch Arduino

Arduino l mt IDE tch hp sn editor, compiler, programmer v i km vi n l cc firmware c


bootloader, cc b th vin c xy dng sn v d dng tch hp. Ngn ng s dng l C/C++. Tt
c u opensource v c ng gp, pht trin hng ngy bi cng ng. Trit l thit k v s
dng ca Arduino gip cho ngi mi, khng chuyn rt d tip cn, cc cng ty, hardware d dng
tch hp. Tuy nhin, vi trnh bin dch C/C++ v cc th vin cht lng c xy dng bn di th
mc ph bin ngy cng tng v hiu nng th khng h thua km cc trnh bin dch chuyn
nghip cho chip khc.

i din cho Arduino ban u l chip AVR, nhng sau ny c rt nhiu nh sn xut s dng cc
chip khc nhau nh ARM, PIC, STM32 gn y nht l ESP8266, ESP32, v RISCV vi nng lc phn
cng v phn mm i km mnh m hn nhiu.

Mt s c im ca Arduino

Arduino che du i s phc tp ca in t bng cc khi nim n gin, che i s phc tp


ca phn mm bng cc th tc ngn gn. Vic setup output cho 1 MCU bng cch setup
thanh ghi r rng phc tp n ngi chuyn cng phi lt datasheet ra xem, nhng vi
Arduino th ch cn gi 1 hm.

Bi v tnh ph bin v d dng, vi cc th vin c tch hp sn. Bn ch cn quan tm n


tnh nng sn phm m b qua cc tiu tit (protocol, datasheet ) Nn gip cc newbie khng
chuyn d dng tip cn v lm ra cc sn phm tuyt vi m khng cn phi bit nhiu v
in t.

Chnh v khng quan tm nhiu n cch thc hot ng ca cc Module i km, nn a phn
ngi dng s kh x l c khi c cc vn pht sinh ngoi tm ca th vin.

Cc module prototype lm sn cho Arduino c bn khng cao, mc tiu n gin ha qu


trnh lm sn phm.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 17/155

Cc li ch khi s dng Arduino

Thit k IDE tt, c th d dng tch hp nhiu loi compiler, nhiu loi hardware m khng h
gim hiu nng. V d: Arduino gc cho AVR, nhng c nhiu phin bn cho STM32, PIC32,
ESP8266, ESP32 tn dng ti a cc th vin sn c.

Cc th vin c vit da trn lp API trn cng, nn a s cc th vin cho Arduino c th


dng c cho tt c cc chip. in hnh l Arduino cho ESP8266 c th tn dng trn 90% cc
th vin cho Arduino khc

Trnh bin dch cho Arudino l C/C++, bn c bit l khi bin dch ESP8266 non-os SDK v
ESP8266 Arduino cng dng chung trnh bin dch? Vy th hiu nng khng h thua km

Cch t chc cc th vin C/C++ theo dng OOP gip phn lp, k tha v qun l cc k tt
cho cc ng dng ln .Cc MCU ngy cng mnh m v ng dng cho n s ngy cng ln.
Cc m hnh qun l code n gin trc y (thun C) s kh.

Cc project cho Arduino u opensource, bn d dng ly n v a vo sn phm production


vi cht lng tt v hc hi c nhiu t cch thc thit k chng trnh ca cc bc thy.

Arduino ch trng tnh a nn tng, module ha cao, ph hp vi cc ng dng t phc tp ti


cc k phc tp. Cc ng dng kiu ny rt ph bin trong thc t. Nu bn khng dng C++,
hoc arduino m gp vn v overcontrol th nn th qua Arduino.

Bn s tit kim c rt rt nhiu thi gian cho vic tp trung vo tnh nng sn phm y.
Thi bui ny, thi gian l tin v c qu nhiu th hc, lm th nn u tin ng ch.

Cng ng Arduino trn th gii

Arduino chnh thc(IDE & AVR/ARM/x86 Board) www.arduino.cc

Arduino cho ESP8266 github.com/esp8266/Arduino

Arduino cho ESP32 github.com/espressif/arduino-esp32

Arduino cho PIC32 chipkit.net/

Arduino cho STM32 www.stm32duino.com/

*Cc d n Arduino www.hackster.io/arduino

Arduino cho ESP8266 & board mch ESP8266 WiFi


Uno

Board mch ESP8266 WiFi Uno l mt d n m ngun m gip h tr mi trng pht trin Arduino
cho ESP8266. Gip bn c th vit 1 Sketch s dng cc th vin v hm tng t ca Arduino, c th
18/155

chy trc tip trn ESP8266 m khng cn bt k vi iu khin no khc.

ESP8266 Arduino core i km vi th vin kt ni WiFi h tr TCP, UDP v cc ng dng HTTP, mDNS,
SSDP, DNS Servers. Ngoi ra cn c th thc hin cp nht OTA, s dng Filesystem dng b nh
Flash hay th SD, iu khin servos, ngoi vi SPI, I2C.

Link: github.com/iotmakervn/iot-wifi-uno-hw

Hnh 7. PINOUT

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 19/155

Node.js
Node.js l mt Javascript Run time Cross Platform (chy a h iu hnh) c xy dng da trn
m ngun m Googles V8 JavaScript engine cho Chrome (Browser). Node.js cho php cc lp trnh
vin c th xy dng ng dng Server Side, truy cp vo ti nguyn h thng v thc hin c
phn ln cc tc v h iu hnh c th thc hin bng ngn ng Javascript, hoc lin kt C++.

Hin nay trn th gii c nhiu cng ty ng dng Node.js xy dng cc h thng production ln,
nh Paypal, hoc cc microservice da trn Node.js cng c trin khai a s cc hng hng u
v cng ngh.

Nn tng Cloud ca gn nh tt c cc nh pht trin ln hin nay u h tr thc thi Node.js, in


hnh nh Amazon Lambda, Google Script, IBM Blumix, Microsoft Azure

Ngn ng lp trnh Javascript c ci tin lin tc, hin nay l Ecmascript 6 (ES5, ES2015) v ang
c ci tin rt nhanh, vi nhiu u im nh d hc, xc tch, OOP

Mt l do Node.js c a chung na l a phn cc lp trnh vin vit Web, Mobile u bit, v gi


y, nh Node.js m h c th trin khai cc ng dng Server Side bng Javascript, m khng cn
dng ngn ng no khc (nh trc kia phi cn Java, PHP )

L do s dng Node.js trong cun sch ny

Mt h thng Internet Of Things y kh phc tp, bao gm thit b, Server x l kt ni, Server d
liu (Database), cc h thng cn bng ti, cc h thng phn thch, bo co d liu, tr tu nhn to.
M hnh v d ca Google IoT Core

Hnh 8. Google IoT Core Diagram

Server l mt thnh phn khng th thiu trong h thng IoT. Vi nhiu u im ca Node.js th n
rt ph hp trong vic pht trin cc Server cho IoT trong tng lai. Ngoi ra, Node.js c cng
ng h tr rt nhiu, v khng kh tm thy 1 package cn thit, tit kim rt nhiu thi gian pht
trin ng dng.
20/155

Cun sch ny c hng dn Node.js ?

Khng, nhng bn ng vi tht vng, cc ng dng Node.js s dng thc hin cc bi tp trong
cun sch ny kh n gin v t m ngun, cho bn vn hiu d cho trc y cha bao gi lp
trnh vi Node.js.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 21/155

Sublime Text
Nu phn Chip, lp trnh cho ESP8266 bn c Arduino IDE, bao gm c trnh son tho. Nhng
vi Node.js th bn cn 1 trnh son tho khc. Ngoi Sublime Text, bn c th la chn cc trnh
son tho ph bin hin nay nh Atom, Visual Code, nhng ng di s dng Nodepad, mc d l
vn c.

Sublime Text l mt trnh son tho c nhiu lp trnh vin u thch hng u hin nay, bi nhiu
l do, trong tc l quan trng nht. N thc s nhanh, nhanh gn nh l s 1 trong s cc trnh
son tho hin nay. Ngoi ra n min ph (lu lu nhc mua, khung thoi m nhiu lp trnh vin bo
thiu th bun).

Hnh 9. Sublime Text


22/155

Ci t v chun b

Arduino IDE

Bc 1: Ci t Arduino IDE.

Download v ci t arduino t trang ch ca arduino. Link donwload: www.arduino.cc/en/Main/


Software.

Ty h iu hnh m chn gi ci t thch hp.

Bc 2: Ci t b cng c, trnh bin dch, SDK h tr chip ESP8266 trong Arudino IDE.

Vi b cng c ny, chng ta c th d dng lp trnh, bin dch v s dng cc th vin dnh cho
ESP8266 trc tip trn Arduino IDE. M Arduino IDE, trn thanh Menu chn File Preferecens, trong
tab settings chn cc ty chn nh hnh di:

Hnh 10. Thm file thng tin board ESP8266

Sketchbook location l ng dn m bn mun lu Sketch (file chng trnh), trn cc h iu hnh


Unix liked ng dn mc nh l: /home/name_your_computer/Arduino. y cng s l v tr lu
nhng th vin m chng ta s thm vo sau ny.

Mc Additional Board Manager URLs field nhp ng dn


http://arduino.esp8266.com/stable/package_esp8266com_index.json.

Bc 3: Ci t board ESP8266.

M Boards Manager mc Tools trn thanh menu-bar tm board cn s dng vi keyword Generic

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 23/155

8266 chn board cn ci t nh hnh v nhn vo install.

Hnh 11. Ci t board ESP8266

Ci t th vin Arduino

Mt s th vin do cc nh pht trin khc cng b v c t do s dng c th ci t trc tip


bng cng c Library Manager ca Arduino.

Khi ng arduino IDE v chn mc Sketch include library Manage libraries:

Hnh 12. Khi ng Library Manager

Trong mc libbrary manager nhp ni dung th vin cn tm ti hp thoi text box, chn phin bn,
ri nhn install, Nhng th vin c ci t s c text hin th INSTALLED u mi th vin. V
d tm th vin OLED lin quan n ESP8266:
24/155

Hnh 13. Ci t th vin

USB CDC driver.

Board ESP8266 WiFi Uno c kt ni vi my tnh qua cng USB MicroB v s dng chip CH340
chuyn i USB sang UART. V vy cn ci USB driver my tnh v board c th giao tip vi nhau.

Thc hin kt ni cable USB vi board, m bm n LED khoanh trn sng nh hnh di:

Hnh 14. Connect USB

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 25/155

Windows & Linux

Ti bn ci t USB driver cho Windows www.wch.cn/download/CH341SER_ZIP.html v cho Linux


www.wch.cn/download/CH341PAR_LINUX_ZIP.html Lm theo cc yu cu ci t. Sau khi ci t, kt
qu hin th trn Arduino nh hnh:

Hnh 15. Kt ni thnh cng

Mac OS

Ti bn ci t: arduino.esp8266.vn/_static/download/CH34x_Install_V1.3.pkg

i vi Mac OS Sierra tr v sau nu gp vn b RESET my th x l nh sau:

M ng dng "Terminal" cmd + space - Enter Terminal

Xa driver: sudo rm -rf /System/Library/Extensions/usb.kext

Vi mt s my, bn phi thc thi thm sudo rm -rf /Library/Extensions/usbserial.kext

Nu khng th thc hin c lnh trn, bn cn phi thay i Security and Privacy trong phn
System Preference. Chn Allow Apps Downloaded From t Mac App Store and Identified
Developers sang Anywhere - V ti CH34x_Install_V1.3.pkg v ci t li.
26/155

Hnh 16. La chn Allow Apps Downloaded From Anywhere

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Sau khi kt ni v ci t xong, s xut hin cng COM o trn my tnh (Ty tng loi h iu hnh
m c nhng tn cng nh: COM1, COM2 i vi Windows, /dev/tty.wchusbserial1420 trn Mac OS,
/dev/ttyUSB0 trn Linux) M Arduino IDE v la chn (tham kho cu hnh kt ni nh hnh di):

Hnh 17. Cu hnh Board ESP8266 WiFi Uno

Board: Generic ESP8266 Module.

Flash Size: 4M (3M SPIFFS).

Port: chn cng khi gn thit b vo s thy xut hin.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 27/155

Upload speed: Chn cao nht, nu np khng c chn thp dn.

Np chng trnh xung board dng Arduino IDE

Trn giao din Arduino c 2 nt, ngoi cng bn tri l nt Verify, bin dch chng trnh, tng
ng vi Sketch > Verify/Compile, nt tip theo l Upload, tng ng Sketch > Upload. Khi la
chn board ph hp, chng trnh khng c li, th nhn Upload s np chng trnh vo board v
thc thi sau .

Hnh 18. Np chng trnh

Xut firmware binary trong Arduino IDE

Vi bt k tnh hung no cn file Binary, bn c th c xut ra bng cch Sketch > Export
compiled Binary, v file .bin s nm trong th mc ca Sketch.
28/155

Hnh 19. Xut file Binary

Serial Terminal

C nhiu ng dng min ph tng tc vi cng Serial trn my tnh:

Windows: PuTTY, realterm

Linux: minicom, screen

MacOS: minicom, screen

S dng Arduino IDE Serial Monitor

Arduino c tch hp sn Serial Monitor, khi chn ng cng Serial, th c th nhn biu tng Serial
trn IDE m:

Hnh 20. Arduino IDE Serial Monitor

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 29/155

Node.js

Ti v ci t Node.js ti: nodejs.org/en/download/

Sublime Text

Ti v ci t ti: www.sublimetext.com/

Git

Mt cng c h tr khc bn cng nn ci t v tp s dng, n khng gip bn tr thnh 1 lp trnh


vin, nhng n gip 1 lp trnh vin tr nn chuyn nghip v lm vic hiu qu: git-scm.com/
30/155

Tng kt
Ti lc ny, bn c th c ci nhn tng quan v h sinh thi, cng c v phng thc lm vic vi
ESP8266 cng nh tng quan v h thng IoT. ng thi c th bt u vic pht trin ng dng
cho ESP8266 ngay lp tc. Cc cng c c la chn u l a nn tng, d dng c s dng
cho cc h iu hnh Mac OS, Windows, hay Linux

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 31/155

Hello World
Bt k mt chng trnh hc no cng cn nn bt u mt cch t t. Bi v thi im ny chng ta
u mi bt u, nhiu khi nim, kin thc v lnh mc ny gn nh khng c nhiu. Helloworld gip
cc bn c th nm c cc kin thc c bn, lm sao bin dch, np c chng trnh. Lm
sao s dng cc th vin cng cng. Cng nh nm c mt s kin thc v kin trc chng
trnh Arduino.
32/155

Chp tt bng LED

Kin thc

n LED vit tt (Light Emitting Diodes) - l bng bn dn c th pht sng vi mu sc khc nhau
ty thuc vo cht liu bn dn. iu khin c bng LED cn cung cp mc in p chnh lch
gia cc m v cc dng ca bng LED cao hn mc in p Vf (datasheet), thng l 3.2v, v dng
in nh hn mc chu ng ca n, thng l 15mA.

Anode Cathode

Hnh 21. K hiu LED trn mch in (Cathode+, Anode-)

Hnh 22. Mch c th chy c nh sau

Arduino IDE

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 33/155

Hnh 23. Arduini IDE

Bin dch chng trnh (kim tra c li hay khng).

Bin dch v np chng trnh.

Tab tn file.

Khu vc ni dung file ino.

u ni

Hnh 24. Mch ESP8266 WiFi Uno c u ni sn LED vo Pin 16, v nt nht vo Pin 0

Vi m ngun bn di, sau khi kim tra chng trnh, bn cn chc chn Chn Board ESP8266
WiFi Uno trong Arduino IDE v Np chng trnh xung board dng Arduino IDE
34/155

M ngun chp tt dng Delay

int pin_led = 16;


/* hm ny c gi 1 ln duy nht khi khi ng */
void setup() {

pinMode(pin_led, OUTPUT); // cu hnh pin 16 l ng ra


}

/* hm loop s c gi lin tc */
void loop() {
digitalWrite(pin_led, HIGH); // tt LED (HIGH - c ngha l mc cao)
delay(1000); // ch 1 giy
digitalWrite(pin_led, LOW); // bt LED bi mc in p LOW
delay(1000); // ch 1 giy
}

M ngun chp tt dng nh thi

int ledPin = 16;


int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup() {
pinMode(ledPin, OUTPUT);
}

void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH; // i trng thi
else
ledState = LOW; // i trng thi
digitalWrite(ledPin, ledState);
}
}

Digital IO

Tn Pin trong Arduino (Pin number) ging vi th t chn ca ESP8266. pinMode, digitalRead, v
digitalWrite u s dng Pin Number nh nhau, v d nh c GPIO2, gi hm digitalRead(2).

Cc chn GPIO0 n GPIO15 c th l INPUT, OUTPUT, hay INPUT_PULLUP. Chn GPIO16 c th l


INPUT, OUTPUT hay INPUT_PULLDOWN_16. Khi khi ng, tt c cc chn s c cu hnh l INPUT.

Mi chn c th phc v cho mt tnh nng no , v d Serial, I2C, SPI. V tnh nng s c cu
hnh ng khi s dng th vin.

GPIO6 v GPIO11 khng c th hin bi v n c s dng cho vic kt ni vi Flash. Vic s dng 2

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 35/155

chn ny c th gy li chng trnh.

Mt s board v module khc (v d ESP-12ED, NodeMCU 1.0) khng c GPIO9 v

GPIO11, h s dng vi ch DIO cho Flash, trong khi ESP12 chng ta ni bn


trn s dng ch QIO

Ngt GPIO h tr thng qua cc hm attachInterrupt, detachInterrupt Ngt GPIO c th gn cho bt


k GPIO no, ngoi tr GPIO16 v u h tr cc ngt tiu chun ca Arduino nh: CHANGE, RISING,
FALLING.

Tng kt

Cc ng dng m rng

Fading LED (sng dn hay tt dn)

Chp tt LED dng Ticker == Nt nhn

Kin thc

Nt nhn s gip vic ESP8266 khi ng mt hnh ng no khi cn thit. Trong nhiu ng dng
chng ta hu nh u cn nhng kch hot t bn ngoi. Xuyn sut cun sch ny, s dng nt
nhn kch hot chy cc ng dng mu cng nh n LED thng bo cc trng thi. Trong
phn ny, nhn nt n LED s chuyn trng thi (t sng tt v ngc li).

y l v d n gin, trong thc t vic x l nt nhn kh phin phc. Bi v nt nhn vt l khi c


nhn s to ra hng lot cc xung ln xung (nhiu, bouncing). Thng th ch cn m bo mc
Logic ca chn o c c gi n nh trong khong 100 mili giy l c xem n nh.

Ngoi cch dng ngt xc nh nt nhn c c nhn hay khng - cch ny s tit kim ti
nguyn tnh ton ca CPU, n ch c gi khi c s kin xy ra, th cn mt cch na l hi vng:
Cch ny i hi CPU lin tc kim tra xem mc Logic ca nt nhn. ng thi vic p ng cng
khng nhanh bng s dng ngt.
36/155

Yu cu: Nhn nt (GPIO0) th chp tt n LED (GPIO6) v in ra cng Serial

Mch ESP8266 WiFi Uno u sn nt nhn vo GPIO0

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

M ngun dng hi vng

int ledPin = 16; // LED ni vo chn 16


int btnPin = 0; // Nt nhn ni vo chn 0
int ledState = LOW;

void blink()
{
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState); //o trng thi LED & in ra serial
Serial.println("Pressed, value=" + String(ledState));
}

bool isPressed()
{
return (digitalRead(btnPin) == 0);
}
void setup()
{
pinMode(ledPin, OUTPUT); // Cu hnh LED l ng ra
pinMode(btnPin, INPUT_PULLUP); // Cu hnh nt nhn l ng vo pull-up

Serial.begin(115200);
}

void loop()
{
if (isPressed()) {
blink();
}
}

M ngun dng ngt

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 37/155

int ledPin = 16; // LED ni vo chn 16


int btnPin = 0; // Nt nhn ni vo chn 0
int ledState = LOW;

void blink()
{
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(ledPin, ledState);
Serial.println("Pressed, value=" + String(ledState));
}
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
pinMode(btnPin, INPUT_PULLUP); // Cu hnh nt nhn l ng vo pull-up
attachInterrupt(btnPin, blink, FALLING); //ci t ngt cho chn LED
Serial.begin(115200);
}

void loop()
{
//Khng phi lm g
}

Cc khi nim

Ngt Ngt l mt khi nim lin quan nhiu n phn cng, mt s kin no xy ra, bt buc
CPU phi dng cc tc v bnh thng khc ang thc thi thc hin tc v Ngt. V d, cu
hnh ngt khi c thay i mc logic t 1 v 0 (cnh xung) ca GPIO, th khi mc logic thay i
trn GPIO , CPU s ngay lp tc dng v lu cc trng thi ti chng trnh chnh v nhy vo
hm ngt thc thi cc lnh trong .

pull-up/pull-down a s cc chn GPIO ca Chip u c th c 3 trng thi, trng thi l ng


ra mc cao (logic 1), trng thi l ng ra mc thp (logic 0) v trng thi ng vo (input). trng
thi Input, th cc GPIO c cu hnh tr khng cao (Hi-Z), hay cn gi l trng thi cch ly,
khng cho dng in i qua, nhng vn cm nhn c in p. trng thi Hi-Z, nu khng
xc nh mc logic trc cho GPIO th GPIO ny b th tri, ngha l rt d nh hng bi mi
trng, khi c v s khng on nh c mc Logic. Pull-up l ni 1 in tr vi GPIO ny ln
mc logic 1, xc nh trc 1 in p cho n m bo khng khng c tc ng in no th
n l mc logic 1. Tng t, pull-down xc nh trc mc logic 0 cho GPIO.
38/155

OLED

Mn hnh OLED

OLED (Organic Light Emitting Diode) l loi mn hnh hin th bao gm mt lp vt liu hu c vi ch
yu l cacbon nm gia hai in cc anot v catot s t ng pht sng mi khi c dng in chy
qua. OLED s dng i-t pht quang hu c, chnh v th n khng cn ti n nn chiu sng, do
c li th v kch thc cng nh tit kim in hn so vi cc loi LCD. V sng tng i tt
mi trng sng t nhin

Mn hnh OLED SSD1306

L mn hnh loi nh, kch thc tm 0.96 inch cho ti 1.25 inch, c dng kh rng ri trong cc sn
phm in t. Tm nn c iu khin bng chip driver SSD1306. Chip ny giao tip vi cc b iu
khin/MCU khc bng giao tip LCD

Hnh 25. OLED SSD1306

Giao tip I2C

I2C (Inter-Integrated Circuit) l mt loi bus ni tip c pht trin bi hng Philips nhm truyn
nhn d liu gia cc IC. I2C s dng 2 ng truyn tn hiu, 1 ng xung nhp ng h (SCL) do

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 39/155

Master pht i v 1 ng truyn d liu theo 2 hng (SDA)

Hnh 26. I2C Clock

Hnh 27. M hnh mng I2C

Mch vt l I2C l mch cc thu h, do mng I2C c th hot ng c, cn ti thiu 2 cp


in tr pull-up nh trn hnh. Thng thng 4k7, hoc 1k2. Ty thuc vo tc truyn v khong
cch truyn.

Hin th mn hnh OLED vi ESP8266

Bc 1: u ni ni chn GPIO4 ca ESP8266 vi chn SDA ca OLED, chn GPIO5 vi SCL. Cp


ngun 3v3 vo VCC v u GND cho OLED. Tuy nhin vi board ESP8266 IoT Uno th phn u ni
ra sn header, bn ch cn cm OLED vo nh hnh
40/155

Hnh 28. ESP8266 vi OLED

Bc 2: Ci t th vin ESP8266 and ESP32 OLED driver for SSD1306 display, xem thm Ci t
th vin Arduino

Bc 3: Lp trnh Chng ta s thc hin hin th gi lp ng h trn mn hnh OLED

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 41/155

#include <Wire.h>
#include "SSD1306.h"

SSD1306 display(0x3c, 4, 5);


int thoi_gian = 0;
void setup()
{
Serial.begin(115200);
display.init();
//display.flipScreenVertically(); //o chiu
display.setFont(ArialMT_Plain_10);
display.drawString(0, 0, "Hello world");
display.display();
delay(1000);
display.clear();
}

void loop()
{
int gio, phut, giay;

delay(1000);
thoi_gian ++;

gio = thoi_gian/3600;
phut = (thoi_gian%3600)/60;
giay = thoi_gian % 60;
display.clear();
display.drawString(0, 0, String(gio) + ":" + String(phut) + ":" + String(giay));
display.display();
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE


42/155

Tng kt
Thng qua cc v d mu v iu khin n LED, nt nhn v OLED, chng ta c th trin khai thm
nhiu v d khc s dng GPIO ca ESP8266, cng nh hiu r hn v cch lm vic ca Arduino IDE,
cch np chng trnh, s dng th vin

Mt trong nhng ng dng c th s dng cc kin thc ny nh l tr chi Flappy Bird, bn c th


th nghim ti y: https://github.com/esp8266vn/arduino-flappybird

Hnh 29. Arduino FlappyBird

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 43/155

ESP8266 WiFi
Kt ni WiFi chnh im mnh nht ca chip ESP8266, n c th kt ni n cc Router sn c trong
gia nh, cc Access Point vi cc tiu chun kt ni thng dng hin nay tn s 2.4GHz - ch
STA. Ngoi ra, ESP8266 cn h tr ch AP (Access Point), tc l n c th khi ng mt (hoc
nhiu) Access Point v cho php cc client khc c th kt ni vo, hoc chy ng thi c ch
STA v AP.

Trong a phn cc ng dng th ch STA c s dng rt nhiu, n gip thit b kt ni n


mng WiFi cc b, c internet kt ni n Server v gi d liu. Mt s trng hp khc th ch
AP c s dng trao i d liu vi ESP8266 v my tnh (hoc thit b c h tr trnh duyt). V
d nh iu khin ng tt n thng qua Web Server chy trn ESP8266.

WiFi Access Point l mt thit b x l kt ni trung tm v phn phi cc lung d liu. Nh l vic x
l cc gi tin IP nh a ch mng LAN, nh tuyn cc gi tin t Internet v cc my trm (Station).

Hnh 30. WiFi Access Point

Thit b kt ni n Access Point c gi l Station, cc my tnh Laptop, my tnh c card WiFi khi
kt ni vo Access Point th u c gi l Station
44/155

Hnh 31. Mng WiFi

Cc Station khi mun kt ni vo Access Point th cn xc nh thng qua BSSID, thng thng
chng ta hay gi l SSID - hay mng WiFi. Bn c th d dng xem danh snh SSID xung quanh mnh
khi scan wifi trn my tnh kt ni mng Internet.

Trong phn ny chng ta s tm hiu v cc ch WiFi ca ESP8266

Ch Station - STA kt ni ti Access Point sn c.

S dng HTTPClient gi v ly d liu t Internet.

Ch Access Point - AP cho php Client khc kt ni vo.

Web Server chy trn ESP8266, dng bt tt n LED.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 45/155

Ch WiFi Station

Kin thc

kt ni c vo mng Internet, th u tin ESP8266 phi kt ni vo mng WiFi ni b, v mng


WiFi ni b phi c kt ni WAN Internet. a phn cc Modem hin nay u tch hp lun c WiFi
Access Point, do kh d dng trong vic trin khai cc ng dng IoT.

Khi mun kt ni vo mng WiFi cc b th ESP8266 cn phi hot ng ch Station (STA), ng


thi n phi c cung cp tn (SSID) v mt khu mng WiFi.

Mi Access Point u yu cu mt phng thc m ha Station s dng nhm to kt ni - v d


cc phng thc WEP, WPA2, tuy nhin chng ta c l khng cn quan tm nhiu, v ESP8266 s t
ng thc hin cc thao tc la chn phng thc m ha.

Khi kt ni thnh cng vo mng WiFi th ESP8266 s khi ng DHCP Client (mc nh) xin cp
pht a ch IP trc khi bt u cc kt ni IP. Do , nu nh v l do g , m Access Point ca bn
khng c DHCP Server cp pht IP th bn phi cu hnh IP tnh cho ESP8266.

Kt ni vo mng WiFi ni b

Vi on code ny, nu bn cung cp ng SSID v PASSWORD, ng thi Access Point hot ng


th thit b s kt ni v in ra Serial Terminal a ch IP ca ESP8266 trong mng LAN
46/155

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";


const char* password = "your-password";

void setup() {

// Thit lp truyn d liu ni tip tc 115200 bits/s


Serial.begin(115200);
delay(10);
Serial.print("Connecting to ");

// In ra tn mng wifi s kt ni n
Serial.println(ssid);

// Thit lp ESP8266 ch station v kt ni n mng wifi ch nh


WiFi.begin(ssid, password);
// on code in ra du . nu ESP8266 cha c kt ni
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// In ra dng "WiFi connected" v a ch IP ca ESP8266
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void loop() {

S dng WiFiMulti

Tuy nhin, i lc ng dng bn cn ni ng ci , th c 2-3 mng WiFi backup l bnh thng,


class WiFiMulti s gip bn iu . Cng vi mt hm monitor n gin bo cho cc chc nng
khc bit khi mng c thit lp.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 47/155

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
// Khai bo bin wifiMulti thuc class ESP8266WiFiMulti s dng cc chc nng ca class ny.
ESP8266WiFiMulti wifiMulti;
// Bin connectioWasAlive nhm kim tra kt ni ca ESP8266 n mng wifi.
boolean connectioWasAlive = true;

void setup()
{
Serial.begin(115200);
Serial.println();
// Add vo cc mng wifi m ESP8266 c ch nh s kt ni
wifiMulti.addAP("primary-network-name", "pass-to-primary-network");
wifiMulti.addAP("secondary-network-name", "pass-to-secondary-network");
wifiMulti.addAP("tertiary-network-name", "pass-to-tertiary-network");
}

void monitorWiFi()
{
// Kim tra nu cha kt ni n 1 mng wifi no s ci t connectioWasAlive = false
// ng thi in ra du "." sau mi 500ms nu cha c kt ni.
if (wifiMulti.run() != WL_CONNECTED)
{
if (connectioWasAlive == true)
{
connectioWasAlive = false;
Serial.print("Looking for WiFi ");
}
Serial.print(".");
delay(500);
}
// Nu kt ni n 1 trong cc mng wifi s in ra tn mng wifi v set connectioWasAlive = true
// khi mt kt ni chng trnh s vo phn if (connectioWasAlive == true) nhm thng bo ang
// tm kim mng wifi
else if (connectioWasAlive == false)
{
connectioWasAlive = true;
Serial.printf(" connected to %s\n", WiFi.SSID().c_str());
}
}

void loop()
{
monitorWiFi();
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE


48/155

HTTP Client

Giao thc HTTP

HTTP - Hypertext Transfer Protocol (giao thc truyn dn siu vn bn), l giao thc truyn d
liu gia cc my tnh qua www (World Wide Web), vi d liu c th l dng text, file, nh, hoc video.

HTTP c thit k trao i d liu gia Client v Server trn nn TCP/IP, n vn hnh theo c ch
yu cu/tr li, stateless - khng lu tr trng thi. Trnh duyt Web chnh l Client, v mt my ch
cha Web Site l Server. Client s kt ni ti Server, gi d liu n server bao gm cc thng tin
header. Server nhn c thng tin v cn c trn gi phn hi li cho Client. ng thi ng kt
ni.

Mt v d in hnh l khi bn g a ch vo thanh a ch ca trnh duyt v nhn Enter, th ngay lp


tc Web Client s thc hin vic gi yu cu ti Web Server c a ch m bn va g. Web Server s
tr li bng ni dung Web Site m bn cn xem.

Trong giao thc HTTP, vic thit lp kt ni ch c th xut pht t pha client ( lc ny c th gi l
HTTP Client ). Khi client gi yu cu, cng vi URL v payload ( d liu mun ly ) ti server. Server (
HTTP Server ) lng nghe mi yu cu t pha client v tr li cc yu cu y. Khi tr li xong kt ni
c chm dt.

Hnh 32. Cch thc HTTP hot ng

Khi nhc ti HTTP th Hyperlink, hay URL (Uniform Resource Locator) l nhng khi nim c thy
hng ngy

URL c dng nh dng a ch Website, cha cc thng tin yu cu t client v server da vo


x l, cu trc ca n nh hnh:

Hnh 33. Cu trc 1 URL

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 49/155

V d bn c th gi thng tin v nhit n server thng qua ng dn:


http://esp8266.vn/log.php?nhiet_do=30

Cu trc 1 URL

|scheme | host |port |path |query |fragment|


http:// server.com: 8080 /path/to/log.php ?nhiet_do=30&do_am=80 #test

scheme xc nh giao thc truyn ti server, nu l https th s c m ha.

host a ch server.

port port server dng phc v, nu ko c th mc nh l 80 cho web.

path thng tin client mun truy sut.

query thng tin client mun gi ln.

fragment thuc tnh ny gip browser i n v tr ca trang.

Vi ng dn nh trn, khi bn g vo trnh duyt, th trnh duyt s thc hin kt ni v gi d liu


nh sau.

GET /log.php?nhiet_do=30 HTTP/1.1


Host: esp8266.vn
User-Agent: curl/7.49.1
Accept: */*

D liu tr v:

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive

data

Trn linux, bn c th s dng curl xem chi tit d liu raw truyn nhn, g
lnh curl -v http://esp8266.vn/log.php?nhiet_do=30 trn terminal

Giao thc HTTP nh ngha mt s phng thc (method) truyn n


Server:

GET l phng thc yu cu d liu n gin v thng s dng nht ca HTTP. Phng thc
GET yu cu server ch tr v d liu bng vic cung cp cc thng tin truy vn trn URL, thng
thng Server cn c vo thng tin truy vn tr v d liu m khng thay i n. path v
query trong URL cha thng tin truy vn.

POST tng t nh GET, nhng POST c th gi d liu v Server.


50/155

PUT l phng thc yu cu to mi mt d liu, ging POST nhng nh du cho Server bit,
nu d liu khng tn ti trong c s d liu th to mi, hoc sa i n.

DELETE Tng t nh GET, nhng bo cho Server bit v vic xa d liu thng qua URL.

Cc phng thc thng thng ch dng GET v POST, cc phng thc cn li thng s dng
trong API server (RESTful). Mt s im khc bit gi POST v GET.

GET c th b cache (lu tr trnh duyt v s dng li sau ), ni dung request c th lu tr


lch s trnh duyt, c th c nh du (bookmark).

GET khng nn s dng gi cc d liu nhy cm.

GET b gii hn ln d liu cn gi.

GET ch nn dng ly d liu v.

POST khng b catch, khng tn ti d liu gi trong lch s trnh duyt, khng th nh du
(bookmark).

POST khng gii hn bi ln d liu cn gi.

HTTP Header & Status Code

D liu tr v bao gi cng c phn thng tin header vi dng u tin cha Status Code HTTP/1.1
200 OK c ngha l status code = 200, request c tr v ph hp. Theo sau l cc cp header
cha thng tin Server mun trao i vi Client, m nu l trnh duyt th n b n i (ngi dng bnh
thng khng th thy). Cc cp header ny nh dng theo kiu name: value v kt thc bng k t
xung dng khng thy bng mt thng (0x0D 0x0A hay \r\n). Trong v d trn, thng tin header
Content-Type: text/html; charset=utf-8 bo cho trnh duyt bit rng nh dng d liu gi v l
dng text, m ha utf-8. Transfer-Encoding: chunked chiu di d liu khng c bit trc v gi
cho ti khi server ng kt ni.

Mt s HTTP status code thng thy:

1xx: M trng thi thng tin. Bn cht ca m trng thi ny, ch thng bo vi client rng
request c chp nhn. Cc m trng thi thng tin ny c quy nh trong HTTP/1.1, cn
phin bn HTTP/1.0 hay trc th khng c, c th b qua phn m trng thi ny. Cc m
hay gp:

100 Continue: Thng bo cho Client bit l c th gi tip phn request cn li nu cn,
kt thc nu ht. Nu trong request POST, phn thn request ln s b server t chi v
gii quyt iu ny th client phi gi Expect: 100-continue theo sau phn header
ban u.

2xx: Nhm m trng thi ny thng bo vi Client rng request c nhn, hiu v x l
thnh cng. Vi mt s m thng thy:

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 51/155

200 OK: Thng bo cho Client bit l request gi thnh cng. C th thy m trng thi
ny trong cc phng thc GET, HEAD, POST, TRACE.

201 Created: Cho bit request x l thnh cng v ti nguyn c khi to. c
s dng xc nhn s thnh cng ca mt request PUT hoc POST.

204 No Content: Thng bo khng c phn thn message trong response.

3xx: Nhm m trng thi thng bo Client cn phi thc hin thm hnh ng hon thnh
request. M trng thi thng gp trong nhm:

301 Moved Permanently: Thng bo ti nguyn c yu cu c chuyn hng


sang mt URL mi v server s gi URL mi ny trong response cho Client bit.

4xx: Nhm m thng bo cc li t pha Client. c s dng khi server cho rng pha Client
ang xy ra li, vi mt request, hoc ti nguyn khng hp l, hoc mt request khng ng.
Cc m thng dng:

400 Bad Request: Thng bo request gi l sai.

401 Unauthorized: Ch ra rng request cn c xc thc. Client c th gi li request vi


header c xc thc. Trng hp nh km header xc thc nhng vn nhn c
thng bo ny tc l header xc thc cha hp l.

403 Forbidden: Server t chi quyn truy cp ca Client.

404 Not Found: Thng bo ti nguyn khng hp l v khng tn ti trn server.

409 Conflict: Server khng th hon thnh yu cu v Client c chnh sa ti nguyn mi


hn so vi timestamp ca Client. Xung t xy ra ch yu trong cc request PUT trong
qu trnh hp tc chnh sa ti nguyn.

5xx: Nhm lnh thng bo server ang trong tnh trng li hoc khng c kh nng thc hin
yu cu. Mt s m thng gp:

500 Internal Server Eror: Cho bit l khng th thc hin request ca Client.

501 Not Implemented: Thng bo server khng c phng thc c yu cu hoc


khng c kh nng h tr chc nng m Client request.

503 Service Unavailable: Xy ra khi h thng ca server ang bo dng hoc qu ti.

JSON

JSON (JavaScript Object Notation) l 1 nh dng trao i d liu gip vic c v vit d liu tr
nn d dng hn, my tnh cng s d phn tch v to ra JSON. Chng l c s da trn tp hp
ca ngn ng lp trnh JavaScript. JSON l 1 nh dng kiu text m hon ton c lp vi cc ngn
ng hon chnh, thuc h hng vi cc ngn ng trong h hng ca C, gm c C, C++, C#, Java,
JavaScript, Perl, Python, v nhiu ngn ng khc. Nhng c tnh to nn JSON 1 ngn ng
52/155

hon v d liu l tng.

JSON c xy dng trn 2 cu trc:

L tp hp ca cc cp tn v gi tr name-value. Trong nhng ngn ng khc nhau, y c th


l 1 object, record, struct, dictionary, hash table, keyed list hay associative array.

L 1 tp hp cc gi tr c sp xp. Trong hu ht cc ngn ng, d liu ny c xem nh


array, vc t, list hay sequence. y l 1 cu trc d liu ph dng. Hu nh tt c cc ngn
ng lp trnh hin i u h tr. Chng to nn ngha ca 1 nh dng hon v d liu vi cc
ngn ng lp trnh cng c c s ho trn cu trc ny.

C php

D liu nm trong cc cp name/value

Cc d liu c ngn cch bi dy phy ,

Cc i tng (name/value) nm gia hai du ngoc kp "

Tt c cc i tng nm bn trong hai du ngoc nhn {}

D liu ca JSON c vit theo tng cp name/value. Mt cp name/value bao gm trng


name ( nm trong hai du ngoc kp ", theo sau l du hai chm :, v sau cng l trng value
(cng c nm trong hai du ngoc kp ". V d: "name":"John"

{
"username" : "your-user-name",
"email" : "your-email@email.com",
"website" : "iota.edu.vn",
"title" : "IoT Stater Cource"
}

ng dng xem gi Bitcoin

Mt ng dng n gin s dng giao thc HTTP ly t gi Bitcoin (BTC)/USD t cc trang Web giao
dch, hin th ln mn hnh OLED.

Chng ta c rt nhiu ngun ly t gi, mt trong s l www.cryptocompare.com/. Vi ti liu c


cung cp, v nhu cu l ch ly t gi Bitcoin/USD, chng ta ch cn ESP8266 gi 1 HTTP Request n
min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD th s nhn c mt chui JSON
dng nh:

{"USD":4731.44}

v gi tr ca trng USD chnh l gi tr chng ta mun hin th.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 53/155

a s cc dch v Web hin nay u s dng giao thc bo mt HTTPS, v c

bn n cng l HTTP, nhng qu trnh truyn nhn c m ha d liu, thc


hin xc thc trc khi gi gia Client v Server.

Khi dng HTTPS, chng ta cn cung cp SHA1 Fingerpint Client c th xc thc server. Bn c th
dng trnh duyt truy cp trc ly. Nu l Chrome, sau khi truy cp vo a ch min-
api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD, Nhn Ctrl+Shift+I (Shift + + I vi MacOS)
v i n Security > View Certificate > Details > Thumbprint. Bn s thy hnh nh bn di, v copy
n.

Hnh 34. HTTPS Fingerprint

y l on Code ly gi Bitcoin, c mi 5 giy, ESP8266 s kt ni n Cryptocompare server


ly thng tin v hin th ln OLED.
54/155

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h> //https://github.com/bblanchon/ArduinoJson
#include "SSD1306.h" //https://github.com/squix78/esp8266-oled-ssd1306

const char* ssid = ".....";


const char* password = "....";
SSD1306 display(0x3c, 4, 5);
/* xem thm https://www.cryptocompare.com/api/ */
const char* host = "https://min-api.cryptocompare.com/data/price?fsym=BTC&tsyms=USD";
/*SHA1 fingerprint*/
const char* fingerprint = "61 DE E9 FF BB 6B AD AA E4 9A 38 95 DC EC 74 2C 61 4B 7D 07";

void getBitcoin()
{
HTTPClient http;
Serial.print("connecting to ");
Serial.println(host);

http.begin(host, fingerprint);
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
Serial.println(payload);
StaticJsonBuffer<512> jsonBuffer;
JsonObject& root = jsonBuffer.parseObject(payload);
if (!root.success()) {
Serial.println("parseObject() failed");
return;
}

double priceUSD = root["USD"];


display.clear();
display.drawString(0, 0, "Bitcoin price");
display.drawString(0, 18, String(priceUSD));
display.display();
Serial.println(priceUSD);
}
http.end();
}

void setup() {
Serial.begin(115200);
display.init();
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0, 0, "Connecting to");
display.drawString(0, 18, ssid);
display.display();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
display.clear();
display.drawString(0, 0, "Connected");
display.display();
}

void loop() {
if (WiFi.status() == WL_CONNECTED) {
getBitcoin();
}
delay(5000);
}

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 55/155

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

Hnh 35. Kt qu ly gi Bitcoin v hin th mi 5 giy


56/155

Ch WiFi Access Point

ESP8266 hot ng ch Access Point

ESP8266 c kh nng cho php cc thit b khc (Station - STA) truy cp vo v hot ng nh l 1
Access Point, c th t thit lp 1 mng WiFi ni b, vi kh nng khi ng DHCP Client v cung cp
c IP cho cc Client kt ni ti. Do gii hn v RAM, nn s lng ti a cc STA c th kt ni n
mt ESP8266 hin ti l 5.

Khi to mng

u tin bn cn include <ESP8266WiFi.h>, th vin ny cha hm softAP dng cu hnh Access


Point mm (soft AP) khi to mt mng WiFi.

Mt mng WiFi n gin nht ch cn cung cp tn SSID v khng mt khu WiFi.softAP(ssid). Phc
tp hn, bn cung cp mt khu cho mng WiFi WiFi.softAP(ssid, password), hoc chi tit
WiFi.softAP(ssid, password, channel, hidden) khi cung cp chnh xc knh truyn (1..13), mc nh 1 v
n n i, khng hin th ra khi hidden = true

Nh rng ssid s dng chui k t khng qu 63, v mt khu (c th khng cn) vi ti thiu 8 k t
cho mng WPA2-PSK

Hm softAP s tr v true nu khi to thnh cng mng WiFi

Lu rng, mng WiFi khi to bi hm softAP s s dng a ch IP mc nh l


192.168.4.1, v chy 1 DHCP Server cung cp di IP cho client kt ni ti l
192.168.1.x. Bn c th thay i a ch IP mc nh ny bng hm softAPConfig.
Ngoi ra, ESP8266 c th chy c song song 2 ch Station v Access
Point, nhng lu , ch c 1 channel, v channel ca softAP s dng bi
channel ca Station.

WiFi.softAPConfig (local_ip, gateway, subnet) dng cu hnh IP cho Access Point

Cu hnh a ch IP cho ESP8266 AP l 192.168.4.22

IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
WiFi.softAPConfig(local_IP, gateway, subnet)

WiFi.softAPgetStationNum() s tr v s lng client ang kt ni ti Access Point

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 57/155

Khi to mng WiFi s dng ESP8266

Vi on code ny, bn c th to ra mt mng WiFi cc b c SSID l AP-XXXXXX v c th dng


my tnh kt ni trc tip vo vi password l password

#include <ESP8266WiFi.h>

const char *password = "password";

void setup() {
Serial.begin(115200);
Serial.print("Configuring access point...");
char ssid[64];
sprintf(ssid, "AP-%06X", ESP.getChipId());
WiFi.softAP(ssid, password);

IPAddress myIP = WiFi.softAPIP();


Serial.print("AP IP address: ");
Serial.println(myIP);
}

void loop() {
Serial.printf("Stations connected = %d\n", WiFi.softAPgetStationNum());
delay(3000);
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

Hnh 36. Khi khi ng 1 WiFiAccesspoint


58/155

Web Server

Web Server l g?

Web Server l mt my ch Web m khi c bt k mt Web Client no (chng hn Web Browser) truy
cp vo, th n s cn c trn cc thng tin yu cu truy cp x l, v phn hi li ni dung. a
phn cc ni dung Web Server phc v l HTML, Javascript, CSS, JSON v bao gm c cc d liu
Binary.

Mc nh cc Web Server phc v trn Port 80, v 443 cho dch v Web c bo mt HTTPS

HTML - Javascript - CSS

HTML, Javascript v CSS l ba ngn ng xy dng v pht trin Web. Nhng hiu bit c bn v
chng s to iu kin thun li cho cc qu trnh tip theo sau c d dng hn.

HTML

Vit y l Hyper Text Markup Language - ngn ng nh du siu vn bn dng cu trc


ni dung ca mt trang Web, v d nh: ch nh cc on vn bn, tiu , bng d liu, hoc nhng
hnh nh hoc video vo Web. Mi trang Web cha mt lot cc lin kt n cc trang khc c gi
l hyperlinks (siu lin kt). Mi trang c to ra t nhiu tag (th) khc nhau, vi cu trc mt tag
nh sau

Cu trc 1 tag

<tagname> ni dung tag...</tagname>

Cc tag thng i theo cp, bt u bi <tagname> v kt thc bng </tagname>

Tag kt thc phi c du gch cho / pha trc tn th.

Trang HTML c bn c th c thy nh sau:

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 59/155

<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>

<h1>This is a Heading</h1>
<p>This is a paragraph.</p>

</body>
</html>

Vi mt s tag c bn nh sau:

<!DOCTYPE html> cho bit l HTML5.

<html> root ca trang HTML.

<head> cha thng tin v ti liu.

<title> phn tiu trang.

<body> phn cha ni dung trang hin th.

<h1> ni cha phn tiu chnh.

<p> phn ghi cc on vn bn.

Javascript

Javascript l mt ngn ng c thit k ch yu thm tng tc vo cc trang Web, v to ra


cc ng dng Web.

Cc chng trnh Javascript c th c nhng trc tip vo HTML ca Web. V ty vo mc ch c


th, script c th chy khi m trang Web, nhp chut, g phm, gi biu mu, cp nht d liu, giao
tip vi c s d liu

nhng chng trnh vit bng Javascript vo trang HTML, ch cn thm tag <script> v thuc tnh
type. C th thm phn ny phn <head> hoc phn <body> ca HTML. V d sau y minh ha
vic thm mt chng trnh Javascript vo phn thn (<body>) ca HTML:
60/155

<!DOCTYPE html>
<html>
<head>
<title>My first JavaScript page</title>
</head>
<body>

<script type="text/javascript">
// chng trnh Javascript nn c vit y
// ngay trc </body>
</script>
</body>
</html>

CSS

CSS l t vit tt ca Cascading Style Sheets, l mt ngn ng c thit k x l giao din


Web, gip cc trang Web c p hn. CSS c th kim sot c mu sc ca vn bn, phong
ch, kch c ch, khong cch gia cc on vn, hnh nn hoc mu nn, v nhiu hiu ng khc.

Mt on CSS bao gm 4 phn nh th ny:

vng-chn {
thuc-tnh-a: gi-tr-x;
thuc-tnh-b: gi-tr-y;
.....
}

V d v s dng CSS trong HTML

<!DOCTYPE html>
<html>
<head>
<title>My first JavaScript page</title>
<style>
.class-select {
background-color: red;
}

#id-select {
background-color: green;
}

div {
color: blue;
}
</style>
</head>
<body>
<div id="id-select"> css select by id </div>
<div class="class-select"> css select by class </div>
</body>
</html>

Vi on HTML bn trn, th mu nn ca tag div c id = id-select s c mu xanh l cy, tag div c


class = class-select s c mu , v ch ca tt c nhng th div c mu xanh nc bin.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 61/155

ng dng iu khin n LED thng qua Webserver

ESP8266 hon ton c th thc hin vai tr Web Server phc v cho mt vi kt ni n, tn dng
giao din Web iu khin, cu hnh cho n.

ESP8266 Web Server

Vi ng dng ny, ESP8266 s khi to 1 Web Server, khi c bt k client no kt ni ti (Web


Browser) th ESP8266 s gi v 1 trang HTML vi cc thng tin Client c th iu khin chp tt
n LED ca board.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "........";


const char* password = "........";
const int led = 16; //LED pin = gpio16
/* HTML s c gi xung client */
const char *html = \
"<html>\
<head>\
<title>ESP8266 Webserver</title>\
</head>\
<body>\
<a href=\"/on\">ON</a>\
<a href=\"/off\">OFF</a>\
</body>\
</html>";

/* Web Server lng nghe port 80 */


ESP8266WebServer server(80);

/* hm ny c gi khi trnh duyt truy vn n '/on'


* s bt n LED (0 = on), sau chuyn hng trnh duyt
* v li trang ch '/'
*/
void handleOn() {
digitalWrite(led, 0);
server.sendHeader("Location","/");
server.send(301);
}

/* hm ny c gi khi trnh duyt truy vn n '/off'


* s tt n LED (1 = off), sau chuyn hng trnh duyt
* v li trang ch '/'
*/
void handleOff() {
digitalWrite(led, 1);
server.sendHeader("Location","/");
server.send(301);
}

/* hm ny c gi khi trnh duyt truy vn n trang ch '/'


* s gi d liu HTML, cung cp cc thng tin bt, tt LED
*/
void handleRoot() {
server.send(200, "text/html", html);
}
62/155

void setup(void){
pinMode(led, OUTPUT);
digitalWrite(led, 0);
Serial.begin(115200);
WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {


delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");

/* Chng ta c th bit IP ca ESP8266


* kt ni ti nh gi hm ny
*/
Serial.println(WiFi.localIP());

server.on("/", handleRoot);
server.on("/on", handleOn);
server.on("/off", handleOff);
server.begin();
Serial.println("HTTP server started");
}

void loop(void){
server.handleClient();
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

Kt hp WiFi AP v Web Server

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 63/155

Trao i d liu gia 2 ESP8266


Thng thng, mun hai hay nhiu ESP8266 c th lin lc, trao i d liu vi nhau s cn n mt
router hay access-point, cc module ESP8266 ny s kt ni vo Access Point ri sau giao tip
vi nhau.

C mt s ng dng n gin kt ni 2 ESP8266 vi nhau m khng cn Access Point, chng ta c


th khi to 1 board hot ng nh l WiFi Access Point, ng thi khi to 1 TCP Server. Board khc
hot ng nh 1 WiFi client thng thng, kt ni vo mng WiFi c to, v khi ng 1 TCP
Client kt ni vo TCP Server kia.

Yu cu

Khng cn bt k mt Router, hay Access Point no, thc hin vic kt ni giao tip gia 2
ESP8266 thng qua mng WiFi, 2 Board ny s truyn d liu vi nhau mi giy, v hin th ln
Serial Terminal

Hng dn thc hin

trao i d liu gia 2 ESP8266 cn p ng cc iu kin sau:

1 ESP8266 s khi ng SoftAP to mng WiFi, ng thi khi ng 1 TCP Server lm


Server.

1 ESP8266 phi l client vi ch WiFi Station v kt ni n ESP8266 server to trn.

Sau mi giy, Board ESP8266 ny s gi d liu vo Board kia, board nhn c d liu s in ra
cng Serial v gi ngc li.

Code

P2P server

#include <ESP8266WiFi.h>

#define PORT 23
// Gioi han so luong clients ket noi
#define MAX_CLIENTS 3

// Ten va mat khau cua ESP8266 AP se tao


const char *ssid = "yourSSID";
const char *password = "yourPassword";

//khoi tao IP adress


IPAddress local_IP(192, 168, 4, 1);
IPAddress gateway(192, 168, 4, 1);
IPAddress subnet(255, 255, 255, 0);
64/155

// Khoi tao port de clients ket noi.


WiFiServer server(PORT);
WiFiClient clients[MAX_CLIENTS];

void setup() {
Serial.begin(115200);
Serial.println();
Serial.print("Setting soft-AP configuration ... ");

//Cau hinh acces point, cai dat soft AP de client ket noi vao.
WiFi.softAPConfig(local_IP, gateway, subnet);
WiFi.softAP(ssid, password);

//In ra local_IP cua AP.


Serial.print("AP IP address: ");
Serial.println(WiFi.softAPIP());
Serial.println("Telnet server started");
server.begin();
}

void loop() {
uint8_t i;
// kiem tra co client moi ket noi khong
if (server.hasClient()) {
for (i = 0; i < MAX_CLIENTS; i++) {
if (!clients[i] || !clients[i].connected())
{ if (clients[i]) clients[i].stop();
clients[i] = server.available();
Serial.print("New client: "); Serial1.print(i);
continue;
}
}
WiFiClient serverClient = server.available();
serverClient.stop();
}
// Kiem tra neu so client ket noi MAX_CLIENTS
// co client, client duoc ket noi va o trang thai available
// doc du lieu tu client, va gui lai du lieu cho client do.
for (i = 0; i < MAX_CLIENTS; i++) {
if (clients[i] && clients[i].connected()) {
if (clients[i].available()) {
String line = clients[i].readStringUntil('\r');
Serial.print("Server receive from Client:");
Serial.println(line);

//Gui thong tin hoai dap cho client


String resp = String(line.reserve(line.length() - 1));
Serial.print(" Then, response back to client:");
Serial.println(resp);
clients[i].write(resp.c_str());
Serial.println();
}
}
}
}

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 65/155

P2P client

#include "ESP8266WiFi.h"
// Ten va mat khau cua ESP8266 AP lam server se vao
const char *ssid = "yourSSID";
const char *password = "yourPassword";

IPAddress server_ip(192, 168, 4, 1);


#define PORT 23
// port 23 la port cua esp8226 lam AP da khoi tao.
WiFiClient client;

void setup() {
uint8_t i = 0;
Serial.begin(115200);
WiFi.begin(ssid, password);

Serial.print("\nConnecting to ");
Serial.println(ssid);

// Kiem tra tnh trang ket noi, neu chua ket noi duoc
// se in chuoi "connecting..." tren man hinh serial terminal.
while (WiFi.status() != WL_CONNECTED) {
Serial.println("Connecting...");
delay(500);
}
}

unsigned long previousMillis = 0;


void loop() {
if (WiFi.status() == WL_CONNECTED) {
// Kiem tra neu client(STA) chua duoc ket noi.
// Kiem tra tiep tuc neu khong duoc ket noi den IP va PORT cua server(AP
// thi in ra serial terminal chuoi "connection failed".
while (!client.connected()) {
if (!client.connect(server_ip, PORT)) {
Serial.println("connection failed");
delay(1000);
return;
}
}
// Neu client(STA) duoc ket noi thi se doc du lieu tu server(AP)
// den khi gap ki tu \r va in ra seria terminal du lieu nhan duoc.
while (client.available()) {

String line = client.readStringUntil('\r');


Serial.print("Client receive from Server:");
Serial.println(line);
}
//Send PING to server every 1000ms.
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
client.write("PING\r");
}
}
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE


66/155

Tng kt
Trong phn ny, chng ta nm r cc ch hot ng ca ESP8266, cc giao thc truyn
TCP/IP, HTTP v cc nh dng HTML, CSS, Javascript. Ngoi cc v d thc tin s dng ESP8266 nh
HTTP Client hng dn trn, bn c th s dng HTTPClient kt ni n cc Server t to, gi d
liu cm bin n Server, cng nh ly d liu t Server thc thi cc tc v.

Ch WiFi Access Point v Web Server chy trn ESP8266 thng s dng cu hnh cc thng
s cho sn phm, s dng giao din Web c bt k my tnh no cung cp cc thng s phc
tp cho ng dng mt cch d dng.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 67/155

D n c cm bin DHT11
v gi v Server
Trong bi ny chng ta s xy dng ng dng dng cm bin DHT11 thu thp nhit , m ca
mi trng. Thng tin v nhit v m s c hin th trn my tnh v hin th trn trnh duyt
web bng cch truy cp vo 1 a ch URL c ch nh. Mt s kin thc cn thit :

Nhit l i lng th hin tnh cht vt l nng, lnh ca vt cht. Nhit c o bng
cc n v khc nhau v c th bin i bng cc cng thc. Trong h o lng quc t, nhit
c o bng n v Kelvin, k hiu l K. Trong i sng Vit Nam v nhiu nc, n c
o bng C.

m tng i l t s ca p sut hi nc hin ti ca bt k mt hn hp kh no vi hi


nc so vi p sut hi nc bo ha tnh theo n v l %. nh ngha khc ca m tng
i l t s gia khi lng nc trn mt th tch hin ti so vi khi lng nc trn cng th
tch khi hi nc bo ha

DHT11 l mt cm bin c kh nng o nhit v m khng kh vi chnh xc va phi,


gi c phi chng. C th ly d liu o c ca cm bin bng giao thc OneWire.
68/155

Thit k ng dng
Hnh nh bn di m t tng quan d n

Hnh 37. Tng quan m hnh ca d n

Trong thc t, khi thit k ng dng, ngi dng cn mt giao din gim st v iu khin thn thin,
ng thi c th pht trin thm cc tnh nng nh hin th kt qu di dng th (chart), lu tr
d liu theo thi gian ch nh hay iu khin trng thi cc thit b ch vi 1 click chut trn my tnh.
Cc d n vi m hnh phc tp s cn qun l cc kt ni cng nh d liu ca cc thit b

Chng ta s gii quyt nhng vn trn thng qua ng dng c nhit , m ca mi trng
v gi v server. y l mt ng dng kh n gin, hu ch v d lm. Thng qua phn ny chng ta
c th xy dng c mt ng dng IoT thc t, nm bt c cc kin thc c bn v thu thp d
liu, xy dng thit b v server.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 69/155

Yu cu

Dng cm bin DHT11 thu thp nhit , m ca mi trng v kt ni vi board mch


ESP8266

Board mch ESP8266 s kt ni khng dy n mng WiFi v gi d liu v HTTP Server

Phn c bn: HTTP Server hin th d liu nhit , m ra mn hnh Log trn my tnh

Phn nng cao: HTTP Server lu tr d liu, v cung cp file HTML cho ngi dng c th xem
qua Browser

Phn tch

Chng ta cn 1 Web Server vit bng Javascript, thc thi bi Node.js, lng nghe Port c ch
nh trn my tnh c nhn. y l port 8000

My tnh phi c kt ni cng mng WiFi ni b vi ESP8266 v cn bit a ch IP ca my tnh


ESP8266 c th truy cp, v d IP l 192.168.1.102

ESP8266 sau khi kt ni vo mng WiFi ni b, s tin hnh c thng s nhit , m t cm


bin DHT11 v gi v Server sau mi 2 giy.

Qu trnh gi c thc hin bi phng thc GET, v d


http://192.168.1.102/update?temp=25&humd=80 vi 192.168.1.102 l a ch Web Server, /update l
ng dn, temp=20 v humd=80 cha thng tin nhit 20 C v m 80%.

Web Server tr v trng thi HTTP status = 200 (OK), cng vi vic hin th ra ca s log gi tr
nhit , m.

phn nng cao:Web Server lu tr d liu nhit , m trong mng, cha b nh RAM
Web Server cn cung cp 1 file index.html cha m Javascript c th yu cu ly d liu
nhit , m lu trong RAM, v hin th ln biu

Kin thc

S d dng hn nu chng ta c nhng kin thc c bn v

Chun truyn d liu OneWire gia cc IC

Ngn ng Javascript xy dng server bng cch dng Node.js

Ngn ng HTML xy dng 1 trang html n gin nhm hin th d liu

Tuy nhin cng ng qu lo lng nu bn cha tng dng nhng th ny, chng ta s hiu n khi
c cc phn tip theo.
70/155

Cm bin DHT 11 v chun d liu OneWire

DHT11 l cm bin c chc nng o nhit , m ca mi trng, c dng kh ph bin v


gi thnh thp v n nh cao. Cm bin s dng chun truyn d liu OneWire. Thng tin
chi tit v DHT11 c th xem ti Datasheet

OneWire l chun giao tip ni tip c thit k bi hng Dallas. l h thng bus nhm kt
ni cc thit b vi nhau truyn hoc nhn d liu.Trong chun giao tip ny thng ch s
dng 1 chn ng thi l va l ngun cung cp va l chn truyn nhn d liu. Cng ging
nh cc chun giao tip khc, OneWire cng gm 3 giai on reqquest (hi) respond (p)
data reading (truyn nhn d liu).

Hnh nh m t qu trnh truyn,nhn d liu ca DHT11 nh hnh bn di

Hnh 38. Qu trnh truyn nhn d liu trong chun OneWire

Tm tt

1. Master (ESP8266) gi tn hiu START, DHT11 s chuyn t ch tit kim nng lng (low-
power mode) sang ch lm vic bnh thng (high-speed mode)

2. DHT11 nhn c tn hiu v phn hi n master, master nhn tn hiu v bt u qu trnh


truyn d liu.

3. DHT11 s gi d liu ln bus, mi ln gi l 1 gi 40 bits data.

4. Khi mun kt thc, Master s gi tn hiu STOP, kt thc qu trnh truyn nhn d liu

Chi tit v chun OneWire xem ti maximintegrated.com

Ngn ng HTML

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 71/155

Mt trong nhng a ch web hc HTML cho ngi mi bt u l w3school.com/HTML, lu rng


chng ta s khng i qu su vo vic hc HTML, bi vic ny c th nh hng n tin thc
hin ca project, ti thi im ny chng ta ch cn hc xy dng project hon chnh.

Node.js v Javascript

to server dng Node.js cn trang b mt s kin thc c bn v Javascript v Node.js, hc


Javascript chng ta c th truy cp a ch URL w3school.com/Javascrpit, vi Node.js th
codeschool.com tht s hu ch vi ngi mi bt u.

Thc hin

Linh kin cn c

Cm bin DHT11

Board ESP8266 WiFi Uno

Dy ni male-female header

in tr 5K Ohm

Cable kt ni gia board ESP8266 v my tnh

u ni

Kt ni s mch in nh hnh bn di

Hnh 39. Kt ni DHT11 v ESP8266 WiFi Uno


72/155

Server Nodejs
V pha Web Server, chng ta cn m bo n c th phc v cho nhiu Client, vi path l:

/update th s thm mi d liu lu tr, v in ra mn hnh

/get tr v d liu lu tr nh dng JSON

/ v cn li th tr v file index.html

Mng d liu lu tr c nh dng: [{"temp": 25, "humd":80, time: "time"}, ...]

M ngun file server.js

//---------------------------------------------------------------------------------------------
var fs = require('fs');
var url = require('url');
var http = require('http');
var querystring = require('querystring');
var db = []; //database
//---------------------------------------------------------------------------------------------
// function gi yu cu(response) t pha server hoc nhn yu cu (request) ca client gi ln
function requestHandler(request, response) {

// Gi s a ch nhn c http://192.168.1.7:8000/update?temp=30&humd=40
var uriData = url.parse(request.url);
var pathname = uriData.pathname; // /update?
var query = uriData.query; // temp=30.5&hum=80
var queryData = querystring.parse(query); // queryData.temp = 30.5, queryData.humd = 40
//-----------------------------------------------------------------------------------------
if (pathname == '/update') {
var newData = {
temp: queryData.temp,
humd: queryData.humd,
time: new Date()
};
db.push(newData);
console.log(newData);
response.end();
//-----------------------------------------------------------------------------------------
} else if (pathname == '/get') {
response.writeHead(200, {
'Content-Type': 'application/json'
});
response.end(JSON.stringify(db));
db = [];
//-----------------------------------------------------------------------------------------
} else {
fs.readFile('./index.html', function(error, content) {
response.writeHead(200, {
'Content-Type': 'text/html'
});
response.end(content);
});
}
//-----------------------------------------------------------------------------------------
}
var server = http.createServer(requestHandler);
server.listen(8000);
console.log('Server listening on port 8000');

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 73/155

Gii thch m ngun

require dng load cc th vin hoc module cn thit cho d n

fs: Module gip c file t server hoc upload file ln server

url: Chia nh URL thnh nhng thnh phn d dng truy xut

http: Phng thc truyn nhn d liu dng http

querystring: Module gip chuyn string sang object

db = []: Bin kiu mng nhm cha d liu nhit , m

So snh gi tr pathname x l d liu. Nu pathname =/update th s to bin newData nhm


ly d liu client gi ln thng qua URL, sau y d liu vo mng db thng qua lnh
db.push(newData) , gi tr c hin th qua Log khi dng lnh console.log(newData). Hm Date()
gip ly thi gian hin ti.

Tr v nh dng JSON ('Content-Type': 'application/json') ca mng db nu pathname = /get, sau


xa gi tr ca mng. Hm response.end() s tr v HTTP code (m 200 l kt qu OK)

Tr v ni dung ca file index.html khi khng xy ra 2 trng hp <2> v <3>. Dng fs c file
index.html v gn ni dung vo content thng qua lnh fs.readFile('./index.html', function(error,
content). Hm response.writeHead(200, {'Content-Type': 'text/html' }) nhm khai bo m HTTP
code, nh dng tr v l HTML c file

Khi to mt server HTTP v m port 8000 cc client truy cp

Bn c th truy cp n ng dn ca file server.js v thc thi on code trn vi dng lnh node
server.js, sau th truy vp vo localhost:8000 xem trang index.html. Hoc truy cp vo
localhost:8000/update?temp=20&humd=60 xem mn hnh Log in ra kt qu nhit v m.

{ temp: '20', humd: '60', time: 2017-08-21T16:56:23.358Z }


{ temp: '20', humd: '60', time: 2017-08-21T16:57:06.277Z }
{ temp: '20', humd: '60', time: 2017-08-21T16:57:17.708Z }

phn c bn chng ta cha cn phi quan tm n file index.html v on code Javascript trong
. Cng nhng cha quan tm ti vic x l khi ng dn l /get hoc /\*, m ch quan tm duy
nht khi nhn c vi ng dn /update.

Khi hon thnh phn c bn chng ta s i n mt ng dng kh ph bin, ngi dng cn hin
th cc d liu thu thp mt cch trc quan thng qua trnh duyt Web. V vy chng ta s lm 1 file
index.html cha m ngun Javascript c th yu cu Server tr v d liu mi giy hin th ln 1
biu canvas.

M ngun file index.html

<!DOCTYPE html>
<html>
74/155

<head>
<meta charset="UTF-8">
<title>DHT11</title>
<!-- Nhng file Javasript ti ng dn src c th xy dng 1 graph -->
<script type="text/javascript" src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
</head>
<body>
<h1> 1. THONG SO NHIET DO, DO AM</h><br>
<h2> Temprature</h2> <input type="text" size="6" id="temp">&#176;C<br>
<h2> Humidity</h2> <input type="text" size="6" id="humd">%<br>
<h1> 2. DO THI</h1><br>
<!-- thit lp kch thc cho graph thng qua id ChartContainer thit lp trn -->
<div id="ChartContainer" style="height: 300px; width:80%;"></div>
<script type="text/javascript">
function httpGetAsync(theUrl, callback) {
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
callback(JSON.parse(xmlHttp.responseText));
}
xmlHttp.open("GET", theUrl, true); // true for asynchronous
xmlHttp.send(null);
}

window.onload = function() {
var dataTemp = [];
var dataHumd = [];

var Chart = new CanvasJS.Chart("ChartContainer", {


zoomEnabled: true, // Dng thuc tnh c th zoom vo graph
title: {
text: "Temprature & Humidity" // Vit tiu cho graph
},
toolTip: { // Hin th cng lc 2 trng gi tr nhit , m trn graph
shared: true
},
axisX: {
title: "chart updates every 2 secs" // Ch thch cho trc X
},
data: [{
// Khai bo cc thuc tnh ca dataTemp v dataHumd
type: "line", // Chn kiu d liu ng
xValueType: "dateTime", // Ci t kiu gi tr ti trc X l thuc tnh thi gian
showInLegend: true, // Hin th "temp" mc ch thch (legend items)
name: "temp",
dataPoints: dataTemp // D liu hin th s ly t dataTemp
},
{
type: "line",
xValueType: "dateTime",
showInLegend: true,
name: "humd",
dataPoints: dataHumd
}
],
});
var yHumdVal = 0; // Bin lu gi tr m (theo trc Y)
var yTempVal = 0; // Bin lu gi tr nhit (theo trc Y)
var updateInterval = 2000; // Thi gian cp nht d liu 2000ms = 2s
var time = new Date(); // Ly thi gian hin ti

var updateChart = function() {


httpGetAsync('/get', function(data) {

// Gn gi tr t localhost:8000/get vo textbox hin th


document.getElementById("temp").value = data[0].temp;
document.getElementById("humd").value = data[0].humd;

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 75/155

// Xut ra mn hnh console trn browser gi tr nhn c t localhost:8000/get


console.log(data);
// Cp nht thi gian v ly gi tr nhit , m t server
time.setTime(time.getTime() + updateInterval);
yTempVal = parseInt(data[0].temp);
yHumdVal = parseInt(data[0].humd);
dataTemp.push({ // cp nht d liu mi t server
x: time.getTime(),
y: yTempVal
});
dataHumd.push({
x: time.getTime(),
y: yHumdVal
});
Chart.render(); // chuyn i d liu ca ca graph thnh m hnh ha
});
};
updateChart(); // Chy ln u tin
setInterval(function() { // Cp nht li gi tr graph sau thi gian updateInterval
updateChart()
}, updateInterval);
}
</script>
</body>
</html>

Gii thch m ngun

Nhng tag c bn khi khi to 1 trang HTML

<!DOCTYPE html> cho trnh duyt bit phin bn HTML c s dng

<html> cho trnh duyt bit y l vn bn HTML

<head> khai bo thng tin cho trang HTML

<meta charset="UTF-8"> cung cp d liu v vn bn HTML, dng m ha charset="UTF-8"

<title>DHT11</title> tiu ca trang

S dng CanvasJS Chart v biu nhit , m.

To 2 textbox ti tag tiu ph <h1> hin th nhit , m. Mi textbox s c 1 id cp


nht gi nhit , m t server. M nh dng &#176;C l ca k t C

Hm gip ly d liu t server

Phn tch phn v biu

Chng ta s ly d liu t server gi xung v v biu dng m Javascrpit, s dng tag


<scrpit>code JS </scrpit> chn ni dung code Javascrpit vo file HTML.

Vic ly d liu c thc thi bng hm httpGetAsync(). Hm ny s dng i tng


XMLHttpRequest ly d liu t server m khng cn phi load li trang, d liu
xmlHttp.responseText ly t server ti a ch localhost:8000/get nh dng JSON nn cn
phi chuyn sang dng Object bng hm JSON.parse().
76/155

Cn phi c d liu t ESP8266 gi ln server th ti a ch localhost:8000/get


mi c d liu.

Hnh 40. Hnh nh d liu ti a ch localhost:8000/get

S dng window.onload = function() load li ni dung ca graph, cc lnh trong hm c


gii thch trong code.

Truy cp vo trang canvasjs.com/javascript-charts/ la chn v xy dng


nhng th ph hp vi mc ch ca bn.

Hnh nh trang HTML sau khi xy dng

Hnh 41. Hnh nh giao din HTML

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 77/155

Code ESP8266
ESP8266 s dng th vin HTTPClient kt ni ti Web Server v ly d liu nhit , m thng
qua phng thc GET vi query l temp v humd.

Chun b

Cung cp SSID v PASSWORD WiFi cho board mch ESP8266 kt ni vo mng ni b vi Web
Server.

Cung cp a ch IP, port ca Web Server.

Th vin h tr ly d liu ca DHT11. Da theo chun truyn nhn 1 wire v s ph bin ca


dng sensor DHTXX (DHT11, DHT22,), c rt nhiu th vin c xy dng ln vic lp trnh
vi DHT11 tr nn d dng hn. Trong bi ny chng ta s ci t v s dng th vin DHT
sensor library ca Adafruit.

Hnh 42. Hnh nh th vin DHT sensor library

M ngun ESP8266
78/155

#include <DHT.h> // Khai bo s dng th vin DHT


#include <ESP8266WiFi.h> // Khai bo s dng th vin ESP8266WiFi.h thit lp ch HTTP client cho ESP8266
#define DHTPIN 4 // Chn d liu ca DHT11 kt ni vi GPIO4 ca ESP8266
#define DHTTYPE DHT11 // Loi DHT c s dng

DHT dht(DHTPIN, DHTTYPE);


WiFiClient client; // To 1 bin client thuc kiu WiFiClient
const char* ssid = "YOUR-WIFI-SSID"; // Tn mng Wifi c ch nh s kt ni (SSID)
const char* password = "YOUR-WIFI-PASS"; // Password ca mng Wifi c ch nh s kt ni
const char* server = "Your-local-IP"; // a ch IP ca my khi truy cp cng mng WiFi
const int port = 8000; // Port ca server m
const int sendingInternval = 2 * 1000; // Bin cp nht d liu sau mi 2s

void setup() {
Serial.begin(115200);
dht.begin(); // Khi to DHT1 11 truyn nhn d liu
Serial.println("Connecting");

// Thit lp ESP8266 l Station v kt ni n Wifi. in ra du `.` trn terminal nu cha c kt ni


WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
Serial.println("\r\nWiFi connected");
}

void loop() {

// c ga tr nhit ( C), m. Xut ra thng bo li v thot ra nu d liu khng phi l s


float temp = dht.readTemperature();
float humi = dht.readHumidity();
if (isnan(temp) || isnan(humi)) {
Serial.println("Failed to read from DHT sensor!");
return;
}

if (client.connect(server, port)) { // Khi to kt ni n server thng qua IP v PORT m


//---------------------------------------------------------------------------------------
String req_uri = "/update?temp=" + String(temp, 1) + "&humd=" + String(humi, 1);
client.print("GET " + req_uri + " HTTP/1.1\n" + "Host: "+ server +"\n" + "Connection: close\n" + "Content-Length:
0\n" +"\n\n");
//---------------------------------------------------------------------------------------

// temp, humi chuyn t nh dng float sang nh dng string v in ra mn hnh serial // terminal trn Arduino.
Serial.printf("Nhiet do %s - Do am %s\r\n", String(temp, 1).c_str(), String(humi, 1).c_str());
}
client.stop(); // Ngt kt ni n server

delay(sendingInternval);
}

ESP8266 s gi d liu ln server sau khi kt ni thnh cng n server thng qua lnh
client.print(). Ni dung gi :

GET /update?temp=30.6&humd=60 HTTP/1.1 vi :

GET l phng thc gi d liu.

/update?temp=30.6&humd=60 l ni dung cn gi bao gm c pathname v d liu.

HTTP/1.1 khai bo s dng giao thc HTTP version 1.1 c th to 1 HTTP request

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 79/155

Host: 192.168.1.7:8000 thng tin v a ch IP v port ca server.

Connection, Content-Length

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

C th xem thng cc thng tin ca qu trnh truyn nhn d liu vi lnh: curl -v
http://192.168.1.7:8000/update?temp=28.0&humd=45.0. Thng tin hin th nh bn di:

name@yourname:~$ curl -v http://192.168.1.7:8000/update?temp=28.0&humd=45.0


[1] 9277
name@yourname:~$ * Trying 192.168.1.7...
* Connected to 192.168.1.7 (192.168.1.7) port 8000 (#0)
> GET /update?temp=28.0 HTTP/1.1 // > Thng tin gi t ESP8266
> Host: 192.168.1.7:8000
> User-Agent: curl/7.47.0
> Accept: */*
> // < Thng tin gi t server
< HTTP/1.1 200 OK
< Date: Wed, 23 Aug 2017 17:22:49 GMT
< Connection: keep-alive
< Content-Length: 0
<
* Connection #0 to host 192.168.1.7 left intact

Kt qu hin th trn Arduino IDE v mn hnh Log ca my tnh:

Hnh 43. Hnh nh trn Arduino v terminal sau khi kt ni


80/155

ng dng m rng

Dng ESP8266 nh 1 Web Server

Xy dng 1 d n gim st v iu khin nhit , m hin th trn web vi giao din iu khin :

Hin th gi tr nhit , m.

Hin th chart nhit , m theo thi gian.

C 2 ch Auto v Manual.

Vi ch Auto, nhit > 35C s t ng bt qut, m > 50% s bt my phun sng.

Vi ch manual c th iu khin qut v my phun sng bng cc nt nhn


ON/OFF

C ty chn hin th lch s nhit , m theo thi gian t ngy aa/bb/cccc n ngy
xx/yy/zzzz

Hnh nh thit k giao din nh bn di:

Hnh 44. Giao din iu khin trn trang HTML

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 81/155

Tng kt
Sau khi hon thnh d n, chng ta c ci nhn tng quan v trnh t cc bc xy dng mt
d n hon chnh trong vic thu thp d liu ca cm bin cng nh xy dng server qun l cc
my khch. T l bc m gip bn pht trin thm nhiu cc d n thu thp v x l d liu
trong tng lai.
82/155

Cc ch cu hnh WiFi
Thng thng, khi bt u kt ni wifi cho ESP8266, ta phi cu hnh cho thit b cc thng s ca
Access Point cng nh SSID v password nu mng wifi c thit lp cc bo mt nh
WEP/WPA/WPA2. Tuy nhin, cc ng dng nhng s dng Wi-fi thng t ch trng n giao din
ngi dng (user interface), khng c bn phm hay touchscreen,.. giao tip. V th, mi khi mun
kt ni thit b ESP vi mt Access Point no , bn cn phi c mt my tnh ci t sn phn
mm bin dch, tip theo l vit code cu hnh li thng s wifi cho thit b, sau np code cho thit
b thng qua mt cable USB.

iu ny lm cho vic kt ni wifi tr nn kh bt tin v phc tp. Do vy ESP8266 cung cp cc


phng php thay th khc gip n gin ha vic kt ni trm ESP (ch Station) vi mt im
truy cp. l kt ni bng SmartConfig, WPS hay Wifi Manager.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 83/155

Smartconfig

Kin thc

SmartConfig l mt giao thc c to ra nhm cu hnh cho cc thit b kt ni vi mng WiFi mt


cch d dng nht bng smart phone. Ni mt cch n gin, kt ni WiFi cho thit b ESP8266, ta
ch cn cung cp thng tin mng wifi (bao gm SSID v password) cho ESP thng qua 1 ng dng trn
smart phone.

Hnh 45. SmartConfig vi ESP8266

Chng ta nn bit rng, khi 1 in thoi thng minh kt ni vo mng WiFi c mt khu, th ton b
d liu trao i gia in thoi v u mi khc trong mng s c m ha. Ngha l cc thit b
cha c kt ni mng v khng c mt khu th khng th gii m c d liu. Vy lm th no
ng dng trn in thoi gi thng tin kt ni ny n 1 thit b khc cha h kt ni mng. lm
c iu ny, th nh vo 2 c im sau:

ESP8266 c kh nng lng nghe tt c cc gi tin khng dy WiFi xung quanh n, bao gm c
cc gi tin c m ha.

Cc gi tin gi trong mng WiFi c m ha v khng th c c ni dung, tuy nhin di


gi tin l mt hng s. V d, gi tin A cha m ha c chiu di l x, khi m ha gi tin A thnh
gi tin B, th gi tin B s c chiu di l x + n, th n l hng s.
84/155

Cch thc giao thc ESPTOUCH thc hin vic gi thng tin SSID v mt khu cho thit b nh
sau:

ESP8266 s vo ch lng nghe, ln lt tng knh.

in thoi phi kt ni vo mng WiFi c m ha.

ng dng trn in thoi s tin hnh gi cc gi tin vi ni dung bt k, nhng c di n


theo tng k t ca SSID v mt khu. V d, ssid ca mng l mynetwork th s c k t m, vi
k t ascii = 109, ng dng s gi gi tin c di 109 vi ni dung bt k, v lp li cho n ht
k t k, cng nh mt khu, v cc k t khc nh CRC.

C th giao thc ESPTOUCH s m ha c cc thng s gi i, nhng vn gi nguyn tc nh


trn.

ESP8266 s pht hin ra cc gi tin vi di thay i ny v ghp ni li thnh SSID v


password kt ni vo mng.

Khi ESP8266 kt ni thnh cng n mng, ESP8266 s kt ni n IP ca in thoi, c cung


cp thng qua ESPTOUCH, v gi thng tin kt ni thnh cng n ng dng trn in thoi.

Hnh 46. Gi tin UDP

Lu :

Khong cch gia thit b v router cng xa th thi gian kt ni s cng lu.

Nu thit b khng th kt ni vi router trong khong thi gian quy nh th ng dng s tr v


thng bo cu hnh tht bi. Ngi dng c th ci t thi gian timeout ny thng qua lnh
esptouch_set_timeout(uint8 time_s)

Trong qu trnh cu hnh kt ni thit b bng SmartConfig, thit b phi c ci t ch


Station.

Ngi dng c th cu hnh cho nhiu thit b kt ni chung vo mt router cng lc.

ESP Touch hin nay h tr i vi Access Point chun 802.11n 2.4Ghz

Thc hin SmartConfig vi ESP8266

Trong v d di y, chng ta s tin hnh kt ni wifi cho board ESP8266 bng SmartConfig. S
dng ng dng ESP8266 SmartConfig (Android). Bn c th d dng tm thy ng dng ny cng nh
cc ng dng tng t trn Play Store (Android) hay iTunes (iOS) thc hin vic kt ni bng

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 85/155

SmartConfig ny.

Trc tin, ta s np chng trnh cho ESP8266. im mu cht trong chng trnh ny chnh l hm
WiFi.beginSmartConfig() c cung cp trong th vin ESP8266WiFi. Hm ny cho php thit b khi
ng ch SmartConfig, thu thp cc thng tin t cc gi tin v gii m chng c th kt ni vo
mng Wifi.

Sau khi np xong chng trnh, ta nhn gi button (GPIO0) trong 3s thit b i vo ch
smartconfig. (Lc ny bn s thy led trn board nhp nhy nhanh hn). Dng smart phone ca bn
truy cp vo wifi mun kt ni, sau m ng dng smartconfig v nhp cc thng tin SSID v
PASSWORD (nu c) ca wifi. Nhn CONFIRM xc nhn.

https://www.youtube.com/watch?v=-RqMKvMLPi0 (YouTube video)


Video Demo

Code

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <Ticker.h>
#include <time.h>

#define PIN_LED 16
#define PIN_BUTTON 0

#define LED_ON() digitalWrite(PIN_LED, HIGH)


#define LED_OFF() digitalWrite(PIN_LED, LOW)
#define LED_TOGGLE() digitalWrite(PIN_LED, digitalRead(PIN_LED) ^ 0x01)

Ticker ticker;

/* Hm kim tra trng thi ca button*/


bool longPress()
{
static int lastPress = 0;
if (millis() - lastPress > 3000 && digitalRead(PIN_BUTTON) == 0) { // Nu button c nhn v gi trong 3s th
return true;
} else if (digitalRead(PIN_BUTTON) == 1) { // Nu button khng c nhn v gi 3s th
lastPress = millis(); // gn bin lastPress bng thi im khi gi hm
}
return false;
}

void tick()
{
int state = digitalRead(PIN_LED); // Ly trng thi hin ti ca LED (GPIO16)
digitalWrite(PIN_LED, !state); // o trng thi LED.
}

bool in_smartconfig = false; // Bin trng thi kim tra thit b c ang trong ch smartconfig hay khng.

/* Vo ch Smartconfig*/
void enter_smartconfig()
{
if (in_smartconfig == false) { // Kim tra tra bin trng thi, nu khng ch smartconfig th
in_smartconfig = true; // Gn bin trng thi bng "true", ngha l ang trong smartconfig
ticker.attach(0.1, tick); // Nhp nhy led chu k 0.1s.
86/155

WiFi.mode(WIFI_STA); // Thit lp kt ni cho thit b ch Station mode


WiFi.beginSmartConfig(); // Bt u ch smartconfig
Serial.println("Enter smartconfig"); // In thng bo "Enter smartconfig" ra mn hnh
}
}

/* Thot ch smartconfig*/
void exit_smart()
{
ticker.detach(); // Ngng nhy led
LED_ON(); // Bt LED
in_smartconfig = false; // Gn bin trng thi tr v ban u.
Serial.println("Connected, Exit smartconfig"); // In thng bo ra mn hnh.
}

/* Ci t cc thng s ban u*/


void setup() {
Serial.begin(115200); // Tc baud = 115200
Serial.setDebugOutput(true); // hin th cc thng tin debug h thng ln mn hnh qua serial

pinMode(PIN_LED, OUTPUT); // Cu hnh GPIO cho cc chn LED v button


pinMode(PIN_BUTTON, INPUT); // Chp tt led chu k 1s
Serial.println("Setup done"); // In thng bo ci t xong
}

/* Chng trnh chnh*/


void loop() {
if (longPress()) { // Gi hm longPress kim tra trng thi button
enter_smartconfig(); // Nu button c nhn gi trong 3s th vo trng thi smartconfig
}
if (WiFi.status() == WL_CONNECTED && in_smartconfig && WiFi.smartConfigDone()) { //Kim tra trng thi kt ni wifi,
// cc thng s cu hnh cng nh trng thi smartconfig
exit_smart(); // khi thit b ht ni wifi thnh cng, thot ch smartconfig
}
if (WiFi.status() == WL_CONNECTED) {
//Chng trnh ca bn khi thit b c kt ni wifi
}
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 87/155

WPS

WPS l g?

Nu tng cu hnh cho mt router wifi, s gp qua cc thut ng WPS trong cc menu cu hnh
ca router. Hoc tng nhn thy mt nt nhn trn cc router vi ch vit bn cnh WPS. Vy WPS l
g ? Qu trnh thc hin kt ni nh th no ? Cng nh thc hin WPS vi ESP8266, l nhng nhng
ni dung s c ni n phn ny.

WPS l t vit tc ca Wifi Protected Setup, mt phng thc gip vic kt ni vi mng khng dy
gia router v thit b kt ni khng dy mt cch nhanh chng v d dng, thay v lm mt cch th
cng: tm mng wifi cn kt ni v nhp mt khu vo mng wifi. WPS ch hot ng khi c hai thit
b l router v thit b cn kt ni n router c h tr chun bo mt c nhn WPA/WPA2.

WPS c ba ch hot ng : ch kt ni vi m PIN, ch kt ni bng nt nhn, v ch kt


ni NFC - Near Field Communication (cha ph bin). Mt trong nhng ch ph bin v s thc
hin trong phn ny l ch kt ni bng nt nhn.

ch kt ni bng nt nhn, iu trc tin cn thc hin :

Nhn nt WPS trn router, gip router vo ch bo mt c bit, ch ny router s


cho php cc yu cu kt ni n router t cc thit b WPS (cc thit b c h tr WPS).

Tip theo l nhn nt nhn thit b WPS. Nt nhn ny gip thit b WPS kt ni n router,
vic kt ni ny c th tht bi nu qu thi gian. Thi gian ny c nh sn xut cc thit b
h tr ch ny quy inh, khong t 1 pht n 5 pht.

Hnh 47. Nt nhn WPS trn router


88/155

Thc hin WPS vi ESP8266

ESP8266 h tr hm WiFi.beginWPSConfig() trong th vin ESP8266WiFi. Vi hm ny gip ESP8266


vo ch cu hnh vi WPS v kt ni n mng wifi ca router. V d ny ESP8266 s c a sn
vo ch WPS, m khng cn thm nt nhn no.

- WPS ch c th thc hin khi ESP8266 ch STA (Station)


- Router phi trong ch WPS trc

Code

#include <ESP8266WiFi.h>

void setup()
{
// Ci t cc thng s ban u
Serial.begin(115200);
WiFi.mode(WIFI_STA);
// Kt ni vi AP c vo trc , SSID v password c lu trong b nh flash ca thit b
WiFi.begin("", "");
delay(4000);

// Kim tra xem wifi c kt ni cha, nu cha, bt u kt ni bng WPS


// Lu , cn phi m bo rng Router ca bn ang trong trng thi WPS.
while (WiFi.status() != WL_CONNECTED)
{
Serial.println("\nAttempting connection ...");
WiFi.beginWPSConfig();
delay(6000);
}
// Khi kt ni thnh cng, in thng bo ra mn hnh cng vi cc thng s ca Wifi va kt ni.
Serial.println("\nConnection already established.");
Serial.println(WiFi.localIP());
Serial.println(WiFi.SSID());
Serial.println(WiFi.macAddress());
}

void loop()
{
// chng trnh chnh
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 89/155

Wifi Manager
WifiManager l mt th vin cu hnh ESP8266 kt ni vo mng WiFi cc b s dng giao din Web.
Bng cch khi ng 1 mng WiFi ring vi Captive Portal, ESP8266 s cho php cc thit b khc nh
my tnh, in thoi thng minh kt ni vo, ng thi chuyn hng mi kt ni n giao din Web
do ESP8266 to nn. Trn giao din ny, s cung cp cc trng ngi dng c th d dng qut
mng xung quanh, chn mng WiFi, nhp mt khu, lu cu hnh.

Hot ng c bn WifiManager

Khi ESP8266 khi ng, ESP8266 s vo ch STATION v s t ng kt ni n mt Access


Point vi cc thng tin kt ni c lu vo ESP8266 ln kt ni thnh cng trc .

Nu nh kt ni khng thnh cng (c th l Access Point ln trc khng cn na, hay sai mt
khu, hoc cha c thng tin ca bt c Access Point no trong ESP8266 ), lc ny ESP8266 s
vo ch AP vi mt DNS tr v chnh n (c th thit lp DNS tr v a ch khc) v khi ng
Web Server (vi a ch mc nh l 192.168.4.1)

S dng cc thit b c h tr wifi, v c trnh duyt web (in thoi thng minh, laptop, my
tnh bng) kt ni n AP ca ESP8266 va mi to ra. C th thy mt giao din (vi tn AP
ca ESP8266 l mc nh v khng ci t mt khu cho ESP8266 AP) tng t nh sau :
90/155

Sau khi vo c giao din option ca ESP8266 AP a ch 192.168.4.1, chn mc cu hnh cho
wifi cho ESP8266 (nh v d trn l Configure WiFi hoc Configure WiFi (No Scan)), c th s thy
giao din tip theo tng t nh sau :

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 91/155

Chn mng wifi cn kt ni v nhp mt khu vo wifi.

Nu ESP8266 kt ni thnh cng, ta s khng thy tn ca ESP8266 AP na. Nu cha thnh


cng th ch cn kt ni li ESP8266 AP v cu hnh li.

Chun b

Ci t th vin: github.com/tzapu/WiFiManager, xem thm Ci t th vin Arduino

Code
92/155

#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino

//cc th vin cn thit


#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include "WiFiManager.h" //https://github.com/tzapu/WiFiManager

void configModeCallback (WiFiManager *myWiFiManager)


{
Serial.println("Entered config mode");
Serial.println(WiFi.softAPIP());
Serial.println(myWiFiManager->getConfigPortalSSID());
}

// Ci t thng s ban u
void setup()
{
Serial.begin(115200);

//Khai bo wifiManager thuc class WiFiManager, c quy nh trong file WiFiManager.h


WiFiManager wifiManager;
//c threset cc ci t c bng cch gi hm:
//wifiManager.resetSettings();

//Ci t callback, khi kt ni vi wifi c tht bi, thit b s gi hm callback


//v khi ng ch AP vi SSID c ci t ng l "ESP+chipID"
wifiManager.setAPCallback(configModeCallback);
if (!wifiManager.autoConnect())
{
Serial.println("failed to connect and hit timeout");
//Nu kt ni tht bi, th kt ni li bng cch reset thit b
ESP.reset();
delay(1000);
}
//Nu kt ni wifi thnh cng, in thng bo ra mn hnh
Serial.println("connected...yeey :)");

void loop()
{
// Chng trnh chnh
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

M rng

Ngoi cc ch c bn, th th vin WiFiManager cn nhiu tnh nng hu ch khc nh


startConfigPortal khi ng cu hnh khi cn (v d nhn nt cu hnh), b sung cc trng ty
chn trn giao din Web, ty chn li giao din

Cc thng tin API v v d bn c th d dng tm thy ti github.com/tzapu/WiFiManager

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 93/155

Tng kt
trin khai mt ng dng IoT thc t th i hi rt nhiu vn , mt trong s nhng iu quan
trng l d dng, d cu hnh cho ngi s dng v phi bo mt trong qu trnh cung cp thng tin
cho thit b. Ty thuc vo nhu cu pht trin sn phm v tnh nng ca sn phm m bn c th
la chn cho mnh phng php cu hnh ph hp. V d, nu thit b c nt nhn v c phn mm
trn in thoi, th SmartConfig v WPS l mt s la chn. Nu l 1 bng n trng trn khng c g
c, th WiFiManager li hu hiu.
94/155

MQTT

MQTT (Message Queuing Telemetry Transport) l mt giao thc gi dng publish/subscribe s dng
cho cc thit b Internet of Things vi bng thng thp, tin cy cao v kh nng c s dng
trong mng li khng n nh.

Bi v giao thc ny s dng bng thng thp trong mi trng c tr cao nn n l mt giao thc
l tng cho cc ng dng M2M.

MQTT cng l giao thc s dng trong Facebook Messager.

V MQTT l g? c mt ci nhn ton din hoc nh ngha chi tit, ch cn google "what is mqtt",
"mqtt slides" y chng ta ch ni ngn gn thi, hiu giao thc MQTT, bao gm cc nh
ngha "subscribe", "publish", "qos", "retain", "last will and testament (lwt)"

Publish, subscribe

Trong mt h thng s dng giao thc MQTT, nhiu node trm (gi l mqtt client - gi tt l client)
kt ni ti mt MQTT Server (gi l Broker). Mi client s ng k mt vi knh (topic), v d nh
"/client1/channel1", "/client1/channel2". Qu trnh ng k ny gi l "subscribe", ging nh chng ta
ng k nhn tin trn mt knh Youtube vy. Mi Client s nhn c d liu khi bt k trm no
khc gi d liu vo knh ng k. Khi mt Client gi d liu ti knh , gi l "publish".

QoS

y c 3 tu chn QoS (Qualities of service) khi "publish" v "subscribe":

QoS0 Broker/Client s gi d liu ng 1 ln, qu trnh gi c xc nhn bi ch giao thc


TCP/IP, ging kiu em con b ch.

QoS1 Broker/Client s gi d liu vi t nht 1 ln xc nhn t u kia, ngha l c th c nhiu


hn 1 ln xc nhn nhn c d liu.

QoS2 Broker/Client m bm khi gi d liu th pha nhn ch nhn c ng 1 ln, qu trnh


ny phi tri qua 4 bc bt tay.

Xem thm QoS: code.google.com/p/mqtt4erl/wiki/QualityOfServiceUseCases

Mt gi tin c th c gi bt k QoS no, v cc Client cng c th subscribe vi bt k yu cu

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 95/155

QoS no. C ngha l Client s la chn QoS ti a m n c nhn tin. V d, nu 1 gi d liu c


publish vi QoS2, v Client subscribe vi QoS0, th gi d liu c nhn v Client ny s c
broker gi vi QoS0, v 1 Client khc ng k cng knh ny vi QoS 2, th n s c Broker gi d
liu vi QoS2.

Mt v d khc, nu 1 Client subscribe vi QoS2 v gi d liu gi vo knh publish vi QoS0 th


Client s c Broker gi d liu vi QoS0. QoS cng cao th cng ng tin cy, ng thi tr
v bng thng i hi cng cao hn.

Retain

Nu RETAIN c set bng 1, khi gi tin c publish t Client, Broker PHI lu tr li gi tin vi QoS,
v n s c gi n bt k Client no subscribe cng knh trong tng lai. Khi mt Client kt ni
ti Broker v subscribe, n s nhn c gi tin cui cng c RETAIN = 1 vi bt k topic no m n
ng k trng. Tuy nhin, nu Broker nhn c gi tin m c QoS = 0 v RETAIN = 1, n s hu tt c
cc gi tin c RETAIN = 1 trc . V phi lu gi tin ny li, nhng hon ton c th hu bt k lc
no.

Khi publish mt gi d liu n Client, Broker phi set RETAIN = 1 nu gi c gi nh l kt qu ca


vic subscribe mi ca Client (ging nh tin nhn ACK bo subscribe thnh cng). RETAIN phi bng
0 nu khng quan tm ti kt qu ca vic subscribe.

LWT

Gi tin LWT (last will and testament) khng thc s bit c Client c trc tuyn hay khng, ci ny
do gi tin KeepAlive m nhn. Tuy nhin gi tin LWT nh l thng tin iu g s xy n sau khi thit
b ngoi tuyn.

Mt v d

Ti c 1 cm bin, n gi nhng d liu quan trng v rt khng thng xuyn. N c ng k trc


vi Broker mt tin nhn lwt topic /node/gone-offline vi tin nhn id ca n. V ti cng ng k
theo di topic /node/gone-offline, s gi SMS ti in thoi thi mi khi nhn c tin nhn no
knh m ti theo di. Trong qu trnh hot ng, cm bin lun gi kt ni vi Broker bi vic lun gi
gi tin keepAlive. Nhng nu v l do g , cm bin ny chuyn sang ngoi tuyn, kt ni ti Broker
timeout do Broker khng cn nhn c gi keepAlive. Lc ny, do cm bin ca ti ng k LWT,
do vy broker s ng kt ni ca Cm bin, ng thi s publish mt gi tin l Id ca cm bin vo
knh /node/gone-offline, d nhin l ti cng s nhn c tin nhn bo ci cm bin yu qu ca
mnh ngoi tuyn.

Ngn gn

Ngoi vic ng kt ni ca Client ngoi tuyn, gi tin LWT c th c nh ngha trc v c


gi bi Broker ti knh no khi thit b ng k LWT ngoi tuyn.
96/155

MQTT Client
Nh chng ta tm hiu phn trc, 2 thnh phn publisher v subscriber l c trng to nn
giao thc MQTT. Cc MQTT Client khng kt ni trc tip vi nhau, mi gi d liu c gi i u
thng qua MQTT Broker. c th trin khai cc ng dng ca MQTT Client, chng ta cn MQTT
Broker (s c trnh by trong phn sau). phn ny chng ta s lm quen vi giao thc MQTT
bng cc v d s dng MQTT Client thng dng v cc dch v MQTT Broker min ph v ph bin, 2
trong s chng l test.mostquitto.org v cloudmqtt.com

MQTT Lens

Thng tin

MQTT Lens l mt tin ch m rng ca Chrome (Chrome Extension), n s dng trnh duyt Chrome
kt ni n MQTT Broker cng nh test cc tnh nng publish/subcribe ca giao thc MQTT. y
l mt cng c rt hu ch kim tra kt ni n MQTT Broker v kim tra vic gi v nhn gi tin.

Mt s thng tin ca MQTT Lens c trnh by bng di.

Bng 2. Short Profile

Type Chrome App


License MIT
Operating Systems Windows, Linux & MacOSX
Website "https

Kt ni

Chng ta s s dng cng c ny vi dch v MQTT Broker ti iot.eclipse.org c trnh by nh cc


bc bn di:

Bc 1: Ci t trnh duyt Chrome, thc hin ng nhp ti khon ca bn vo chrome, truy


cp vo a ch chrome.google.com/webstore/category/extensions v g mqttlens vo mc tm
kim tin ch nh hnh bn di.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 97/155

Hnh 48. Hnh nh tm kim tin ch mqttlens trn chrome store

Bc 2: Thm v khi chy MQTT lens

Hnh 49. Hnh nh cc bc thm v khi chy tin ch MQTT lens

Bc 3 : To 1 MQTT Client kt ni n MQTT Broker eclipse nh cc bc bn di.


98/155

Hnh 50. Hnh nh to 1 MQTT client

Gii thch

Chng ta s to 1 connection c tn eclipse MQTT vi host name ca MQTT Broker l iot.eclipse.org,


Broker ny s gip trao i d liu ca cc Client vi nhau v lng nghe cc Client port 1883 (port
s dng giao thc MQTT v khng m ha d liu, cc port khc tham kho ti test.mosquitto.org)
connection ny s ng k nhn gi tin ti topic Home/garden/sensor/# (k t # cho php subcribe
cc topic Home/garden/sensor/1, Home/garden/sensor/2 vv). Tip theo chng ta s pulish 1 gi d
liu vi ni dung "Temp in garden: 27degree Celcius " ti topic Home/garden/sensor/1.

Kt qu: Ti mc subrcriptions, chng ta s nhn c gi d liu publish do subcribe topic


Home/garden/sensor/# nh hnh bn di.

Hnh 51. Hnh nh d liu nhn c sau khi publish gi tin

M rng

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 99/155

To nhiu connection subcribe v publish cc gi tin vi MQTT Broker iot.eclipse.org ng thi


test cc gi tin vi QoS v LWT

MQTT.js

MQTT.js l mt th vin MQTT client, c vit bng ngn ng JavaScript trn nn tng Node.js v h
tr MQTT Over Websocket (MOW).

MQTT.js l d n m ngun m (open source), bn c th ti MQTT.js bn cp nht mi nht ti


github.com/mqttjs/MQTT.js.git

Ci t

Trc tin ta cn kim tra h iu hnh h tr Node.js trc khi ci t MQTT.js. Nu cha th c
th tham kho cch ci t ti nodejs.org/en/

Khi to mt d n Node.js. d qun l, c th to mt th mc ring, v d mqtt-client v mt file


javascrip trong , v d nh client-a.js. i n th mc ny v m terminal (linux OS) hoc Command
Prompt (trn Windowns OS) v dng lnh:

npm init

Khi chy lnh ny, bn cng cn phi khai bo thm mt s thng tin cho d n nh tn, phin bn,
keywords, tc gi, Sau khi to xong, trong th mc va to s xut hin mt file l package.json vi
ni dung l cc phn khai bo. File ny cng cha thuc tnh dng lu tr cc package chng
ta ci t.

Tip theo chng ta s ci MQTT.js, s dng lnh:

npm install mqtt --save

Sau khi ci t xong, bn c th s dng module mqtt thc hin vic kt ni MQTT Client vi
Broker, publish message hay subscribe topic. Tt nhin, ton b cc file lin quan n th vin s
nm trong th mc node_modules, trong th mc d n.

hiu r hn cch hot ng ca MQTT.js, chng ta s to ra thm 1 s file m ngun Javascript


(file .js) l client-a.js v client-b.js thc hin subcribe v puslish cc gi tin.

Ni dung thc hin

2 Client ny s kt ni vo cng 1 MQTT Broker. Client A s subscribe knh /client-a/sub, nu nhn


bt k d liu no c publish vo knh ny, client A s public d liu Hello from client A vo knh
/client-b/sub v ng kt ni, kt thc. Client B s subscribe knh /client-b/sub, nu nhn bt k d
liu no c public vo knh ny, client B s ng kt ni v kt thc. Ngay khi kt ni vo Broker,
client B s public 1 gi tin Hello from client B vo knh /client-a/sub
100/155

M ngun ca client A

client-a.js

// to bin mqtt s dng cc chc nng ca module mqtt


var mqtt = require('mqtt')
// to bin client s dng thuc tnh connect kt ni n broket MQTT vi hostname mqtt://iot.eclipse.org
var client = mqtt.connect('mqtt://iot.eclipse.org')
// function c chc nng subscribe 1 topic nu kt ni thnh cng n broker
client.on('connect', function() {
console.log('Client A connected')
// client subcribe topic /client-a/sub
client.subscribe('/client-a/sub')
})
// function c chc nng gi 1 gi tin n n topic ng k
client.on('message', function(topic, message) {
// in ra mn hnh console 1 message nh dng string
console.log(message.toString())
// publish gi tin 'Hello from client A' n topic /client-b/sub
client.publish('/client-b/sub', 'Hello from client A')
// ng kt ni ca client
client.end()
})
console.log('Client A started')

M ngun ca client B

client-b.js

// to bin mqtt s dng cc chc nng ca module mqtt


var mqtt = require('mqtt')
// to bin client s dng thuc tnh connect kt ni n broket MQTT vi hostname mqtt://iot.eclipse.org
var client = mqtt.connect('mqtt://iot.eclipse.org')
// function c chc nng subscribe 1 topic nu kt ni thnh cng n broker
client.on('connect', function() {
console.log('Client B connected')
// client subcribe topic /client-b/sub
client.subscribe('/client-b/sub')
// publish gi tin 'Hello from client B' n topic /client-a/sub
client.publish('/client-a/sub', 'Hello from client B')
})

client.on('message', function(topic, message) {


// in ra mn hnh console 1 message nh dng string
console.log(message.toString())
// ng kt ni ca client
client.end()
})
console.log('Client B started')

Kt qu hin th nh hnh bn di:

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 101/155

Hnh 52. Hnh nh kt qu khi khi chy cc MQTT client

Ngoi ra, MQTT.js cn cung cp thm cc lnh c th tng tc vi Broker thng qua terminal.
lm c iu ny, chng ta ci t MQTT.js nh mt module ton cc bng cch s dng lnh:

npm install mqtt -g.

Bn c th kim tra bng cch m 2 mn hnh terminal, mn hnh 1 (tm gi l subscriber) s


subscribe vo topic tn l "topicA" bng lnh:

mqtt sub -t 'topicA' -h 'test.mosquitto.org' -v

terminal th 2 (tm gi l publisher) thc hin publish mt tin nhn vi ni dung "hello subscriber"
ti "topicA":

mqtt pub -t 'topicA' -h 'test.mosquitto.org' -m 'hello subscriber'

Cc options:

-t : MQTT topic, ni s thc hin pushlish 1 message.

-h : Xc nh my ch s kt ni n.

-m : Gi 1 message dng command line.

-v : verbose, option cho php ghi li nht k hot ng ca cc tp tin trong file cu hnh.
102/155

Hnh 53. Hnh nh message c publish dng command line

xem thm cc API khc trong MQTT.js, bn c th s dng lnh: mqtt help
[command].

ESP8266 MQTT Client

Thc t c kh nhiu th vin MQTT cho ESP8266 trn Arudino, y chng ta ch cp n 2 th


vin ph bin l PubSubClient v ESP8266MQTTClient

PubSubClient

Trong phn ny chng ta s thc hin kt ni board ESP8266 WiFi Uno n 1 broker s dng th vin
PubSubClient.

Bc 1 : Download th vin PubSubClient ti ng dn github.com/knolleary/pubsubclient v


add vo chng trnh Arduino. Ngoi ra c th import th vin ny trong Arduino bng cch tm
kim th vin vi t kha PubSubClient, chn th vin PubSubClient ca tc gi Nick OLeary v
nhn install.

Bc 2 : Vit v np chng trnh cho ESP8266. M ngun c trnh by pha di

#include <ESP8266WiFi.h>
#include <PubSubClient.h>

const char* ssid = "........";


const char* password = ".........";
const char* mqtt_server = "broker.mqtt-dashboard.com";

WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
pinMode(16, OUTPUT);
Serial.begin(115200);
// hm thc hin chc nng kt ni Wifi v in ra a ch IP ca ESP8266
setup_wifi();
// ci t server l broker.mqtt-dashboard.com v lng nghe client port 1883

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 103/155

client.setServer(mqtt_server, 1883);
// gi hm callback thc hin cc chc nng publish/subcribe
client.setCallback(callback);
// gi hm reconnect() thc hin kt ni li vi server khi b mt kt ni
reconnect();
}

void setup_wifi() {
delay(10);
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
// kt ni n mng Wifi
WiFi.begin(ssid, password);
// in ra du . nu cha kt ni c n mng Wifi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// in ra thng bo kt ni v a ch IP ca ESP8266
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

void callback(char* topic, byte* payload, unsigned int length) {


//in ra tn ca topic v ni dung nhn c t knh MQTT lens publish
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
// kim tra nu d liu nhn c t topic ESP8266/LED_GPIO16/status l chui "on"
// s btled GPIO16, nu l chui "off" s tt led GPIO16
if ((char)payload[0] == 'o' && (char)payload[1] == 'n') //on
digitalWrite(16, LOW);
else if ((char)payload[0] == 'o' && (char)payload[1] == 'f' && (char)payload[2] == 'f') //off
digitalWrite(16, HIGH);
Serial.println();
}

void reconnect() {
// lp cho n khi c kt ni tr li
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP8266")) {
Serial.println("connected");
// publish gi tin "Connected!" n topic ESP8266/connection/board
client.publish("ESP8266/connection/board", "Connected!");
// ng k nhn gi tin ti topic ESP8266/LED_GPIO16/status
client.subscribe("ESP8266/LED_GPIO16/status");

} else {
// in ra mn hnh trng thi ca client khi khng kt ni c vi MQTT broker
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// delay 5s trc khi th li
delay(5000);
}
}
}

void loop() {
// kim tra nu ESP8266 cha kt ni c th s thc hin kt ni li
if (!client.connected()) {
104/155

reconnect();
}
client.loop();
}

Gii thch m ngun:

Chng ta s to mt bin espClient thuc lp WiFiClient, bin ny c khai bo l MQTT Client v s


dng cc thuc tnh ca th vin PubSubClient. Ti hm setup() s thit lp ESP8266 ch
station, kt ni n mng wifi. Bn cnh hm setup() cng s thc hin chc nng t ng kt ni
li vi MQTT Broker khi xy ra mt kt ni ng thi thc hin cc chc nng publish, subscribe ca 1
MQTT Client thng qua hm reconnect(). Hm callback() c nhim v ly d liu ca cc puslisher khi
publish 1 message sau gi n cc client subscribe topic v kim tra ni dung ca
message iu khin led GPIO16. Hm loop() c chc nng kt ni Client l ESP8266 vi Broker,
thc hin chc nng publish 1 message v subscribe topic. client.loop() s kim tra thi gian kt ni
ca Client vi gi KEEP_ALIVE a ra cc thng tin v trng thi kt ni ca ESP8266 ng thi ly
d liu ca message t buffer gi n cc Client subcribe topic.

Bc 3 : M MQTT lens trn trnh duyt Chrome, to 1 connection vi host name broker.mqtt-
dashboard.com, s dng port 1883. Thc hin subscribe topic ESP8266/connection/board. Sau
khi nhn nt subscribe trn MQTT lens s xut hin 1 message gi t esp8288 vi ni dung
connnected. Thc hin pushlish cc message vo topic ESP8266/LED_GPIO16/status. Nu
pushlish message vi ni dung on, led GPIO16 trn board s sng, pushlish message off led
GPIO16 trn board s tt. Cc message vi ni dung khc th vn s hin th d liu nhn c
trn serial terminal ca Arduino nhng s khng c tc dng iu khin led GPIO16. Kt qu
hin th nh hnh bn di:

Hnh 54. Kt qu hin th trn serial terminal v MQTT lens khi s dng th vin pubsubClient

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 105/155

ESP8266MQTTClient

Tip theo, chng ta s tm hiu cch s dng th vin ESP8266MQTTClient, th vin c cng ng
developer nh gi l n nh d s dng hn so vi th vin PubSubClient thng qua 1 ng dng
iu khin led trn board ESP8266 WiFi Uno bng 1 ng dng trn in thoi smartphone.

Bc 1 : Download th vin ESP8266MQTTClient ti ng dn github.com/tuanpmt/


ESP8266MQTTClient v add vo chng trnh Arduino. Ngoi ra c th import th vin ny trong
Arduino bng cch tm kim th vin vi t kha ESP8266MQTT, chn th vin ca tc gi Tuan
PM, version 1.3 v nhn install.

Bc 2 : Vit v np chng trnh cho ESP8266. M ngun c trnh by pha di.

#include <ESP8266MQTTClient.h>
#include <ESP8266WiFi.h>

#define ledPin 16 //Led on board ESP8266 WiFi Uno

MQTTClient mqtt;

const char* ssid = "Your SSID";


const char* password = "Your password";

void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);

// OFF led GPIO16 khi bt u chng trnh


digitalWrite(ledPin, HIGH);

// Thit lp ESP8266 ch STA v kt ni Wifi


WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("\nConnecting to ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());

// Kt ni n server MQTT, in ra id ca topic "esp8266/GPIO16" ng thi ng k nhn message vi gi QoS 0,


// v subcribe cc topic "hello/esp8266"
mqtt.onConnect([]() {
Serial.printf("MQTT: Connected\r\n");
Serial.printf("Subscribe id: %d\r\n", mqtt.subscribe("esp8266/GPIO16", 0));
mqtt.subscribe("esp8266/GPIO16", 0);
});

// Thc hin chc nng subscribe topic v publish cc message


mqtt.onSubscribe([](int sub_id) {
//in ra id ca cc topic subscribe l "hello/esp8266" v "MQTTlens/test/#"
Serial.printf("Subscribe topic id: %d ok\r\n", sub_id);

//publish message c ni dung hello app n topic Broker/app vi gi QoS 0 v c retain 0


mqtt.publish("Broker/app", "hello app", 0, 0);
});
106/155

// X l d liu nhn c ca cc topic subscribe


mqtt.onData([](String topic, String data, bool cont) {
Serial.printf("Data received, topic: %s, data: %s\r\n", topic.c_str(), data.c_str());

// Nu chui nhn c l 'on' s ON led trn board ESP8266 WiFi Uno, chui 'off' s OFF led
if (topic == "esp8266/GPIO16" && data[0] == 'o' && data[1] == 'n' && data[2] == '\0') {
digitalWrite(ledPin, LOW);
Serial.println("Turn on the led on board");
} else if (topic == "esp8266/GPIO16" && data[0] == 'o' && data[1] == 'f' && data[2] == 'f' && data[3] == '\0' ) {
digitalWrite(ledPin, HIGH);
Serial.println("Turn off the led on board");
}
});
// khi to broker MQTT l iot.eclipse.org s dng phng thc websocket v lng nghe client port 80
mqtt.begin("ws://iot.eclipse.org:80/ws");
}

void loop() {
// Hm khi to MQTT, kim tra v x l cc d liu t cc topic, kim tra cc thuc tnh ca giao
// thc nh gi keep-a-live, gi tin QoS, id ca topic...,
mqtt.handle();
}

Gii thch m ngun

Tng t nh m ngun ca chng trnh s dng th vin pubsubCLient, chng ta cng s khi to
ESP8266 l MQTT Client trong class MQTT ca th vin ESP8266MQTTClient. Ci t ESP8266 ch
Station v kt ni n network wifi. Chc nng ca cc hm trong th vin c gii thch file
m ngun, hm mqtt.onConnect() chng ta s subscribe topic l esp8266/GPIO16. Hm
mqtt.onSubscribe() s thc hin puslish cc message topic ch nh l Broker/app. Hm
mqtt.onData() s nhn, kim tra v x l d liu nhn c t topic subscribe. y ta s dng 1
public MQTT Broker l iot.eclipse.org, s dng phng thc Websocket l lng nghe cc MQTT Client
port 80, y l port mc nh khi s dng Websocket. Vic gi nhn d liu bng phng thc
Websocket s gip gim bng thng v tr khi truyn nhn d liu thng qua giao thc MQTT. Chi
tit v Websocket chng ta s c hc cc bi hc sau. loop() chng ta ch cn gi hm
handle() khi to v kim tra cc thuc tnh ca giao thc cng nh x l, truyn v nhn d liu t
cc topic subscribe v public.

tm hiu chi tit file cu hnh ca th vin, c th xem ti github.com/


tuanpmt/ESP8266MQTTClient/tree/master/src

Bc 3 : Ci t v s dng ng dng trn in thoi iu khin led GPIO16.

Truy cp vo App Store trn h iu hnh iOS hoc CH Play trn h iu hnh Android. nhp t kha
IoT Smartconfig v ci t ng dng IoT Smartconfig ca developer Tuan PM. Hnh nh ng dng
hin th nh bn di:

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 107/155

Hnh 55. Hnh nh ng dng IoT Smartconfig trn h iu hnh iOS v Android

ng dng ny s dng vi ESP8266 v ESP32, ngoi chc nng c bn l publish, subscribe ca giao
thc MQTT, ng dng cn c chc nng smartconfig ESP8266 v ESP32 c th d dng thit lp
kt ni vi cc network wifi khc nhau mt cch thun tin v nhanh chng m khng phi np li m
ngun.

Tip theo, trt ng dng qua phn MQTT, nhn vo nt connect kt ni n server MQTT Broker
ws://iot.eclipse.org:80/ws. Thc hin subscribe topic Broker/app v publish message vo topic
esp8266/GPIO16. Nu publish message on vo esp8266/GPIO16 th led trn board ESP8266 WiFi Uno
s sng, gi off s tt led, ng thi khi ESP8266 publish cc message topic Broker/app th ni
dung cc message s c hin th trn ng dng. Kt qu hin th nh hnh bn di:
108/155

Hnh 56. Hnh nh subcribe topic v publish cc message trn ng dng

Hnh 57. Hnh nh trn Serial terminal ca Arduino

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 109/155

MQTT Broker
phn trc chng ta s dng cc dch v MQTT Broker min ph th nghim, tuy nhin ta c th
s phi tr ph dch v vi nhng ng dng ln cn bng thng rng v tc p ng nhanh, cng
vi vic d liu c th b tn cng do bo mt thng tin cha cao. Do , phn ny, chng ta s
t mnh xy dng 1 MQTT Broker. Vic t thit lp 1 MQTT broker gip chng ta c th s dng giao
thc MQTT trn my local m khng cn kt ni n cc dch v MQTT Broker mng internet. Qu
trnh truyn, nhn v x l d liu din ra 1 cch nhanh chng cng nh bo mt thng tin ca ngi
dng. Tuy nhin, to c 1 MQTT Broker vi y tnh nng ca giao thc MQTT i hi chng
ta phi c kin thc tt v giao thc MQTT cng nh cc ngn ng lp trnh b tr cho vic xy dng
n. bt u, ta s to ra 1 MQTT Broker n gin bng cch dng 1 module h tr sn c l
Mosca.

MOSCA

Mosca l 1 trong s rt nhiu server MQTT Broker ca giao thc MQTT. C th k n cc server khc
nh HiveMQ, Apache Apollo, Mosquitto, Mongoose. Mosca c 1 s c im nh sau:

N l 1 Node.js Broker, c vit bng ngn ng JavaScript v vy c th xy dng MQTT


Broker, chng ta cn Node.js chy. Mosca c th nhng vo ng dng ca bn nu ng
dng ny c vit bng Node.js

Mosca l 1 multi-transport MQTT Broker, c ngha l n h tr tt c cc chc nng publish,


subscribe ca cc broker khc. Danh sch cc publish/subscribe broker c h tr bao gm
RabbitMQ, Redis, Mosquitto, ZeroMQ. phn ny chng ta s to ta 1 MQTT Broker n gin
dng Mosca vi s h tr ca c s d liu Mongodb

Mc tiu

Chng ta s to 1 MQTT Client l ESP8266 v 1 MQTT Client trn my tnh s dng MQTT.js nhm
kt ni n MQTT Broker , subscribe topic v publish cc message.

Dng Mosca to 1 MQTT Broker trn my tnh c nhn nhm broadcast messages (truyn b
cc gi tin) n cc MQTT Client.

Cc bc thc hin

Bc 1 : Trc tin, chng ta nn to 1 folder thit lp 1 MQTT Broker trn my local. i n


folder ny, to file package.js bng lnh npm init v thit lp cc thng tin ca d n. Tip theo,
ci t module mosca bng lnh npm install mosca --save. lng nghe cc kt ni n t
client cng nh lu tr d liu v thng tin kt ni v ni dung cc message ta cn cng c h
tr l MongoDB, bn cng c th chn Redis, Mosquitto, RabbitMQ v tm hiu thm v im
110/155

mnh, yu ca cc c s d liu ny. ci t MongoDB, chng ta s truy cp vo i ch


docs.mongodb.com/manual/administration/install-community/, ty theo h iu hnh chn
gi ci t thch hp. Sau khi ci t xong, chng ta s m port 27017 (port mc nh khi dng
mongodb, chng ta c th iu chnh port file cu hnh ca mongodb) lng nghe cc kt
ni t client thng qua lnh sudo service mongod start. Trn h iu hnh Linux, c th kim
tra cc kt ni trn h thng bng lnh Netstat nh hnh di:

Hnh 58. Hnh nh port 27017 m thnh cng v lng nghe cc kt ni

Bc 2 : To file Javascript vit m ngun cho MQTT Broker. V d v m ngun ca file


serverMosca.js c vit bn di:

M ngun file serverMosca.js

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 111/155

var mosca = require('mosca'); // Khai bo bin mosca s dng cc thuc tnh ca module mosca
// S dng th vin ascoltatore nhm h tr publish message, subscribe topic n t cc Broker/Protocol
var ascoltatore = {

type: 'mongo',
url: 'mongodb://localhost:27017/mqtt', // url: a ch url ca mongodb, server s lng nghe cc client a
// ch localhost:27017
pubsubCollection: 'ascoltatori', // pubsubCollection: Ni lu tr cc message ca mongodb
mongo: {} // mongo: Ci t dnh cho kt ni ca mongo. Khng s dng
};
var settings = {
port: 1883, // port kt ni n server
backend: ascoltatore // ascoltatore s c gi v thc thi khi to server c to thit lp cc kt ni
};

// Lnh to server s dng mosca


var server = new mosca.Server(settings);

// Thc hin hm setup, in ra mn hnh console nu c s kin ready ca server


server.on('ready', setup);
function setup() {
console.log('Mosca server is up and running');
}

// In ra dng ch client connected v id ca client khi c s kin client kt ni thnh cng n server
server.on('clientConnected', function(client) {
console.log('client connected', client.id);
});

// In ra dng ch client disconnected v id ca client khi c s kin client ngt kt ni vi server


server.on('clientDisconnected', function(client) {
console.log('client disconnected', client.id);
});

// In ra message ca client gi dng string khi c s kin client publish 1 message


server.on('published', function(packet, client) {
console.log('Published', packet.payload.toString());
});

Bc 3 : Vit m ngun cho ESP8266. nhanh chng, chng ta s dng m ngun ca th


vin ESP8266MQTTClient vit mc trc. Sa i a ch ca MQTT Broker t
mqtt.begin("mqtt://iot.eclipse.org:1883"); thnh mqtt.begin("mqtt://your-local-ip:1883"); vi your-
local-ip l a ch IP ca my tnh (v d 192.168.1.7), ch rng ESP8266 v MQTT Broker phi kt
ni chung 1 network WiFi.

Bc 4 : To MQTT Client dng MQTT.js. Chng ta s to 1 folder cha cc file ca MQTT


Client. Tng t nh bc 1 , dng npm init to file package.js v thit lp cc thng tin ca
d n. Tip theo ci t module mqtt bng lnh npm install mqtt --save v to file Javascript
vit ni dung cho MQTT Client. V d v m ngun file moscaClient.js c trnh by bn
di:

M ngun file moscaClient.js


112/155

// Khai bo bin mqtt s dng cc thuc tnh thuc module mqtt


var mqtt = require('mqtt');
// To 1 kt ni n a ch 192.168.1.7 port 1883 thng qua giao thc MQTT
var client = mqtt.connect('mqtt://192.168.1.7:1883');
// Khi c s kin connect n server, client s subscribe topic MQTTlens/test/3 v
// publish 1 message "on" vo topic hello/world ON led board ESP8266 WiFi Uno
client.on('connect', function () {
client.subscribe('Broker/app');
client.publish('esp8266/GPIO16', 'on');

})
// Khi c message gi n client, client s chuyn i d liu t Buffer sang dng String v in ra mn
// hnh console d liu nhn c v ng kt ni.
client.on('message', function (topic, message) {
// message is Buffer
console.log(message.toString());
//client.end();
})

Kt qu

Trn terminal, i n th mc cha file moscaServer.js v khi chy server bng lnh node
moscaServer.js. Server s khi ng v lng nghe cc kt ni n t cc MQTT Client. Tip theo, np
chng trnh trn Arduino cho ESP8266, sau khi chy MQTT Client trn my tnh bng lnh node
moscaClient.js. Khi c cc s kin kt ni , ngt kt ni, pushlish 1 message hay subcrible 1 topic n
t cc client th bn pha server u s hin th ni dung v thng tin. Cc terminal hin th kt qu
nh hnh bn di:

Hnh 59. Hnh nh thng tin nhn c t cc client server mosca

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 113/155

Hnh 60. Hnh nh thng tin nhn c client mqtt.js v client ESP8266

Mt s MQTT Broker s dng cho sn phm thc t

Mosquitto

Mosquitto l 1 MQTT Broker vit bng ngn ng lp trnh C. Mt s c im ni bt ca mosquitto l


tc truyn nhn v x l d liu nhanh, n nh cao, c s dng rng ri v ph hp vi
nhng ng dng embedded. Thch hp cho cc h thng nh chy trn my local nh Raspberry Pi,
bn cnh Mosquitto cng c h tr cc giao thc TLS/SSL (cc giao thc nhm xc thc server
v client, m ha cc message bo mt d liu).

Mt s nhc im ca mosquitto l kh thit k khi lm nhng ng dng ln v t phng thc xc


thc thit b nn kh nng bo mt vn cha ti u.

EMQ

EMQ (Erlang MQTT Broker) l mt MQTT Broker c vit bng ngn ng lp trnh Erlang. u im ca
EMQ l tnh n nh cao, thch hp thit k cc h thng ln do kh nng m rng ng dng d
dng cng nh kh d ci t. Ngoi ra EMQ cn h tr nhiu phng thc xc thc ngi dng,
pht trin v cp nht tnh nng lin tc bi cng ng developer. Tuy nhin im yu ca MQTT
broker ny l kh i vi nhng ngi mi bt u. Thng tin v EMQ c th xem ti trang emqttd-
docs.readthedocs.io/en/latest/#
114/155

Tng kt
T nhng ni dung trnh by trn, chng ta phn no hiu r v cch thc hot ng ca giao
thc MQTT cng nh vai tr ca n trong cc ng dng IoT. Nhng ni dung c trnh by phn
ny ch l phn c bn ca giao thc, v y l giao thc quan trng v thng s dng trong IoT nn
chng ta hy dnh nhiu thi gian hn nghin cu thm v hot ng ca cc gi QoS, Keep
alive, cng nh cc vn chng thc ti khon, vn bo mt d liu khi s dng MQTT.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 115/155

Websocket
WebSoket l cng ngh h tr giao tip hai chiu gia client v server bng cch s dng mt TCP
socket to mt kt ni lin tc, hiu qu v t tn km. Mc d c thit k chuyn s dng
cho cc ng dng web, lp trnh vin vn c th a chng vo bt k loi ng dng no.

WebSockets mi xut hin trong HTML5, cho php cc knh giao tip song song hai chiu v hin
c h tr trong nhiu trnh duyt. Kt ni c m thng qua mt HTTP request (yu cu HTTP), vi
nhng header c bit thng bo cho Server (c h tr) chuyn sang kt ni Websocket. Kt ni ny
c duy tr bn c th gi v nhn d liu mt cch lin tc, khng t qung, v khng cn bt
k HTTP header (overhead) no na.

Websocket h tr cho cc trnh duyt ph bin hin nay nh: Google Chrome, Microsoft Edge,
Internet Explorer, Firefox, Safari v Opera.

u im

WebSockets cung cp kh nng giao tip hai chiu vi kt ni c duy tr, c tr thp, gip
Server d dng giao tip vi Client. Do , websocket s ph hp cho cc ng dng real-time, ngi
dng s khng mt thi gian phi reload li trnh duyt cp nht thng tin mi nht nh khi s
dng giao thc HTTP.

Nhc im

Giao thc Websocket cha c tt c cc trnh duyt c hin nay h tr. Websocket cng i
hi cc ng dng web trn server h tr n.
116/155

S dng ESP8266 nh Websocket Server


Trong phn ny, chng ta s thit lp ng dng s dng ESP8266 nh 1 Websocket Server v Trnh
duyt nh l mt Web Socket Client cp nht trng thi nt nhn, cng nh iu khin n LED
trn board thi gian thc thng qua Trnh duyt.

Yu cu

Khi ng 1 Webserver (c h tr Websocket) trn chip ESP8266.

Khi truy cp vo a ch IP ca ESP8266 s tr v 1 file HTML bao gm ni dung ca on


Javascript thit lp kt ni Websocket n ESP8266 ng thi lng nghe cc gi tin t ESP8266
Server.

Khi nhn nt trn board ESP8266 s gi ni dung trng thi nt nht n Web Browser hin th
dng hp kim (checkbox), nhn nt l c kim, khng nhn nt l khng c kim.

ng thi khi nhn hp kim trn trnh duyt s thay i trng thi n LED trn board
ESP8266.

Chun b

Ci t th vin, xem thm Ci t th vin Arduino:

github.com/me-no-dev/ESPAsyncWebServer

github.com/me-no-dev/ESPAsyncTCP

Gii thiu v th vin ESPAsyncWebServer

Th vin ESPAsyncWebServer dng cho vic thit lp HTTP server v websocket server cho module
ESP8266, v x l cc s kin trn server-client.

cc chng trnh dng th vin ESPAsyncWebserver hoat ng, ta cn dng thm th vin
ESPAsyncTCP.

on code Javascript to kt ni Web Socket

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 117/155

//Trnh t m mt websocket c bn:

var ws = new WebSocket('ws://domain.com:8000/'); // m 1 websocket


ws.onopen = function() //
{
// s kin khi websocket c m thnh cng
};

ws.onmessage = function(evt)
{
// s kin xy ra khi client nhn d liu t server
};
ws.onclose = function() {
// s kin khi websocket b ng
};

Nhng file HTML cha on code JS vo ESP8266


118/155

<!DOCTYPE HTML>
<html>
<head>
<title>ESP8266 WebSocket</title>
</head>
<body>
<div> Webscoket status <span id="status" style="font-weight: bold;"> disconnected </span> </div>
<div> ESP8266 Button Status <input type="checkbox" id="btn" name="btn" /> </div>
<div> Control LED <input type="checkbox" id="led" name="led" disabled="true" /> </div>

<script type="text/javascript">
var button = document.getElementById('btn');
var led = document.getElementById('led');
var url = window.location.host; // hm tr v url ca trang hin ti km theo port
var ws = new WebSocket('ws://' + url + '/ws'); // m 1 websocket vi port 8000
ws.onopen = function() //khi websocket c m th hm ny s c thc hin
{
document.getElementById('status').innerHTML = 'Connected';
led.disabled = false; //khi websocket c m, mi cho php
};

ws.onmessage = function(evt) // s kin xy ra khi client nhn d liu t server


{
if(evt.data == 'BTN_PRESSED') {
button.checked = true;
} else if(evt.data == 'BTN_RELEASE') {
button.checked = false;
}
};
ws.onclose = function() { // hm ny s c thc hin khi ng websocket
led.disabled = true;
document.getElementById('status').innerHTML = 'Disconnected';
};

led.onchange = function() { // thc hin thay i bt/tt led


var status = 'LED_OFF';
if (led.checked) {
status = 'LED_ON';
}
ws.send(status)
}

</script>
</body>
</html>

Chng trnh hon chnh cho ESP8266

#include <ESP8266WiFi.h>
#include <ESPAsyncWebServer.h>

const char* ssid = "******";


const char* password = "*********";
const int LED = 16;
const int BTN = 0;

// a on code HTML vo chng trnh Arduino, cn chuyn i code HTML sang dng char

const char index_html[] PROGMEM = ""


"<!DOCTYPE HTML>"
"<html>"
"<head>"
" <title>ESP8266 WebSocket</title>"

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 119/155

"</head>"
"<body>"
" <div> Webscoket status <span id=\"status\" style=\"font-weight: bold;\"> disconnected </span> </div>"
" <div> ESP8266 Button Status <input type=\"checkbox\" id=\"btn\" name=\"btn\" /> </div>"
" <div> Control LED <input type=\"checkbox\" id=\"led\" name=\"led\" disabled=\"true\" /> </div>"
" <script type=\"text/javascript\">"
" var button = document.getElementById('btn');"
" var led = document.getElementById('led');"
" var status = document.getElementById('status');"
" var url = window.location.host;"
" var ws = new WebSocket('ws://' + url + '/ws');"
" ws.onopen = function()"
" {"
" status.text = 'Connected';"
" led.disabled = false;"
" };"
" ws.onmessage = function(evt)"
" {"
" if(evt.data == 'BTN_PRESSED') {"
" button.checked = true;"
" } else if(evt.data == 'BTN_RELEASE') {"
" button.checked = false;"
" }"
" };"
" ws.onclose = function() {"
" led.disabled = true;"
" status.text = 'Disconnected';"
" };"
" led.onchange = function() {"
" var status = 'LED_OFF';"
" if (led.checked) {"
" status = 'LED_ON';"
" }"
" ws.send(status)"
" }"
" </script>"
"</body>"
"</html>";

AsyncWebServer server(8000);
AsyncWebSocket ws("/ws");

// Hm x l s kin trn Server khi client l browser pht s kin


void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data,
size_t len) {
if (type == WS_EVT_DATA && len > 0) { // type: loi s kin m server nhn c. Nu s kin nhn c l t
websocket th bt u x l
data[len] = 0;
String data_str = String((char*)data); // p kiu, i t kiu char sang String
if (data_str == "LED_ON") {
digitalWrite(LED, 0); // Khi client pht s kin "LED_ON" th server s bt LED
} else if (data_str == "LED_OFF") {
digitalWrite(LED, 1); // Khi client pht s kin "LED_OFF" th server s tt LED
}
}

}
void setup()
{
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT);
Serial.begin(115200);
Serial.setDebugOutput(true);
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);
if (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.printf("STA: Failed!\n");
120/155

WiFi.disconnect(false);
delay(1000);
WiFi.begin(ssid, password);
}

ws.onEvent(onWsEvent); // gi hm onWsEvent
server.addHandler(&ws);
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {

request->send_P(200, "text/html", index_html); // tr v file index.html trn giao din browser khi browser truy cp
vo IP ca server
});
server.begin(); // khi ng server

void loop()
{
static bool isPressed = false;
if (!isPressed && digitalRead(BTN) == 0) { //Nhn nt nhn GPIO0
isPressed = true;
ws.textAll("BTN_PRESSED");
} else if (isPressed && digitalRead(BTN)) { //Nh nt nhn GPIO0
isPressed = false;
ws.textAll("BTN_RELEASE");
}
}

Thc hin sau khi kim tra m ngun:

Chn Board ESP8266 WiFi Uno trong Arduino IDE

Np chng trnh xung board dng Arduino IDE

Kt qu

Sau khi bin dch xong code trn Arduino, ta vo browser, truy cp vo a ch IP ca ESP8266 tr
v trn Serial Monitor cng vi port thit lp trn server, trng hp ny l 192.168.1.65:8000

Hnh 61. Ca s trnh duyt c th iu khin ESP8266 thng qua Web Socket

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 121/155

Video kt qu

https://www.youtube.com/watch?v=pN3YSLiWbHk (YouTube video)


122/155

S dng ESP8266 nh Websocket Client


Trong mt s ng dng khc, chng ta c 1 Server Websocket thc hin cc tc v thi gian thc
nh ng dng in thoi, trnh duyt Web. Th ESP8266 c th kt ni trc tip vo cc server ny
nh 1 Websocket Client tip nhn, hoc gi thng tin thng qua Websocket.

Mt s dch v s dng Websocket in hnh nh dch v tin nhn Slack, dch v c s d liu thi
gian thc Firebase

phn ny, chng ta s s dng Node.js t xy dng 1 Web server, va ng vai tr l 1


Websocket Server. C nhng tnh nng:

C th cung cp file index.html cha cc on m javascript to kt ni Websocket gia trnh


duyt vi Server, ging nh phn Server Nodejs

Cho php kt ni Websocket n, bao gm t trnh duyt, hay t ESP8266

Server s broadcast tt c cc gi tin t bt k 1 client no gi n, ti tt c cc client cn li.

Vi tnh nng nh trn th bn c th hnh dung nh sau: Nu 1 ca s trnh duyt c kt ni


Websocket n Server, khi nhn 1 nt kim, th s gi v server trng thi ca nt kim . V d
LED_ON, server nhn c s gi d liu LED_ON n cc trnh duyt cn li (hoc bao gm c
ESP8266), v trnh duyt cn li s hin th trng thi nt kim ny ang bt.

Hnh 62. Hai ca s trnh duyt s hin th trng thi nt kim ging nhau khi click thay i

Javascript Websocket Client trn trnh duyt

Vi file index.html c cha m ngun Javascript to kt ni n Websocket, cng th mc vi file


server.js

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 123/155

index.html

<!DOCTYPE HTML>
<html>
<head>
<title>ESP8266 WebSocket</title>
</head>
<body>
<div> Webscoket status <span id="status" style="font-weight: bold;"> disconnected </span> </div>
<div> ESP8266 Button Status <input type="checkbox" id="btn" name="btn" /> </div>
<div> Control LED <input type="checkbox" id="led" name="led" disabled="true" /> </div>

<script type="text/javascript">
var button = document.getElementById('btn');
var led = document.getElementById('led');
var url = window.location.host; // hm tr v url ca trang hin ti km theo port
var ws = new WebSocket('ws://' + url + '/ws'); // m 1 websocket vi port 8000
console.log('connecting...')
ws.onopen = function() //khi websocket c m th hm ny s c thc hin
{
document.getElementById('status').innerHTML = 'Connected';
led.disabled = false; //khi websocket c m, mi cho php
console.log('connected...')
};

ws.onmessage = function(evt) // s kin xy ra khi client nhn d liu t server


{
console.log(evt.data)
if(evt.data == 'BTN_PRESSED') {
button.checked = true;
} else if(evt.data == 'BTN_RELEASE') {
button.checked = false;
} else if(evt.data == 'LED_OFF') {
led.checked = false;
} else if(evt.data == 'LED_ON') {
led.checked = true;
}
};
ws.onclose = function() { // hm ny s c thc hin khi ng websocket
led.disabled = true;
document.getElementById('status').innerHTML = 'Connected';
};

led.onchange = function() { // thc hin thay i bt/tt led


var led_status = 'LED_OFF';
if (led.checked) {
led_status = 'LED_ON';
}
ws.send(led_status)
}

</script>
</body>
</html>

Node.js Websocket Server

Trong phn ny chng ta cn dng th vin Websocket ws github.com/websockets/ws. Bn c th


ci t bng cch thc thi lnh:

npm install ws
124/155

server.js

var fs = require('fs');
var url = require('url');
var http = require('http');
var WebSocket = require('ws');

// function gi yu cu(response) t pha server hoc nhn yu cu (request) ca client gi ln


function requestHandler(request, response) {
fs.readFile('./index.html', function(error, content) {
response.writeHead(200, {
'Content-Type': 'text/html'
});
response.end(content);
});

// create http server


var server = http.createServer(requestHandler);
var ws = new WebSocket.Server({ server });
var clients = [];

function broadcast(socket, data) {


console.log(clients.length);
for(var i=0; i<clients.length; i++) {
if(clients[i] != socket) {
clients[i].send(data);
}
}
}
ws.on('connection', function(socket, req) {
clients.push(socket);

socket.on('message', function(message) {
console.log('received: %s', message);
broadcast(socket, message);
});

socket.on('close', function() {
var index = clients.indexOf(socket);
clients.splice(index, 1);
console.log('disconnected');
});
});

server.listen(8000);
console.log('Server listening on port 8000');

ESP8266 Websocket Client

github.com/Links2004/arduinoWebSockets

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 125/155

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <WebSocketsClient.h> //https://github.com/Links2004/arduinoWebSockets
WebSocketsClient webSocket;

const char* ssid = "...";


const char* password = "...";
const int LED = 16;
const int BTN = 0;

void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) {


switch (type) {
case WStype_DISCONNECTED:
Serial.printf("[WSc] Disconnected!\n");
break;
case WStype_CONNECTED:
{
Serial.printf("[WSc] Connected to url: %s\n", payload);
}
break;
case WStype_TEXT:
Serial.printf("[WSc] get text: %s\n", payload);
if(strcmp((char*)payload, "LED_ON") == 0) {
digitalWrite(LED, 0); // Khi client pht s kin "LED_ON" th server s bt LED
} else if(strcmp((char*)payload, "LED_OFF") == 0) {
digitalWrite(LED, 1); // Khi client pht s kin "LED_OFF" th server s tt LED
}
break;
case WStype_BIN:
Serial.printf("[WSc] get binary length: %u\n", length);
break;
}
}

void setup() {
pinMode(LED, OUTPUT);
pinMode(BTN, INPUT);
Serial.begin(115200);
Serial.println("ESP8266 Websocket Client");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

webSocket.begin("192.168.0.106", 8000);
webSocket.onEvent(webSocketEvent);

void loop() {
webSocket.loop();
static bool isPressed = false;
if (!isPressed && digitalRead(BTN) == 0) { //Nhn nt nhn GPIO0
isPressed = true;
webSocket.sendTXT("BTN_PRESSED");
} else if (isPressed && digitalRead(BTN)) { //Nh nt nhn GPIO0
isPressed = false;
webSocket.sendTXT("BTN_RELEASE");
}
}
126/155

Hnh 63. Click nt kim s thay i trng thi LED trn board

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 127/155

Tng kt
Vic s dng giao thc websocket s c nhiu li ch cho cc kt ni 2 chiu, lun c duy tr v c
tr thp.
128/155

Firmware update over the


air (FOTA)
Cc phng php pht trin phn mm v sn phm ph bin hin nay, th xut bn kt qu tng
giai on thng mang li hiu qu cao, sn phm c th n tay ngi dng sm, nhn c phn
hi sm t khch hng, v c iu chnh hp l hn. Chnh vic pht hnh sn phm sm
thng s t tnh nng v cn cp nht thm tnh nng, nng cao cht lng sn phm trong tng
lai.

Cp nht ng dng t xa trn cc phn mm in thoi, my tnh rt ph bin. Cc phn mm


c cp nht hng tun, thng sa li, nng cp tnh nng.

i vi cc sn phm phn cng cng tng t, chng ta nn b sung cc tnh nng cp nht t xa
ngay t giai on pht trin sn phm. Ngoi vic gip nng cp cc tnh nng trong tng lai mt
cch d dng, th vn sa li, nng cp h thng t xa s gip tit kim c rt nhiu chi ph v
ngun lc.

Trong phn ny, chng ta s tm hiu cc phng php cp nht t xa cho ESP8266, lm sao np
Firmware khng dy cho module, lm sao ESP8266 c th t ti Firmware v, lm sao ESP8266
c th t khi ng 1 HTTP Server c giao din Web upload firmware ln chip.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 129/155

Cp nht firmware t xa
Cp nht firmware OTA (Over the Air) l tin trnh ti firmware mi vo ESP8266 module thay v s
dng cng Serial. Tnh nng ny thc s rt hu dng trong nhiu trng hp gii hn v kt ni vt
l n ESP Module.

OTA c th thc hin vi:

Arduino IDE

Web Browser

HTTP Server

S dng OTA vi ty chn dng Arduino IDE trong qu trnh pht trin, th nghim, 2 ty chn cn li
ph hp cho vic trin khai ng dng thc t, cung cp tnh nng cp nht OTA thng qua web hay
s dng HTTP Server.

Trong tt c cc trng hp, th Firmware h tr OTA phi c np ln u tin qua cng Serial, nu
mi th hot ng trn tru, logic ng dng OTA hot ng ng th c th thc hin vic cp nht
firmware thng qua OTA.

S khng c m bo an ninh i vi qu trnh cp nht OTA b hack. N ph thuc vo nh pht


trin m bo vic cp nht c php t ngun hp php, ng tin cy. Khi cp nht hon tt,
ESP8266 s khi ng li v thc thi code mi. Nh pht trin phi m bo ng dng thc trn
module phi c tt v khi ng li 1 cch an ton. Ni dung bn di cung cp b sung cc thng
tin v an ninh, v an ton cho tin trnh cp nht OTA.

Bo mt

Khi ESP8266 c php thc thi OTA, c ngha n c kt ni mng khng dy v c kh nng c
cp nhp Sketch mi. Cho nn kh nng ESP8266 b tn cng s nhiu hn v b np bi m thc thi
khc l rt cao. gim kh nng b tn cng cn xem xt bo v cp nht ca bn vi mt mt
khu, cng s dng c nh khc bit, v.v

Kim tra nhng tnh nng c cung cp bi th vin ArduinoOTA thng xuyn, c th c nng
cp kh nng bo v an ton:

void setPort(uint16_t port);


void setHostname(const char* hostname);
void setPassword(const char* password);

Mt s chc nng bo v c xy dng trong v khng yu cu bt k m ha no cho nh pht


trin. ArduinoOTA v espota.py s dng Digest-MD5 chng thc vic ti firmware ln. n gin l
m bo tnh ton vn ca firmware bng vic tnh MD5.
130/155

Hy phn tch ri ro cho ring ng dng ca bn v ty thuc vo ng dng m quyt nh nhng


chc nng cng nh th vin thc hin. Nu cn thit, c th xem xt vic thc hin cc phng
thc bo v khi b hack, v d nh cp nht OTA ch cho ti ln ch theo lch trnh c th, kch hot
OTA ch c ngi dng nhn nt chuyn dng Cp nht, v.v

An ton

Qu trnh OTA tiu tn ngun ti nguyn v bng thng ca ESP8266 khi ti ln. Sau , ESP8266
c khi ng li v mt Sketch mi c thc thi. Cn phn tch v kim tra nh hng ca qu
trnh ny ti cc chc nng c v sketch mi ca ESP module.

Nu ESP c t xa v iu khin mt vi thit b, ta nn ch ti hot ng ca thit b nu thit


b ngng hot ng t xut do qu trnh cp nht. Do , ta cn phi xc nh c trng thi lm
vic an ton ca thit b trc qu trnh cp nht. V d, module c dng iu khin h thng
ti nc t ng trong vn. Nu trong qu trnh hot ng m h thng iu khin b tt t ngt
v cc van b m, th c vn s b ngp nc.

Cc hm sau y c cung cp bi th vin ArduinoOTA v c dng x l ng dng trong qu


trnh cp nht OTA hoc x l khi OTA gp li:

void onStart(OTA_CALLBACK(fn));
void onEnd(OTA_CALLBACK(fn));
void onProgress(OTA_CALLBACK_PROGRESS(fn));
void onError(OTA_CALLBACK_ERROR (fn));

Yu cu cn bn

B nh Flash phi c dung lng lu c sketch c (ang vn hnh trn h thng) v sketch
mi (cp nht OTA).

H thng File v EEPROM cng cn dung lng lu tr.

Hm ESP.getFreeSketchSpace(); c dng kim tra dung lng trng cho sketch mi.

Update process - memory view

Sketch mi s c cha trong dung lng trng ga sketch c v spiff.

Trong ln reboot tip theo th eboot bootloader kim tra cc cu lnh.

Sketch mi s c copy.

Sketch mi khi ng.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 131/155
132/155

OTA s dng Arduino IDE


Thc hin OTA vi Arduino IDE ch nn thc hin khi:

S dng np firmware cho module ESP8266 thng qua WiFi m khng dng cng Serial

ESP8266 v my tnh chy Arduino IDE s dng chung mng WiFi ni b

ESP8266 kt ni thnh cng vo mng WiFi

Np firmware h tr OTA thng qua cng Serial trc

Trc khi bt u, cn phi chc chn Arduino IDE c ci t phin bn mi nht, bao gm gi
ESP8266 cho Arudino, v Python 2.7

Bc 1: np firmware h tr OTA thng qua cng


Serial

M sketch v d mu BasicOTA.ino. Vo File > Examples > ArduinoOTA.

Hnh 64. M sketch v d mu OTA

Cung cp chnh xc SSID v mt khu mng WiFi ang dng ESP8266 c th kt ni vo

Cung cp SSID v password

const char* ssid = "..........";


const char* password = "..........";

Ty vo phin bn v board ESP bn s dng, bn c th thy ``Upload Using:``


trong menu. La chn ny s khng hot ng v khng nh hng ti la
chn ca bn. Chc nng ny tng thch vi cc phin bn OTA c v b g b
platform package version 2.2.0.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 133/155

Upload sketch Ctrl+U Khi hon thnh, m Serial Monitor Ctrl+Shift+M (xem S dng Arduino IDE Serial
Monitor) v kim tra module trup cp c WIFI cha

Hnh 65. Kim tra module ESP8266 truy cp c mng WiFi ni b cha

ESP module nn c reset sau khi Upload xong firmware


134/155

#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>

const char* ssid = "...";


const char* password = "...";

void setup() {
Serial.begin(115200);
Serial.println("Booting");
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
Serial.println("Connection Failed! Rebooting...");
delay(5000);
ESP.restart();
}
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH)
type = "sketch";
else // U_SPIFFS
type = "filesystem";

// NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
else if (error == OTA_END_ERROR) Serial.println("End Failed");
});
ArduinoOTA.setPassword((const char *)"ota-pass");
ArduinoOTA.begin();
Serial.println("Ready");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
}

void loop() {
ArduinoOTA.handle();
}

Bc 2: La chn cng np thng qua OTA

Khi module kt ni ti mng WiFi thnh cng, sau vi giy, cng esp8266-ota s xut hin trn
Arduino IDE. Lc ny bn hon ton c th b kt ni Serial t board mch n my tnh. Arduino IDE
c th np firmware mi thng qua WiFi. Chn port vi a ch IP hin trn ca s Serial Monitor
bc trc.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 135/155

Hnh 66. Chn cng np t Network

Nu cng OTA khng hin ln, bn cn thot Arduino IDE, v m li. Kim tra li

port OTA. Nu vn tip tc khng hin th cng OTA, kim tra tng la ca my
v cc ci t trn router.

Bc 3: Sa firmware mi v np li thng qua WiFi

Sau khi chn ng cng np OTA, bn hon ton c th sa li firmware mi v np thng qua
WiFi, tuy nhin cn lu nh sau:

Firmware mi phi m bo kt ni n WiFi khng b mt (v d cp sai mt khu)

Firmware mi phi c cc hm khi to v x l OTA nh Bc 1: np firmware h tr OTA thng


qua cng Serial
136/155

Hnh 67. Np firmware thnh cng thng qua OTA

S dng mt khu

Bo v qu trnh upload OTA vi password l mt qu trnh kh n gn. Nhng vic bn cn lm l


b sung on m ngun:

ArduinoOTA.setPassword((const char *)"your-password");

Sau upload li sketch mt ln na (dng OTA). Sau khi bin dch v upload xong, ca s s hin
ln yu cu nhp password:

Hnh 68. Password cho OTA

Nhp password, nu ng, kt qu l thng bo Authenticating...OK v qu trnh np din ra bnh


thng.

Cc ln np sau Arduino IDE s nh mt khu v khng hi li, tr khi bn thay i mt khu OTA, v
cc bc xc thc khng thnh cng, Arduino IDE s hi li bn.

Cn lu l password c th d dng thy c, nu IDE khng c ng sau ln upload cui

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 137/155

cng. Vic ny c th c thc hin bng cch cho php Show verbose ouput during: upload trong
File > Preferences v upload ln module.

Nhng s c thng gp

Nu vic cp nht OTA tht bi, bc u tin bn cn lm l kim tra phn bo li hin trn ca s
Log ca Arduino IDE. Nu vic ny khng gip c bn, hy upload li khi kim tra cc thng tin ca
ESP hin trn serial port.

Cc nguyn nhn ph bin gy li OTA nh sau:

Khng dung lng b nh trn chip (v d nh ESP01 vi 512KB b nh flash khng cho
OTA).

Khu vc d liu cho SPIFFS qu nhiu, khng cn cha firmware, trong trng hp bn c
4MB Flash th trng hp ny khng xy ra.

Khu vc b nh cha firmware qu t, ti thiu l 512KB

Khng reset module ESP sau ln upload u dng Serial Port.


138/155

Cp nht Firmware dng Web Browser


Khi thc hin cp nht firmware dng Web Browser, ESP8266 s khi ng 1 HTTP Server, vi 1 form
upload. Khi truy cp ng a ch ca n, bn s c cung cp 1 giao din chn file binary, v
upload ln Chip. Vic ny hu dng khi khng dng Arudino IDE cho vic cp nht, s dng lun trnh
duyt sn c. Hoc tch hp vo 1 ng dng m bn c th mun cp nht n trong tng.

Cp nht vi web browser c thc hin bng th vin ESP8266HTTPUpdateServer cng vi 2 th


vin khc ESP8266WebServer v ESP8266mDNS cho vic nhn din ESP8266 trong mng ni b.

Thc hin

M v d: File > Examples > ESP8266HTTPUpdateServer > WebUpdater

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>

const char* host = "esp8266-webupdate";


const char* ssid = "...";
const char* password = "...";

ESP8266WebServer httpServer(80);
ESP8266HTTPUpdateServer httpUpdater;

void setup(void){

Serial.begin(115200);
Serial.println();
Serial.println("Booting Sketch...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid, password);

while(WiFi.waitForConnectResult() != WL_CONNECTED){
WiFi.begin(ssid, password);
Serial.println("WiFi failed, retrying.");
}

MDNS.begin(host);
httpUpdater.setup(&httpServer);
httpServer.begin();

MDNS.addService("http", "tcp", 80);


Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", host);
}

void loop(void){
httpServer.handleClient();
}

Cung cp ng SSID v mt khu mng WiFi my tnh bn ang dng, np Firmware WebUpdater vo
ESP8266 Chn Board ESP8266 WiFi Uno trong Arduino IDE v Np chng trnh xung board dng
Arduino IDE

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 139/155

Lu l my tnh phi s dng mng WiFi cng vi ESP8266

Khi bn khng th truy cp vo module ESP8266 theo cng Serial, th nhn din c a ch IP
ca module trong mng LAN, bn cn chy dch v mDNS trn my tnh. Dch v ny sn c trong
MacOS, tuy nhin, vi Linux th bn cn ci t Avahi: avahi.org/, cn Windows th Bonjour:
support.apple.com/downloads/bonjour_for_windows

Vi dch v mDNS chy trn my tnh, bn d dng truy cp vo ESP8266 theo ng dn esp8266-
webupdate.local/update

Hnh 69. Giao din Web cp nht firmware

Bng cch chn file v nhn cp nht, ESP8266 s tin hnh cp nht firmware mi do bn gi ln.
File ny c th c xut ra bng cch Sketch > Export compiled Binary, v file .bin s nm trong th
mc ca Sketch

Hnh 70. Xut file Binary


140/155

Khi nhp esp8266-webupdate.local/update m khng thc hin c, hy


thay esp8266-webupdate vi a ch IP ca module (bn c th xem trong

modem/router, hay Serial Terminal). V d, nu IP ca module l 192.168.1.100 th


URL phi l 192.168.1.100/update. Phng php ny hu hiu trong trng hp
host software ci t bc 1 khng hot ng.

Nu cc bc din ra thnh cng tt p, th trn trnh duyt v ca s Serial Terminal (nu m) nh


hnh

Hnh 71. Thc hin thnh cng cp nht Firmware s dng WebUpdater

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 141/155

Bo mt

Nu b sung WebUpdater vo sn phm ca mnh, d nhin bn s khng mun ngi khc t do a


vo thit b 1 firmware khc. Hy s dng hm httpUpdater.setup(&httpServer, update_path,
update_username, update_password); vi cc thng s username, password m bt buc bn phi
nhp ng mi c php upload firmware mi.

M v d : File > Examples > ESP8266HTTPUpdateServer > SecureWebUpdater xem chi tit
142/155

HTTP Server
Vi 2 phng php trc, bn d dng cp nht Firmware thng qua mng WiFi ni b. Tuy nhin, khi
trin khai ng dng thc t, chng ta s cn cp nht Firmware t xa thng qua Internet, v cn 1
Server lu tr firmware, qun l cc phin bn.

Mt kch bn ph thng thng c lm nht l:

Khi ESP8266 khi ng (khong sau 1 khong thi gian - v d nh 1 ngy), n s kt ni n


Server, cung cp thng tin phin bn hin c ca n

Server khi nhn thy phin bn hin ti cn phi c nng cp, n s tr v firmware mi

Nu phin bn hin ti ca ESP8266 khng cn phi cp nht, n s tr v m 304.

thc hin c iu ny, chng ta cn thc hin trn c ESP8266 v trn Server side. Th nghim
trong mc ny, chng ta s dng Node.js lm server. Bn hon ton c th thc thi on code
Server ny v gn cho n domain c th truy cp t bt k u.

ESP8266 ESPhttpUpdate

Bng cch thc thi ESPhttpUpdate.update("your-domain.com", 8000, "/fimrware.bin");, ESP8266 s t


ng kt ni ti server a ch your-domain.com:8000/fimrware.bin ti phin bn firmware mi
v. M HTTP Status Code:

(M) 200: Nu tn ti firmware mi, v ni dung file s c gi km sau

(M) 304: Thng bo l khng c bn update mi.

on m c th d dng tm thy File > Examples > ESPhttpUpdate > httpUpdate

Bn cn cung cp SSID, mt khu WiFi chnh xc, thc hin Chn Board ESP8266 WiFi Uno trong
Arduino IDE v Np chng trnh xung board dng Arduino IDE

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 143/155

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266httpUpdate.h>

const char* ssid = "...";


const char* password = "...";
const char *currentVersion = "1.0";
const char *serverUrl = "http://192.168.0.106:8000/firmware.bin";
void setup() {

Serial.begin(115200);
Serial.println();
Serial.println();
Serial.print("ESP8266 http update, current version: ");
Serial.println(currentVersion);

WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
t_httpUpdate_return ret = ESPhttpUpdate.update(serverUrl, currentVersion);
switch (ret) {
case HTTP_UPDATE_FAILED:
Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(),
ESPhttpUpdate.getLastErrorString().c_str());
break;

case HTTP_UPDATE_NO_UPDATES:
Serial.println("HTTP_UPDATE_NO_UPDATES");
break;
case HTTP_UPDATE_OK:
Serial.println("HTTP_UPDATE_OK");
break;
}

void loop() {
}

Phin bn firmware ca bn, gi s bn thay i l 2.0 v t ln server, sau bn i li 1.0 v


np vo board

ng dn n firmware ca bn, l a ch web, ip, hay domain


144/155

Node.js OTA Server


Khi ESP8266 kt ni ti Web Server, th n s cung cp cc thng tin Header Server cn c vo
nh gi firmware c cn phi cp nht hay khng. V d v cc header

[HTTP_USER_AGENT] => ESP8266-http-Update


[HTTP_X_ESP8266_STA_MAC] => 18:FE:AA:AA:AA:AA
[HTTP_X_ESP8266_AP_MAC] => 1A:FE:AA:AA:AA:AA
[HTTP_X_ESP8266_FREE_SPACE] => 671744
[HTTP_X_ESP8266_SKETCH_SIZE] => 373940
[HTTP_X_ESP8266_SKETCH_MD5] => a56f8ef78a0bebd812f62067daf1408a
[HTTP_X_ESP8266_CHIP_SIZE] => 4194304
[HTTP_X_ESP8266_SDK_VERSION] => 1.3.0
[HTTP_X_ESP8266_VERSION] => 1.0

Da trn kin thc phn Server Nodejs, chng ta xy dng 1 OTA Server dng Node.js nh sau

server.js

var fs = require('fs');
var url = require('url');
var http = require('http');
var querystring = require('querystring');
var crypto = require('crypto');
// function gi yu cu(response) t pha server hoc nhn yu cu (request) ca client gi ln
function requestHandler(request, response) {

// Gi s a ch yu cu firmware http://192.168.1.7:8000/firmware.bin
var uriData = url.parse(request.url);
var pathname = uriData.pathname; // /firmware.bin

if (pathname == '/firmware.bin') {
var ver = request.headers['x-esp8266-version'];
console.log('Client request update, version ', ver);
if(ver == '1.0') {
console.log('Send firmware 2.0 to client');
fs.readFile('./esp8266-firmware-2.0.bin', function(error, content) {
response.writeHead(200, {
'Content-Type': 'binary/octet-stream',
'Content-Length': Buffer.byteLength(content),
'x-MD5': crypto.createHash('md5').update(content).digest("hex")
});
response.end(content);
});
} else {
response.statusCode = 304;
response.end();
}
}
}
var server = http.createServer(requestHandler);
server.listen(8000);
console.log('Server listening on port 8000');

Thc thi node server.js khi ng Server

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 145/155

Khi bn lm vic vi cc ngn ng lp trnh khc, lun phi m bo khi gi v


client cn c y thng tin header Content-Length v x-MD5

Bn cn file esp8266-firware-2.0.bin mc ESP8266 ESPhttpUpdate bin dch


vi currentVersion = "2.0" t cng th mc vi file server.js

Nu bn thc hin y cc bc nh trn, kt qu thc thi s nh hnh

Hnh 72. Kt qu thc hin OTA s dng HTTP Server


146/155

Cheatsheet
Phn ny cung cp thng tin cho vic tra cu nhanh cc hm c th s dng vi Arduino, ESP8266
v ngn ng lp trnh C. C rt nhiu th vin cho Arduino cung cp cc tnh nng hu ch thng qua
cc API cho php ngi s dng gi, ni dung tm lc y ch cp ti cc th vin thng
xuyn c s dng nht. Nu bn s dng cc th vin khc, hon ton c th tra cu d dng
trong ti liu s dng ca th vin . Thng thng cc th vin c pht hnh ngun m trn
Github s c file README.md cung cp y cc thng tin.

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 147/155

Arduino - ESP8266 Cheatsheet

/* CU TRC C BN CA 1 SKETCH */ /* D LIU KIU CHUI */


void setup() { /* Chui bao gm k t kt thc chui \0 (null) */
/* char str1[8] = {'A','r','d','u','i','n','o','\0'};
Hm c gi khi bt u sketch. Dng khi to /* Trnh bin dch t ng thm k t \0 vo cui
bin, cu hnh chn, khi to th vin... chui */
Code trong setup ch chy 1 ln (khi khi ng hoc char str2[8] = {'A','r','d','u','i','n','o'};
reset board) /* Khai bo chui ,khng khai bo s phn t v gn gi
*/ tr chui*/
} char str3[] = "Arduino";
void loop() { /* Khai bo v gn gi tr cho chui */
// Ni dung trong loop() lp li lin tc char str4[8] = "Arduino";
}
/* D LIU KIU MNG */
/* LNH R NHNH */ /* Khai bo mng kiu int c 6 phn t v gn gi tr
if (x < 5) // thc thi code nu x<5 cho mi phn t */
{ code } int myPins[] = {2, 4, 8, 3, 6};
else if (x > 10)// thc thi code nu x>10 /* Mng kiu int 6 phn t v khng gn gi tr */
{ code } int myInts[6];
else { code } // thc thi code cc trng hp cn li myInts[0] = 42; // Gn gi tr 42 cho phn t u tin
myInts[6] = 12; // LI ! ch s ca mng ch t 0 n 5
switch (var) { // thc thi case c gi tr var
case 1: /*Qualifiers*/
... static // Khng thay i gi tr cc ln gi
break; volatile // In RAM (Thng dng trong ngt)
case 2: const // Khng i (ch c)
... PROGMEM /* Cho php lu tr d liu trong b nh
break; FLASH thay v SRAM */
default:
... /* CC TON T, PHP TON THNG DNG */
} /* Cc ton t thng dng */
= ton t bng
/* CC KIU VNG LP */ + ton t cng
/* Thc hin code nu x<5 */ - ton t tr
while (x < 5) { code }; * ton t nhn
/* Thc hin code, so snh, nu x<0 tip tc thc hin / ton t chia ly phn nguyn
code */ % ton t chia ly phn d
do { code } while(x < 0); == php so snh bng
/* Khi to i, thc hin code v tng i nu i < 10 */ != php so snh khng khng bng (khc)
for (int i = 0; i < 10; i++) { code }; < php so snh nh hn
/* Thot ra vng lp (for, while, do-while) ngay lp > php so snh ln hn
tc */ <= php so snh nh hn hoc bng
break; >= php so snh ln hn hoc bng
/* i n chu k lp tip theo ca vng lp hin ti */ && php ton logic (AND)
continue; || php ton logic (OR)
! php ton logic (NOT)
/* CC NH NGHA V HM*/
<ret. type> <name>(<params>) { ... } /* Cc ton t hp nht */
int func_name(int x) { return x*2; } ++ tng 1 n v
return x; // x phi trng khp vi ki tr v ca hm -- gim 1 n v
return; // loi return dnh cho hm void += php ton cng v gn gi tr
ex: x = 5; x+= 1; //x = 6
/* INCLUDE */ -= php ton tr v gn gi tr
/* include th vin chun */ ex: x = 5; x-= 1; //x = 4
#include <stdio.h> *= php ton nhn v gn gi tr
/* include th vin to bi ngi dng */ ex: x = 5; x*= 3; //x = 15
#include "your-library.h" /= php ton chia ly phn nguyn v gn gi tr
ex: x = 6; x/= 2; //x = 3
148/155

ex: x = 6; x/= 2; //x = 3 analogWrite(pin, value)


&= php ton logic AND v gn gi tr /* ESP8266: thay i RANGE PWM output */
ex: x = 0b1010; x&= 0110; //x =0b0010 analogWriteRange(new_range)
|= php ton logic OR v gn gi tr /* ESP8266: Tn s PWM output */
ex: x = 0b1010; x&= 0110; //x =0b1110 analogWriteFreq(new_frequency)

/* Cc ton t trn bit */ /* ADVANCED I/O */


& and ^ xor /* To sng vung tn s freq_Hz vi duty cycle=50% */
<< dch tri >> dch phii tone(pin, freq_Hz)
| or ~ not /* To sng vung tn s freq_Hz, duration mili giy */
tone(pin, freq_Hz, duration_ms)
/* Thc thi vi con tr */ /* Ngng vic to sng vung khi dng tone() */
&reference: // ly a ch ca bin m con tr tr ti noTone(pin)
*dereference:// ly gi tr ca bin m con tr tr ti /* Dch 1 byte, mi ln dch 1 bit, dch t bit cao */
shiftOut(dataPin, clockPin,[MSBFIRST, LSBFIRST], value)
/* HNG S V KIU D LIU */ /* Tr v (ms) ca xung HIGH/LOW trn chn pin */
123 S thp phn unsigned long pulseIn(pin,[HIGH, LOW])
0b0111 S nh phn
0173 S Octal - base 8 /* CHC NNG NGT */
0x7B S thp lc phn base 16 /* Thit lp chc nng ngt cc chn digital */
123U S nguyn khng du attachInterrupt(interrupt, func, mode)
123L S nguyn c du 4 bytes /*
123UL S nguyn khng du 4bytes interrupt: s ngt (thng l chn s dng chc nng
123.0 S thc ngt)
1.23e6 S thc dng c s m ex: 1.23*10^3 = 1230 func : hm s c gi khi ngt xy ra (lu : hm
khng c tham s u vo cng nh kiu tr v)
/*PHM VI CA KIU D LIU */ mode : gm cc ch LOW,CHANGE, RISING, FALLING. Ngt
boolean true | false s c kch hot khi chn ngt mode tng ng
char -128 - 127, 'a' '$' etc. */
unsigned char 0 - 255 /* V hiu ha ngt interrupt */
byte 0 - 255 detachInterrupt(interrupt)
int -32768 - 32767 /* V hiu ha t c cc ngt */
unsigned int 0 - 65535 noInterrupts()
word 0 - 65535 /* Cho php ti ngt sau khi dng noInterrupts() */
long -2147483648 - 2147483647 interrupts()
unsigned long 0 - 4294967295
float -3.4028e+38 - 3.4028e+38 /*************************************************
double -3.4028e+38 - 3.4028e+38 * TH VIN PH BIN *
void i.e., no return value *************************************************/

/* KHAI BO BIN */ /*************************************************


int a; * Serial *
int a = 0b01111011, b = 0123, c = 1, d; *Th vin giao tip vi PC hoc thng qua RX/TX*
float fa = 1.0f; *************************************************/
double da = 1.0; /* Thit lp giao tip serial-UART vi tc speed */
char *pointer; begin(long speed)
char *other_pointer = NULL; /* V hiu ha giao tip serial */
end()
/** /* Tr v s bytes c sn c */
* BUILT-IN FUNCTIONS int available()
* Pin Input/Output /* c d liu n t serial (tr v byte u tin ca
* Digital I/O - pins 0-13 A0-A5 d liu t serial hoc -1 nu d liu khng c */
*/ int read()
/* Thit lp cu hnh chn */ /* Ch qu trnh truyn d liu serial hon tt */
pinMode(pin,[INPUT, OUTPUT, INPUT_PULLUP]) flush()
/* c gi tr ca pin_6 v gn cho a */ /* In ra serial port d liu data (vi bt k kiu d
int a = digitalRead(pin_6); liu no c thit lp */
/* Ci t mc HIGH/LOW cho pin_5 */ print(data)
digitalWrite(pin_5, [HIGH, LOW]) /* Tng t nh print(data) nhng sau khi in ra serial
/* c gi tr ca pin v gn cho a, pin t A0-->A5 */ -port, con tr s xung dng tip theo */
int a = analogRead(pin) println(data)
/* Gi d liu value/string/array n serial port */
/* PWM ng ra - pins 3 5 6 9 10 11 write(byte)
* ESP8266: pin 0..16, range = 0..1023, 1KHz default /* Hm c gi khi c d liu n t chn RX */
*/ SerialEvent()
/* t gi tr PWM cho pin */

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 149/155

/************************************************* /* Dng khi chng trnh cn thc thi nhiu tc v cng


* Servo.h * mt lc, th vin h tr <Scheduler.h> */
* Th vin h tr iu khin ng c servo * void yield();
*************************************************/ /* Reset chip ESP */
/* void ESP.reset();
Thit lp chn kt ni vi servo v rng xung /* Tr v kch thc vng nh trng heap */
pin : Chn kt ni vi servo uint32_t ESP.getFreeHeap();
[min_uS, max_uS] : rng xung tnh theo us tng ng /* Tr v ID ca chip ESP */
vi gc xoay t 0 n 180 uint32_t ESP.getChipId();
*/
attach(pin, [min_uS, max_uS]) /* CH CU HNH WIFI STATION */
/* Ghi d liu gc xoay cho ng c angle t 0~180 */ /* Thit lp ch station */
write(angle) WiFi.mode(WIFI_STA);
/* Vit gi tr iu khin gc quay cho servo, gi /* Kt ni n AP */
tr t 700 ~ 2300 */ WiFi.begin(ssid, password);
writeMicroseconds(uS) /* Ngt kt ni n network wifi hin ti */
/* c gi tr gc xoay (0 n 180 ) */ bool WiFi.disconnect();
int read() /* Tr v a ch IP ca station */
/* Tr v true nu bin servo kt ni n pin */ WiFi.localIP();
bool attached() /* Tr v trng thi khi kt ni n AP */
/* G b bin servo ra khi chn kt ni */ WiFi.status();
detach() /* Tr v tn ca netwwork WiFi kt ni */
WiFi.SSID();
/************************************************* /* Tr v cng ca WiFi (n v dBm) */
* Wire.h * WiFi.RSSI();
* Dng trong giao tip I2C * /* Bt u thit lp ch WPS */
*************************************************/ WiFi.beginWPSConfig();
/* Master khi to th vin Wire vi giao tip I2C */ /* Bt u thit lp ch smart config */
begin() WiFi.beginSmartConfig();
/* Slave tham gia vo kt ni i2C, addr l 7 bits a
ch ca slave */ /* CH CU HNH WIFI SOFT ACCESS POINT (AP) */
begin(addr) /* Khi to 1 AP vi tn v password */
/* WiFi.softAP(ssid, password);
Master yu cu 1 s byte t slave: /* Khi to 1 AP v thit lp cu hnh cho AP gm a
address: 7bits a ch ca slave. ch IP, gateway v subnet */
count: S lng byte master yu cu WiFi.softAPConfig (local_ip, gateway, subnet);
stop: Kiu boolean, nu true, master tn hiu stop sau /* Tr v s station kt ni n AP */
khi yu cu v gii phng bus I2C, nu false, master WiFi.softAPgetStationNum();
gi yu cu restart gi kt ni /* Ngt kt ni ca cc station */
*/ WiFi.softAPdisconnect(wifioff);
requestFrom(address, count, stop) /* Tr v a ch IP ca AP */
/* Gi tn hiu bt u, truyn d liu n slave c WiFi.softAPIP();
a ch addr */ /* Tr v a ch MAC ca AP */
beginTransmission(addr) WiFi.softAPmacAddress(mac);
/* Gi d liu (1 byte)n slave */
send(byte) /* WIFI FEATURES */
/* Gi d liu (string) n slave */ /* SCAN */
send(char * string) /* Thit lp ch Station */
/* Gi d liu (1 mng )vi s byte l size */ WiFi.mode(WIFI_STA);
send(byte * data, size) /* Scan v tr v s lng network avalable */
/* Gi tn hiu kt thc truyn d liu ti slave */ WiFi.scanNetworks();
endTransmission() /* Tr v tn ca network (kiu string) v tr num */
/* Tr v s byte availabe sau khi c bi read() */ WiFi.SSID(num).c_str();
int available() /* Tr v thng tin ca tt c cc network */
/* truy xut n 1 byte truyn t slave n master WiFi.getNetworkInfo(networkItem,&ssid,
hoc truyn chiu ngc li khi nhn c &encryptionType, &RSSI,*&BSSID, &channel, &isHidden)
requestFrom. Tr v byte tip theo nhn c */
byte receive() /* DIAGNOSTICS */
/* Hm handler s c gi khi slave nhn d liu */ /*
onReceive(handler) * Mc ch : chun on, cung cp thng tin v khc
/* Handler s c gi khi master yu cu d liu */ * phc s c khi khng kt ni n net work WiFi
onRequest(handler) */
/* In ra serial cc chun on thng tin ca network */
/************************************************* WiFi.printDiag(Serial);
* ESP8266 * /* Enable ch debug */
*************************************************/ Serial.setDebugOutput(true);
150/155

/* WEBSERVER */ mqtt.unSubscribe("/qos0");
/* My ch TCP ti port 80 s phn hi cc HTTP request /* Thc hin subscribe topic v publish cc message */
c gi ln t client */ mqtt.onSubscribe([](int sub_id)
ESP8266WebServer server (80); /* Publish 1 message "qos0" n topic /qos0 vi QoS =0,
/* Server bt u lng nghe cc client */ v Retain = 0 */
server.begin(); mqtt.publish("/qos0", "qos0", 0, 0);
/* Vit d liu n cc client */ /* Kt ni n server MQTT */
server.write(buf, len) mqtt.onConnect([]()
/* Khi to server a ch URL, handleRoot l ni /* Subscribe topic v nhn message ti topic /qos0 */
dung hoc hm s thc hin */ mqtt.subscribe("/qos0", 0)
server.on ( "URL", handleRoot ); /* Bt u truyn nhn d liu vi broker MQTT c url
/* Server tng tc vi client gi, nhn d liu */ mqtt://test.mosquitto.org ti port 1883 */
server.handleClient(); mqtt.begin("mqtt://test.mosquitto.org:1883")
/* Tr v 1 nu bin val c tn ti trn server */ /* Hm c gi trong loop() nhm khi to MQTT, kim
server.hasArg(val) tra x l cc d liu t cc topic, kim tra cc thuc
/* Ly gi tr ca bin val trn server */ tnh ca giao thc nh gi keep-a-live, QoS... */
server.arg(val); mqtt.handle();
/* Gi yu cu cp nht d liu t server:
code : HTTP code /* Cc hm ca th vin PubSubClient*/
text/html : nh dng tr v l file HTML /* Khai bo bin espClient thuc i tng client trong
content: Ni dung s tr v t pha server */ class PubSubClient */
server.send (code, "text/html",content); PubSubClient client(espClient);
/* Publish gi tin "Connected!" n topic ESP8266 */
/* MQTT */ client.publish("ESP8266", "Connected!");
/* /* Subscribe nhn cc message t topic ESP8266 */
Cc th vin h tr giao thc MQTT dnh cho ESP8266 client.subscribe("ESP8266");
trn arduino thng s dng l ESP8266MQTTClient /* Ci t server lng nghe client port 1883 */
v PubSubClient. Phn ny gii thch cc hm ca cc client.setServer(url_server, 1883);
th vin /* Gi hm callback thc hin cc chc nng
*/ publish/subcribe */
/* Cc hm ca th vin ESP8266MQTTClient*/ client.setCallback(callback);
/* Khai bo 1 bin mqtt thuc class MQTTClient */ /* Hm c gi trong loop() nhm khi to MQTT, kim
MQTTClient mqtt; tra
/* Ly d liu nhn c t topic subcribe */ x l cc d liu t cc topic, kim tra cc thuc tnh
mqtt.onData([](String topic, String data, bool cont) ca giao thc nh gi keep-a-live, gi tin QoS... */
/* Hy subcribe topic /qos0 */ client.loop();

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 151/155

C - Cheatsheet

/* CU TRC C BN */ 123L S nguyn c du 4 bytes


Vit ch thch trn 1 dng dng // 123UL S nguyn khng du 4bytes
ex: x++ ; // tng x 1 n v 123.0 S thc
/* */ Vit ch thch trn nhiu dng. 1.23e6 S thc dng c s m ex: 1.23*10^3 = 1230
ex : /************************* /* nh ngha hng s a kiu nguyn, c gi tr l 1 */
* Ch thch c vit * const int a = 1;
* trn nhiu dng * /* nh ngha hng s x kiu thc, c gi tr l 4.0 */
************************/ const float x = 4;
/* CU TRC 1 CHNG TRNH */ /* nh ngha hng s c kiu integer c gi tr 49 */
#include <stdio.h>//include th vin chun ca C const c = 1; // K t 1 trong m ASCII l 49
#include "iLib.h" //include th vin to bi ngi dng /* nh ngha str l hng s kiu con tr, tr ti
int global_var; //bin c dng trong chng trnh chui Cheasheet C */
/* Khai bo hm bt u ca 1 chng trnh C vi kiu const char * str = Cheasheet C;
tr v l integer. i s arg kiu int c truyn vo
hm */ /* KHAI BO BIN */
int main (int arg){ /* Khai bo bin a kiu nguyn v khng gn gi tr */
float local_var ; // Bin ch c dng trong hm main int a;
Lnh 1 /* khai bo a kiu binary, b kiu base8, c kiu s
... nguyn, d kiu s nguyn v khng gn gi tr */
Lnh n ; int a = 0b01111011, b = 0123, c = 1, d;
return 0; //chng trnh thc hin thnh cng v thot /* Khai bo bin fa thuc kiu s thc float */
} float fa = 1.0f;
/* Khai bo bin da thuc kiu s thc double */
/*KIU D LIU V PHM VI */ double da = 1.0;
boolean true | false /* Khai bo bin con tr v tr n 1 vng nh khng
char -128 - 127, 'a' '$' etc. xc nh */
unsigned char 0 - 255 char *pointer;
byte 0 - 255 /* Khai bo bin con tr v tr v NULL (0)*/
int -32768 - 32767 char *other_pointer = NULL;
unsigned int 0 - 65535
word 0 - 65535 /* CHUI K T */
long -2147483648 - 2147483647 /* Chui bao gm k t kt thc chui \0 (null) */
unsigned long 0 - 4294967295 char str1[8] = {'A','r','d','u','i','n','o','\0'};
float -3.4028e+38 - 3.4028e+38 /* Trnh bin dch t ng thm k t \0 vo cui
double -3.4028e+38 - 3.4028e+38 chui */
void i.e., no return value char str2[8] = {'A','r','d','u','i','n','o'};
/* Khai bo chui ,khng khai bo s phn t v gn gi
/* T TN BIN */ tr chui */
/* t tn ng */ char str3[] = "Arduino";
int x; // Mt bin /* Khai bo v gn gi tr cho chui */
int x = 1; // Bin c khai bo v khi to char str4[8] = "Arduino";
float x, y, z; // Nhiu bin cng kiu d liu
const int x = 88; // Bin tnh, khng ghi c /* Cc hm x l chui thng dng */
int tenBien1ok; // t tn bin ny ng /* Ni cc k t t chui source tip vo v tr cui
int ten_bien_nay_ok; ca chui dest */
/* t tn sai */ strcat(dest, source)
int 2001_tensai; // V s u /* Tm v tr xut hin u tin ca k t c trong
int ten-sai; // Du '-' khng phi l alphanumberic source, tr v con tr ch ti v tr hoc null nu
int while; // Sai, v dng t kha vng lp while khng tm thy c trong source */
strchr(source, c)
/* HNG S V KIU D LIU */ /* Hm tr v di ca chui st */
123 S thp phn strlen(st)
0b0111 S nh phn /* copy v thay cc k t ca chui soure vo dest */
0173 S Octal - base 8 strcpy(dest, source)
0x7B S thp lc phn base 16 /* chp k t t u n n t chui source vo dest */
123U S nguyn khng du strncpy(dest, source, n)
152/155

/* MNG */ /* for : Khi to v gn gi tr cho i, thc hin code


/* Khai bo mng 1 chiu 6 phn t kiu integer v gn tng i nu i < 10 */
gi tr cho mi phn t */ for (int i = 0; i < 10; i++) { code };
int myPins[] = {2, 4, 8, 3, 6};
/* Khai bo mng 1 chiu 6 phn t kiu integer v /* PHP TON V TON T THNG DNG
khng gn gi tr */ /* Cc ton t thng dng */
int myInts[6]; = ton t bng
myInts[0] = 42; // Gn gi tr 42 cho phn t u tin + ton t cng
myInts[6] = 12; // LI ! ch s ca mng ch t 0 n 5 - ton t tr
/* Ly gi tr ca phn t th 3 trong mng myInts */ * ton t nhn
int c = myInts[2]; // C th dng *(myInts + 2) / ton t chia ly phn nguyn
/* Ly a ch ca phn t th 3 trong mng myInts */ % ton t chia ly phn d
int c = &myInts[2]; // C th dng int c = myInts + int == php so snh bng
/* Tr v chiu di ca mng myInts */ != php so snh khng khng bng (khc)
int length = sizeof(myInts) / sizeof(myInts[0]); < php so snh nh hn
/* Khai bo 2 mng kiu float, arr1 c 5 phn t, arr2 > php so snh ln hn
c 10 phn t */ <= php so snh nh hn hoc bng
float arr1[5], arr2[10]; >= php so snh ln hn hoc bng
/* Khai bo mng s nguyn arr c 2 dng, 5 ct. Tng && php ton logic (AND)
cng c 10 phn t */ || php ton logic (OR)
int a[2][5]; ! php ton logic (NOT)

/* KHI LNH V CC LNH DNG TRONG VNG LP */ /* Cc ton t hp nht */


{} // bao gm nhiu lnh, thng c s dng trong h ++ tng 1 n v
m -- gim 1 n v
/* Goto : chng trnh s nhy n nhn (nhn phi c += php ton cng v gn gi tr
mt trong cu lnh cha goto) */ ex: x = 5; x+= 1; //x = 6
goto nhn; -= php ton tr v gn gi tr
/* Continue : Ch dng trong cc lnh c vng lp s ex: x = 5; x-= 1; //x = 4
chuyn qua chu k mi ca vng lp trong cng nht */ *= php ton nhn v gn gi tr
continue; /* ex: x = 5; x*= 3; //x = 15
/* Break : Dng vi cc vng lp thot khi vng lp /= php ton chia ly phn nguyn v gn gi tr
trong cng nht, hoc dng trong cu trc switch..case ex: x = 6; x/= 2; //x = 3
thot ra khi case tng ng */ &= php ton logic AND v gn gi tr
break; /* ex: x = 0b1010; x&= 0110; //x =0b0010
/* Return */ |= php ton logic OR v gn gi tr
/* Dng cho hm khng c kiu tr v (void) */ ex: x = 0b1010; x&= 0110; //x =0b1110
return;
/* Value c th l hng s, bin, biu thc hoc gi /* Cc ton t trn bit */
n 1 hm khc tr v gi tr */ & and ^ xor
return <value>; << dch tri >> dch phii
| or ~ not
/* LNH R NHNH */
if (x < 5) // thc thi code nu x<5 /* THC THI VI CON TR */
{ code } &reference: // ly a ch ca bin m con tr tr ti
else if (x > 10)// thc thi code nu x>10 *dereference:// ly gi tr ca bin m con tr tr ti
{ code } /* khai bo bin con tr kiu int tr ti a ch ca
else { code } // thc thi code cc trng hp cn li bin a */
int a = 5; int *pointer = &a;
switch (var) { // thc thi case c gi tr var
case 1: /* CC K T IU KHIN V K T C BIT */
... \n Nhy xung dng k tip canh v ct u tin
break; \t Canh ct tab ngang.
case 2: \r Nhy v u hng, khng xung hng.
... \a Ting ku bip.
break; \\ In ra du \
default: \" In ra du "
... \' In ra du '
} %%: In ra du %
\b ~ backspace (xa 1 k t ngay trc)
/* CC KIU VNG LP */
/* While: Thc hin code nu x<5 */ /* HM V CC VN LIN QUAN */
while (x < 5) { code }; /* Khai bo prototype ca hm max, c 2 i s u vo
/* Do-While : Thc hin code, so snh, nu x<0 tip tc l a v b thuc kiu s nguyn, kt qu tr v ca hm
thc hin code */ kiu s nguyn */
do { code } while(x < 0); int max(int a, int b);

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 153/155

/* Khai bo bin c l gi tr tr v ca hm max */ SINHVIEN */


int c = max(5,4); typedef struct sinhVien SINHVIEN;
/* Khai bo prototype ca hm khng c i s v khng /* Khai bo bin sinhVienA thuc struct SINHVIEN */
c kiu tr v (void) */ SINHVIEN sinhVienA;
void none();
/* CC LNH X L TP TIN (#include <stdio.h>) */
/* TYPEDEF- nh ngha kiu d liu */ /* Khai bo 1 bin con tr l ng dn ca 1 file */
/* nh ngha kiu unsigned char l BYTE, khai bo cc const char *filePath = "ng/dn/file/document.txt";
bin a, b thuc kiu BYTE */ /* To 1 bin con tr thuc kiu FILE */
typedef unsigned char BYTE; BYTE a, b; FILE *file;
/* M 1 file ng dn filePath v c d liu */
/* KIU LIT K - ENUMERATION (enum) */ file = fopen(filePath, "r");// Tr v NULL nu tht bi
/* khai bo kiu d liu enum l cc ngy trong tun */ /* ng 1 file m, tr v 0 nu thnh cng , ngc
enum daysOfWeek { sunday, monday, tuesday, wednesday }; li tr v EOF */
/* To bin toDay thuc daysOfWeek v gn gi tr */ fclose(file);
daysOfWeek toDay = wednesday; /* Vit k t c ln file ang m, tr v EOF nu ghi
tht bi, tr v m ASCII ca c nu thnh cng */
/* STRUCT - KIU D LIU DO NGI DNG NH NGHA */ int fputc(int c, FILE *f);
/* Khai bo struct sinhVien */ /* Vit chui "hello" ln file ang m */
struct sinhVien{ int c = fputs("hello", file);
char tenSinhVien; /* c (255-1) k t t file ang m, kt qu c
char MSSinhVien; c
int tuoiSinhVien; s lu vo mng str, vic c b dng nu gp k t
}; '\n' hoc EOL */
/* Truy xut n thnh phn MSSinhVien trong struct fgets(str, 255, file);
sinhVien */ /* Thay i v tr tr n trong file ca con tr
sinhVien.MSSinhVien; internal file position indicator v li u file */
/* i tn struct sinhVien thnh 1 bin duy nht l int fseek(file, 0, SEEK_SET);
/* Tr v kch thc ca ni dung c trong file */
ftell(file);

www.cheatography.com/ashlyn-black/cheat-sheets/c-reference/
154/155

Li kt
Cc thnh vin tham gia ng gp.

hon thin ni dung ca sch cn c s ng gp ca cc thnh vin sau:

1. Phm Minh Tun (TuanPM) - Ch bin

2. Lm Nht Qun - K s lm vic ti IoT Maker Vit Nam.

3. Trnh Hong c - K s lm vic ti IoT Maker Vit Nam.

4. L Phng Trnh - Thc tp sinh ti IoT Maker Vit Nam - Sinh vin i Hc Bch Khoa,
chuyn ngnh in t vin thng, kha hc 2014.

5. Trn Phc Vinh - Thc tp sinh ti IoT Maker Vit Nam - Sinh vin i Hc Bch Khoa,
chuyn ngnh k thut in, kha hc 2014.

V s ng gp ca cng ng ti arduino.esp8266.vn

Li kt.

Tht vui khi bn ng hnh cng chng ti i n ht cun sch ny. Mc ch ca cun sch l
gip nhng ngi mi bt u tm hiu v Internet Of Things (IoT) c kin thc c bn v hng i
chnh xc nghin cu v IoT mt cch nhanh chng hn. Hi vng cun sch s n tay tht nhiu
bn am m lnh vc cng ngh cn mi m nhng rt tim nng ny. Chc cc bn thnh cng trn
con ng m mnh chn.

Mc d c gng hon thnh tt nht ni dung cho cun sch, tuy nhin vn khng trnh khi
nhng thiu st. Mi kin ng gp xin gi mail v a ch support@iotmaker.vn

Ngoi ra cc bn c th tng tc vi chng ti qua 1 s a ch:

1. Webstore : iotmaker.vn/

2. Facebook : www.facebook.com/iotmaker.vn/

Mt s trang web ng gp cho cng ng (mong nhn c s chia s v ng gp ca cc bn


cng ng IoT Vit Nam ni ring cng nh cng ng k thut Vit Nam ni chung ngy mt pht
trin hn):

1. V ESP8266 vi Arduino : arduino.esp8266.vn/

iotmaker.vn
Internet Of Things (IoT) cho ngi mi bt u 155/155

2. V ESP32 : esp32.vn

3. Facebook Group: www.facebook.com/groups/iotmaker/

Giy php s dng ti liu.

Ti liu tun theo giy php CC-BY-NC-SA (creativecommons.org/licenses/by-nc-sa/4.0/


legalcode)

Bn quyn ton b ti liu ny thuc v IoT Maker Vit Nam, bn c min ph s dng cho
mc ch c nhn, hc tp v s dng trong cc d n ca mnh, khng c s dng cho mc
ch thng mi. Nu bn mun sa cha, phn phi li, bn bt buc phi gi nguyn giy
php v cn c s ng ca IoT Maker Vit Nam.

Ch duy nht cc cc nhn, t chc c lit k ti iota.edu.vn l c php s dng ti liu


cho mc ch thng mi.

You might also like