Bài tập lớn tìm hiểu . Các thông tin góp nhặt trên mạng . Khá sơ sài. MQ Telemetry Transport (MQTT) (tạm dịch là Giao vận tầm xa) là giao thức truyền message theo mô hình cung cấpthuê bao (publishsubcribe). Nó dựa trên một Broker (điểm trung gian) nhẹ (khá ít xử lý), và được thiết kế có tính mở (tức là không đăng trưng cho ứng dụng cụ thể nào), đơn giản, nhẹ, và dễ implement. Những đặc trưng này khiến MQTT rất lý tưởng để sử dụng trong các môi trường bị giới hạn tài nguyên tính toán và truyền dữ liệu như:•Những nơi mà giá network đắt hoặc băng thông thấp, hay thiếu tin cậy•Khi chạy trên một thiết bị nhúng bị giới hạn về tài nguyên tốc độ và bộ nhớ.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 (machine to machine).MQTT cũng là giao thức sử dụng trong Facebook Messager.
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
HÀ NỘI 6-2017
Trang 2MỤC LỤC
1.MQTT là gì? 3
1.1 MQTT là gì? 3
1.2 Lịch sử ra đời của MQTT 3
1.3.Vị trí MQTT trong IoT (Internet of Things) 4
2.Một số khái niệm, đặc điểm và ứng dụng 4
2.1 Một số khái niệm 4
2.2 Đặc điểm ,tính năng nổi bật của MQTT 5
2.2.Ứng dụng 6
3.Phân loại và hoạt độ giao thức 6
3.1.Phân loại MQTT 6
3.2 Các gói tin quan trọng của MQTT 7
3.2.1 Định dạng của message 7
3.2.2.Quy trình truyền nhận dữ liệu trong MQTT 9
3.3 Mô hình Pub/Sub và Cơ chế hoạt động 11
3.3.1.Mô hình mẫu Pub/Sub 11
3.3.2.Cơ chế hoạt động của MQTT theo mô hình Pub/Sub 13
4.Mô phỏng MQTT 14
4.1.Cài đặt công cụ mô phỏng 14
4.2 Thiết lập bản mô phỏng 14
KẾT LUẬN 20
Tài liệu tham khảo:
1 http://mqtt.org/
2 IBM Knowledge Center – MQTT Protocol.
https://www.ibm.com/support/knowledgecenter/en/SSFKSJ.
3.
Trang 31.MQTT là gì?
1.1 MQTT là gì?
MQ Telemetry Transport (MQTT) (tạm dịch là Giao vận tầm xa) là giaothức truyền message theo mô hình cung cấp/thuê bao (publish/subcribe) Nódựa trên một Broker (điểm trung gian) "nhẹ" (khá ít xử lý), và được thiết kế
có tính mở (tức là không đăng trưng cho ứng dụng cụ thể nào), đơn giản,
"nhẹ", và dễ implement Những đặc trưng này khiến MQTT rất lý tưởng để sửdụng trong các môi trường bị giới hạn tài nguyên tính toán và truyền dữ liệunhư:
• Những nơi mà giá network đắt hoặc băng thông thấp, hay thiếu tin cậy
• Khi chạy trên một thiết bị nhúng bị giới hạn về tài nguyên tốc độ và bộ nhớ
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 (machine to machine)
MQTT cũng là giao thức sử dụng trong Facebook Messager
Trang 41.3.V trí MQTT trong IoT (Internet of Things) ị
2.Một số khái niệm, đặc điểm và ứng dụng.
2.1 M t s khái ni m ộ ố ệ
• Client: là thiết bị IoT muốn gửi/nhận dữ liệu trong network
• Broker: là thiết bị trung gian nhận dữ liệu từ các client muốn gửi và
gửi dữ liệu đó tới các client muốn nhận
• Topic: tượng trưng cho loại dữ liệu mà các thiết bị Client gửi/nhận
thông qua MQTT Topic là 1 chuỗi UTF-8 text tượng trưng cho tên loại
như ‘#’ hoặc ‘+’ như sau:
‘+’ Đăng ký nhiều topic chỉ khác nhau 1 vị trí phân cấp trong text của topic Ví dụ như “demo/sensor/+” sẽ đăng ký nhận dữ liệu từ các topic như “demo/sensor/accel”, “demo/sensor/gyro”, v.v…
‘#’ Đăng ký nhiều topic có khác nhau nhiều vị trí phân cấp trong text của topic Ví dụ như “demo/*” sẽ đăng ký nhận dữ liệu từ tất cả topic bắt đầu bằng “demo/”
• Publish: là bước gửi dữ liệu từ 1 thiết bị client đến Broker Trong bước
này, thiết bị IoT sẽ xác định topic (là loại dữ liệu muốn gửi) và giá trị của topic đó
• Subscribe: là bước đăng ký nhận dữ liệu từ Broker của 1 thiết bị
Client Trong bước này, thiết bị IoT sẽ xác định loại dữ liệu mà nó muốn nhận Khi Broker nhận được loại dữ liệu này từ 1 thiết bị client khác, nó sẽ gửi dữ liệu này tới thiết bị client đã đăng ký nhận
• Unsubscribe: là bước thông báo với Broker là thiết bị Client không
muốn tiếp tục nhận dữ liệu nữa
Trang 5Sau khi hiểu được các khái niệm cơ bản nhưng quan trọng này, có thể sử dụngcác thư viện open-source cho MQTT client và MQTT Broker vì flow chương trình sử dụng thư viện MQTT client khá đơn giản chỉ sử dụng vài hàm API như sau:
• Tạo kết nối TCP đến server chạy code MQTT Broker
• Gọi hàm publish() để gửi dữ liệu lên Broker
• Gọi hàm subscribe() để đăng ký nhận dữ liệu từ Broker (hoặc
unsubscribe() để ngừng nhận dữ liệu từ Broker)
• Đăng ký hàm callback của ứng dụng để được gọi khi thư viện MQTT client nhận được dữ liệu từ Broker
Với phạm vi và thời gian hạn chế, bài viết muốn giới thiệu cách thức hoạt động của giao thức MQTT và các kiến thức tổng quát đủ để hiểu được bản chất của MQTT và sử dụng các thư viện open-source cho MQTT trong các ứng dụng của mình
2.2 Đ c đi m ,tính năng n i b t c a MQTT ặ ể ổ ậ ủ
- Dạng truyền message cung cấp/thuê bao (publish/subcribe) cung cấpviệc truyền tin phân tán 1-nhiều
- Việc truyền message là luôn không quan tâm đến nội dung truyền
- Dựa trên nền TCP/IP để cung cấp đường truyền
- Có 3 loại QoS được đưa ra:
+ "Hầu như chỉ 1 lần " : "At most once", message được truyềnnhận dựa hoàn toàn vào tính tin cận của TCP/IP Việc mất hoặc lặpmessage có thể xảy ra Ở QoS này, có thể ví dụ 1 trường hợp sử dụng:như trong môi trừong sensor mà việc mất 1 gói dữ liệu tại 1 thời điểmkhông ảnh hưởng đến toàn bộ quá trình
+ "Ít nhất 1 lần" : "At least once", các message được đảm bảonhận được nhưng có thể xảy ra lặp
+ "Chính xác chỉ 1 lần" : "Exactly once", message được đảm bảođến nơi đúng 1 lần Ở level này, các hệ thống thanh toán, nơi mà việclặp hay mất message có thể gây ra việc tính tiền bị sai
- Dữ liệu bao bọc dữ liệu truyền (overhead) nhỏ (độ dài cố định luôn là
2 byte), and là giao thức giảm đến mức tối thiểu traffic đường truyền
- Một cơ chế để thông báo đến các thuê bao khi đường truyền bị đứt bấtthường, sử dụng Last Will và Testament feature
Trang 6Ví dụ về kết nối trong mạng lưới MQTT
- Light sensor liên tục gửi dữ liệu về broker (điểm trung gian)
- Ứng dụng điều khiển tòa nhà nhận dữ liệu từ broker để quyết địnhtrạng thái các thiết bị trong nhà
- Ứng dụng gửi tín hiệu điều khiển actor node thông qua broker
2.2 ng d ng Ứ ụ
3.Phân loại và hoạt độ giao thức.
3.1.Phân lo i MQTT ạ
Các thành phần chính của MQTT là clients, servers (=brokers),
sessions, subscriptions và topics
MQTT client (publisher, subscriber): Client thực hiện subscribe đến topics để publish và receive các gói tin
Topic: Về mặt kỹ thuật, topics là các hàng đợi chứa message Về logic, topics cho phép clients trao đổi thông tin và dữ liệu
Session: Một session được định nghĩa là kết nối từ client đến server Tất
cả các giao tiếp giữa client và server đều là 1 phần của session
Subscription: Không giống như sessions, subscription về mặt logic là kết nối từ client đến topic Khi thực hiện subscribed đến topic, client có thể
Trang 7trao đổi messages với topic Subscriptions có thể ở trạng thái ‘transient’ hoặc
‘durable’, phụ thuộc vào cờ clean session trong gói Connect
Message: Messages là các đơn vị dữ liệu được trao đổi giữa các topic clients
3.2 Các gói tin quan tr ng c a MQTT ọ ủ
3.2.1 Đ nh d ng c a message ị ạ ủ
Phần header cố định
Tất cả các message luôn chứa phần cố định theo bảng sau:
Byte 1 : Chứa loại Message và các cờ (DUP, QoS level, and RETAIN) Byte 2 : (Ít nhất 1 byte) quy định độ dài còn lại
Loại Message
Vị trí: byte 1, bits 7-4
Một số 4-bit không dấu diễn tả các giá trị được miêu tả dưới bảng
- Các cờ
Bit còn lại của byte đầu chứa các trường DUP, QoS và RETAIN
Vị trí các bit và ý nghĩa được miêu tả trong bảng sau:
Trang 8* DUP :Vị trí byte 1, bit 3.
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 mesage mà có QoSS lớn hơn 0 và yêu cầu ACK Khi bit DUP được set, phần header thay đổi sẽ chứa Message ID Nhìn vào giá trị này
sẽ biết được gói tin đã nhận được trước đó hay không Nó không nên sử dụng
để tin ngay rằng có duplicates hay không
* QoS : Vị trí byte 1, bits 2-1
Cờ này sẽ cho biết độ đảm bảo việc nhận message PUBLISH Giá trị của QoS được miêu tả trong bảng sau
* RETAIN:
Vị trí byte 1, bit 0
Cờ này chỉ được sử dụng ở message PUBLISH Khi client gửi 1
message PUBLISH đến server, nếu cờ Retain được set (1), thì server phải hiểu rằng nên giữ message này ngay cả sau khi chuyển nó đến các subcribers hiện tại Khi có 1 subcription mới được thiết lập trên 1 topic, message cuối cùng của topic đó nên được gửi đến subscriber với 1 trường Retain được set trong header Nếu không có messsage nào còn, thì không cần gửi gì hết
Trường này sẽ có ích khi publisher gửi message để báo "report bằng ngoại lệ", thỉnh thoảng là nơi giữa các message Điều này cho phép những subcribers mới nhanh chóng nhận dữ cần thiết Trường hợp mà server chuyển tiếp nội dung vừa nhận được từ một Publisher thì trường Retain sẽ không được set Điều này sẽ giúp phân biệt được message có từ trước với message mới được publish lên Message Retained sẽ được giữ thậm chí sau khi restart lại server Server sẽ xóa message được retained nếu nó nhận được một
message với payload bằng zero
Trang 9dụ miêu tả độ Remain Length = 64, ta chỉ cần 1 byte, trong đó 7 bytes để miêu tả giá trị 64, 1 bit còn lại bằng 0.
Một ví dụ nữa, giá trị là 321 chẳng hạn 321 = 65*128^0 + 2* 128^1, tacầ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
Trường này được biểu diễn tối đa trong 4 byte Tức là cho độ dài cho phép sẽ là đến 268 435 455 (256 MB)
3.2.2.Quy trình truy n nh n d li u trong MQTT ề ậ ữ ệ
3.2.2.1 CONNECT and SUBSCRIBE message sequence
Session và subscription được thiết lập với clean session flag = 1.
TH1: Quy trình truyền nhận dữ liệu trong MQTT khi session flag = 1:
- Client và Server được kết nối qua giao thức TCP
- Client gửi gói tin CONNECT yêu cầu kết nối đến Server, clean
session = 1 Đây là thời điểm đánh dấu session được thiết lập
- Server gởi gói CONNACK xác nhận thiết lập kết nối thành công
- Client thực hiện SUBSCRIBE đến topic XYZ Đây là thời điểm bắt đầu timeout của một subscription
- Server gởi gói SUBACK xác nhận quá trình subscription
- Client PUBLISH để gởi topic - message đến server
Trang 10- Sau khi nhận đủ thông tin, client gửi gói UNSUBSCRIBE topic XYZ
để kết thúc quá trình Subscribe
- Server trả về gói UNSUBACK
- Client gửi gói DISCONNECT để kết thúc session truyền thông
Session và subscription được thiết lập với clean session flag = 0
TH2: Quy trình truyền nhận dữ liệu trong MQTT khi session flag = 0:
- Subscription lifetime đã được thiết lập trước - Client và Server được kết nối qua giao thức TCP
- Client gửi gói tin CONNECT yêu cầu kết nối đến Server, clean
session = 0 Đây là thời điểm đánh dấu session được thiết lập
- Server gởi gói CONNACK xác nhận thiết lập kết nối thành công
- Client PUBLISH để gởi topic - message đến server
- Client gửi gói DISCONNECT để kết thúc session truyền thông
3.2.2.2 PUBLISH message flows
QoS level 0: At most once delivery
Message được phân phối dựa trên best efforts của tầng mạng TCP/IP bên dưới Một response sẽ không được định nghĩa trong giao thức Các
message đến server hoặc chỉ 1 lần hoặc không bao giờ
QoS mức 0
QoS level 1: At least once delivery
Việc nhận được message bên phía server được xác nhận bởi một
message PUBACK Nếu có lỗi do kết nối hoặc gửi đến device, hoặc message xác nhận không nhận được sau một khoảng thời gian nhất định, sender sẽ gửi
Trang 11lại message và set DUP bit trong phần header của message header Message đến server ít nhất 1 lần Cả message SUBSCRIBE và message
UNSUBSCRIBE đều sử dụng QoS level là 1
Khi nhận được một message lặp lại từ phía client, server sẽ publish các message đến các subscribers, và gửi một message PUBACK khác
QoS level 1.
QoS level 2: Exactly once delivery
Một luồng được thêm vào luồng QoS level bằng 1 ở trên để đảm bảo rằng message bị lặp lại không bị chuyển đến ứng dụng Đây là mức độ cao nhất khi khi phân phối message, không message lặp nào được chấp nhận Nhờ
đó mà lưu lượng mạng sẽ tăng lên
Nếu phát hiện lỗi, hoặc sau một khoảng thời gian nhất định, luồng protocol sẽ được thực hiện lại từ kết quả của message xác nhận cuối cùng; hoặc là PUBLISH , hoặc là PUBREL Luồng protocol đảm bảo rằng message đến các subscriber chỉ đúng 1 lần.
QoS level 2
3.3 Mô hình Pub/Sub và C ch ho t đ ng ơ ế ạ ộ
3.3.1.Mô hình m u Pub/Sub ẫ
Thành phần:
Trang 12• Publisher - nơi gửi thông điệp
• Subscriber – nơi nhận thông điệp
• Broker – điểm trung gian
Đặc điểm nổi bật
• Tách biệt giữa publisher và subscriber
• Cả publisher và subscriber đều là client và nó luôn luôn 1 kết nốiđến broker trung tậm
• Sử dụng 1 thành phần, phương thức nào đó để xác định thông điệp nào sẽ được chuyền đến client nào (Mà với MQTT đó chính
là kênh (“topics”)
Ưu điểm
• Kết nối riêng rẽ
• Khả năng mở rộng
• Thời gian tách biệt (Time decoupling)
• Đồng bộ riêng rẽ (Synchronization decoupling)
Nhược điểm
• Điểm trung gian (broker) không cần thông báo về trạng thái gửi thông điệp Do đó không có cách nào để phát hiện xem thông điệp đã gửi đúng hay chưa
Trang 13• Publisher không hề biết gì về trạng thái của subscribe và ngược lại Vậy làm sao chúng ta có thể đảm bảo mọi thứ đều ổn
• Những kẻ xấu (malicious publisher) có thể gửi những thông điệp xấu, và các subcribers sẽ truy cập vào những thứ mà họ không nên nhận
3.3.2.C ch ho t đ ng c a MQTT theo mô hình Pub/Sub ơ ế ạ ộ ủ
3.3.2.1.Tính thừa kế và những đặc điểm riêng
Tính thừa kế:
• Space decoupling (Không gian tách biệt)
• Time decoupling (Thời gian tách biệt)
• Synchronization decoupling (Sự đồng bộ riêng rẽ)
…
Đặc điểm riêng biệt:
• MQTT sử dụng cơ chế lọc thông điệp dựa vào tiêu đề based )
(subject-• MQTT có một tầng gọi là chất lượng dịch vụ (Quality of
Services – QoS) Nó giúp cho dễ dàng nhận biết được là message
có được truyền thành công hay không
3.3.2.2.Cơ chế tổng quan:
• MQTT hoạt động theo cơ chế client/server, nơi mà mỗi cảm biến là mộtkhách hàng (client) và kết nối đến một máy chủ, có thể hiểu như một điểm trung gian (broker), thông qua giao thức TCP (Transmission Control Protocol) Broker chịu trách nhiệm điều phối tất cả các thông điệp giữa phía gửi đến đúng phía nhận
Trang 14• MQTT là giao thức định hướng bản tin Mỗi bản tin là một đoạn rời rạccủa tín hiệu và broker không thể nhìn thấy Mỗi bản tin được publish một địa chỉ, có thể hiểu như một kênh (Topic) 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ể subcribe 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.
Ví dụ
4.Mô phỏng MQTT
4.1.Cài đ t công c mô ph ng ặ ụ ỏ
Có nhiều cách triển khai MQTT broker như:
• Dùng các ứng dụng opensource chạy broker trên máy tính
- Cần có tối thiểu một Client và một Broker
- Thiết đặt Host, Port, Topic, user và password
Broker Chúng ta sẽ cài đặt một Broker miễn phí trên dịch vụ CloudMQTT Vào https://www.cloudmqtt.com/plans.html , Click Try now for Free
Ở phần Sign up, bạn điền địa chỉ E-mail và Click Sign up
Trang 15Vào hòm thư và Click vào đường link trong email mà CloudMQTT gửi cho bạn Link sẽ dẫn bạn đến một trang đi điền thông tin cho tài khoản và nhấn
Submit
Tiếp theo, nhấn Create để tạo MQTT broker
Trang 16Điền vào ô Name, nhấn Create Click Details
Tại mục Manager User điền tên User, mật khẩu Password quản lí Client, nhấn Save.
Tại mục New Rule, User chọn tên vừa tạo ở trên, đặt tên Topic, tisck chọn Read Accsess và Write Accsess, click Save.
Trang 17Chúng ta quan tâm đến một số thông số sau:
Profile Name: timhieuveMQTT
Broker Address: m10.cloudmqtt.com
Broker Port: 16351
User Name: ammymlhc
Password: aUS3WK1CEFWT
Trang 18Sau đó bấm OK để thiết lập cài đặt
Đến đây chúng ta sẽ connect Profile Name và Topic cho các client Publish và client Subscribe
Profile Name: timhieuveMQTT
Topic: timhieuveMQTT
Chúng ta sẽ tiến hành gửi 1 tin nhắn từ Publisher khi đó các
subscriber đã đăng kí cùng topic sẽ nhận được tin từ Publisher