You are on page 1of 77

EBOOKBKMT.

COM

MỤC LỤC
LỜI MỞ ĐẦU.........................................................................................................III
TÓM TẮT ĐỒ ÁN..................................................................................................IV
DANH MỤC CÁC BẢNG BIỂU.............................................................................V
DANH MỤC CÁC HÌNH VẼ.................................................................................VI
DANH SÁCH CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT........................................VII
CHƯƠNG 1. TỔNG QUAN VỀ ĐỀ TÀI.................................................................1
1.1. Giới thiệu về đề tài........................................................................................1
1.1.1. Lý do chọn đề tài...................................................................................1
1.1.2. Mục đích chọn đề tài...............................................................................1
1.1.3. Đối tượng và phạm vi nghiên cứu...........................................................1
1.1.4. Ý nghĩa khoa học và ý nghĩa thực tiễn của đề tài....................................1
1.2. Một số giao thức sử dụng trong truyền thông.................................................2
1.2.1. Mô hình TCP/IP.......................................................................................2
1.2.1.1. Kiến trúc TCP/IP.............................................................................3
1.2.1.2. Quá trình truyền dữ liệu trong mô hình TCP/IP..............................8
1.2.3. Mô hình OSI............................................................................................9
1.2.3.1. Kiến trúc và chức năng các lớp trong mô hình OSI.........................9
1.2.3.2. So sánh hai giao thức TCP/IP và OSI............................................12
1.2.4. Truyền thông Socket..............................................................................13
1.2.4.1. Định nghĩa.....................................................................................13
1.2.4.2. Nguyên lý hoạt động......................................................................15
CHƯƠNG 2. GIAO THỨC MQTT TRONG HỆ THỐNG IOT..............................17
2.1. Hệ thống IoT (Internet of Things)................................................................17
2.1.1. Định nghĩa.............................................................................................17
2.1.2. Kiến trúc tham chiếu..............................................................................17
2.1.3. Phân loại thiết bị IoT và phương thức kết nối Internet...........................20
2.1.4. Các yêu cầu của kiến trúc tham chiếu cho IoT................ ....................21

I
EBOOKBKMT.COM

2.2. Nền tảng truyền thông IoT............................................................................23


2.2.1. Giao thức Zigbee...................................................................................24
2.2.2. Giao thức Bluetooth...............................................................................27
2.2.3. Công nghệ Wifi.....................................................................................30
2.3. Giao thức MQTT..........................................................................................33
2.3.1. Định nghĩa.............................................................................................33
2.3.2. Các đặc trưng của giao thức...................................................................35
2.3.3. Định dạng của message..........................................................................36
2.3.3.1. Message CONNECT – Client yêu cầu kết nối đến server..............42
2.3.3.2. Message PUBLISH........................................................................46
2.3.3.3. Message SUBSCRIBE...................................................................47
2.3.4. Nguyên lý làm việc................................................................................49
2.3.5. Bảo mật trong MQTT............................................................................50
CHƯƠNG 3. THỬ NGHIỆM GIAO THỨC MQTT...............................................53
3.1. Giới thiệu về hệ điều hành Linux..................................................................53
3.2. Hệ điều hành Ubuntu....................................................................................54
3.3. Ngôn ngữ lập trình Python............................................................................56
3.4. Cấu trúc một số lệnh trong thư viện Python Client MQTT...........................58
3.5. Thử nghiệm truyền nhận dữ liệu MQTT trên Python...................................61
KẾT LUẬN.............................................................................................................63
TÀI LIỆU THAM KHẢO.......................................................................................64
PHỤ LỤC................................................................................................................ 65

II
EBOOKBKMT.COM

LỜI MỞ ĐẦU

Trong những năm gần đây một khái niệm mới trong ngành công nghệ được
nhắc đến nhiều đó là "Internet of Things". Khái niệm Internet of Things được thực
sự đưa ra vào năm 1999, khi mà người ta bắt đầu nhìn nhận được tiềm năng của xu
hướng này, lúc mà các rào cản giới hạn Internet, khoa học công nghệ dần được khai
phá. Mặc dù khái niệm Internet of Things được đưa ra từ lâu nhưng trong những
năm gần đây nó mới được nhiều doanh nghiệp cũng như các nhà khoa học để ý và
phát triển mạnh mẽ.
Các thiết bị trong IoT là rất nhỏ, chúng chỉ trao đổi lượng thông tin nhỏ với
nhau, tuy nhiên các giao thức truyền thống không phù hợp với sự giao tiếp IoT mà
cần có các giao thức tối ưu dành riêng cho IoT. Nhận biết được tầm quan trọng của
giao thức này trong sự phát triển một thế giới thông minh do vậy em đã chọn đồ án
“Nghiên cứu và thử nghiệm giao thức MQTT trong hệ thống IoT” để tìm hiểu
về giao thức MQTT và cách thức hoạt động của nó.
Đồ án này bao gồm 3 chương:
Chương 1: Tổng quan về đề tài. Nêu rõ lý do, mục đích lựa chọn đề tài, ý
nghĩa của đề tài trong sự phát triển thế giới IoT. Trình bày về một số giao thức
truyền thông thường được sử dụng.
Chương 2: Giao thức MQTT trong hệ thống IoT. Trình bày hiểu biết về thế
giới IoT và các giao thức nền tảng được sử dụng. Đi sâu nghiên cứu và tìm hiểu về
giao thức MQTT.
Chương 3: Thử nghiệm giao thức MQTT. Thử nghiệm truyền nhận dữ liệu
bằng giao thức MQTT trên phần mềm Python.
Em xin gửi lời cảm ơn chân thành đến thầy giáo Th.S Đinh Văn Nam đã
hướng dẫn tận tình và giúp đỡ em trong quá trình thực hiện đồ án này. Trong quá
trình thực hiện đồ án không thể tránh được sai sót, vì vậy em hy vọng sẽ nhận được
các lời khuyên và đóng góp của thầy, cô và bạn đọc.

Nghệ An, Ngày 20 tháng 5 năm 2016


Sinh viên thực hiện
Trần Thị Thuận
III
EBOOKBKMT.COM

TÓM TẮT ĐỒ ÁN

Đồ án này đi sâu tìm hiểu về giao thức MQTT. Giao thức MQTT hiện nay
được sử dụng trong nhiều lĩnh vực công nghiệp khác nhau và đặc biệt là trong hệ
thống IoT. Nó không chỉ kéo dài tuổi thọ pin mà còn cung cấp tin nhắn chỉ trong
“vài trăm mili giây”. Giao thức MQTT sử dụng băng thông thấp do đó phù hợp với
các thiết bị có hạn chế về tốc độ đường truyền và độ tin cậy thấp, nó cũng được ứng
dụng trong các mạng có độ tin cậy cao nhưng cần tiết kiệm băng thông. MQTT cho
phép giao tiếp hai chiều, sử dụng một kết nối TCP được tạo ra từ các client để kết
nối client với broker. Giao thức này có mô hình publish/subscribe các bản tin và
được thiết kế trong các ứng dụng sử dụng công nghệ M2M gọn nhẹ. Chương trình
sử dụng phần mềm lập trình Python để thử nghiệm quá trình publish/subscribe giữa
client và broker. Qua đó có thể hiểu rõ hơn về giao thức MQTT cũng như quá trình
hoạt động của nó.

ABSTRACT

This thesis was studied about protocol MQTT. The MQTT protocol is used
today throughout a variety of industries and IoT environments. It’s to not only save
battery life but also deliver messages in "the hundreds of milliseconds". MQTT's
low bandwidth makes it ideal for constrained devices and unreliable networks,
though it is often also used on reliable networks to preserve bandwidth. MQTT
enables bidirectional communication, uses a TCP connection initiated by the client
to connect client and broker. MQTT is a publish/subscribe messaging protocol
designed for lightweight M2M communications. Using Python programming
software for testing process publish/ subscribe between client and broker. Through
that can better understand the protocol MQTT well as its operational processes.

IV
EBOOKBKMT.COM

DANH MỤC CÁC BẢNG BIỂU

Bảng 2.1. Định dạng phần header cố định của message..........................................36


Bảng 2.2. Định dạng phần header thay đổi được của message CONNECT............38
Bảng 2.3. Các giá trị và ý nghĩa của mã rc..............................................................41
Bảng 2.4. Định dạng phần header cố định của message CONNECT......................42
Bảng 2.5. Ví dụ biểu diễn phần hesder thay đổi được của message CONNECT.....43
Bảng 2.6. Định dạng phần header cố định message PUBLISH...............................46
Bảng 2.7. Header có độ dài thay đổi của message PUBLISH.................................47
Bảng 2.8. Ví dụ về phần header thay đổi được của message PUBLISH..................47
Bảng 2.9. Định dạng phần header cố định của message SUBSCRIBE....................48
Bảng 2.10. Ví dụ về phần header thay đổi được với message ID bằng 10...............48

V
EBOOKBKMT.COM

DANH MỤC CÁC HÌNH VẼ

Hình 1.1. Kiến trúc TCP/IP.......................................................................................3


Hình 1.2. Khuôn dạng của UDP datagram................................................................5
Hình 1.3. Khuôn dạng TCP segment.........................................................................6
Hình 1.4. Quá trình truyền dữ liệu trong mô hình TCP/IP........................................8
Hình 1.5. Các lớp trong mô hình OSI.......................................................................9
Hình 1.6. Quá trình truyền dữ liệu trong mô hình OSI............................................12
Hình 1.7. So sánh mô hình TCP/IP và OSI.............................................................13
Hình 1.8. Mô hình OSI rút gọn................................................................................14
Hình 1.9. Mô hình Socket.......................................................................................14
Hình 2.1. Kiến trúc tham chiếu cho IoT..................................................................17
Hình 2.2. Kiến trúc lớp (hay ngăn xếp – Stack) trong kiến trúc Zigbee..................25
Hình 2.3. Các mô hình mạng Zigbee.......................................................................26
Hình 2.4. Các tầng nghi thức của Bluetooth............................................................28
Hình 2.5. Quá trình Subscribe của client B và client C...........................................34
Hình 2.6. Quá trình Publish của client A và nhận dữ liệu của client B, C...............34
Hình 3.1. Giao diện hệ điều hành Ubuntu...............................................................55
Hình 3.2. Giao diện Python trên Ubuntu.................................................................57
Hình 3.3. Kết quả quá trình publish của thiết bị......................................................61
Hình 3.4. Kết quả quá trình subscribe của thiết bị...................................................61

VI
EBOOKBKMT.COM

DANH SÁCH CÁC KÝ HIỆU, CÁC CHỮ VIẾT TẮT

MQTT Message Queuing Telemetry Công nghệ truyền nhận tốc độ


Transport tức thời

IoT Internet of Thing Internet của sự vật

M2M Machine to Machine Máy đến Máy

TCP Transmission Control Protocol Giao thức điều khiển truyền


thông

IP Internet Protocol Giao thức Internet

MAC Media Access Control Địa chỉ vật lý của thiết bị

UDP User Datagram Protocol Giao thức gói dữ liệu người


dùng

Open Systems Interconnection Mô hình tham chiếu kết nối


OSI
các hệ thống mở 
Giao thức ràng buộc ứng dụng
CoAP Constrained Application Protocol
Giao thức truyền tải siêu văn
HTTP Hyper Text Transfer Protocol
bản
HTTPS Hyper Text Transfer Protocol
Phiên bản của giao thức HTTP
Secure
Mạng máy tính cục bộ
LAN Local Area Network
 Dịch vụ dữ liệu di động dạng
GPRS General Packet Radio Service
gói
Giao thức chuyển nhượng tập
FTP File Transfer Protocol 
tin
IEEE  Institute of Electrical and
Viện kỹ nghệ Điện và Điện tử
Electronics Engineers
Secure Sockets Layer Giao thức bảo mật
SSL
Transport Layer Security Giao thức an toàn tầng giao
TLS
vận

VII
EBOOKBKMT.COM

VIII
EBOOKBKMT.COM

CHƯƠNG 1. TỔNG QUAN VỀ ĐỀ TÀI

1.1. Giới thiệu về đề tài

1.1.1. Lý do chọn đề tài


Giao thức MQTT là một giao thức quan trọng trong hệ thống IoT. IoT nhằm
đưa thế giới tiến tới những kỹ thuật tiên tiến nhất, thông minh nhất, một thế giới mà
các thiết bị có thể đo lường và đưa ra các nhận xét chính xác nhất. Để thực hiện
được một thế giới thông minh như vậy thì việc tìm hiểu về cách thức hoạt động và
sự giao tiếp giữa các thiết bị IoT là cực kỳ quan trọng. Nhận biết được tầm quan
trọng đó, trong đồ án này em lựa chọn nghiên cứu về giao thức MQTT nhằm giúp
bạn đọc hiểu rõ hơn về giao thức này cũng như vai trò của nó trong IoT.

1.1.2. Mục đích chọn đề tài

Mục đích của đề tài này là đi sâu nghiên cứu về giao thức MQTT và quá trình
truyền nhận dữ liệu thông qua giao thức này. Sự phát triển của thế giới thông minh
cần có các giao thức phù hợp với thiết bị IoT, bởi vì các thiết bị IoT là rất nhỏ, tiêu
tốn ít công suất do đó các giao thức truyền nhận cũng cần tiêu tốn ít năng lượng.
Giao thức MQTT như là một ống dẫn luồng dữ liệu nhị phân cho các thiết bị IoT,
giao thức này thực sự quan trọng đối với sự hoàn thiện của thế giới IoT.

1.1.3. Đối tượng và phạm vi nghiên cứu

Đối tượng nghiên cứu ở đồ án này là giao thức MQTT trong hệ thống IoT và
lập trình truyền nhận dữ liệu thông qua giao thức MQTT trên phần mềm Python.
Phạm vi nghiên cứu là quá trình giao tiếp M2M thông qua công nghệ kết nối Wifi.
M2M kết nối tất cả các loại thiết bị và máy móc trên hệ thống mạng, từ đó chúng có
thể giao tiếp với nhau thông qua máy chủ trung tâm hoặc dựa trên đám mây doanh
nghiệp sử hữu.

1.1.4. Ý nghĩa khoa học và ý nghĩa thực tiễn của đề tài

Ý nghĩa khoa học:


Sự giao tiếp giữa các thiết bị M2M phụ thuộc vào giao thức MQTT. Khi các
thiết bị M2M có thể giao tiếp với nhau một cách dễ dàng thì sẽ tự động kết nối với

1
EBOOKBKMT.COM

nhau và làm việc thay cho con người. Từ đó sẽ xây dựng nên một thế giới thông
minh. Một thế giới mà các cảm biến sẽ đo lường và đưa ra những nhận xét chính
xác nhất về môi trường, thiên tai, lũ lụt,...và gửi về cho chúng ta thông qua giao
thức MQTT.
Ý nghĩa thực tiễn:
Sự phát triển của giao thức MQTT sẽ dẫn tới sự phát triển của các thiết bị
M2M và sẽ đẩy nhanh sự hoàn thiện thế giới IoT. IoT có thể thay đổi hoàn toàn
cách sống của con người trong tương lai không xa. Khi mọi vật đã được "Internet
hóa" người dùng có thể điều khiển chúng từ bất kỳ nơi nào, không bị giới hạn về
mặt không gian và thời gian chỉ cần một thiết bị thông minh có kết nối Internet.
Internet of Thing đang là chìa khóa của thành công trong tương lai.

1.2. Một số giao thức sử dụng trong truyền thông

Một máy tính tương tác với thế giới thông qua một hoặc nhiều ứng dụng.
Những ứng dụng này thực hiện các nhiệm vụ cụ thể và quản lý dữ liệu ra và vào.
Nếu máy tính đó là một phần của hệ thống mạng, thì một trong số các ứng dụng trên
sẽ có thể giao tiếp với các ứng dụng trên các máy tính khác thuộc cùng hệ thống
mạng. Bộ giao thức mạng là một hệ thống các quy định chung giúp xác định quá
trình truyền dữ liệu phức tạp. Dữ liệu đi từ ứng dụng trên máy này, qua phần cứng
mạng của máy, tới bộ phận trung gian và đến nơi nhận, thông qua phần cứng của
máy tính đích rồi tới ứng dụng.

1.2.1. Mô hình TCP/IP

TCP/IP là viết tắt của Transmission Control Protocol (Giao thức Điều Khiển
Truyền Thông) / Internet Protocol (Giao thức Internet). TCP/IP là một bộ giao thức
(bao gồm nhiều giao thức) hỗ trợ việc truyền thông giữa các máy tính hoặc các thiết
bị tương tự trên mạng.

2
EBOOKBKMT.COM

TCP/IP là bộ các giao thức có vai trò xác định quá trình liên lạc trong mạng và
quan trọng hơn cả là định nghĩa “hình dạng” của một đơn vị dữ liệu và những thông
tin chứa trong nó để máy tính đích có thể dịch thông tin một cách chính xác. TCP/IP
và các giao thức liên quan tạo ra một hệ thống hoàn chỉnh quản lý quá trình dữ liệu
được xử lý, chuyển và nhận trên một mạng sử dụng TCP/IP. Một hệ thống các giao
thức liên quan, chẳng hạn như TCP/IP, được gọi là bộ giao thức.
Thực tế của quá trình định dạng và xử lý dữ liệu bằng TCP/IP được thực hiện
bằng bộ lọc của các hãng sản xuất. Một chuẩn TCP/IP là một hệ thống các quy định
quản lý việc trao đổi trên các mạng TCP/IP. Bộ lọc TCP/IP là một phần mềm có
chức năng cho phép một máy tính hoà vào mạng TCP/IP.

Các chức năng của TCP/IP:

Một hệ thống giao thức như TCP/IP phải đảm bảo khả năng thực hiện những
công việc sau:
- Cắt thông tin thành những gói dữ liệu để có thể dễ dàng đi qua bộ phận
truyền tải trung gian.
- Tương tác với phần cứng của adapter mạng.
- Xác định địa chỉ nguồn và đích: Máy tính gửi thông tin đi phải có thể xác
định được nơi gửi đến. Máy tính đích phải nhận ra đâu là thông tin gửi cho mình.
- Định tuyến: Hệ thống phải có khả năng hướng dữ liệu tới các tiểu mạng, cho
dù tiểu mạng nguồn và đích khác nhau về mặt vật lý.
- Kiểm tra lỗi, kiểm soát giao thông và xác nhận: Đối với một phương tiện
truyền thông tin cậy, máy tính gửi và nhận phải xác định và có thể sửa chữa lỗi
trong quá trình vận chuyển dữ liệu.
- Chấp nhận dữ liệu từ ứng dụng và truyền nó tới mạng đích.
Để có thể thực hiện các công việc trên, những người sáng tạo ra TCP/IP đã
chia nó thành những phần riêng biệt, theo lý thuyết, hoạt động độc lập với nhau.
Mỗi thành phần chịu một trách nhiệm riêng biệt trong hệ thống mạng.

