Một vài suy nghĩ về trải nghiệm của tôi với TCP, UDP và MQTT cũng như một số tài nguyên bổ sung để xem xét.
Với UDP, tôi đã gặp phải sự cố lỗi im lặng trong đó một ứng dụng trên một nút mạng, máy khách, chỉ thấy một số tin nhắn UDP được gửi. Có quá nhiều lý do tại sao lưu lượng truy cập mạng có thể bị sai lệch. Vấn đề với UDP là các gói có thể bị loại bỏ khá nhiều bất cứ khi nào bất kỳ nút nào trong đường dẫn mạng giữa nhà sản xuất gói và người tiêu dùng gói bảo đảm. Xem chủ đề Wikipedia Mất gói .
Câu hỏi là tỷ lệ mất mát của bạn trong bất kỳ bối cảnh mạng hiện tại là gì. Vì vậy, nếu đây là giao tiếp trong mạng LAN hoặc mạng con, tỷ lệ mất của bạn có thể thấp. Trên mạng LAN hoặc trên internet, tỷ lệ mất của bạn có thể khá cao. Các gói UDP bị loại bỏ vì một số lý do và được định tuyến tuy nhiên các điều kiện mạng cho phép với số giảm hop đó. Gửi các gói ra khoảng trống lớn mà không có trách nhiệm giải trình sẽ mở ra khả năng thất bại thầm lặng.
Có vẻ như trong trường hợp của bạn chỉ là một ack đơn giản với truyền lại sau khi hết thời gian mà không nhận được ack là đủ.
Tôi đã thực hiện các thông báo XML qua kết nối TCP được duy trì và nó hoạt động rất tốt. Tôi đã có một lớp phân phối các thông điệp đầy đủ trong mỗi bộ đệm đến lớp ứng dụng để xử lý. Tôi đã sử dụng XML để đóng gói thư với thẻ bắt đầu XML cho phần đầu của tin nhắn và thẻ kết thúc XML để biết khi nào toàn bộ tin nhắn đã được nhận.
TCP có một vài tính năng như thứ tự các gói liên tục, không lặp lại và là một cơ chế vận chuyển được kết nối có nghĩa là bạn biết liệu đầu kia có biến mất hay không mặc dù có thể mất một lúc để tìm hiểu. Kết nối và ngắt kết nối có thể gây ra sự chậm trễ nhưng không nặng nề trong các điều kiện thông thường mặc dù điều kiện mạng có thể khiến thông lượng TCP bị chậm lại.
MQTT là một giao thức được vận chuyển bởi một lớp vận chuyển mạng, thường là TCP. MQTT sử dụng mô hình xuất bản / đăng ký để không lưu trữ tin nhắn. Vì vậy, khi nhà xuất bản xuất bản một thông báo nếu thuê bao không được kết nối vào thời điểm đó thì khi nó kết nối, nó sẽ không nhìn thấy tin nhắn. MQTT là khá nhiều thời gian thực, tôi cho rằng đó là những gì từ xa của từ viết tắt là tất cả về. Tôi thích MQTT cho các thông báo nhỏ và đã thực hiện một số thử nghiệm với tải trọng JSON thông qua MQTT bằng Mosquitto. Xem bài viết này Gửi tin nhắn đáng tin cậy với Mosquitto (MQTT) với tổng quan về MQTT và chất lượng dịch vụ. Và xem bài viết ngắn gọn này với các liên kết đến các tài nguyên bao gồm một ứng dụng mẫu IoT - Mã xuất bản và đăng ký CQTT .
Các thử nghiệm của tôi với MQTT sử dụng văn bản JSON và cơ sở dữ liệu SQLite3 trong thuê bao để lưu trữ thư là tại https://github.com/RichardChambers/raspberrypi/tree/master/mqtt mặc dù nguồn ở dạng C và khá lộn xộn.
Dưới đây là video dài 13 phút # 144 Giao thức Internet: CoAP vs MQTT, Network Sniffing và chuẩn bị cho IKEA Tradfri Hacking . Đây là một bài viết thú vị về CoAP, Giao thức ứng dụng ràng buộc: CoAP là giao thức 'hiện đại' của IoT . Có bản tóm tắt CoAP này:
Những người dùng đầu tiên đồng ý rằng Giao thức ứng dụng ràng buộc hoạt động cực kỳ tốt đối với các mạng và thiết bị bị hạn chế. Một cái gì đó không được biết đến nhiều: "Trên một mạng không dây rất tắc nghẽn - Wi-Fi hoặc di động - CoAP có thể tiếp tục hoạt động khi giao thức dựa trên Giao thức điều khiển truyền (TCP) như MQTT thậm chí không thể quản lý để hoàn thành bắt tay, "Vermillard nói.
Điều này là do không giống như hầu hết các giao thức IoT khác, CoAP được xây dựng dựa trên UDP. Nói cách khác, điều đó có nghĩa là không có bắt tay giao thức hoặc sửa lỗi như gặp phải với TCP. "CoAP có thể không đáng tin cậy như HTTP hoặc đảm bảo việc gửi tin nhắn như MQTT, nhưng nó cực kỳ nhanh", Matthieu lưu ý. "Nếu bạn ổn với một số tin nhắn không được nhận, bạn có thể gửi thêm nhiều tin nhắn trong cùng một khung thời gian."
Có một vài thứ khác như AMQP, STOMP và CBOR mà bạn có thể nhìn vào là tốt. Xem trang web tiêu chuẩn CBOR cũng như luận án này, Triển khai và đánh giá giao thức CBOR . Xem bài viết này, Chọn Giao thức nhắn tin của bạn: AMQP, MQTT hoặc STOMP để so sánh và đối chiếu AMQP, MQTT và STOMP và kết thúc bằng một ghi chú về nhà môi giới RabitMQ:
Hy vọng, điều này có thể giúp nhiều người bắt đầu điều hướng súp giao thức ra khỏi đó cho từng trường hợp sử dụng của bạn. Vì thông thường các công ty có nhiều ứng dụng với các nhu cầu khác nhau, nên chắc chắn bạn có thể cần cả ba nhà môi giới trên các ứng dụng khác nhau. Đó là nơi mà một nhà môi giới đa chủng tộc, polyglot vững chắc như RabbitMQ đến ở vì họ có thể gửi STOMP, MQTT hoặc AMQP và đưa một trong những người khác ra ngoài. Bạn không cần phải bị khóa bởi một trong các giao thức này. Cả ba đều được nhà môi giới RabbitMQ hỗ trợ, làm cho nó trở thành một lựa chọn lý tưởng cho khả năng tương tác giữa các ứng dụng. Kiến trúc plugin cũng cho phép RabbitMQ phát triển để hỗ trợ các phiên bản bổ sung hoặc cập nhật của các giao thức này trong tương lai.
Gói chia sẻ slide này gồm khoảng 60 slide thực hiện so sánh và tương phản giữa bốn giao thức IoT khác nhau, xem xét nhu cầu của hai nhóm IoT khác nhau, Người tiêu dùng và Công nghiệp, có nhu cầu khác nhau về độ tin cậy và độ mạnh. Tiêu chuẩn nhắn tin phù hợp cho IoT là gì? .
Ack
ing là không cần thiết. Tôi nghĩ rằng làm việc với độ tin cậy trên UDP không có ý nghĩa quá nhiều, đó là những gì TCP dành cho.