Mặc dù công bằng mà nói rằng XML là dài dòng, nhưng cần phải biết rằng sự dài dòng này không phải là tất cả "chi phí" liên quan đến nội dung vì nó gói gọn về ngữ nghĩa; đó là chi phí chung của bất kỳ giao thức nào nhấn mạnh đến tính năng động trái ngược với cấu trúc tĩnh. Ví dụ, HTML thực sự là một dạng XML thoải mái truyền tải nội dung với cấu trúc động, cấu trúc có thể được coi là một khía cạnh của nội dung. Bạn có thể phân biệt nội dung của bảng với chính bảng đó, nhưng thực tế là nội dung là dữ liệu dạng bảng với các quan hệ cụ thể là không thể thiếu đối với nội dung; nếu tôi chỉ lấy mỗi ô và truyền tất cả thành một chuỗi dài, cấu trúc đó và các mối quan hệ đó sẽ biến mất, và vì vậy tôi đã mất thông tin và đó không phải là nội dung đó sao?
Chúng ta hãy xem xét một thông điệp 8 byte có thể tạo thành một số dữ liệu tabluar. Nếu tôi sử dụng một giao thức rất tĩnh, tôi có thể, tối thiểu, truyền nó mà không cần thêm chi phí đơn giản bằng cách xác định một giao thức như thế này:
- Mỗi thông báo chính xác là 8 byte, vì vậy chúng tôi không cần chỉ ra độ dài hoặc bao gồm bất kỳ chuỗi kết thúc nào.
- Tám byte luôn được lấy để chỉ lưới 2 x 2 trong đó mỗi ô chứa giá trị 16 bit.
Nếu tất cả các thông điệp của tôi đều giống hệt như vậy, sử dụng XML, HTML hoặc XMPP có thể bị coi là ngớ ngẩn - Tôi đang lãng phí băng thông cho các thành phần cấu trúc luôn giống nhau và được xác định trước, và lãng phí thời gian tính toán tương ứng ở cả hai đầu tạo và phân tích cú pháp. Một trang HTML tối thiểu, phù hợp chỉ chứa một bảng 2 x 2 với một vài ký tự trong mỗi ô có thể sẽ có ít nhất 100 byte để phù hợp với định dạng và chi phí giao thức.
Tuy nhiên, nếu không phải tất cả các tin nhắn của tôi đều chính xác như vậy, thì việc chỉ định loại tin nhắn đó có thể không phải là một phần nghĩa đen của "tải trọng" nhưng nó là một thành phần cần thiết, khôn ngoan về nội dung. Tôi có thể làm điều đó chỉ với hai byte thêm và giới thiệu tính năng động hơn nhiều:
- Các thông báo hiện có độ dài thay đổi, 0-255 byte và byte đầu tiên cho biết độ dài.
- Có (tối đa) 256 mã cho các loại thông báo được xác định trước khác nhau, một trong số đó là "bảng 2 x 2", đó là byte thứ hai.
Bây giờ 8 byte nội dung bảng của tôi yêu cầu 2 byte phí, nhưng có nhiều khả năng rộng hơn về mặt loại tin nhắn nào có thể được gửi với giao thức tùy chỉnh này.
Nó vẫn không giống với khả năng của một trang HTML hoặc đặc tả không gian tên XML (hoặc được đặt trong đó, về cơ bản là XMPP ).
Vì vậy, dựa trên điều đó, nếu chủ yếu những gì bạn đang làm là gửi các tin nhắn 8 byte đơn giản, XMPP có thể là quá mức cần thiết. Tuy nhiên, không nhất thiết là nhiều. Khiếu nại rằng "một trao đổi yêu cầu / phản hồi duy nhất để gửi một byte dữ liệu từ THIẾT BỊ KẾT NỐI IOT đến máy chủ là hơn 0,5 kB" đối với tôi, liếc nhìn RFC có liên quan , là một cường điệu tiềm năng (nhưng nb, tất cả Tôi đã làm là liếc nhìn nó, tôi chưa bao giờ thực hiện hoặc sử dụng XMPP). Tôi không nghi ngờ bạn có thể xây dựng một ví dụ như vậy, nhưng đó có lẽ không phải là một ví dụ tối thiểu .
Do giao thức được định hướng TCP, nên việc thiết lập "luồng XML đủ điều kiện theo không gian tên 'jabber: client'" chỉ cần được coi là một phần của thông báo nếu chúng tôi thực hiện một việc - thiết bị liên lạc với máy chủ để gửi 8 byte đến, gửi các dữ liệu, ngắt kết nối. Nếu mối quan hệ bền bỉ hơn, thường xảy ra trong bối cảnh IoT, thì chúng ta có thể giả sử thiết bị đã có kết nối được thiết lập đến đích. Trong trường hợp này, nếu đích đến cuối cùng của tin nhắn là máy chủ (trái ngược với máy khách khác, máy chủ sẽ chuyển tin nhắn đến), thì chi phí giao thức là rất nhỏ.
<message><body>8 bytes.</body></message>
33 byte "trên không". Điều đáng nói ở đây là XML là văn bản, và vì vậy nếu các thông điệp của bạn thường là nhị phân, thì nó sẽ trở nên ít phù hợp hơn, bởi vì dữ liệu đó cần được mã hóa (ví dụ, đến cơ sở64 ), điều này bổ sung thêm chi phí và tính toán yêu cầu.
Vì vậy, cuối cùng:
XMPP có chi phí lớn cho các thiết bị IoT gửi tin nhắn ngắn, thường xuyên không?
Nếu có một kết nối liên tục và các thông điệp phần lớn không có cấu trúc, tôi không nghĩ vậy. Tuy nhiên, nếu bạn không cần những gì nó cung cấp (tính năng động liên quan đến cấu trúc), thì có lẽ có những phương pháp phù hợp hơn.
Theo đuổi điều đó, nếu chúng ta có bối cảnh trong đó một máy chủ trung tâm đang xử lý và / hoặc dựa vào các tin nhắn giữa nhiều loại thiết bị, mặc dù bất kỳ thiết bị nào trong số đó đang làm có thể luôn đơn giản và dễ hiểu, một giao thức có thể gói gọn nhiều tin nhắn vẫn sẽ hữu ích. Nếu một thiết bị khách có tài nguyên hạn chế, chúng ta có thể mã hóa phần lớn giao thức và gói mỗi tin nhắn từ đầu đó trở thành một nhiệm vụ rất đơn giản; Tôi tin rằng nhiều thiết bị IoT triển khai máy chủ HTTP thực hiện điều đó (đó là nghịch đảo của "máy khách đơn giản, máy chủ phức tạp"). Các máy chủ đó không thể xử lý bất kỳ loại yêu cầu HTTP nào (ngoại trừ thông qua từ chối được định dạng trước) và có một tập hợp rất rõ ràng, tập trung vào những việc sẽ làm và phản hồi mà chúng sẽ gửi, nhưng vì chúng không hoạt động chính xác như máy chủ HTTP,