1.2.1.1. Kiến trúc TCP/IP

3
EBOOKBKMT.COM

Hình 1.1. Kiến trúc TCP/IP


Tầng liên kết mạng (Network Access Layer):
Tầng liên kết (còn được gọi là tầng liên kết dữ liệu hay là tầng giao thiếp
mạng) là tầng thấp nhất trong mô hình TCP/IP, bao gồm các thiết bị giao tiếp mạng
và chương trình cung cấp các thông tin cần thiết để có thể hoạt động, truy nhập
đường truyền vật lý qua thiết bị giao tiếp mạng đó.
Tầng này gồm các thiết bị phần cứng vật lí chẳng hạn như Card Mạng và Cáp
Mạng. Card mạng chẳng hạn là card Ethernet chứa một số HEX 12 kí tự (00-18-37-
03-C0-F4) được gọi là địa chỉ MAC hay địa chỉ truy nhập phương tiện. MAC đóng
vai trò quan trọng trong việc gán địa chỉ và truyền dữ liệu.
Một số giao thức thuộc tầng này bao gồm:
+ ATM
+ Ethernet
+ Token Ring
+ FDDI
+ Frame Relay
Tầng Internet (Internet Layer):
Tầng Internet (hay còn gọi là tầng mạng) xử lý quá trình truyền gói tin trên
mạng bao gồm các chức năng: gán địa chỉ, đóng gói và định tuyến (Route) dữ liệu.
4 giao thức quan trọng trong giao thức này là:
+ IP: Có chức năng gán địa chỉ cho dữ liệu trước khi truyền và định tuyến
chúng tới đích.
+ ARP: Có chức năng biên dịch địa chỉ IP của máy đích thành địa chỉ MAC.
+ ICMP: Có chức năng thông báo lỗi trong trường hợp truyền dữ liệu bị hỏng.

4
EBOOKBKMT.COM

+ IGMP: Có chức năng điều khiển truyền đa hướng (Multicast).


Tầng giao vận (Transport Layer):
Tầng giao vận phụ trách luồng dữ liệu giữa hai trạm thực hiện các ứng dụng
của tầng trên. Tầng này có hai giao thức chính: TCP và UDP.

 Giao thức UDP:

Là một trong những giao thức cốt lõi của giao thức TCP/IP. Dùng UDP,
chương trình trên mạng máy tính có thể gởi những dữ liệu ngắn được gọi là
datagram tới máy khác. UDP không cung cấp sự tin cậy và thứ tự truyền nhận mà
TCP làm, các gói dữ liệu có thể đến không đúng thứ tự hoặc bị mất mà không có
thông báo. Tuy nhiên UDP nhanh và hiệu quả hơn đối với các mục tiêu như kích
thước nhỏ và yêu cầu khắt khe về thời gian. Do bản chất không trạng thái của nó
nên nó hữu dụng đối với việc trả lời các truy vấn nhỏ với số lượng lớn người yêu
cầu.
Khuôn dạng của UDP datagram như sau:

Source Port Destination Port


Length Checksum
Data
Hình 1.2. Khuôn dạng của UDP datagram
− Số hiệu cổng nguồn (Source Port - 16 bit): số hiệu cổng nơi đã gửi datagram
− Số hiệu cổng đích (Destination Port - 16 bit): số hiệu cổng nơi datagram
được chuyển tới
− Độ dài UDP (Length - 16 bit): độ dài tổng cổng kể cả phần header của gói
UDP datagram
− UDP Checksum (16 bit): dùng để kiểm soát lỗi, nếu phát hiện lỗi thì UDP
datagram sẽ bị loại bỏ mà không có một thông báo nào trả lại cho trạm gửi. UDP có
chế độ gán và quản lý các số hiệu cổng (port number) để định danh duy nhất cho
các ứng dụng chạy trên một trạm của mạng. Do có ít chức năng phức tạp nên UDP
có xu thế hoạt động nhanh hơn so với TCP.  Nó thường dùng cho các ứng dụng
không đòi hỏi độ tin cậy cao trong giao vận.

 Giao thức TCP:

5
EBOOKBKMT.COM

TCP và UDP là  2 giao thức ở tầng giao vận và cùng sử dụng giao thức IP
trong tầng mạng. Nhưng không giống như UDP, TCP cung cấp dịch vụ liên kết tin
cậy và có liên kết.
Có liên kết ở đây có nghĩa là 2 ứng dụng sử dụng TCP  phải thiết lập liên kết
với nhau trước khi trao đổi dữ liệu. Sự tin cậy trong dịch vụ được cung cấp bởi TCP
được thể hiện như sau:
− Dữ liệu từ tầng ứng dụng gửi đến được được TCP chia thành các segment có
kích thước phù hợp nhất để truyền đi
− Khi TCP gửi 1 segment, nó duy trì một thời lượng để chờ phúc đáp từ trạm
nhận. Nếu trong khoảng thời gian đó phúc đáp không tới được trạm gửi thì segment
đó được truyền lại
− Khi TCP trên trạm nhận nhận dữ liệu từ trạm gửi nó sẽ gửi tới trạm gửi 1
phúc đáp tuy nhiên phúc đáp không được gửi lại ngay lập tức mà thường trễ một
khoảng thời gian
− TCP duy trì giá trị tổng kiểm tra (checksum) trong phần Header của dữ liệu
để nhận ra bất kỳ sự thay đổi nào trong quá trình truyền dẫn. Nếu 1 segment bị lỗi
thì TCP ở phía trạm nhận sẽ loại bỏ và không phúc đáp lại để trạm gửi truyền lại
segment bị lỗi đó
Giống như IP datagram, TCP segment có thể tới đích một cách không tuần tự.
Do vậy TCP ở trạm nhận sẽ sắp xếp lại dữ liệu và sau đó gửi lên tầng ứng dụng đảm
bảo tính đúng đắn của dữ liệu. Khi IP datagram  bị trùng lặp TCP tại trạm nhận sẽ
loại bỏ dữ liệu trùng lặp đó .
TCP cũng cung cấp khả năng điều khiển luồng. Mỗi đầu của liên kết TCP có
vùng đệm (buffer) giới hạn do đó TCP tại trạm nhận chỉ cho phép trạm gửi truyền
một lượng dữ liệu nhất định (nhỏ hơn không gian buffer còn lại). Điều này tránh
xảy ra trường hợp trạm có tốc độ cao chiếm toàn bộ vùng đệm của trạm có tốc độ
chậm hơn.
0 4 10 16 24 31

Source Port Destination Port

Sequence Number

Acknowledgement Number

6
EBOOKBKMT.COM

U A P R S F
Header
Length
Reserved R C S S Y I Window Size
G K H T N N

Checksum Urgent Pointer

Options Padding

Data

Hình 1.3. Khuôn dạng TCP segment


Các tham số trong khuôn dạng trên có ý nghĩa như sau:
− Source Port (16 bits ) là số hiệu cổng của trạm nguồn
− Destination Port (16 bits ) là số hiệu cổng trạm đích
− Sequence Number (32 bits) là số hiệu byte đầu tiên của segment trừ khi bit
SYN được thiết lập. Nếu bit SYN được thiết lập thì sequence number là số hiệu
tuần tự khởi đầu ISN (Initial Sequence Number ) và byte dữ liệu đầu tiên là ISN +
1. Thông qua trường này TCP thực hiện việc quản lý từng byte truyền đi trên một
kết nối TCP
− Acknowledgment Number (32 bits): số hiệu của segment tiếp theo mà trạm
nguồn đang chờ để nhận và ngầm định báo nhận tốt các segment mà trạm đích đã
gửi cho trạm nguồn
− Header Length (4 bits): số lượng từ (32 bits) trong TCP header, chỉ ra vị trí
bắt đầu của vùng dữ liệu vì trường Option có độ dài thay đổi. Header length có giá
trị từ 20 đến 60 byte
− Reserved (6 bits): dành để dùng trong tương lai
− Control bits: các bit điều khiển
URG: xác đinh vùng con trỏ khẩn có hiệu lực
ACK: vùng báo nhận ACK Number có hiệu lực
PSH: chức năng PUSH
RST: khởi động lại liên kết
SYN: đồng bộ hoá các số hiệu tuần tự (Sequence number)
FIN: không còn dữ liệu từ trạm nguồn

7
EBOOKBKMT.COM

− Window size (16 bits): cấp phát thẻ để kiểm soát luồng dữ liệu (cơ chế cửa
sổ trượt). Đây chính là số lượng các byte dữ liệu bắt đầu từ byte được chỉ ra trong
vùng ACK number mà trạm nguồn sẫn sàng nhận
− Checksum (16 bits): mã kiểm soát lỗi cho toàn bộ segment cả phần header
và dữ liệu
− Urgent Pointer (16 bits): con trỏ trỏ tới số hiệu tuần tự của byte cuối cùng
trong dòng dữ liệu khẩn cho phép bên nhận biết được độ dài của dữ liệu khẩn. Vùng
này chỉ có hiệu lực khi bit URG được thiết lập
− Option (độ dài thay đổi ): khai báo các tuỳ chọn của TCP trong đó thông
thường là kích thước cực đại của 1 segment: MSS (Maximum Segment Size)
− TCP data (độ dài thay đổi ): chứa dữ liệu của tầng ứng dụng có độ dài ngầm
định là 536 byte . Giá trị này có thể điều chỉnh được bằng cách khai báo trong vùng
Option
Tầng ứng dụng (Application Layer):
Tầng ứng dụng là tầng trên cùng của mô hình TCP/IP bao gồm các tiến trình
và các ứng dụng cung cấp cho người sử dụng để truy cập mạng. Có rất nhiều ứng
dụng được cung cấp ở tầng này, mà phổ biến là: Telnet: sử dụng trong việc truy cập
mạng từ xa, FTP (File Transfer Protocol): dịch vụ truyền tệp, Email: dịch vụ thư tín
điện tử, WWW (World Wide Web).

1.2.1.2. Quá trình truyền dữ liệu trong mô hình TCP/IP

user data

application

Appl user data


head
er TCP

TCP application data


header
TCP segment IP

IP TCP application data


header header
Ethernet
driver
Ethernet IP TCP application8data Ethernet
header header header trailer
EBOOKBKMT.COM

IP datagram

Ethernet
Ethernet Frame
46 to 1500 bytes
Hình 1.4. Quá trình truyền dữ liệu trong mô hình TCP/IP
Khi truyền dữ liệu, quá trình tiến hành từ tầng trên xuống tầng dưới, qua mỗi
tầng dữ liệu được thêm vào một thông tin điều khiển được gọi là phần header. Khi
nhận dữ liệu thì quá trình xảy ra ngược lại, dữ liệu được truyền từ tầng dưới lên và
qua mỗi tầng thì phần header tương ứng được lấy đi và khi đến tầng trên cùng thì dữ
liệu không còn phần header nữa.

1.2.3. Mô hình OSI

Mô hình OSI (Open System Interconnection): là mô hình được tổ chức ISO đề


xuất từ 1977 và công bố lần đầu vào 1984. Để các máy tính và các thiết bị mạng có
thể truyền thông với nhau phải có những qui tắc giao tiếp được các bên chấp nhận.
Mô hình OSI là một khuôn mẫu giúp chúng ta hiểu dữ liệu đi xuyên qua mạng như
thế nào đồng thời cũng giúp chúng ta hiểu được các chức năng mạng diễn ra tại mỗi
lớp.

1.2.3.1. Kiến trúc và chức năng các lớp trong mô hình OSI

Hình 1.5. Các lớp trong mô hình OSI


Chức năng của các lớp trong mô hình tham chiếu OSI:

9
EBOOKBKMT.COM

 Lớp ứng dụng (ApplicationLayer): là giao diện giữa các chương trình ứng
dụng của người dùng và mạng. Lớp Application xử lý truy nhập mạng chung, kiểm
soát luồng và phục hồi lỗi. Lớp này không cung cấp các dịch vụ cho lớp nào mà nó
cung cấp dịch vụ cho các ứng dụng như: truyền file, gởi nhận E-mail, Telnet,
HTTP, FTP, SMTP…
 Lớp trình bày (PresentationLayer): lớp này chịu trách nhiệm thương lượng
và xác lập dạng thức dữ liệu được trao đổi. Nó đảm bảo thông tin mà lớp ứng dụng
của một hệ thống đầu cuối gởi đi, lớp ứng dụng của hệ thống khác có thể đọc được.
Lớp trình bày thông dịch giữa nhiều dạng dữ liệu khác nhau thông qua một dạng
chung, đồng thời nó cũng nén và giải nén dữ liệu. Thứ tự byte, bit bên gởi và bên
nhận qui ước qui tắc gởi nhận một chuỗi byte, bit từ trái qua phải hay từ phải qua
trái. Nếu hai bên không thống nhất thì sẽ có sự chuyển đổi thứ tự các byte bit vào
trước hoặc sau khi truyền. Lớp presentation cũng quản lý các cấp độ nén dữ liệu
nhằm giảm số bit cần truyền. Ví dụ: JPEG, ASCCI, EBCDIC...
 Lớp phiên (SessionLayer): lớp này có chức năng thiết lập, quản lý, và kết
thúc các phiên thông tin giữa hai thiết bị truyền nhận. Lớp phiên cung cấp các dịch
vụ cho lớp trình bày. Lớp Session cung cấp sự đồng bộ hóa giữa các tác vụ người
dùng bằng cách đặt những điểm kiểm tra vào luồng dữ liệu. Bằng cách này, nếu
mạng không hoạt động thì chỉ có dữ liệu truyền sau điểm kiểm tra cuối cùng mới
phải truyền lại. Lớp này cũng thi hành kiểm soát hội thoại giữa các quá trình giao
tiếp, điều chỉnh bên nào truyền, khi nào, trong bao lâu. Ví dụ như: RPC, NFS,...
Lớp này kết nối theo ba cách: Haft-duplex, Simplex, Full-duplex.
 Lớp vận chuyển (TransportLayer): lớp vận chuyển phân đoạn dữ liệu từ hệ
thống máy truyền và tái thiết lập dữ liệu vào một luồng dữ liệu tại hệ thống máy
nhận đảm bảo rằng việc bàn giao các thông điệp giữa các thiết bị đáng tin cậy. Dữ
liệu tại lớp này gọi là segment. Lớp này thiết lập, duy trì và kết thúc các mạch ảo
đảm bảo cung cấp các dịch vụ sau:
+ Xếp thứ tự các phân đoạn: khi một thông điệp lớn được tách thành nhiều
phân đoạn nhỏ để bàn giao, lớp vận chuyển sẽ sắp xếp thứ tự các phân đoạn trước
khi ráp nối các phân đoạn thành thông điệp ban đầu

10
EBOOKBKMT.COM

+ Kiểm soát lỗi: khi có phân đoạn bị thất bại, sai hoặc trùng lắp, lớp vận
chuyển sẽ yêu cầu truyền lại
+ Kiểm soát luồng: lớp vận chuyển dùng các tín hiệu báo nhận để xác nhận.
Bên gửi sẽ không truyền đi phân đoạn dữ liệu kế tiếp nếu bên nhận chưa gởi tín
hiệu xác nhận rằng đã nhận được phân đoạn dữ liệu trước đó đầy đủ
 Lớp mạng (NetworkLayer): lớp mạng chịu trách nhiệm lập địa chỉ các
thông điệp, diễn dịch địa chỉ và tên logic thành địa chỉ vật lý đồng thời nó cũng chịu
trách nhiệm gởi packet từ mạng nguồn đến mạng đích. Lớp này quyết định đường đi
từ máy tính nguồn đến máy tính đích. Nó quyết định dữ liệu sẽ truyền trên đường
nào dựa vào tình trạng, ưu tiên dịch vụ và các yếu tố khác. Nó cũng quản lý lưu
lượng trên mạng chẳng hạn như chuyển đổi gói, định tuyến, và kiểm soát sự tắc
nghẽn dữ liệu. Nếu bộ thích ứng mạng trên bộ định tuyến (router) không thể truyền
đủ đoạn dữ liệu mà máy tính nguồn gởi đi, lớp Network trên bộ định tuyến sẽ chia
dữ liệu thành những đơn vị nhỏ hơn, nói cách khác, nếu máy tính nguồn gởi đi các
gói tin có kích thước là 20Kb, trong khi Router chỉ cho phép các gói tin có kích
thước là 10Kb đi qua, thì lúc đó lớp Network của Router sẽ chia gói tin ra làm 2,
mỗi gói tin có kích thước là 10Kb. Ở đầu nhận, lớp Network ráp nối lại dữ liệu. Ví
dụ: một số giao thức lớp này: IP, IPX,... Dữ liệu ở lớp này gọi packet hoặc
datagram.
 Lớp liên kết dữ liệu (Data link Layer): cung cấp khả năng chuyển dữ liệu tin
cậy xuyên qua một liên kết vật lý. Lớp này liên quan đến:
+ Địa chỉ vật lý
+ Mô hình mạng
+ Cơ chế truy cập đường truyền
+ Thông báo lỗi
+ Thứ tự phân phối frame
+ Điều khiển dòng
Tại lớp datalink, các bít đến từ lớp vật lý được chuyển thành các frame dữ liệu
bằng cách dùng một số nghi thức tại lớp này. Lớp datalink được chia thành hai lớp
con:
+ Lớp con LLC (logical link control)

11
EBOOKBKMT.COM

+ Lớp con MAC (media access control)


Lớp con LLC là phần trên so với các giao thức truy cập đường truyền khác, nó
cung cấp sự mềm dẻo về giao tiếp. Bởi vì lớp con LLC hoạt động độc lập với các
giao thức truy cập đường truyền, cho nên các giao thức lớp trên hơn (ví dụ như IP ở
lớp mạng) có thể hoạt động mà không phụ thuộc vào loại phương tiện LAN. Lớp
con LLC có thể lệ thuộc vào các lớp thấp hơn trong việc cung cấp truy cập đường
truyền.
Lớp con MAC cung cấp tính thứ tự truy cập vào môi trường LAN. Khi nhiều
trạm cùng truy cập chia sẻ môi trường truyền, để định danh mỗi trạm, lớp cho MAC
định nghĩa một trường địa chỉ phần cứng, gọi là địa chỉ MAC address. Địa chỉ MAC
là một con số đơn nhất đối với mỗi giao tiếp LAN (card mạng).
 Lớp vật lý (PhysicalLayer): định nghĩa các qui cách về điện, cơ, thủ tục
