ieeeColors = ({
navy: "#2C3E50",
teal: "#16A085",
orange: "#E67E22",
gray: "#7F8C8D",
red: "#C0392B",
green: "#27AE60",
purple: "#8E44AD",
blue: "#3498DB",
yellow: "#F1C40F",
darkGray: "#34495E",
lightGray: "#BDC3C7",
white: "#ECF0F1"
})
// Protocol definitions with overhead characteristics
protocolDefinitions = ({
"MQTT 3.1.1": {
name: "MQTT 3.1.1",
transport: "TCP",
minHeader: 2,
maxHeader: 5,
fixedOverhead: 0,
topicOverhead: 2, // 2 bytes for topic length
qosOverheads: { 0: 0, 1: 2, 2: 2 }, // Message ID for QoS 1,2
description: "Lightweight pub/sub messaging protocol",
color: ieeeColors.teal
},
"MQTT 5.0": {
name: "MQTT 5.0",
transport: "TCP",
minHeader: 2,
maxHeader: 5,
fixedOverhead: 1, // Properties length (minimum)
topicOverhead: 2,
qosOverheads: { 0: 0, 1: 2, 2: 2 },
description: "Enhanced MQTT with properties and features",
color: ieeeColors.green
},
"CoAP": {
name: "CoAP",
transport: "UDP",
minHeader: 4,
maxHeader: 4,
fixedOverhead: 0,
topicOverhead: 0, // URI is in options
optionOverhead: 1, // Per option byte + length
qosOverheads: { 0: 0, 1: 0, 2: 0 }, // NON, CON handled in type
description: "Constrained Application Protocol for IoT",
color: ieeeColors.orange
},
"HTTP/1.1": {
name: "HTTP/1.1",
transport: "TCP",
minHeader: 100, // Minimal request line + headers
maxHeader: 500,
fixedOverhead: 50, // Content-Type, Content-Length, etc.
topicOverhead: 0,
qosOverheads: { 0: 0, 1: 0, 2: 0 },
description: "Standard web protocol with text headers",
color: ieeeColors.red
},
"HTTP/2": {
name: "HTTP/2",
transport: "TCP",
minHeader: 9, // Frame header
maxHeader: 50, // With HPACK compression
fixedOverhead: 20,
topicOverhead: 0,
qosOverheads: { 0: 0, 1: 0, 2: 0 },
description: "Binary framing with header compression",
color: ieeeColors.purple
},
"AMQP": {
name: "AMQP",
transport: "TCP",
minHeader: 8,
maxHeader: 8,
fixedOverhead: 20, // Delivery annotations, properties
topicOverhead: 4,
qosOverheads: { 0: 0, 1: 4, 2: 8 },
description: "Advanced Message Queuing Protocol",
color: ieeeColors.blue
},
"LwM2M": {
name: "LwM2M",
transport: "UDP",
minHeader: 4, // CoAP base
maxHeader: 4,
fixedOverhead: 2, // Object/Instance/Resource IDs
topicOverhead: 0,
qosOverheads: { 0: 0, 1: 0, 2: 0 },
description: "Lightweight M2M over CoAP",
color: ieeeColors.navy
},
"Raw TCP": {
name: "Raw TCP",
transport: "TCP",
minHeader: 0,
maxHeader: 0,
fixedOverhead: 0,
topicOverhead: 0,
qosOverheads: { 0: 0, 1: 0, 2: 0 },
description: "Direct TCP socket communication",
color: ieeeColors.gray
},
"Raw UDP": {
name: "Raw UDP",
transport: "UDP",
minHeader: 0,
maxHeader: 0,
fixedOverhead: 0,
topicOverhead: 0,
qosOverheads: { 0: 0, 1: 0, 2: 0 },
description: "Direct UDP datagram communication",
color: ieeeColors.darkGray
}
})
// Transport layer overhead
transportOverheads = ({
"TCP": { header: 20, options: 12, description: "Transmission Control Protocol" },
"UDP": { header: 8, options: 0, description: "User Datagram Protocol" },
"DTLS 1.2": { header: 13, options: 0, macSize: 8, description: "Datagram TLS" },
"TLS 1.2": { header: 5, options: 0, macSize: 20, description: "Transport Layer Security" },
"TLS 1.3": { header: 5, options: 0, macSize: 16, description: "TLS with reduced overhead" }
})
// Network layer overhead
networkOverheads = ({
"IPv4": { header: 20, options: 0, description: "Internet Protocol v4" },
"IPv6": { header: 40, options: 0, description: "Internet Protocol v6" },
"6LoWPAN": { header: 7, options: 0, description: "IPv6 over Low-Power WPAN (compressed)" },
"6LoWPAN-Full": { header: 40, options: 0, description: "6LoWPAN without compression" }
})
// Link layer overhead
linkOverheads = ({
"Ethernet": { header: 14, trailer: 4, preamble: 8, mtu: 1500, description: "IEEE 802.3" },
"Wi-Fi": { header: 36, trailer: 4, preamble: 0, mtu: 2304, description: "IEEE 802.11" },
"802.15.4": { header: 25, trailer: 2, preamble: 6, mtu: 127, description: "IEEE 802.15.4 (Zigbee/Thread)" },
"BLE": { header: 10, trailer: 3, preamble: 1, mtu: 251, description: "Bluetooth Low Energy 5.0" },
"LoRa": { header: 13, trailer: 0, preamble: 8, mtu: 255, description: "Long Range radio" },
"NB-IoT": { header: 0, trailer: 0, preamble: 0, mtu: 1600, description: "Narrowband IoT (cellular)" }
})
// Predefined scenarios
scenarios = ({
"tiny_sensor": {
name: "Tiny Sensor Reading",
description: "4-byte temperature/humidity reading",
payload: 4,
topic: 20,
qos: 0,
headers: 0
},
"json_telemetry": {
name: "JSON Telemetry",
description: "100-byte JSON sensor data",
payload: 100,
topic: 30,
qos: 1,
headers: 20
},
"structured_data": {
name: "Structured Data",
description: "500-byte protobuf message",
payload: 500,
topic: 25,
qos: 1,
headers: 10
},
"image_upload": {
name: "Image Upload",
description: "10KB image data",
payload: 10240,
topic: 40,
qos: 2,
headers: 50
},
"constrained_network": {
name: "Constrained Network",
description: "Minimal payload for 802.15.4",
payload: 20,
topic: 10,
qos: 0,
headers: 0
},
"custom": {
name: "Custom Configuration",
description: "User-defined parameters",
payload: 50,
topic: 20,
qos: 1,
headers: 10
}
})
// State management
viewModel = {
const state = Mutable({
selectedProtocols: ["MQTT 3.1.1", "CoAP", "HTTP/1.1"],
scenario: "json_telemetry",
payloadSize: 100,
topicLength: 30,
qosLevel: 1,
customHeaders: 20,
transportSecurity: "None",
networkLayer: "IPv4",
linkLayer: "Ethernet",
showComparison: true,
comparisonMode: "absolute" // or "relative"
});
return state;
}
// Current state accessor
currentState = viewModel.value
// Scenario selector
html`<div style="background: linear-gradient(135deg, ${ieeeColors.navy} 0%, ${ieeeColors.darkGray} 100%);
color: white; padding: 25px; border-radius: 12px; margin-bottom: 20px;">
<h3 style="margin: 0 0 15px 0; display: flex; align-items: center; gap: 10px;">
<span style="font-size: 1.5em;">📊</span> Protocol Overhead Calculator
</h3>
<p style="margin: 0; opacity: 0.9; font-size: 0.95em;">
Calculate and compare protocol overhead across different IoT protocols to optimize bandwidth efficiency.
</p>
</div>`