và các đặc tả chức năng để kích hoạt, duy trì và dừng một liên kết vật lý giữa các hệ
thống đầu cuối. Một số các đặc điểm trong lớp vật lý này bao gồm:
+ Mức điện thế
+ Khoảng thời gian thay đổi điện thế
+ Tốc độ dữ liệu vật lý
+ Khoảng đường truyền tối đa
+ Các đầu nối vật lý
Quá trình xử lý và vận chuyển của một gói dữ liệu trong mô hình OSI:

12
EBOOKBKMT.COM

Hình 1.6. Quá trình truyền dữ liệu trong mô hình OSI

1.2.3.2. So sánh hai giao thức TCP/IP và OSI


Khi kiến trúc tiêu chuẩn OSI xuất hiện thì TCP/IP đã trên con đường phát
triển. Xét một cách chặt chẽ, TCP/IP không tuân theo OSI. Tuy nhiên, hai mô hình
này có những mục tiêu giống nhau và do có sự tương tác giữa các nhà thiết kế tiêu
chuẩn nên 2 mô hình xuất hiện những điểm tương thích. Cũng chính vì thế, các
thuật ngữ của OSI thường được áp dụng cho TCP/IP.
Hình 1.7 thể hiện mối quan hệ giữa tiêu chuẩn TCP/IP bốn lớp và mô hình
OSI bảy lớp.

Hình 1.7. So sánh mô hình TCP/IP và OSI

13
EBOOKBKMT.COM

OSI chia nhiệm vụ của lớp ứng dụng thành 3 phân lớp: ứng dụng, trình bày và
khu vực. Hoạt động của lớp tương tác mạng trong OSI được tách thành lớp kết nối
dữ liệu và lớp vật lý. Việc chia nhỏ chức năng làm tăng thêm sự phức tạp, nhưng
đồng thời cũng tạo ra sự linh hoạt cho các nhà phát triển.

1.2.4. Truyền thông Socket

1.2.4.1. Định nghĩa

Có nhiều định nghĩa khác nhau về socket tùy theo cách nhìn của người sử
dụng. Một cách tổng quát nhất có thể định nghĩa: Một socket là một điểm cuối trong
một kết nối giữa hai chương trình đang chạy trên mạng.
Nhìn trên quan điểm của người phát triển ứng dụng người ta có thể định nghĩa:
Socket là một phương pháp để thiết lập kết nối truyền thông giữa một chương trình
yêu cầu dịch vụ (được gán nhãn client) và một chương trình cung cấp dịch vụ (được
gán nhãn server) trên mạng hoặc trên cùng một máy tính.
Đối với người lập trình, họ nhìn nhận socket như một giao diện nằm giữa tầng
ứng dụng và tầng khác trong mô hình mạng OSI có nhiệm vụ thực hiện việc giao
tiếp giữa chương trình ứng dụng với các tầng bên dưới của mạng.
Tuy nhiên, các lập trình viên hiện nay gần như luôn luôn bị ngăn cản tạo
socket riêng bằng cách thủ công bởi dù bạn dùng Java, serlet, hay CGI, PHP,... có
thể bạn sẽ không bao giờ mở được cổng một cách tường minh. Thay vào đó các lập
trình viên sử dụng thư viện socket được hỗ trợ sẵn bởi các ngôn ngữ lập trình. Như
vậy các socket vẫn tồn tại để kết nối các ứng dụng của người dùng, nhưng các chi
tiết của socket được ẩn trong những lớp sâu hơn để mội người không phải đụng
chạm đến.

14
EBOOKBKMT.COM

Hình 1.8. Mô hình OSI rút gọn

Program A Program B

Port Port

Transport protocol Transport protocol


Network protocol Network protocol
Network driver Network driver

Host1 Host2

Hình 1.9. Mô hình Socket


Có hai loại socket:
 Socket có hướng kết nối (TCP)
 Socket không hướng kết nối (UDP)
Đặc điểm của socket hướng kết nối:
+ Có một đường kết nối (địa chỉ IP) giữa 2 tiến trình
+ Một trong 2 tiến trình kia phải đợi tiến trình kia yêu cầu kết nối
+ Có thể dùng để liên lạc theo mô hình client và sever
+ Mô hình client /sever thì sever lắng nghe và chấp nhận từ client
+ Mỗi thông điệp gửi phải có xác nhận trả về
+ Các gói tin chuyển đi tuần tự
Đặc điểm socket không hướng kết nối:
+ 2 tiến trình liên lạc với nhau không kết nối trực tiếp

15
EBOOKBKMT.COM

+ Thông điệp gửi đi phải kèm theo thông điệp người nhận
+ Thông điệp có thể gửi nhiều lần 
+ Người gửi không chắc chắn thông điệp đến tay người nhận
+ Thông điệp gửi sau có thể đến trước và ngược lại
Số hiệu cổng của socket:
Để có thể thực hiện các cuộc giao tiếp, một trong hai quá trình phải công bố số
hiệu cổng socket mà mình sử dụng. Mỗi cổng giao tiếp thể hiện một địa chỉ xác
định trong hệ thống. Khi quá trình được gán một số hiệu cổng, nó có thể nhận dữ
liệu gửi đến cổng này từ các quá trình khác. Quá trình còn lại cũng được yêu cầu tạo
ra một socket.
Ngoài số hiệu cổng, hai bên giao tiếp còn phải biết địa chỉ IP của nhau. Địa
chỉ IP giúp phân biệt máy tính này với máy tính kia trên mạng TCP/IP. Trong khi số
hiệu cổng dùng để phân biệt các quá trình khác nhau trên cùng một máy tính.

1.2.4.2. Nguyên lý hoạt động

Như ta đã thấy, khi hai ứng dụng muốn trao đổi dữ liệu qua mạng chúng sẽ tạo
ra ở mỗi phía một socket và trao đổi dữ liệu bằng cách đọc/ghi từ socket. Để hiểu rõ
cách thức socket trao đổi dữ liệu chúng ta hãy xem xét nguyên lý hoạt động của
chúng.
Trước hết chúng ta hãy xem xét làm thế nào các socket có thể xác định được
nhau. Khi một chương trình tạo ra một socket, một định danh dạng số ( định danh
dạng số này còn được gọi là số hiệu cổng) sẽ được gán cho socket. Việc gán số hiệu
cổng này cho socket có thể được thực hiện bởi chương trình hoặc hệ điều hành tùy
theo cách socket được sử dụng như thế nào. Trong mỗi gói tin mà socket gửi đi có
chứa hai thông tin để xác định đích đến của gói tin:
+ Một địa chỉ mạng để xác định hệ thống sẽ nhận gói tin
+ Một số định danh cổng để nói cho hệ thống đích biết socket nào trên nó sẽ
nhận dữ liệu.
Nhờ hai thông tin này mà gói tin có thể đến đúng được máy tính chứa socket
mà nó cần đến (nhờ địa chỉ mạng) và được phân phối đến đúng socket đích (nhờ địa
chỉ cổng của socket đích).

16
EBOOKBKMT.COM

Dưới góc độ lập trình các socket thường làm việc theo cặp, một socket đóng
vai trò làm server còn các socket khác đóng vai trò như clients. Socket phía server
xác định một cổng cho giao tiếp mạng, sau đó chờ nghe yêu cầu mà client gửi tới nó
bằng client socket. Do đó các cổng cho server socket phải được biết bởi các chương
trình client.
Như vậy số hiệu cổng của socket phía server được xác định bởi chương trình,
ngược lại cổng cho client socket được xác định bởi hệ điều hành. Khi một socket
phía client gửi một gói tin tới socket phía server thì trong gói tin đã có chứa thông
tin về địa chỉ của hệ thống client và cổng của socket phía client trên server hoàn
toàn có thể gửi thông tin phản hồi cho client.
Chúng ta có thể khái quát quá trình trao đổi dữ liệu thông qua các socket như
sau:
+ Chương trình phía server tạo ra một socket, socket này được chương trình
gắn với một cổng trên server. Sau khi tạo ra socket này (ta gọi là socket phía server)
sẽ chờ nghe yêu cầu từ client.
+ Khi chương trình phía client cần kết nối với một server, nó cũng tạo ra một
socket, socket này cũng được hệ điều hành gắn với một cổng. Chương trình client sẽ
cung cấp cho socket của nó (ta gọi là socket phía client) địa chỉ mạng và cổng của
socket phía server và yêu cầu thực hiện kết nối hoặc truyền dữ liệu.
+ Chương trình phía server và chương trình phía client trao đổi dữ liệu với
nhau bằng cách đọc từ socket hoặc ghi vào socket của mình. Các socket ở hai phía
nhận dữ liệu từ ứng dụng và đóng gói để gửi đi hoặc nhận các dữ liệu được gửi đến
và chuyển cho chương trình ứng dụng bởi socket ở cả hai phía đều biết được địa chỉ
mạng và địa chỉ cổng của nhau.

17
EBOOKBKMT.COM

CHƯƠNG 2. GIAO THỨC MQTT TRONG HỆ THỐNG IOT

2.1. Hệ thống IoT (Internet of Things)

2.1.1. Định nghĩa

Internet của Sự vật (IoT) là khái niệm về mọi vật đều có thể kết nối Internet
thông qua các bộ cảm biến (sensor). Hệ thống IoT có thể bao gồm: các thiết bị đeo
(wearable) theo dõi chỉ số y tế, thiết bị đo từ xa, nhà thông minh, mạng cảm biến
không dây đo thông số môi trường, ô tô kết nối Internet, điện thoại di động tương
tác với môi trường... Kết quả là không có một kiến trúc chung duy nhất phù hợp cho
mọi lĩnh vực ứng dụng nêu trên. Tuy nhiên, một kiến trúc kiểu mô- đun cho phép
thêm/bớt tính năng theo yêu cầu của từng tình huống ứng dụng là rất hữu ích. Đó là
điểm khởi đầu giúp cho các nhà kiến trúc tạo ra những giải pháp IoT nền tảng cho
việc phát triển sau này.

2.1.2. Kiến trúc tham chiếu

Kiến trúc tham chiếu IoT bao gồm 5 lớp xếp chồng. Mỗi lớp có một chức năng
riêng, có thể minh họa bằng những công nghệ cụ thể. Có 2 lớp theo chiều dọc là
quản lý thiết bị và quản lý định danh & truy nhập.

Hình 2.1. Kiến trúc tham chiếu cho IoT

18
EBOOKBKMT.COM

Lớp Thiết bị (Devices):


Các thiết bị IoT phải có giao thức truyền thông trực tiếp (Arduino, Raspberry
Pi, Intel Galileo qua Ethernet hoặc Wi-Fi) hoặc gián tiếp kết nối được với Internet
(ZigBee, Bluetooth hoặc Bluetooth công suất thấp qua điện thoại di động,...)
Mỗi thiết bị cần có định danh thuộc một trong các loại: định danh duy nhất
(UUID) ghi sẵn trong phần cứng (thường là một phần của SoC hoặc chip thứ cấp),
UUID gửi qua hệ thống vô tuyến phụ (ví dụ: định danh Bluetooth, địa chỉ Wi-Fi
MAC), token OAuth2 Refresh/Bearer (có thể là bổ sung cho các loại khác), định
danh lưu trong bộ nhớ chỉ đọc như EEPROM.
Các chuyên gia khuyến nghị, mỗi thiết bị IoT nên có một UUID (tốt nhất lưu
cố định trong phần cứng) và một token OAuth2 Refresh/Bearer lưu trong
EEPROM. OAuth2 token có mục đích tạo ra một token định danh tách biệt với số
định danh cố định ghi trong mỗi thiết bị. Bearer token được dùng ban đầu để gửi
đến bất kỳ server hay dịch vụ nào cần định danh. Bearer token có thời gian sống
ngắn hơn Refresh token. Nếu Bearer token hết hạn, Refresh token được gửi đến lớp
định danh để tạo ra bản cập nhật của Bearer token.
Lớp Truyền thông (Communications):
Lớp truyền thông hỗ trợ kết nối các thiết bị. Nhiều giao thức có thể sử dụng
trong lớp này như HTTP/HTTPS, MQTT 3.1/3.1.1, CoAP (Constrained Application
Protocol). Trong đó, HTTP là giao thức lâu đời và phổ biến nhất nên có nhiều thư
viện hỗ trợ. Vì đó là giao thức dựa trên ký tự đơn giản nên nhiều thiết bị nhỏ như bộ
điều khiển 8 bit đều có thể hỗ trợ HTTP. Các thiết bị 32 bit lớn hơn có thể sử dụng
các thư viện HTTP client đầy đủ.
Có một số giao thức được tối ưu riêng cho IoT, trong đó nổi bật nhất là 2 giao
thức MQTT và CoAP.
Lớp Hợp nhất/Bus (Aggregation/ Bus):
Đây là lớp quan trọng để hợp nhất và chuyển đổi các thông điệp (message
broker hay middleware) truyền thông với 3 chức năng sau:

19
EBOOKBKMT.COM

- Hỗ trợ máy chủ HTTP và/hoặc chức năng chuyển đổi MQTT để giao tiếp với
thiết bị.
- Hợp nhất nội dung truyền từ các thiết bị khác nhau và định tuyến truyền
thông tới một thiết bị cụ thể (có thể qua gateway).
- Bắc cầu và chuyển đổi giữa 2 giao thức khác nhau, ví dụ chuyển đổi API dựa
trên HTTP ở lớp trên vào thông điệp MQTT đến thiết bị.
Lớp Bus cũng có thể cung cấp một số tính năng tương quan (correlation) và
ánh xạ đơn giản từ các mô hình tương quan khác nhau (nghĩa là ánh xạ số định danh
thiết bị sang số định danh của người sở hữu thiết bị và ngược lại).
Cuối cùng, lớp Hợp nhất/Bus cần thực hiện 2 nhiệm vụ an toàn bảo mật là
máy chủ tài nguyên OAuth2 (thẩm định Bearer token và các truy nhập tài nguyên
liên quan) và điểm tăng cường chính sách (PEP) đối với truy nhập dựa trên chính
sách. Trong mô hình ở hình 2.1, lớp Bus yêu cầu lớp quản lý truy nhập và định danh
thẩm định các yêu cầu truy nhập. Lớp quản lý truy nhập và định danh đóng vai trò
như điểm quyết định chính sách (PDP) trong quá trình này. Sau đó, lớp Bus thực
hiện theo kết quả do PDP mang đến, nghĩa là cho phép hoặc không cho phép truy
nhập tài nguyên.
Lớp Xử lý Sự kiện và Phân tích (Event Processing and Analytics):
Lớp này xử lý các sự kiện từ lớp Bus chuyển lên. Yêu cầu chủ yếu ở đây là
khả năng lưu trữ dữ liệu vào cơ sở dữ liệu. Mô hình truyền thống sẽ viết một ứng
dụng phía máy chủ (ví dụ, JAX-RS). Tuy nhiên, có một số cách tiếp cận khác linh
hoạt hơn. Thứ nhất là sử dụng các nền tảng phân tích dữ liệu lớn. Đó là nền tảng
dựa trên cloud khả mở hỗ trợ các công nghệ như Apache Hadoop để cung cấp
những phân tích map-reduce (quy trình xử lý dữ liệu siêu lớn) đối với tập hợp dữ
liệu đến từ các thiết bị. Cách tiếp cận thứ hai là hỗ trợ phương thức Xử lý Sự kiện
Phức tạp (Complex Processing Event) để thực hiện các hoạt động gần như theo thời
gian thực và ra quyết định hành động dựa theo kết quả phân tích dữ liệu từ các thiết
bị chuyển đến.
Lớp Truyền thông ngoài (External Communication):
Lớp này tạo ra giao diện giúp quản lý các thiết bị IoT như: web/portal,
dashboard (bảng hiển thị tổng hợp) hoặc hệ thống quản lý API. Với web/portal, kiến

20
EBOOKBKMT.COM

trúc cần hỗ trợ các công nghệ Web phía máy chủ như Java Servlets/JSP, PHP,
Python, Ruby.... Web server dựa trên Java phổ biến nhất là Apache Tomcat.
Dashboard là hệ thống tái sử dụng tập trung vào việc trình bày đồ thị mô tả dữ liệu
đến từ các thiết bị và lớp xử lý sự kiện. Lớp quản lý API có 3 chức năng. Thứ nhất
là cung cấp portal tập trung vào hỗ trợ lập trình viên tác nghiệp (chứ không phải là
người sử dụng như portal thông thường) và quản lý các phiên bản của API được
xuất bản. Thứ hai là đóng vai trò gateway quản lý truy nhập vào các API, kiểm tra
việc điều khiển truy nhập (đối với yêu cầu từ bên ngoài), điều tiết sử dụng dựa trên
chính sách, định tuyến và cân bằng tải. Cuối cùng là chức năng gateway đẩy dữ liệu
vào lớp phân tích để lưu trữ và xử lý, giúp hiểu được các API đã được sử dụng như
thế nào.
Lớp Quản lý Thiết bị (Device Management):
Trong lớp quản lý thiết bị, hệ thống phía máy chủ DM (Device Manager) giao
tiếp với các thiết bị thông qua các giao thức khác nhau và điều khiển phần mềm của
từng thiết bị hoặc một nhóm thiết bị (có thể khóa hoặc xóa dữ liệu trên thiết bị khi
cần), quản lý định danh các thiết bị và ánh xạ vào chủ nhân các thiết bị đó. DM phải
phối hợp với lớp quản lý định danh và truy nhập để quản lý việc điều khiển truy
nhập vào thiết bị (những người có quyền truy nhập vào thiết bị ngoài chủ nhân,
quyền điều khiển của chủ nhân thiết bị so với người quản trị...).
Lớp Quản lý Định danh và Truy nhập (Identity and Access Management):
Lớp này cần cung cấp các dịch vụ: Phát hành và thẩm định Oauth2 token; Các
dịch vụ định danh khác, gồm cả SAML2 SSO và OpenID Connect; XACML PDP;
Danh bạ cho người dùng (ví dụ: LDAP); Quản lý chính sách điều khiển truy nhập
(PCP).

2.1.3. Phân loại thiết bị IoT và phương thức kết nối Internet

Các thiết bị IoT rất đa dạng nhưng có thể phân thành ba loại chủ yếu, xét theo
kích cỡ:
- Những thiết bị IoT có kích thước nhỏ nhất dùng bộ điều khiển 8 bit nhúng,
kiểu cả hệ thống trên chip SoC (System on Chip) và thường không có hệ  điều hành.
Ví dụ điển hình là nền tảng phần cứng nguồn mở Arduino 8 bit.

21
EBOOKBKMT.COM

- Mức cao hơn là hệ thống dựa trên chip ARM và Arthero có kiến trúc 32 bit
rút gọn (limited). Những thiết bị này thường là các bộ router nhỏ dành cho gia đình
và những biến thể khác. Hệ thống thường chạy trên nền tảng nhúng Linux rút gọn
hoặc hệ điều hành nhúng dành riêng. Một số trường hợp không sử dụng hệ điều
hành như Arduino Zero hoặc Arduino Yun.
- Hệ thống IoT lớn nhất là loại sử dụng nền tảng 32 hoặc 64 bit đầy đủ. Những
hệ thống như Raspberry Pi hay BeagleBone có thể chạy hệ điều hành Linux đầy đủ
hoặc Android. Nhiều trường hợp chính là điện thoại di động hoặc dựa trên công
nghệ điện thoại di động. Những thiết bị này có thể đóng vai trò gateway hoặc cầu
(bridge) cho các thiết bị nhỏ hơn. Ví dụ: thiết bị đeo kết nối qua Bluetooth công suất
thấp với điện thoại di động hay Raspberry Pi, để sau đó làm cầu nối với mạng
Internet.
Có một số giải pháp kết nối giữa thiết bị với Internet hoặc gateway:
- Kết nối Ethernet hoặc Wi-Fi trực tiếp qua giao thức TCP hoặc UDP
- Bluetooth công suất thấp
- Kết nối trường gần (NFC)
- Zigbee hoặc các mạng vô tuyến khác
- SRF và kết nối vô tuyến điểm-điểm
- UART hoặc kênh nối tiếp (serial lines)
- SPI hoặc kênh I2C (wired buses)

2.1.4. Các yêu cầu của kiến trúc tham chiếu cho IoT

Yêu cầu chung là kiến trúc tham chiếu cho IoT phải trung lập với nhà sản
xuất, không phụ thuộc vào công nghệ cụ thể nào. Có những yêu cầu khá đặc thù cho
thiết bị IoT và môi trường hỗ trợ nhưng cũng có những yêu cầu xuất phát từ quá
trình sản xuất và sử dụng. Có thể tóm tắt các yêu cầu của kiến trúc tham chiếu cho
IoT trong 5 nhóm sau: 

Kết nối và giao tiếp:


Các giao thức hiện tại như HTTP có vị trí rất quan trọng trong nhiều thiết bị.
Thậm chí ngay cả bộ điều khiển 8 bit cũng có thể tạo ra lệnh GET, POST và giao
thức HTTP tạo ra kết nối đồng nhất quan trọng. Tuy nhiên, phần mào đầu của

22
EBOOKBKMT.COM

HTTP và một số giao thức Internet truyền thống chưa phù hợp cho giao tiếp IoT vì
hai lý do. Thứ nhất, kích cỡ bộ nhớ của chương trình quá lớn so với những thiết bị
nhỏ. Vấn đề thứ hai còn lớn hơn: HTTP yêu cầu công suất tương đối cao so với
thiết bị IoT nhỏ. Do vậy, cần có một giao thức nhị phân đơn giản, nhỏ gọn và có
khả năng đi qua tường lửa. Đối với thiết bị IoT kết nối Internet qua gateway cần 2
giao thức: một giao thức kết nối gateway còn giao thức khác kết nối từ gateway với
Internet. Cuối cùng, kiến trúc phải hỗ trợ giao thức truyền thông (communications)
và bắc cầu. Ví dụ, giao thức nhị phân dùng cho thiết bị IoT phải cho phép API (dựa
trên HTTP) điều khiển được thiết bị khi kết nối với bên thứ ba.
Quản lý thiết bị:
Hiện nay, nhiều thiết bị IoT chưa được quản lý ở chế độ tích cực (active) trong
khi chế độ quản lý này đã phổ biến và ngày càng trở nên quan trọng trong PC, điện
thoại di động và các thiết bị khác. Như vậy, chế độ tích cực là yêu cầu cần có trong
quản lý thiết bị IoT, cụ thể bao gồm những tính năng sau:
- Khả năng ngắt kết nối với thiết bị hỏng hoặc bị đánh cắp
- Khả năng cập nhật phần mềm trên thiết bị
- Cập nhật các thông số bảo mật
- Khả năng bật/tắt từ xa một số tính năng phần cứng
- Xác định vị trí thiết bị mất cắp
- Xóa dữ liệu bảo mật khỏi thiết bị mất cắp
- Cấu hình lại từ xa các thông số của Wi-Fi, GPRS hoặc các thông số mạng
khác
Thu thập, phân tích và khởi động dữ liệu:
Một số thiết bị IoT có giao diện UI nhưng nói chung hầu hết các thiết bị IoT
tập trung vào trang bị 1-2 bộ cảm biến có thể kèm theo (hoặc không) 1 bộ kích động
(actuator) hoặc nhiều hơn. Yêu cầu của hệ thống là thu thập dữ liệu từ rất nhiều
thiết bị, lưu trữ, phân tích và ra quyết định hành động dựa trên kết quả phân tích gần
như theo thời gian thực. Kiến trúc tham chiếu được thiết kế để quản lý số lượng lớn
thiết bị. Nếu những thiết bị đó tạo ra dòng dữ liệu ổn định, liên tục thì sẽ có lượng
dữ liệu khá lớn. Yêu cầu là hệ thống lưu trữ cần có tính khả mở cao, xử lý được
khối lượng dữ liệu lớn và đa dạng.

23
EBOOKBKMT.COM

Tính khả mở (scalability):


Bất kỳ kiến trúc phía máy chủ (server-side) nào đều cần tính khả mở cao, có
thể hỗ trợ hàng triệu thiết bị liên tục gửi, nhận và hoạt động dựa trên dữ liệu. Tuy
nhiên, "kiến trúc khả mở cao" kéo theo giá thành cao cả về phần cứng, phần mềm
và độ phức tạp. Yêu cầu quan trọng đối với kiến trúc này là phải hỗ trợ tính mở từ
mức triển khai nhỏ cho đến số lượng thiết bị rất lớn. Tính năng có thể mở co giãn
(elastic) và có thể triển khai dạng cloud như dịch vụ Amazon EC2 là rất cần thiết.
An toàn bảo mật:
Đây là yêu cầu quan trọng nhất. Các thiết bị IoT thường thu thập dữ liệu có
tính cá nhân cao và đưa lên Internet (và ngược lại). Điều đó dẫn đến hai loại nguy
cơ mất an toàn:
- Những nguy cơ gắn với bản chất mất an toàn thông tin của mạng Internet mà
nhà thiết kế/sản xuất thiết bị IoT không nhận thức được. Đó có thể chỉ đơn giản là
việc mở các cổng trên thiết bị. Ví dụ, tủ lạnh kết nối Internet có server dùng giao
thức SMTP không an toàn nên có thể gửi tin rác (spam).
- Những nguy cơ riêng từ chính bản thân thiết bị IoT, nhất là phần cứng. Ví
dụ, nhiều thiết bị IoT quá nhỏ, không hỗ trợ cơ chế mã hóa phi đối xứng phù hợp
nên không bảo đảm an toàn.
Có hai vấn đề quan trọng, đặc thù của bảo mật IoT là quản lý định danh và
truy nhập. Quản lý định danh cho thiết bị IoT và giao tiếp máy-máy (M2M) bằng
cách dùng cặp "tên/mật khẩu" là sai lầm thông dụng. Giải pháp lý tưởng là sử dụng
token cấp theo chuẩn của OAuth/OAuth2. Đối với quản lý truy nhập, sai lầm
thường thấy là sử dụng luật truy nhập đã lập trình cứng trong mã nguồn phía client
và server. Cách tiếp cận tốt nhất hiện nay là sử dụng tiêu chuẩn XACML. Cách tiếp
cận này không dùng mạch logic lập trình sẵn mà đưa vào chính sách ra quyết định
cho phép truy nhập.

2.2. Nền tảng truyền thông IoT

24
EBOOKBKMT.COM

Đa số thiết bị được gán mác “smart” ngày nay đều đồng nghĩa với việc nó
được sản xuất kèm theo tính năng giao tiếp qua các kênh không dây. Các giao thức
giao tiếp không dây trong thế giới IoT được thiết kế để thỏa mãn các yêu cầu cơ
bản: tiêu tốn ít năng lượng cho việc thu/phát sóng, tiêu tốn ít băng thông (để giảm
gánh nặng cho router wireless và hệ thống mạng), hoạt động trong mạng mắt lưới…
Một số thiết bị sẽ giao tiếp qua Wi-fi hay Bluetooth, nhưng đa phần sẽ tận dụng các
kết nối sử dụng dải tần dưới mức GHz Zigbee.

2.2.1. Giao thức Zigbee

Zigbee là một tiêu chuẩn được định nghĩa: là tập hợp các giao thức giao tiếp
mạng không dây khoảng cách ngắn có tốc độ truyền dữ liệu thấp. Về bản chất
Zigbee cũng một chuẩn giao tiếp không dây như những chuẩn không dây khác:
UWB, Wi-Fi, IrDA, 3G, Bluetooth... nhưng nó mang những đặc tính kỹ thuật và
đặc tính vật lý riêng và do đó sẽ chỉ phù hợp với một mảng ứng dụng nhất định.
Tín hiệu truyền trong giao thức Zigbee thực chất là tín hiệu radio. Zigbee được
hỗ trợ trong các dải tần số sau:
- Dải 868,3MHz: Chỉ một kênh tín hiệu. Trong dải này tốc độ truyền là
20kbps.
- Dải 902MHz - 928MHz: Có 10 kênh tín hiệu từ 1 - 10 với tốc độ truyền
thường là 40kbps.
- Dải 2,4GHz - 2,835GHz: có 16 kênh tín hiệu từ 11 - 26 với tốc độ truyền
250kbps.
Trong nhiều ứng dụng, người ta hay dùng giao thức Zigbee ở dải tần 2,4GHz -
2,835GHz. Đây là dải tần phổ biến và được hỗ trợ bởi nhiều thiết bị. Hơn nữa với
Zigbee, dải tần này có tới 16 kênh tín hiệu trong dải (mỗi kênh cách nhau 5MHz tần
số) với tốc độ truyền lớn nhất: 250kbps.
Zigbee có những đặc điểm chính sau:
- Tốc độ truyền dữ liệu thấp 20-250Kbps
- Sử dụng công suất thấp, ít tiêu hao điện năng
- Thời gian sử dụng pin rất dài
- Cài đặt, bảo trì dễ dàng

25
EBOOKBKMT.COM

- Độ tin cậy cao


- Có thể mở rộng đến 65000 node
- Chi phí đầu tư thấp
Zigbee chủ yếu được sử dụng cho các ứng dụng chạy pin có tốc độ dữ liệu
thấp, chi phí nhỏ, và thời gian sử dụng pin dài. Trong nhiều ứng dụng của Zigbee,
tổng thời gian mà thiết bị không dây thực sự hoạt động rất ít, thiết bị sử dụng hầu
hết thời gian của nó trong chế độ tiết kiệm năng lượng, hay chế độ ngủ (sleep
mode). Kết quả là, Zigbee cho phép các thiết bị có khả năng hoạt động trong nhiều
năm trước khi cần phải nạp lại pin hoặc thay pin mới.

Kiến trúc Zigbee:

APPLICATION

Zigbee
API Device
Object

Security
32/64/128 bit encryption

Network
Start/Mesh/Cluster Tree Topology

MAC

PHY
868 MHz/ 915 MHz/ 2.4 GHz

Hình  2.2. Kiến trúc lớp (hay ngăn xếp - Stack) trong kiến trúc Zigbee
Zigbee được xây dựng ở trên của hai lớp MAC ( Medium Access Control) và
lớp vật lý PHY. Lớp MAC và lớp PHY được định nghĩa theo chuẩn IEEE 802.15.4
dành cho các ứng dụng WPAN tốc độ thấp. Đặc tính kỹ thuật Zigbee sau đó thêm
vào 4 lớp chính: lớp mạng, lớp ứng dụng, lớp các đối tượng thiết bị Zigbee ( ZDO)
và lớp các đối tượng người dùng cho phép tùy biến, linh động trong chuẩn đó.
Bên cạnh việc tích hợp thêm hai lớp mức cao hơn trên các lớp nền, một sự tích
hợp rất quan trọng nữa là thêm vào các ZDO ( Zigbee Device Object). Các ZDO

26
EBOOKBKMT.COM

chịu trách nhiệm cho nhiều tác vụ, trong đó bao gồm: định nghĩa vai trò của các
thiết bị, tổ chức và yêu cầu để truy nhập vào mạng, bảo mật cho thiết bị...

Mô hình mạng Zigbee:

Trong truyền thông dùng giao thức Zigbee thường hỗ trợ 3 mô hình mạng
chính: mạng hình sao, mạng hình cây và mạng sơ đồ lưới.
Trong lớp mạng Zigbee cho phép 3 kiểu thiết bị: ZigBee coordinator( ZC);
ZigBee Router(ZR); ZigBee End Device ( ZED).

Hình 2.3. Các mô hình mạng Zigbee


 Zigbee Coordinator (ZC): Chỉ có duy nhất 1 ZC trong bất kỳ mạng Zigbee
nào và nó có chức năng chính là kích hoạt thông tin về mạng thông qua cấu hình
các kênh, PAN ID và hiện trạng ngăn xếp.
 Zigbee Router (ZR): Là một thành phần của hệ thống mạng mà chức năng
của nó là thực hiện việc vận chuyển các gói tin trong mạng. Nó thực hiện các bảng
kết nối cũng như định vị địa chỉ cho các ZED của nó.
 Zigbee End Device (ZED): Là một thành phần của hệ thống mạng nhưng
không tham gia vào quá trình vận chuyển tin. Nó có được tối ưu sao cho công suất
tiêu thụ là nhỏ nhất nhờ các chế độ bắt tín hiệu và kỹ thuật "sleep".

Quá trình thiết lập trong một mạng Zigbee như sau:

Quét mạng (Network Scan): Các thiết bị trong mạng sẽ quét các kênh tín hiệu,
ví dụ nếu dùng dải tần 2,4GHz thì sẽ có 16 kênh để quét, sau đó thiết bị sẽ chọn
kênh phù hợp nhất để giao tiếp trong mạng. Ta gọi đó là sự chiếm chỗ : ocupacy.

27
EBOOKBKMT.COM

- Thiết lập/Gia nhập mạng: Thiết bị có thể tạo ra một mạng trên một kênh hoặc
gia nhập vào một mạng đã tồn tại sẵn.
- Phát hiện thiết bị: Thiết bị sẽ yêu cầu mạng phát hiện ra địa chỉ của mình trên
các kênh được kích hoạt.
- Phát hiện dịch vụ: Thiết bị quét các dịch vụ được hỗ trợ trên thiết bị trong
phạm vi mạng.
- Liên kết: Thiết bị giao tiếp với nhau thông qua các lệnh và các tin nhắn điều
khiển.
Chuẩn Zigbee rất phù hợp với những ứng dụng yêu cầu giá thành thấp, tiêu
thụ năng lượng nhỏ và tính linh động tốt. Vì vậy ngày nay Zigbee được dùng vào
rất nhiều ứng dụng trong cuộc sống như: Các hệ chiếu sáng thông minh, HVAC,
Công nghiệp, Sensor không dây, bệnh viện....

2.2.2. Giao thức Bluetooth

Bluetooth là chuẩn kết nối không dây tầm ngắn, thiết kế cho các kết nối thiết
bị cá nhân hay mạng cục bộ nhỏ, trong phạm vi băng tần từ 2.4 đến 2.485GHz.
Bluetooth được thiết kế hoạt động trên 79 tần số đơn lẻ. Khi kết nối tự động nó sẽ
tìm ra tần số tương thích để di chuyển đến thiết bị cần kết nối trong khu vực nhằm
đảm bảo sự liên tục. Nó được thiết kế kết nối tầm thấp với 3 lớp khác nhau nhằm có
thể cơ động truyền sóng đi xa nhất đến mức có thể. Thông thường các loại di động
hiện tại dùng Bluetooth lớp thứ 2, với cường độ 2.5mW, phạm vi chỉ có 35 feet
(khoảng 12m). Trong khi lớp thứ nhất lên đến 100 feet (hơn 30m) với cường độ
100mW.
Các đặc điểm của Bluetooth:
Bluetooth có thể đạt được tốc độ truyền dữ liệu 1Mb/s. Bluetooth hỗ trợ tốc độ
truyền tải dữ liệu lên đến 720kbps trong phạm vi 10m. Khác với kết nối hồng ngoại
(IrDA), kết nối Bluetooth là vô hướng và sử dụng dải tần 2.4GHz.
- Tiêu thụ năng lượng thấp, cho phép ứng dụng được trong nhiều loại thiết bị,
bao gồm cả các thiết bị cầm tay và điện thoại di động.
- Giá thành hạ (giá 1 con chip bluetooth đang giảm dần)
- Khoảng cách giao tiếp cho phép

28
EBOOKBKMT.COM

+ Khoảng cách giữa hai thiết bị đầu cuối có thể lên đến 10m ngoài trời và 5m
trong tòa nhà
+ Khoảng cách thiết bị đầu cuối và Access point có thể lên tới 100m ngoài trời
và 30m trong nhà
- Bluetooth sử dụng băng tần đăng kí 2.4GHz trên dãy băng tần ISM. Tốc độ
truyền dữ liệu có thể đạt mức tối đa 1Mbps
- Dễ dàng trong việc phát triển ứng dụng: Bluetooth kết nối một ứng dụng này
với một ứng dụng khác thông qua các chuẩn “ Bluetooth Profiles”, do đó có thể độc
lập về phần cứng cũng như hệ điều hành sử dụng
- Bluetooth được dùng trong giao thiếp dữ liệu tiếng nói: có 3 kênh để truyền
tiếng nói và 7 kênh để truyền dữ liệu trong một mạng cá nhân
- An toàn và bảo mật: được tích hợp với sự xác nhận và mã hóa
- Tính tương thích cao, được nhiều nhà sản xuất phần cứng cũng như phần
mềm hỗ trợ

Các tầng giao thức trong Bluetooth:

Hình 2.4. Các tầng nghi thức của Bluetooth

 Bluetooth Radio- Sóng Radio

29
EBOOKBKMT.COM

Tầng Bluetooth radio là tầng thấp nhất được định nghĩa trong đặc tả Bluetooth,
nó định nghĩa những yêu cầu cho bộ phận thu phát sóng hoạt động ở tần số 2.4GHz
ISM. Băng tần ISM là băng tần không cần đăng kí được dành riêng cho các thiết bị
không dây trong công nghệ, khoa hoạc, y tế.
Nhờ giao tiếp bằng sóng radio mà dữ liệu Bluetooth có thể xuyên qua các vật
thể rắn và phi kim.
 Baseband – Dải băng cơ sở
Nằm ở tầng vật lý của Bluetooth, nó quản lý những kênh truyền và liên lết vật
lý tách biệt khỏi những dịch vụ khác như sửa lỗi, chọn bước nhảy và bảo mật. Tầng
Base band protocol nằm trên tầng radio trong tầng giao thức của Bluetooth, base
band protocol được cài đặt như là Link Controller (Kiểm soát liên kết). Nó cùng với
Link manager (quản lý) thực hiện những công việc ở mức thấp như kết nối, quản lý
năng lượng. Tầng Baseband cũng quản lý những kết nối đồng bộ và không đồng bộ,
quản lý các gói tin, thực hiện tìm kiếm và yêu cầu kết nối đến các thiết bị Bluetooth
khác.

 Link Manager Protocol – Quản lý liên kết

Link Manager (LM) thực hiện việc thiết lập kênh truyền, xác nhận hợp lệ cấu
hình kênh truyền, nó tìm kiếm những LM khác và giao tiếp với chúng thông qua
Link Manager Protocol. Để thực hiện được những vai trò của mình, LM dùng
những dịch vụ do tầng Link Controller bên dưới cung cấp.

 Host Cotroller Interface (HCI) – Kiểm soát giao diện chủ

HCI cung cấp một giao diện cho phép các tầng bên trên điều khiển Baseband
Cotroller và Link Manager, đồng thời cho phép truy cập đến trạng thái của phần
cứng và các thanh ghi điều khiển, về bản chất, giao diện này cung cấp một phương
thức duy nhất để truy cập đến những khả năng của băng tần cơ sở. HCI tồn tại trong
3 phần: Host - Transport layer (lớp chuyển tải) - Host Controller, mỗi phần đóng vai
trò khác nhau trong hệ thống HCI.

 Logical Link Control And Adaptation Protocol (L2CAP) – Kiểm soát liên
kết logic, giao thức điều hợp

30
EBOOKBKMT.COM

L2CAP nằm bên trên giao thức băng tần cơ sở và nằm ở tầng data link.
L2CAP cung cấp những dịch vụ hướng kết nối và phi kết nối cho những tầng giao
thức bên trên. L2CAP có khả năng phân kênh, phân đoạn và tái tổ hợp. L2CAP cho
phép những giao thức ở tầng cao hơn và những ứng dụng truyền, nhận những dữ
liệu. Mỗi gói dữ liệu L2CAP tối đa 64kb.

 Radio Frequency Communication (RFCOMM Protocol) – Tần số truyền


thông

Giao thức RFCOMM cho phép giả lập cổng serial thông qua giao thức
L2CAP. Giao thức này dựa trên chuẩn ETSI TS 07.10, chỉ có một phần của chuẩn
TS 07.10 được dùng và chỉnh sửa cho phù hợp với Bluetooth.
RFCOMM hỗ trợ tối đa 60 kết nối cùng một lúc giữa hai thiết bị Bluetooth, số
kết nối tối đa tùy thuộc vào nhà sản xuất. Đối với FRCOOM một kết nối bao gồm 2
ứng dụng chạy trên 2 thiết bị riêng biệt (2 thiết bị đầu cuối).

 Service Discovery Protocol (SDP) – Dịch vụ

SDP cho phép các ứng dụng tìm kiếm những dịch vụ và thuộc tính của các
dịch vụ có trong một thiết bị Bluetooth SDP, điều này rất cần thiết bởi vì các dịch
vụ mà 1 thiết bị Bluetooth cung cấp sẽ thay đổi tùy theo mỗi thiết bị. Nhiệm vụ
chính của SDP là cho phép 1 thiết bị Bluetooth tìm kiếm xem các thiết bị Bluetooth
khác có cung cấp những dịch vụ nào. SDP cho phép làm điều này bằng nhiều cách:
Searching (tìm kiếm 1 dịch vụ cụ thể), Browsing (lấy những dịch vụ đang được
cung cấp).
SDP là một giao thức đơn giản với những yêu cầu tối thiểu về việc truyền dẫn
bên dưới, SDP dùng mô hình request/respone PDU. Client này sẽ gửi yêu cầu đến
Server và Server sẽ trả lời ngược lại.

2.2.3. Công nghệ Wifi

Wi-Fi viết tắt từ Wireless Fidelity hay mạng 802.11 là hệ thống mạng không


dây sử dụng sóng vô tuyến, giống như điện thoại di động, truyền hình và radio.
Hệ thống này đã hoạt động ở một số sân bay, quán cafe, thư viện hoặc khách
sạn. Hệ thống cho phép truy cập Internet tại những khu vực có sóng của hệ thống

31
EBOOKBKMT.COM

này, hoàn toàn không cần đến cáp nối. Ngoài các điểm kết nối công cộng (hotspots),
WiFi có thể được thiết lập ngay tại nhà riêng.
Tên gọi 802.11 bắt nguồn từ viện IEEE (Institute of Electrical and Electronics
Engineers). Viện này tạo ra nhiều chuẩn cho nhiều giao thức kỹ thuật khác nhau, và
nó sử dụng một hệ thống số nhằm phân loại chúng; 4 chuẩn thông dụng của WiFi
hiện nay là 802.11a/b/g/n.
Truyền thông qua mạng không dây là truyền thông vô tuyến hai chiều. Cụ thể:
thiết bị adapter không dây (hay bộ chuyển tín hiệu không dây) của máy tính chuyển
đổi dữ liệu số sang tín hiệu analog vô tuyến và phát những tín hiệu này đi bằng một
ăng-ten. Thiết bị router không dây nhận những tín hiệu này và giải mã chúng rồi gửi
thông tin tới Internet hoặc máy chủ thông qua kết nối mạng có dây.
Quy trình này vẫn hoạt động với chiều ngược lại, router nhận thông tin từ
Internet/máy chủ, chuyển chúng thành tín hiệu vô tuyến và gởi đến adapter không
dây của máy tính.
Sóng vô tuyến sử dụng cho Wi-Fi giống với các sóng vô tuyến sử dụng cho
thiết bị cầm tay, điện thoại di động và các thiết bị khác. Chỉ khác biệt ở chỗ: chúng
truyền và phát tín hiệu ở tần số cao hơn là 2,4GHz hoặc 5GHz, cho phép tín hiệu
mang theo nhiều dữ liệu hơn.
Wifi dùng chuẩn 802.11:
 Chuẩn 802.11b là phiên bản đầu tiên trên thị trường. Đây là chuẩn
chậm nhất và rẻ tiền nhất, và nó trở nên ít phổ biến hơn so với các chuẩn khác.
802.11b phát tín hiệu ở tần số 2.4 GHz, nó có thể xử lý đến 11Mbps, và nó sử dụng
mã CCK (complimentary code keying).
 Chuẩn 802.11g cũng phát ở tần số 2.4 GHz, nhưng nhanh hơn so với
chuẩn 802.11b, tốc độ xử lý đạt 54Mbps. Chuẩn 802.11g nhanh hơn vì nó sử dụng
mã OFDM (orthogonal frequency-division multiplexing), một công nghệ mã hóa
hiệu quả hơn.
 Chuẩn 802.11a phát ở tần số 5 GHz và có thể đạt đến 54Mbps. Nó
cũng sử dụng mã OFDM. Những chuẩn mới hơn sau này như 802.11n còn nhanh
hơn chuẩn 802.11a, nhưng 802.11n vẫn chưa phải là chuẩn cuối cùng.

32
EBOOKBKMT.COM

 Chuẩn 802.11n cũng phát ở tần số 2.4 GHz, nhưng nhanh hơn so với
chuẩn 802.11a, tốc độ xử lý đạt 300 Mbps.
 Chuẩn 802.11ac phát ở tần số 5 GHz
WiFi có thể hoạt động trên cả ba tần số và có thể nhảy qua lại giữa các tần số
khác nhau một cách nhanh chóng. Việc nhảy qua lại giữa các tần số giúp giảm thiểu
sự nhiễu sóng và cho phép nhiều thiết bị kết nối không dây cùng một lúc.
Các chế độ bảo mật mạng Wi-Fi:
Do mọi giao tiếp đều là không dây, tiện lợi nhưng cũng tiềm tàng nhiều nguy
hiểm, dữ liệu dễ dàng bị đánh cắp và can thiệp bởi những kẻ xấu. Chính vì vậy,
song hành cùng Wi-Fi, tổ chức IEEE cũng đưa ra các công nghệ mã hóa để bảo vệ.
+ WEP (Wired Equivalency Privacy)
WEP sử dụng công nghệ mã hóa 64 bit hoặc 128 bit (an toàn hơn). Những ai
muốn sử dụng mạng đã được kích hoạt WEP đều phải biết khóa WEP, khóa này
thường là mật khẩu dạng dãy số. Hiện tại, đã có những phương pháp để tấn công
chuẩn này khiến WEP không còn an toàn nên ít ai dùng. Hầu hết các điểm truy cập
không dây công cộng thường mở hoàn toàn (không phải nhập mật khẩu) hoặc bảo
mật bằng WPA hay WPA2.
+ WPA (WiFi Protected Access)
WPA là một bước tiến của WEP và là một phần của giao thức bảo mật mạng
không dây 802.11i. Năm 2003, hiệp hội Wi-Fi đã phát hành một chuẩn bảo mật
mang tên Wi-Fi Protected Access với phiên bản đầu tiên (WPA) sử dụng mã hóa
TKIP/RC4 khó bẻ khóa hơn so với WEP.
+ WPA2
Giữa năm 2004, chuẩn WPA thế hệ 2 (WPA2) ra đời có khả năng bảo mật cao
hơn với chuẩn bảo mật IEEE 802.11i và mã hóa CCMP/AES. Nhiều router chuẩn n
hiện tại chỉ chạy ở tốc độ tối đa khi bạn chọn chế độ mã hóa WPA2, vì vậy nếu
không bị vướng vấn đề phải tương thích với các thiết bị cũ, hãy chọn ngay mã hóa
WPA2 khi bạn cấu hình mạng không dây tại nhà/văn phòng.
Mở rộng cho doanh nghiệp
+ Personal

33
EBOOKBKMT.COM

Personal hay Pre-Shared Key (PSK) thích hợp với hầu hết các mạng gia đình,
quán cà phê, văn phòng nhỏ. Bạn có thể định nghĩa mật khẩu mã hóa trên router
không dây và các điểm truy cập (AP) khác. Sau đó, mật khẩu phải được nhập vào
bởi người dùng khi kết nối với mạng Wi-Fi.
Mặc dù chế độ này dường như rất dễ triển khai, nhưng nó không thể bảo đảm
an toàn tuyệt đối cho mạng doanh nghiệp. Mật khẩu mã hóa được lưu trên các máy
tính, nên ai cũng có thể khôi phục và xem được mật khẩu. Hơn nữa, bạn sẽ gặp phải
phiền toái khi muốn thay đổi mật khẩu vì phải thay đổi trên tất cả các Acces Point
và máy tính.
+ Enterprise 
Enterprise (EAP/RADIUS): chế độ này cung cấp khả năng bảo mật cần thiết
cho các mạng không dây trong môi trường doanh nghiệp. Mặc dù phức tạp trong
thiết lập, nhưng chế độ bảo mật này cung cấp khả năng điều khiển tập trung và có
thể triển khai các chính sách riêng biệt cho từng người dùng. Thông tin đăng nhập
của người dùng có thể được thay đổi hoặc thu hồi bởi các quản trị mạng. 
Người dùng không cần quan tâm đến các khóa mã hóa thực sự. Chúng được
tạo một cách an toàn và được gán trên mỗi session người dùng trong chế độ nền sau
khi người dùng nhập vào mật khẩu đăng nhập của họ. Điều này sẽ tránh được việc
ai đó có thể khôi phục lại mật khẩu từ các máy tính.
Phương pháp xác định các thông tin người dùng (và máy chủ) trên các mạng
WPA/WPA2-Enterprise được định nghĩa theo chuẩn IEEE 802.1x. Cách thức này
yêu cầu một máy chủ ngoài, được gọi là máy chủ Remote Authentication Dial In
User Service (RADIUS).

2.3. Giao thức MQTT

2.3.1. Định nghĩa

MQTT viết tắt của Message Queuing Telemetry Transport là một giao thức
gửi dạng publish/subscribe sử dụng cho các thiết bị Internet of Things với băng
thông thấp, độ tin cậy cao và khả năng được sử dụng trong mạng lưới không ổn
định.

34
EBOOKBKMT.COM

Bởi vì giao thức này sử dụng băng thông thấp trong môi trường có độ trễ cao
nên nó là một giao thức lý tưởng cho các ứng dụng M2M. Trong môi trường không
ổn định, khi các kết nối từ client đến broker có bị hỏng thì broker sẽ đệm message
và đẩy chúng ra cho các thuê bao khi nó trở lại trực tuyến. Các kết nối từ client và
broker có thể bị ngắt mà không cần thông báo, các broker có thể ngắt kết nối và gửi
đến các thiết bị những tin nhắn được lưu trữ với các hướng dẫn từ các nhà sản xuất.

Kiến trúc:

MQTT có mô hình client/server, nơi mà mỗi cảm biến là một khách hàng
(client) và kết nối đến một máy chủ, có thể hiểu như một nhà môi giới (broker),
thông qua giao thức TCP.

MQTT là giao thức định hướng bản tin. Mỗi bản tin là một tín hiệu rời rạc và
broker không thể biết trước.

Mỗi bản tin được publish một địa chỉ, có thể hiểu như một kênh. Client đăng
kí vào một vài kênh để nhận/gửi dữ liệu, gọi là subscribe. Client có thể subscribe
vào nhiều kênh. Mỗi client sẽ nhận được dữ liệu khi bất kì trạm nào khác gửi dữ
liệu vào kênh đã đăng kí. Khi một client gửi một bản tin đến một kênh nào đó, gọi
là publish. Các mô hình publish/subscribe cho phép các Client MQTT có thể giao
tiếp 1-1, 1-N và N-1.
Ví dụ: một mạng đơn giản gồm 3 Client và một broker trung tâm.
Cả 3 khách hàng mở kết nối TCP với Broker. Client B và C đăng kí tới kênh
nhiệt độ topic temperature.

Hình 2.5. Quá trình subscribe của client B và client C


35
EBOOKBKMT.COM

Tại một thời điểm nào đó, Client A gửi một giá trị 22.5 đến kênh nhiệt độ
topic temperature. Broker sẽ chuyển bản tin đến tất cả các Client đã đăng kí.

Hình 2.6. Quá trình publish của client A và nhận dữ liệu của client B, C
Như vậy, cả Client B và C đều nhận được bản tin gửi từ A.
2.3.2. Các đặc trưng của giao thức

- Giao thức MQTT truyền nhận không đồng bộ


- Dạng truyền message publish/subcribe cung cấp việc truyền tin phân tán 1-
nhiều và tách biệt các ứng dụng
-Hoạt động bằng cách trao đổi một loạt gói tin điều khiển MQTT một cách
xác định
-Việc truyền message thường không quan tâm đến các nội dung mà nó truyền
-Dựa trên nền TCP/IP để cung cấp đường truyền
-Dữ liệu truyền nhỏ (header cố định luôn là 2 byte), và giao thức giảm đến
mức tối thiểu băng thông của đường truyền
-Một cơ chế để thông báo đến các thuê bao khi đường truyền bị đứt bất
thường, sử dụng Last Will và Testament feature
-Có 3 mức QoS:
+ QoS0 (tối đa một lần): tin nhắn được truyền theo những phương pháp tốt
nhất trong môi trường hoạt động. Với mức QoS này có thể xảy ra mất mát tin nhắn.
+ QoS1 (ít nhất một lần): tin nhắn được đảm bảo đến nơi nhận nhưng có thể
nhận được nhiều bản sao.
+ QoS2 (chính xác một lần): tin nhắn được đảm bảo nhận được đúng một lần.

36
EBOOKBKMT.COM

Các trường hợp sử dụng mức QoS

Sử dụng mức QoS0 khi:


- Có một kết nối hoàn chỉnh hoặc gần như ổn định giữa bên gửi và bên nhận
- Không quan tâm tới việc bị mất tin nhắn hoặc trong trường hợp dữ liệu
không quan trọng.
Sử dụng mức QoS1 khi:
- Ứng dụng cần phải nhận được mọi tin nhắn và trường hợp sử dụng này ứng
dụng có thể xử lí các bản sao.
Mức QoS1 thường được sử dụng nhiều nhất vì nó đảm bảo tin nhắn đến ít nhất
một lần. Tuy nhiên, ứng dụng phải chứa được các bản sao và xử lí chúng cho phù
hợp.
- Không có khả năng chịu được sự phức tạp cho các luồng ở mức QoS2
Sử dụng mức QoS2 khi:
- Ứng dụng cần nhận được tất cả tin nhắn đúng một lần.
Mức QoS này được sử dụng khi mà các bản sao sẽ làm hại ứng dụng của
người sử dụng hoặc client đăng kí. Phải tốn thêm thời gian hơn để hoàn thành các
luồng QoS2.

2.3.3. Định dạng của message

Mỗi gói tin điều khiển của MQTT gồm 2byte header, byte đầu là phần header
cố dịnh, byte thứ hai là độ dài còn lại chứa phần header thay đổi được và payload,
nó có thể chứa nhiều byte. Không phải tất cả các gói tin đều có phần header thay đổi
được và phần payload.

a) Phần header cố định

Tất cả các message luôn chứa phần cố định dưới đây:


Bảng 2.1. Định dạng phần header cố định của message

Bit 7 6 5 4 3 2 1 0

Byte1 Loại Message Cờ DUP Mức QoS RETAIN

Byte2 Độ dài còn lại

37
EBOOKBKMT.COM

Loại message

Có 14 loại message bao gồm:


+ CONNECT + SUBSCRIBE
+ CONNACK + SUBACK
+ PUBLISH + UNSUBSCRIBE
+ PUBACK + UNSUBACK
+ PUBREC + PINGREG
+ PUBREL + PINGRESP
+ PUBCOMP + DISCONNECT

Cờ DUP

Cờ này được bật khi client hoặc server đang cố chuyển lại một gói PUBLISH, 
PUBREL, SUBSCRIBE  hoặc UNSUBSCRIBE. Giá trị này được sử dụng trong các
message mà có QoS lớn hơn 0 và yêu cầu xác nhận. Khi bit DUP được set, phần
header thay đổi sẽ chứa Message ID. Dựa vào giá trị này sẽ biết được gói tin đã
nhận được trước đó hay không.

Mức QoS

Mức QoS xác định làm thế nào để mỗi tin nhắn MQTT sẽ được chuyển giao
và phải được quy định cho mỗi tin nhắn khi gửi qua MQTT. Điều quan trọng là lựa
chọn giá trị QoS thích hợp cho mỗi tin nhắn, bởi vì giá trị này xác định khi nào thì
client và server giao tiếp với nhau để cung cấp các gói tin.

Cờ RETAIN

Nếu cờ RETAIN được set bằng 1, khi gói tin được publish từ Client, Broker
phải lưu trữ lại gói tin với mức QoS đã đăng ký, và nó sẽ được gởi đến bất kỳ Client
nào subscribe cùng kênh trong tương lai. Khi một Client kết nối tới Broker và
subscribe, nó sẽ nhận được gói tin cuối cùng có RETAIN = 1 với bất kỳ topic nào
mà nó đăng ký trùng. Tuy nhiên, nếu Broker nhận được gói tin mà có QoS = 0 và
RETAIN = 1, nó sẽ huỷ tất cả các gói tin có RETAIN = 1 trước đó. Và phải lưu gói
tin này lại, nhưng hoàn toàn có thể huỷ bất kỳ lúc nào.

38
EBOOKBKMT.COM

Khi publish một gói dữ liệu đến Client, Broker phải set RETAIN = 1 nếu gói
được gửi như là kết quả của việc subscribe mới của Client (giống như tin nhắn ACK
báo subscribe thành công). RETAIN phải bằng 0 nếu không quan tâm tới kết quả
của việc subscribe.

Độ dài còn lại

Độ dài còn lại là số byte còn lại trong gói, bao gồm dữ liệu trong header thay
đổi được và payload. Việc mã hóa với độ dài thay đổi sử dụng 1 byte để miêu tả độ
dài, vì thế độ dài tối đa sẽ là 127. Những message dài hơn sẽ được miêu tả theo cách
sau: 7 bít được dùng để miêu tả giá trị, bít còn lại dùng để miêu tả phía sau còn byte
nào miêu tả trường này hay không. Mỗi byte tiếp sau đó cũng như vậy, 7 bit để lưu
giá trị, 1 bít gọi là bit tiếp tục. Giá trị được tính bằng cách nhân giá trị được diễn tả
bởi 7 bit và lũy thừa tăng dần của 128.
Ví dụ:
Miêu tả độ Remain Length = 64, ta chỉ cần 1 byte, trong đó 7 bit để miêu tả
giá trị 64, 1 bit còn lại bằng 0.
Miêu tả giá trị là 321, chẳng hạn 321 = 65*128^0 + 2* 128^1, ta cần 2 byte để
biểu diễn. Byte đầu chứa giá trị 65 trong 7 bit và bit còn lại là 1. Byte thứ 2 chứa giá
trị 2 ở 7 bit và 1 bit chứa giá trị bằng 0.

b) Phần header thay đổi được

Một vài loại MQTT message cũng chứa những phần có độ dài thay đổi được.
Nó nằm giữa phần header cố định và phần payload.
Định dạng của các trường thay đổi được trong header được miêu tả bên dưới
đây:
Protocol name (tên giao thức)
Xuất hiện trong message CONNECT. Trường này sẽ chứa tên MQIsdp ở dạng
chữ hoa.
Protocol version (phiên bản giao thức)
Xuất hiện trong phần header của message CONNECT. 8 bit biểu diễn một giá
trị không dấu biểu thị mức độ sửa đổi giao thức của client.
Connect flags (cờ kết nối)

39
EBOOKBKMT.COM

Giá trị này quy định cờ Clean Session, cờ Will, cờ Will QoS, và cờ Retain
được chứa trong phần header thay đổi được của message CONNECT.
Bảng 2.2. Định dạng phần header thay đổi được của message CONNECT
bit 7 6 5 4 3 2 1 0
Clean
Cờ User Cờ Will Will QoS Cờ
Sessio Reserved
Name Password Retain Will
n

Bit số 0 của byte này không được sử dụng trong phiên bản hiện tại của giao
thức. Nó có thể được sử dụng trong phiên bản sau.
Cờ Clean session
Vị trí: Bit đầu tiên của byte Connect flags
Nếu không được set (tức là giá trị bằng 0), thì server phải lưu lại những thiết
bị đăng kí sau khi client này đứt kết nối. Nó bao gồm việc tiếp tục lưu những
message có QoS bằng 1 và QoS bằng 2 cho các topic đã subscribed, vì thế, chúng
có thể được chuyển đi khi client kết nối lại. Server cũng phải cập nhật trạng thái "lơ
lửng" của message đang được chuyển đi tại thời điểm mà bị mất kết nối. Thông tin
này phải được giữ đến khi client kết nối lại.
Nếu cờ này được set (tức giá trị bằng 1), thì server phải xóa hết những thông
tin trước đó về client. Sever cũng phải xóa hết mọi trạng thái của client này khi nó
đứt kết nối.
Thông thường, client sẽ thực hiện trong 1 mode (hoặc là luôn xóa hoặc là luôn
không), ít khi thay đổi.
Lựa chọn này phụ thuộc vào ứng dụng. Client kết nối với một clean
conenction sẽ không nhận được những thông tin trước đó, nó phải subscribe lại tại
mỗi lần kết nối. Client với kết nối dạng non-clean session sẽ không mất bất cứ gói
tin QoS 1 hoặc QoS 2 nào, khi nó được published trong lúc client đứt kết nối. QoS 0
sẽ không bao giờ được lưu lại, vì vậy nó chỉ được chuyển đi theo cách thức cố gắng
hết mức ở thời điểm nó được publish.

40
EBOOKBKMT.COM

Cờ này cũng được biết đến với một tên khác "Clean start". Nó được đổi tên để
phù hợp với ý nghĩa là được áp dụng cho toàn bộ phiên, chứ không riêng gì kết nối
khởi tạo.
Một server có thể cung cấp một cơ chế quản trị cho phép có xóa các thông tin
đã lưu về client hay không. Nó có thể được sử dụng trong trường hợp biết chắc chắn
rằng client nào đó không kết nối lại.
Will flag
Vị trí: Bit thứ 2 của byte Connect flags
Trường này định nghĩa rằng, một message được published bởi server cho một
client mà server không thể giữ kết nối bằng Keep Alive hoặc có lỗi I/O trong quá
trình kết nối với Client. Phải phân biệt với trường hợp server nhận được message
DISCONNECT từ Client, khi đó nó sẽ không gửi Will message.
Nếu cờ này được set, Will QoS và Will Retain sẽ được biểu diễn trong cờ
Connect và các trường của Will Topic và Will Message phải có trong phần payload.
Will QoS
Vị trí: Bit 3, 4 của byte Connect Flags
Một quy định về QoS cho message Will là trường Will QoS, message này
được gửi để báo đứt kết nối với client không mong muốn.
Nếu cờ Will flags được set, thì trường Will QoS sẽ là bắt buộc, ngoài ra nó sẽ
bị bỏ qua.
Các giá trị của Will QoS là 0 (0x00), 1 (0x01), hoặc 2 (0x02).
Will Retain
Vị trí: Bít 5 của byte Connect flags
Cờ Will Retain sẽ quy định có hay không việc giữ lại message Will đã được
published khi client đứt kết nối bất thường.
Cờ Will Retain là bắt buộc nếu Will flag được set, ngoài ra, nó sẽ bị bỏ qua.
User name and password flags
Vị trí: Bit 6, 7 của byte Connect flags.

41
EBOOKBKMT.COM

Một kết nối từ client có thể chỉ ra User và Password, thiết lập các trường để
thông báo rằng có User và Password (tùy chọn) trong phần payload của Message
CONNECT
Nếu cờ User Name được set, thì trường User Name là bắt buộc, ngoài ra nó sẽ
bị bỏ qua. Nếu cờ Password được set, thì trường Password là bắt buộc, mặt khác nó
sẽ bỏ qua giá trị này. Nó sẽ không quan tâm đến Password nếu không cung cấp
Username
Keep Alive timer (chu kỳ lớn nhất tính theo đơn vị giây (s) được cho phép giao
tiếp với broker)
Keep Alive timer được chứa bên trong phần header thay đổi được của message
CONNECT. Keep Alive timer, được tính bằng giây, định nghĩa là khoảng thời gian
lớn nhất giữa các message nhận được từ client. Trường này giúp server phát hiện
được khi nào kết nối đến client bị đứt mà không cần phải đợi TCP/IP timeout.
Client có trách nhiệm gửi 1 message trong mỗi chu kì Keep Alive. Khi không xuất
hiện các message liên quan đến dữ liệu trong chu kì này thì client phải gửi một
message PINGREQ, và khi đó server sẽ trả lời bằng message PINGRESP.
Nếu server không nhận được message trong vòng 1.5 chu kì của Keep Alive
(clients sẽ được "gia hạn" thêm một nửa chu kì), nó sẽ ngắt kết nối với clients như
là khi client gửi message DISCONNECT. Hành động này không ảnh hưởng đến bất
kì thuê bao nào của client.
Nếu client không nhận được message PINGRESP, trong khoảng 1 chu kì Keep
Alive sau khi gửi một message PINGREQ thì nó nên đóng kết nối TCP/IP lại.
Keep Alive timer là một giá trị 16 bit biểu diễn số giây của chu kì này. Giá trị
khi sử dụng sẽ phụ thuộc vào ứng dụng, nó thường là vài phút. Giá trị lớn nhất có
thể là 18 giờ. Nếu giá trị này là Zero, có nghĩa là client không bị mất kết nối.
Connect return code
Mã kết nối trả về được gửi trong phần header thay đổi được của message
CONNACK.
Trường này định nghĩa bởi một byte có giá trị >=0. Ý nghĩa của mỗi giá trị
được miêu tả trong bảng bên dưới. Giá trị trả về có ý nghĩa thay đổi theo từng loại
message. Thông thường, trả về 0 có nghĩa là thành công.

42
EBOOKBKMT.COM

Bảng 2.3. Các giá trị và ý nghĩa của mã rc

Thứ tự HEX Ý nghĩa


0 0x00 Kết nối được chấp nhận
Kết nối bị từ chối: phiên bản của giao thức
1 0x01
không được chấp nhận
2 0x02 Kết nối bị từ chối: mã nhận diện không hợp lệ
3 0x03 Kết nối bị từ chối: server không sẵn sàng
4 0x04 Kết nối bị từ chối: sai user name hoặc password
5 0x05 Kết nối bị từ chối: không cho phép
6-255 Chưa sử dụng

Topic name
Topic name được chứa trong phần header thay đổi được của một message
PUBLISH. Topic name là chìa khóa để xác định thông tin về kênh thông tin mà
payload sẽ được published tới. Subscribers sử dụng trường này để xác định kênh
thông tin mà nó muốn nhận được.
Topic name là một xâu UTF-encoded.
Topic name có giới hạn trên của độ dài là 32.767 kí tự.
c) Payload
Những message dưới đây sẽ có payload:
CONNECT
Nó chứa một hoặc nhiều chuỗi mã hóa UTF-8. Trong đó, chỉ định rõ một mã
nhận diện duy nhất cho client, một Will topic, message và cả user name, password.
Không phải tất cả chúng đều xuất hiện và sự xuất hiện của chúng được quy định bởi
một tập các cờ phía trước.
SUBSCRIBE
Chứa một danh sách các topic name mà client có thể đăng kí và cả mức QoS.
Tất cả chúng cũng là UTF-encoded.
SUBACK
Payload sẽ chứa một danh sách các mức QoS được cho phép. Một mức QoS sẽ
được quản trị của server cho phép client sử dụng để đăng kí đến một Topic name cụ

43
EBOOKBKMT.COM

thể. Những mức QoS này được liệt kê cùng thứ tự tương ứng với danh sách các
Topic Name trong message SUBSCRIBE.

2.3.3.1. Message CONNECT – Client yêu cầu kết nối đến server

Khi một kết nối TCP/IP được thiết lập từ client đến server, một phiên giao
thức cũng được tạo ra bằng cách sử dụng luồng CONNECT.
Header cố định
Bảng 2.4. Định dạng header cố định của message CONNECT
bit 7 6 5 4 3 2 1 0
Byte 1 Message Type DUP flag QoS level RETAIN
0 0 0 1 x x x x
Byte 2 Remaining Length

Cờ DUP, QoS, and RETAIN không được sử dụng trong message CONNECT.
Remaining Length là độ dài của phần header thay đổi được (12 bytes) và độ
dài payload. Nó có thể là nhiều byte.

Header thay đổi được

Header thay đổi được của message CONNECT bao gồm bốn trường theo thứ
tự sau: tên giao thức, mức giao thức, các cờ và Keep Alive.
Một ví dụ về định dạng của phần header biến đổi được có thể thấy trong bảng
sau.
Bảng 2.5. Ví dụ biểu diễn phần header thay đổi được của mesage CONNECT

Bit Biểu diễn 7 6 5 4 3 2 1 0


Protocol name
Byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
Byte 2 Length LSB (6) 0 0 0 0 0 1 1 0
Byte 3 'M' 0 1 0 0 1 1 0 1
Byte 4 'Q' 0 1 0 1 0 0 0 1
Byte 5 'I' 0 1 0 0 1 0 0 1
Byte 6 's' 0 1 1 1 0 0 1 1
Byte 7 'd' 0 1 1 0 0 1 0 0
Byte 8 'p' 0 1 1 1 0 0 0 0
44
EBOOKBKMT.COM

Protocol Version Number


Byte 9 Version (3) 0 0 0 0 0 0 1 1
Connect Flags
User name flag (1)
Password flag (1)
Will RETAIN (0)
Byte 10 1 1 0 0 1 1 1 x
Will QoS (01)
Will flag (1)
Clean Session (1)
Keep Alive timer
Byte 11 Keep Alive MSB (0) 0 0 0 0 0 0 0 0
Byte 12 Keep Alive LSB (10) 0 0 0 0 1 0 1 0

Cờ user name set (1)


Cờ password set (1)
Cờ Clean Session set (1)
Keep Alive timer set 10 giây (0x000A)
Will message

 Cờ Will set (1)


 Trường Will QoS là 1
 Cờ Will RETAIN (0)

Payload

Payload của message CONNECT chứa một hoặc nhiều xâu UTF-8 dựa trên
các cờ ở phần header thay đổi được. Những xâu này nếu có sẽ xuất hiện theo thứ tự
sau:

Client Identifier:
Là xâu được mã hóa UTF đầu tiên.

45
EBOOKBKMT.COM

Client Identifier (Client ID) có độ dài từ 1 đến 23 kí tự, xác định một định
danh duy nhất của client kết nối đến server. Nó phải là duy nhất khi so sánh với các
clients khác, và là chìa khóa để chuyển các message với QoS là 1 và 2. Nếu Client
ID chứa nhiều hơn 23 kí tự, server sẽ trả lời yêu cầu CONNECT với mã rc là 2: mã
nhận diện không hợp lệ.
Will Topic:
Nếu Will Flag được set, thì đây sẽ là chuỗi UTF-8 tiếp theo.
Message Will sẽ được published đến Will Topic. QoS level sẽ được xác định
bằng trường Will QoS, và trạng thái RETAIN sẽ được xác định bằng cờ Will
RETAIN trong phần header thay đổi.

Will Message:
Nếu cờ Will Flag được set, thì đây là xâu UTF-8 tiếp theo. Message Will định
nghĩa nội dung của message, cái mà sẽ được published đến Will Topic nếu client bị
ngắt kết nối bất thường. Xâu này cũng có thể là xâu rỗng tức là độ dài bằng 0.
Mặc dù Will Message được mã hóa trong message CONNECT, khi nó
published đến Will Topic thì chỉ bytes của messages được gửi, không phải là 2 byte
quy định độ dài đầu tiên. Phần message này chỉ có thể chứa các kí tự ASCII 7 bit.
User Name:
Nếu cờ User Name được set, đây sẽ là xâu mã hóa UTF tiếp theo. Trường này
xác định tên của User đang kết nối đến, được sử dụng để xác thực.
Dù không bắt buộc nhưng User Name nên có độ dài từ 12 kí tự trở xuống.
Password:
Nếu cờ Password được set, đây sẽ là xâu UTF-8 kế tiếp. Password cho user
tương ứng đang kết nối đến, được sử dụng cho việc xác thực. Nên để password có
độ dài từ 12 kí tự trở xuống dù điều này không bắt buộc.

Đáp ứng

Server sẽ gửi message CONNACK để trả lời message CONNECT từ client.


Nếu server không nhận được mesage CONNET từ client trong một khoảng
thời gian nào đó sau khi thiết lập kết nối TCP/IP, thì server sẽ đóng kết nối đó lại.

46
EBOOKBKMT.COM

Nếu client không nhận được một message CONNACK từ server trong một
khoảng thời gian nhất định, thì client cũng sẽ đóng kết nối đó lại, và khởi động lại
quá trình làm việc bằng một socket mới đến server rồi tiếp tục gửi yêu cầu kết nối
bằng gói CONNECT.
Trong cả 2 trường hợp trên, thời gian chờ để nhận được message CONNECT
hoặc CONNACK phụ thuộc vào ứng dụng và điều kiện kết nối.
Nếu một client kết nối bằng một Client ID đang được kết nối với Server rồi,
thì client trước đó phải được ngắt kết nối bắt buộc bởi server trước khi thực hiện
luồng CONNECT với client mới .
Nếu client gửi một message CONNECT không hợp lệ, server sẽ đóng kết nối.
Không hợp lệ ở đây bao gồm việc khác nhau về Protocol Name hoặc Protocol
Version Numbers. Nếu server đã phân tích message CONNECT rồi mới phát hiện
ra có một trường nào đó không hợp lệ, nó sẽ gửi lại message CONNACK chứa mã
có nội dung "Kết nối bị từ chối: phiên bản giao thức không được chấp nhận" trước
khi hủy kết nối này.

2.3.3.2. Message PUBLISH

Một message PUBLISH được gửi từ một client đến server để cung cấp chúng
đến các bên đăng kí.
Header cố định
Bảng 2.6. Định dạng phần header cố định message PUBLISH

Bit 7 6 5 4 3 2 1 0
Byte 1 Message type DUP flag QoS level RETAIN
0 0 1 1 0 0 1 0
Byte 2 Remaining Length

QoS level: Set là 1.


Cờ DUP: Set là 0. Có nghĩa là message được gửi ở lần đầu tiên .
Cờ RETAIN: Set là 0. Có nghĩa là message sẽ không được giữ lại.
Remaining Length field: Độ dài của phần header thay đổi cộng phần payload.
Nó có thể là trường nhiều byte

47
EBOOKBKMT.COM

Header thay đổi được

Phần header có độ dài thay đổi được chứa các thành phần sau:
Topic name:
Là một xâu UTF. Nó không chứa kí tự đại diện trong topic.
Khi nhận được yêu cầu subscribe từ client thì topic đó có thể chứa kí tự đại
diện. Chuỗi này hoàn toàn được xác định bởi thiết bị xuất bản chứ không phải là
topic mà client đã subcribe
Message ID:
Được sử dụng cho các messsage có QoS là 1 hoặc 2.
Bảng 2.7 chỉ ra một ví dụ về header có độ dài thay đổi cho PUBLISH
message.
Bảng 2.7. Header có độ dài thay đổi của message PUBLISH

Trường Giá trị


Topic Name: "a/b"
QoS level 1
Message ID: 10
Định dạng của phần header thay đổi trong trường hợp này được chỉ ra dưới
bảng sau:
Bảng 2.8. Định dạng phần header thay đổi được của message PUBLISH

Biễu diễn 7 6 5 4 3 2 1 0
Topic Name
Byte 1 Length MSB (0) 0 0 0 0 0 0 0 0
Byte 2 Length LSB (3) 0 0 0 0 0 0 1 1
Byte 3 'a' (0x61) 0 1 1 0 0 0 0 1
Byte4 '/' (0x2F) 0 0 1 0 1 1 1 1
Byte 5 'b' (0x62) 0 1 1 0 0 0 1 0
Message Identifier
Byte6 Message ID MSB (0) 0 0 0 0 0 0 0 0
Byte7 Message ID LSB (10) 0 0 0 0 1 0 1 0

48
EBOOKBKMT.COM

Payload

Chứa phần dữ liệu cho việc xuất bản. Nội dung và định dạng của dữ liệu là do
ứng dụng quy định. Trường Remaining Length trong phần độ dài cố định sẽ bao
gồm cả phần độ dài thay đổi và phần payload. Như vậy, hoàn toàn hợp lệ khi một
message PUBLISH chứa độ dài payload là 0.

2.3.3.3. Message SUBSCRIBE

Message SUBSCRIBE cho phép client đăng kí một hoặc nhiều topic với
server. Message được published lên server sẽ được chuyển đến client bằng message
PUBLISH. Message SUBSCRIBE cũng chỉ ra QoS level mà thiết bị muốn nhận
message.
Header cố định
Bảng 2.9. Định dạng phần header cố định của message SUBSCRIBE

Bit 7 6 5 4 3 2 1 0

Byte 1 Message Type DUP flag QoS level RETAIN

1 0 0 0 0 0 1 x

Byte 2 Remaining Length

QoS level: Message SUBSCRIBE sử dụng QoS level là 1 để chấp nhận nhiều
yêu cầu đăng kí.
Cờ DUP: Set là zero (0). Có nghĩa là message được gửi lần đầu.
Cờ RETAIN: Không sử dụng.
Remaining Length field: Độ dài của payload. Có thể chứa nhiều byte.

Header thay đổi được

Phần header thay đổi chứa Message ID.


Bảng 2.10. Ví dụ về phần header thay đổi được với Message ID bằng 10

Biểu diễn 7 6 5 4 3 2 1 0
Message Identifier

49
EBOOKBKMT.COM

Byte 1 Message ID MSB (0) 0 0 0 0 0 0 0 0


Byte 2 Message ID LSB (10) 0 0 0 0 1 0 1 0

Payload

Payload của một message SUBSCRIBE chứa một danh sách các topics mà các
client đã đăng kí, và QoS level ở mức mà client muốn. Xâu được mã hóa ở dạng
UTF, QoS level chiếm 2 bits trong 1 single byte. Topic có thể chứa những kí tự đại
diện đặc biệt để biểu diễn một tập các topic.

2.3.4. Nguyên lý làm việc

Một quá trình làm việc của MQTT được chia thành 4 giai đoạn: kết nối, xác
thực, giao tiếp và kết thúc. Một client bắt đầu bằng cách tạo ra một kết nối TCP/IP
tới broker bằng cách sử dụng một cổng tiêu chuẩn hoặc một cổng tùy chỉnh được
xác định bởi các phương thức của broker. Khi kết nối, điều quan trọng là nhận ra
các máy chủ có thể tiếp tục một quá trình làm việc cũ hay không nếu được cung cấp
tới một khách hàng tái sử dụng.
Các cổng tiêu chuẩn là 1883 không được mã hóa giao tiếp và 8883 được mã
hóa giao tiếp sử dụng giao thức SSL/TLS. Trong sự kết hợp SSL/TLS, khách hàng
xác nhận các chứng chỉ máy chủ để xác thực máy chủ. Các client cũng có thể cung
cấp một chứng chỉ client tới broker để trong sự kết hợp này broker có thể sử dụng
để xác thực cho client.
Mỗi gói MQTT bao gồm header cố định (2 byte), header thay đổi được và
payload có giới hạn là 256MB chứa thông tin và chất lượng dịch vụ (QoS). 3 mức
QoS khác nhau xác định nội dung được quản lý bởi các giao thức MQTT. QoS càng
cao càng đáng tin cậy, tuy nhiên độ trễ sẽ lớn hơn và yêu cầu băng thông hơn, bởi
vậy khách hàng đăng ký có thể xác định mức độ QoS mà họ muốn nhận.
Mức QoS đơn giản nhất là dịch vụ không xác nhận. Mức QoS này sử dụng
một chuỗi các gói PUBLISH, các thiết bị gửi tin nhắn tới broker, broker sẽ gửi tới
các thiết bị đăng ký. Không có cơ chế để đảm bảo rằng tin nhắn đã nhận được một
cách chính xác hay chưa và broker không lưu lại tin nhắn sau khi gửi. Mức QoS này
được gọi là “ tối đa một lần”, “QoS 0”, hay “gửi và quên”.

50
EBOOKBKMT.COM

Mức QoS thứ hai là dịch vụ xác nhận. Mức QoS này sử dụng một chuỗi các
gói PUBLISH/PUBACK giữa các thiết bị và broker, cũng như giữa broker và thiết
bị đăng ký. Một gói tin xác nhận sẽ xác nhận nội dung đã nhận được và cơ chế gửi
lại sẽ gửi lại nội dung nếu như sự xác nhận không kịp thời, điều này dẫn đến việc
thiết bị sẽ nhận được nhiều bản sao của cùng một nội dung. Mức QoS này gọi là “ ít
nhất một lần” hoặc “QoS 1”.
Mức QoS thứ ba là dịch vụ đảm bảo. Mức QoS này mang tin nhắn với hai cặp
gói tin. Cặp thứ nhất là PUBLISH/PUBREC, cặp thứ hai là PUBREL/PUBCOMP,
hai cặp này đảm bảo dù có gửi lại thì tin nhắn cũng chỉ đến đích đúng một lần. Mức
này gọi là “đúng một lần” hoặc “QoS 2”.
Trong quá trình truyền thông, một client có thể thực hiện xuất bản, đăng ký,
hủy đăng ký và hoạt động ping. Hoạt động xuất bản gửi một khối dữ liệu nhị phân
tới một chủ đề được xác định bởi các thiết bị xuất bản. MQTT hỗ trợ tin nhắn
BLOBS lên đến 256MB. Các định dạng của nội dung là các ứng dụng cụ thể. Các
chủ đề đăng ký sử dụng một cặp gói tin SUBSCRIBE/SUBACK, hủy đăng ký sử
dụng cặp gói tin UBSUBSCRIBE/UNSUBACK. Hoạt động thứ tư mà client thực
hiện trong quá trình liên lạc là ping tới broker sử dụng gói PINGREQ/PINGRESP.
Hoạt động này không có chức năng nào khác ngoài việc duy trì kết nối trực tiếp và
đảm bảo kết nối TCP/IP không bị đóng lại bởi một gateway hoặc router.
Khi một thiết bị muốn chấm dứt một quá trình MQTT, nó sẽ gửi một tin nhắn
DISCONNECT cho broker và sau đó đóng kết nối. Điều này được gọi là tắt máy
bởi vì nó cung cấp cho client với khả năng dễ dàng kết nối lại bằng cách cung cấp
danh tính khách hàng và khôi phục lại nơi nó bị tắt. Các ngắt kết nối xảy ra đột ngột
sẽ không có thời gian cho các thiết bị gửi tin nhắn DISCONNECT, các broker có
thể gửi các tin nhắn đăng ký từ các thiết bị mà broker đã lưu trữ trước đó. Các tin
nhắn đó cung cấp cho các thiết bị phải làm gì nếu nhà xuất bản bất ngờ ngắt kết nối.

2.3.5. Bảo mật trong MQTT

Ba khái niệm là cơ bản cho bảo mật MQTT: nhận dạng, xác thực và ủy quyền.
Nhận dạng là việc đặt tên cho các client đã được ủy quyền và trao quyền. Xác thực

51
EBOOKBKMT.COM

là chứng minh danh tính của client, và ủy quyền là quản lý các quyền được đưa ra
cho khách hàng.

Nhận dạng:

Nhận dạng một MQTT client bằng định danh của client, ID của người sử
dụng, hoặc chỉ số công khai. Một MQTT server xác nhận chứng chỉ gửi của client
với các giao thức SSL, hoặc nhận dạng client với một mật khẩu được thiết lập bởi
client. Các server điều khiển các tài nguyên mà client có thể truy cập dựa trên danh
tính của client.
Các MQTT server cung cấp cho client địa chỉ IP và chứng chỉ số của nó. Các
MQTT client sử dụng giao thức SSL để xác thực chứng chỉ được gửi bởi server.

Thiết lập danh tính của client bởi 1 trong các cách sau:
Nhận diện client:
Lớp MqttClient thiết lập nhận diện client. Gọi lớp constructor để thiết lập nhận
dạng client như là một tham số, hoặc trả về một nhận diện client ngẫu nhiên được
tạo ra. Nhận diện client phải là duy nhất trên tất cả các client có thể kết nối đến
server. Tất cả các client phải có một định danh, ngay cả khi nó không được sử dụng
để kiểm tra danh tính.
User ID
Lớp MqttClient thiết lập client user ID như là một thuộc tính của
MqttConnectOptions. User ID không cần phải duy nhất cho client.
Chỉ số công khai
Chỉ số công khai của client được lưu trữ trong client keystore.
Thiết lập danh tính của các máy chủ bằng cách lưu trữ khóa riêng của nó trong
server keystore.

Xác thực

Một MQTT client có thể xác thực MQTT server mà nó kết nối đến, và ngược
lại server cũng có thể xác thực client được kết nối với nó.
Một client xác nhận một server với giao thức SSL. Một MQTT server xác
nhận một client với giao thức SSL, hoặc với một mật khẩu, hoặc cả hai.

52
EBOOKBKMT.COM

Nếu client xác thực server, nhưng server không xác thực client, client sẽ được
biết đến như là một client ẩn danh.
Server xác thực bởi 1 client
Một MQTT client xác nhận rằng nó được kết nối đến server bằng cách xác
thực chứng chỉ server với giao thức SSL. Đây là hình thức xác minh quen thuộc khi
duyệt qua một trang web thông qua giao thức HTTPS.
Các server sẽ gửi chứng chỉ công khai của nó, có xác nhận của một cơ quan
chứng nhận cho client. Các client sử dụng khóa công khai của cơ quan chứng nhận
để xác minh chứng chỉ trên server.
Client xác thực bởi 1 server
Một MQTT server xác minh rằng nó được kết nối với client bằng cách xác
thực chứng chỉ client với SSL, hoặc bằng chứng chỉ danh tính client với một mật
khẩu.
Nó xác nhận cho khách hàng với các mật khẩu được gửi bởi client đến server
trong một tiêu đề giao thức MQTT. Các server có thể chọn để xác thực định danh
client, người sử dụng ID, hoặc giấy chứng nhận với mật khẩu, nó phụ thuộc vào
server. Thông thường server xác thực người dùng ID. Xác nhận mật khẩu thông qua
một kết nối SSL đã được đảm bảo bằng cách kiểm tra các máy chủ, để tránh việc
gửi mật khẩu quá rõ ràng.

Ủy quyền

Uỷ quyền không phải là một phần của giao thức MQTT. Nó được cung cấp
bởi các MQTT server. Những gì được ủy quyền phụ thuộc vào những gì các server
làm. MQTT server là broker publish/subscribe, MQTT ủy quyền các quy tắc điều
khiển mà client có thể kết nối đến server, và topic mà client có thể xuất bản hoặc
đăng kí. Nếu một MQTT client có thể quản lý server, nhiều quy tắc kiểm soát mà
client có thể quản lí các khía cạnh khác nhau của server.
Số lượng client có thể là rất lớn, vì vậy nó không phải là khả thi để cho phép
từng client riêng biệt. Một MQTT server sẽ có một phương pháp cho các nhóm
client theo cấu hình, hoặc nhóm.

53
EBOOKBKMT.COM

Danh tính của một client, từ cách nhìn của truy cập và ủy quyền thì không phải
là duy nhất cho từng MQTT client. Danh tính client và nhận dạng client có thể là
giống nhau nhưng chủ yếu là khác nhau.

54
EBOOKBKMT.COM

CHƯƠNG 3. THỬ NGHIỆM GIAO THỨC MQTT

3.1. Giới thiệu về hệ điều hành Linux


Linux là hệ điều hành dạng UNIX ( Unix-like Operating System) chạy trên
máy PC với bộ điều khiển trung tâm (CPU) Intel 80386 hoặc các thế hệ sau đó, hay
các bộ vi xử lý trung tâm tương thích như AMD, Cyrix. Linux ngày nay còn có thể
chạy trên các máy Macsintosh hoặc Sun Sparc. Linux thoả mãn chuẩn POSIX.1.
Linux được viết lại toàn bộ như con số không, tức là không sử dụng một dòng lệnh
nào của Unix, để tránh vấn đề bản quyền của Linux, tuy nhiên hoạt động của Linux
hoàn toàn dựa trên nguyên tắc của hệ điều hành Unix.

Kiến trúc về hệ điều hành Linux:

 Hạt Nhân (Kernel)


Là trung tâm điều khiển của hệ điều hành Linux chứa các mã nguồn điều
khiển hoạt động toàn bộ của hệ thống. Hạt nhân được phát triển không ngừng,
thường có hai phiên bản mới nhất, một bản để phát triển và một bản ổn định. Kernel
thiết kế theo dạng module, do vậy kích thước thật sự của Kernel rất nhỏ. Chúng chỉ
tải được những bộ phận cần thiết lên bộ nhớ, các bộ phận khác sẽ được tải lên nếu
có yêu cầu sử dụng. Do đó không sử dụng lãng phí bộ nhớ.
Kernel Linux có thể truy xuất tới toàn bộ tính năng phần cứng của máy tính.
Ngoài ra, do yêu cầu của các chương trình cần nhiều bộ nhớ, trong khi hệ thống có
ít bộ nhớ, hệ điều hành sử dụng không gian hoán đổi đĩa (Swap pace) để lưu trữ các
dữ liệu xử lý của chương trình. Bên cạnh đó Linux còn hổ trợ các đặc tính sau:
- Bảo vệ vùng nhớ giữa các tiến trình, điều này không cho phép một tiến trình
làm tắt toàn bộ hệ thống.
- Chỉ tải các chương trình khi có yêu cầu.
 Shell
Shell cung cấp các tập lệnh cho người dùng thao tác với kernel để thực hiện
công việc. Shell đọc các lệnh từ người dùng và xử lý.
Ngoài ra, Shell còn cung cấp các đặc tính như: chuyển hướng xuất nhập, ngôn
ngữ lệnh để tạo các file lệnh tương tự như file.bat trong đó.
Có nhiều loại Shell được dùng trong Linux. Điểm quan trọng để phân biệt các

55
EBOOKBKMT.COM

shell với nhau là bộ lệnh của mỗi shell. Ví dụ C shell sử dụng các lệnh tương tự như
ngôn ngữ C, Bourne shell thì dùng ngôn ngữ lệnh khác.
Shell sử dụng chính trong Linux là GNU Bourne Again Shell. Shell này là
shell phát triển từ Bourne shell. Là shell sử dụng chính trong hệ thống Unix, với
nhiều tính năng như: điều khiển các tiến trình, các lệnh history, tên file dài …
Các tiện ích
Được sử dụng thường xuyên. Dùng cho nhiều thứ như: thao tác file, đĩa, nén,
sao lưu file … Tiện ích trong Linux có thể là các lệnh thao tác hay các chương trình
giao diện đồ họa. Hầu hết là sản phẩm của GNU. Linux có nhiều tiện ích như: trình
biên dịch, trình gỡ lỗi soạn văn bản… Tiện ích có thể được người dùng hay hệ
thống.
Chương trình ứng dụng
Khác với tiện ích, các chương trình word, hệ quản trị cơ sở dữ liệu.. là các
chương trình ứng dụng có độ phức tạp lớn và do các nhà sản xuất viết ra.

3.2. Hệ điều hành Ubuntu

Ubuntu là một hệ điều hành mã nguồn mở xây dựng xung quanh nhân Linux,
được cộng đồng cùng phát triển. Hệ điều hành Ubuntu có đầy đủ chức năng của một
hệ điều hành hiện đại, hoạt động tốt trên máy tính để bàn, máy tính xách tay và hệ
thống máy chủ. Tuy ra đời chưa lâu, nhưng hệ điều hành này đang có những bước
tiến nhảy vọt, sức lan toả rất lớn, hiện đang được sử dụng rất rộng rãi trên thế giới
và đang dần dần phổ biến ở Việt Nam.
Ubuntu có nhiều phiên bản để nhắm vào những người sử dụng mục tiêu khác
nhau:
 Kubuntu là một dẫn xuất chính thức của Ubuntu, nhưng sử dụng môi trường
Desktop KDE thay vì GNOME. Phiên bản này là một phần của dự án Ubuntu và có
cùng nền tảng bên dưới với Ubuntu.

56
EBOOKBKMT.COM

 Edubuntu là một dẫn xuất chính thức của Ubuntu, được thiết kế dành cho
việc sử dụng trong trường học. Edubuntu bao gồm nhiều ứng dụng giáo dục như
GCompris, KDE Edutainment Suite, và Schooltool Calendar.
 Xubuntu là một dẫn xuất chính thức của Ubuntu, nhưng sử dụng môi trường
Desktop Xfce thay vì GNOME. Phiên bản này nhắm đến các máy tính cấu hình
không cao, hoặc những hệ thống đặc biệt yêu cầu một môi trường Desktop hiệu suất
cao, tốc độ nhanh.
 Gobuntu là một dẫn xuất của Ubuntu cho những ai mong muốn một hệ điều
hành Desktop thuần phần mềm tự do. Phiên bản này loại bỏ những driver chỉ có gói
binary, và bảo đảm là không sử dụng phần mềm nào giới hạn việc hiệu chỉnh hay
phân phối lại.
Cài đặt
Ubuntu cung cấp một tập hợp đầy đủ các tính năng có thể hoạt động ngay lập
tức từ bản cài đặt chuẩn, nhưng lại vừa vặn trong 1 đĩa CD. Có một đĩa chạy trực
tiếp và một đĩa cài đặt truyền thống cho mỗi lần phát hành. CD chạy trực tiếp cho
phép người dùng xem xét phần cứng của họ có tương thích với hệ điều hành hay
không trước khi cài đặt lên đĩa cứng. Đĩa Ubuntu, Edubuntu được gửi miễn phí cho
bất cứ ai yêu cầu, và tập tin ảnh đĩa cũng có sẵn để tải về. Ubuntu khi chạy cần 256
MB RAM, và khi cài đặt lên đĩa cứng, chiếm 3GB dung lượng đĩa trống.
Quá trình cài đặt Ubuntu sử dụng giao diện đồ họa, tốc độ cài đặt nhanh hay
chậm sẽ tuỳ thuộc vào cấu hình máy tính, trung bình là từ 20 – 30 phút.
Giao diện

57
EBOOKBKMT.COM

Hình 3.1. Giao diện hệ điều hành Ubuntu


Ubuntu sử dụng giao diện đồ họa thân thiện GNOME, qua đó hướng đến sự
đơn giản hóa trong quá trình sử dụng. Đặc điểm có thể nhận thấy rõ ở giao diện mặc
định của Ubuntu là các màu chuyển giữa nâu và cam. Ubuntu đi kèm với Compiz-
Fusion, để tạo sự bóng bẩy trong quá trình sử dụng.

Ứng dụng

Mặc định, Ubuntu được thiết kế để ngay sau khi cài đặt là có thể sử dụng được
ngay. Đó là bộ ứng dụng văn phòng LibreOffice (từ phiên bản Ubuntu 10.04), trình
duyệt Internet Firefox, trình quản lý thư điện tử Evolution, trình gửi tin nhắn tức
thời (IM) Empathy, trình tải file torrent Tranmission và trình biên tập đồ họa GIMP.
Về truyền thông đa phương tiện, Ubuntu tích hợp trình phát, rip CD Sound Juicer,
trình quản lí thư viện nhạc Rhythmbox, trình xem phim Totem Movie Player và
trình ghi âm Sound Recorder. Một số ứng dụng nhỏ như chụp màn hình, máy tính
toán, các trò chơi bài và trò chơi giải đố cũng có sẵn.
Việc cài đặt ứng dụng trong Ubuntu có nhiều phương tiện, phổ biến nhất là
dùng Sofware Center, Add/Remove Application và Synaptic Package Manager.
Trong đó, Add/Remove Application cho phép người dùng tìm toàn bộ các ứng dụng
miễn phí Ubuntu khuyên dùng và cài đặt về máy, còn Synaptic Package Manager là
công cụ nâng cao, giúp người dùng cài đặt từng gói con của ứng dụng. Ngoài ra còn
58
EBOOKBKMT.COM

một số công cụ sử dụng dòng lệnh, như apt-get, aptitude… Luôn luôn có hơn


17.000 ứng dụng khác nhau luôn có sẵn trên mạng để tải về và cài đặt. 

3.3. Ngôn ngữ lập trình Python

Python là một ngôn ngữ lập trình thông dịch nhẹ do Guido van Rossum tạo ra
năm 1990. Python hoàn toàn tạo kiểu động và dùng cơ chế cấp phát bộ nhớ tự động;
do vậy nó tương tự như Perl, Ruby, Scheme, Smalltalk, và Tcl. Python được phát
triển trong một dự án mã mở, do tổ chức phi lợi nhuận Python Software Foundation
quản lý.
Python có thể được cài đặt trên nhiều hệ điều hành khác nhau như ubuntu,
windows,…
Python là một ngôn ngữ lập trình năng động với nhiều tính năng được sử dụng
trong một loạt các ứng dụng. Là ngôn ngữ kịch bản hướng đối tượng (object-
oriented scripting language). Không chỉ vậy, nó còn là một ngôn ngữ cấp cao có khả
năng thông dịch (interpreted language) và có tính tương tác (interactive language)
cao.

Hình 3.2. Giao diện Python trên Ubuntu

Nhờ chức năng thông dịch mà trình thông dịch (Interpreter) của Python có thể
xử lý lệnh tại thời điểm chạy chương trình (runtime). Nhờ đó mà ta không cần biên
dịch chương trình trước khi thực hiện nó (tương tự như Perl và PHP). Tính năng

59
EBOOKBKMT.COM

tương tác của Python giúp ta có thể tương tác trực tiếp với trình thông dịch của nó
ngay tại dấu nhắc lệnh. Cụ thể: Ta có thể thực hiện lệnh một cách trực tiếp tại dấu
nhắc của Python. Python hỗ trợ mạnh cho phong cách lập trình hướng đối tượng và
kỹ thuật lập trình gói mã trong đối tượng. Mặc dù Python được xem là ngôn ngữ lập
trình dành cho những ai mới làm quen với việc lập trình trên máy tính, nhưng nó hỗ
trợ mạnh cho việc phát triển nhiều loại ứng dụng khác nhau, từ các chương trình xử
lý văn bản đơn giản đến các ứng dụng web, các chương trình game,…    
Ưu điểm của python:
- Dễ dàng để tìm hiểu, đọc và duy trì: Cú pháp của python là đơn giản. Nó rất
dễ dàng để tìm hiểu và đọc. Mã này là có thể nhìn thấy rất nhiều vì vậy nó rất dễ
dàng để duy trì.
- Một tiêu chuẩn thư viện mạnh mẽ và ngôn ngữ phát triển hệ thống (chẳng
hạn như C, C ++, và Java).
- Chế độ tương tác: Python đã hỗ trợ cho một chế độ tương tác cho phép thử
nghiệm tương tác và gỡ lỗi các đoạn mã.
- Portable: Việc thực hiện tiêu chuẩn của Python được viết trong di ANSI C,
và biên dịch và chạy trên hầu như tất cả các nền tảng lớn hiện đang sử dụng.
- Extendable: Bạn có thể thêm các module ở mức độ thấp để các thông dịch
Python. Những module này cho phép lập trình để thêm vào hoặc tùy chỉnh các công
cụ của họ có hiệu quả hơn.
- Cơ sở dữ liệu: Python cung cấp giao diện cho tất cả các cơ sở dữ liệu thương
mại lớn.
- GUI Programming: đơn giản và nhanh chóng Python cũng làm cho người
dùng đồ họa hướng đối tượng tiêu chuẩn để các Tk GUI API gọi là Tkinter (Tkinter
trong 2.x) cho phép các chương trình Python để thực hiện ảnh minh hoạ di động với
một cái nhìn tự nhiên và cảm nhận.
- Khả năng mở rộng: chương trình rất phức tạp có thể được xây dựng trong
python.
- Tốc độ: Nó là nhanh hơn so với PHP.
Nhược điểm của python:
- Không nhanh hơn so với C, C ++ và Java.

60
EBOOKBKMT.COM

- Python không có “switch” và do…while


- Không có private, protected và public

3.4. Cấu trúc một số lệnh trong thư viện Python Client MQTT

Client()
Mqtt=mqtt.Client(client_id="", clean_session=True, userdata=None, protocol=MQTTv31)

 client_id: Là giá trị duy nhất trong toàn bộ mạng lưới MQTT đang sử dụng,
nó được sử dụng khi kết nối tới Broker. Nếu giá trị client_id có độ dài là 0 họăc
bằng None, thì một giá trị client_id ngẫu nhiên sẽ được sinh ra. Trong trường hợp
này thì giá trị clean_session phải là True.
 clean_session: Một giá trị kiểu True/False, nó xác định kiểu của clien. Nếu
là True, broker sẽ xóa toàn bộ thông tin về client này khi mà nó ngắt kết nối. Nếu là
False, client có kiểu durable client và thông tin đăng ký và các hàng đợi tin nhắn sẽ
được tiếp tục khi mà client ngắt kết nối.
 userdata: Người dùng định nghĩa dữ liệu thuộc bất kì kiểu nào để kiểm tra
tham số userdata trong hàm callback. Nó có thể được cập nhật sau sử dụng hàm
user_data_set().
 protocol: Phiên bản MQTT sử dụng cho client. Có thể là: MQTTv31 họăc
MQTTv311.

Connect()
mqttc.connect(host, port = 1883, keepalive=60, bind_address="")

Hàm này kết nối client tới broker.


 host: Địa chỉ IP của Broker
 port: Cổng được sử dụng cho Broker. Nếu bạn cài đặt Mosquitto thì cổng
mặc định là 1883. Phần lớn các broker khác cũng sử dụng cổng này.
 keepalive: Chu kỳ lớn nhất tính theo đơn vị giây (s) được cho phép giao tiếp
với broker. Nếu không có bản tin nào được trao đổi, nó sẽ là giá trị mà client sẽ gửi
bản tin “ping message” tới broker. Nó giúp broker biết được xem client hiện
“online” hay “offline”.
 bind_address: Địa chỉ IP của một mạng để liên kết client tới.

61
EBOOKBKMT.COM

loop()
mqttc.loop(timeout=1.0,max_packets=1)

Duy trì kết nối client tới broker. Giá trị timeout không được vượt quá giá trị
của keepalive. Tham số max_packets được khuyến cáo không nên sử dụng.

publish()
publish(topic, payload=None, qos=0, retain=False)

Hàm này sẽ được sử dụng để client gửi bản tin (payload) tới broker vào topic
đã thêm ở trên.
 topic: Topic muốn publish bản tin
 payload: Giá trị truyền đi. Ở đây mặc định là None.
 qos: Giá trị “quality of service level” sử dụng.
 retain: Nếu được set là True, bản tin sẽ là bản tin dạng “last known good”
cho topic mà nó publish tới.

subscribe()
subscribe(topic, qqos=0)

Đăng kí tới một topic hoặc nhiều topic với mức QoS muốn đăng kí.

on_connect()
on_connect(client, userdata, rc)

Được gọi khi broker phản hồi yêu cầu kết nối của client.
 client: đối tượng client cho callback này.
 userdata: Người dùng định nghĩa dữ liệu thuộc bất kì kiểu nào để kiểm tra
tham số userdata trong hàm callback. Nó có thể được cập nhật sau sử dụng hàm
user_data_set().
 rc: kết quả kết nối: kết quả trả về bằng 0 là kết nối thành công, ngoài giá trị
0 thì kết nối không thành công.

on_message()
on_message(client, userdata, message)

Hàm này được gọi khi có bản tin được truyền tới. Có nghĩa là trong topic mà
mình đã đăng kí thì có một client khác đã publish dữ liệu lên broker, và broker gửi
lại tới mình.
62
EBOOKBKMT.COM

Các tham số tương tự hàm callback on_connect, tuy nhiên với tham số
message: có nghĩa là một đối tượng MQTTMessage. Nó là class với các tham số:
topic, payload, qos, và retain.

on_publish()
on_publish(client, userdats, mid)

Được gọi khi tin nhắn được gửi sử dụng hàm publish() đã hoàn thành việc
truyền tới cho broker. Đối với mức QoS 1 và 2, điều này có nghĩa là sự kết hợp đã
hoàn thành. Đối với QoS 0, điều này có nghĩa là tin nhắn đã được gửi cho client.
Hàm callback này là quan trọng bởi vì ngay cả khi hàm publish() trả về thành
công, nó không có nghĩa là tin nhắn đã được gửi đi.

on_subscribe()
on_subscribe(client, userdata, mid, granted_qos)

Được gọi khi broker đáp ứng một yêu cầu đăng kí.
Biến mid phù hợp với biến mid trở về từ hàm subscribe() tương ứng. Biến
granted_qos là một danh sách các số nguyên cung cấp cho các mức QoS do broker
cung cấp cho từng client đăng kí.

3.5. Thử nghiệm truyền nhận dữ liệu MQTT trên Python

Kết quả của quá trình publish dữ liệu của một thiết bị với topic “demo/mqtt”,
nội dung publish là “truyền nhận dữ liệu”, thời gian publish giữa các lần là 2 giây
như hình sau:

63
EBOOKBKMT.COM

Hình 3.3. Kết quả quá trình publish của thiết bị với mức QoS 2
Kết quả quá trình subscribe của thiết bị còn lại như sau:

Hình 3.4. Kết quả quá trình subscribe của thiết bị


Từ thực nghiệm truyền nhận trên ta thấy, thiết bị publish dữ liệu nào lên thì
thiết bị đã subscribe cùng kênh sẽ nhận được đúng dữ liệu đó. Tuy nhiên giữa quá
trình publish và subscribe có sự trễ của đường truyền, do vậy dữ liệu nhận sẽ bị
chậm hơn so với dữ liệu publish.
Đối với mức QoS 0 và 1 thì thời gian trễ từ lúc gửi đến lúc nhận gần như là
bằng nhau. Còn đối với mức QoS 2 thì thời gian trễ là gấp đôi so với mức QoS 0 và
1. Bởi vì quá trình truyền dữ liệu với QoS 2 sẽ có nhiều gói tin xác nhận cho thiết bị
gửi và thiết bị nhận do vậy thời gian dữ liệu nhận được sẽ lâu hơn.
Ở quá trình thử nghiệm này, với mức QoS 0 và QoS 1 thì trời gian trễ nằm
trong khoảng 0.27 đến 0.28s, còn với mức QoS 2 thì thời gian trễ nằm trong khoảng
0.55 đến 0.56s.

64
EBOOKBKMT.COM

65
EBOOKBKMT.COM

KẾT LUẬN

Giao thức MQTT là giao thức quan trọng trong sự xây dựng và phát triển hệ
thống IoT. Các thiết bị trong hệ sinh thái IoT sẽ được tích hợp các cảm biến để phát
hiện các thay đổi về nhiệt độ, ánh sáng, áp lực, âm thanh, chuyển động và vị trí địa
lí. Chúng sẽ là con mắt và đôi tai điện tử của người sử dụng, với khả năng phát hiện
và ghi lại mọi thay đổi của thế giới xung quanh. 
Đa số các thiết bị và cảm biến trong mạng IoT sẽ sử dụng điện từ điện lưới gia
dụng, nhưng cũng có rất nhiều thành phần, trong đó, ví dụ như cơ chế tự động khóa
trên cửa, sẽ phải sử dụng các nguồn năng lượng như pin. Các thiết bị độc lập này sẽ
gửi và nhận một lượng thông tin rất nhỏ theo một chu kì định sẵn. Vì vậy, cần sử
dụng giao thức MQTT để kết nối giữa các thiết bị này phù hợp với việc tiêu tốn ít
năng lượng và băng thông, ngay cả khi sử dụng pin thì thời lượng sử dụng của các
thiết bị này vẫn có thể kéo dài lên tới hơn 1 năm hay thậm chí cả thập kỉ.
Thực hiện xong đồ án này, em có thể hiểu rõ hơn về giao thức MQTT cũng
như nền tảng của thế giới IoT. Sự phát triển của thế giới IoT cần có các giao thức
phù hợp, giao thức MQTT là một trong các giao thức phù hợp nhất đối với IoT.

66
EBOOKBKMT.COM

TÀI LIỆU THAM KHẢO

[1] Hồ Hoàng Triết, Kỹ thuật mạng, Nhà xuất bản Thống Kê, Năm 2001.
[2] Trần Công Hùng, Đinh Việt Hào, Kỹ thuật mạng máy tính, Học Viện Công
Nghệ Bưu Chính Viễn Thông Tp.HCM, Năm 2002.
[3] https://github.com/, truy cập ngày cuối 15/5/2016.
[4] http://public.dhe.ibm.com/, truy cập ngày cuối 12/5/2016.
[5] https://sanphandinh.github.io/, truy cập ngày cuối 16/5/2016.
[6] www.eclipse.org/, truy cập ngày cuối 10/5/2016.
[7] https://www.ibm.com/, truy cập ngày cuối 20/5/2016.

67
EBOOKBKMT.COM

PHỤ LỤC

Chương trình publish:


import paho.mqtt.client as mqtt
import time
import datetime

def on_connect(client, userdata, rc):


if rc == 0:
print("Ket noi toi broker thanh cong!")
client.subscribe("demo/mqtt")
else: print("Khong ket noi duoc toi broker")
def on_message(client, userdata, msg):
print(msg.topic +": "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("iot.eclipse.org", 1883, 60)

client.loop_start()
index = 0
while True:
index = index + 1
time.sleep(2)
client.publish("demo/mqtt", payload = "truyen nhan du
lieu..."+str(datetime.datetime.now().strftime("%H:%M:%S.%f")), qos = 2,
retain = False)

Chương trình subscribe:


import paho.mqtt.client as mqtt
import datetime

def on_connect(client, userdata, flag, rc):


print("rc: "+str(rc))
def on_message(client, userdata, msg):

68
EBOOKBKMT.COM

print(str(datetime.datetime.now().strftime("%H:%M:%S.%f")+" "
+str(msg.qos)+" "+str(msg.payload))
def on_publish(client, userdata, mid):
print("mid: "+str(mid))
def on_subscribe(client, userdata, mid, granted_qos):
print("Subscribe: "+str(mid)+" "+str(granted_qos))
def on_log(client, userdata, level, string):
print(string)

mqttc = mqtt.Client()
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subcsribe

client.connect("iot.eclipse.org", 1883, 60)


mqttc.subscribe("demo/mqtt", 0)

mqttc.loop_forever()

69

You might also like