@mytechtoday/augment-extensions 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/AGENTS.md +33 -1
  2. package/README.md +3 -3
  3. package/augment-extensions/domain-rules/software-architecture/README.md +143 -0
  4. package/augment-extensions/domain-rules/software-architecture/examples/banking-layered.md +961 -0
  5. package/augment-extensions/domain-rules/software-architecture/examples/ecommerce-microservices.md +990 -0
  6. package/augment-extensions/domain-rules/software-architecture/examples/iot-eventdriven.md +882 -0
  7. package/augment-extensions/domain-rules/software-architecture/examples/monolith-to-microservices-migration.md +703 -0
  8. package/augment-extensions/domain-rules/software-architecture/examples/serverless-imageprocessing.md +957 -0
  9. package/augment-extensions/domain-rules/software-architecture/examples/trading-eventdriven.md +747 -0
  10. package/augment-extensions/domain-rules/software-architecture/module.json +119 -0
  11. package/augment-extensions/domain-rules/software-architecture/rules/challenges-solutions.md +763 -0
  12. package/augment-extensions/domain-rules/software-architecture/rules/definitions-terminology.md +409 -0
  13. package/augment-extensions/domain-rules/software-architecture/rules/design-principles.md +684 -0
  14. package/augment-extensions/domain-rules/software-architecture/rules/evaluation-testing.md +1381 -0
  15. package/augment-extensions/domain-rules/software-architecture/rules/event-driven-architecture.md +616 -0
  16. package/augment-extensions/domain-rules/software-architecture/rules/fundamentals.md +306 -0
  17. package/augment-extensions/domain-rules/software-architecture/rules/industry-architectures.md +554 -0
  18. package/augment-extensions/domain-rules/software-architecture/rules/layered-architecture.md +776 -0
  19. package/augment-extensions/domain-rules/software-architecture/rules/microservices-architecture.md +503 -0
  20. package/augment-extensions/domain-rules/software-architecture/rules/modeling-documentation.md +1199 -0
  21. package/augment-extensions/domain-rules/software-architecture/rules/monolithic-architecture.md +351 -0
  22. package/augment-extensions/domain-rules/software-architecture/rules/principles.md +556 -0
  23. package/augment-extensions/domain-rules/software-architecture/rules/quality-attributes.md +797 -0
  24. package/augment-extensions/domain-rules/software-architecture/rules/scalability-performance.md +1345 -0
  25. package/augment-extensions/domain-rules/software-architecture/rules/security-architecture.md +1039 -0
  26. package/augment-extensions/domain-rules/software-architecture/rules/serverless-architecture.md +711 -0
  27. package/augment-extensions/domain-rules/software-architecture/rules/skills-development.md +568 -0
  28. package/augment-extensions/domain-rules/software-architecture/rules/tools-methodologies.md +961 -0
  29. package/augment-extensions/visual-design/CHANGELOG.md +132 -0
  30. package/augment-extensions/visual-design/README.md +255 -0
  31. package/augment-extensions/visual-design/__tests__/README.md +119 -0
  32. package/augment-extensions/visual-design/__tests__/style-selector.test.ts +172 -0
  33. package/augment-extensions/visual-design/__tests__/vendor-styles.test.ts +214 -0
  34. package/augment-extensions/visual-design/domains/other/ai-prompt-helper.ts +157 -0
  35. package/augment-extensions/visual-design/domains/other/dotnet-application.ts +156 -0
  36. package/augment-extensions/visual-design/domains/other/linux-platform.ts +156 -0
  37. package/augment-extensions/visual-design/domains/other/mobile-application.ts +157 -0
  38. package/augment-extensions/visual-design/domains/other/motion-picture.ts +156 -0
  39. package/augment-extensions/visual-design/domains/other/os-application.ts +156 -0
  40. package/augment-extensions/visual-design/domains/other/print-campaigns.ts +158 -0
  41. package/augment-extensions/visual-design/domains/other/web-app.ts +157 -0
  42. package/augment-extensions/visual-design/domains/other/website.ts +161 -0
  43. package/augment-extensions/visual-design/domains/other/windows-platform.ts +156 -0
  44. package/augment-extensions/visual-design/domains/web-page-styles/amazon-cloudscape.ts +506 -0
  45. package/augment-extensions/visual-design/domains/web-page-styles/google-modern.ts +615 -0
  46. package/augment-extensions/visual-design/domains/web-page-styles/microsoft-fluent.ts +531 -0
  47. package/augment-extensions/visual-design/examples/README.md +97 -0
  48. package/augment-extensions/visual-design/examples/ai-prompt-generation.md +233 -0
  49. package/augment-extensions/visual-design/examples/basic-usage.md +216 -0
  50. package/augment-extensions/visual-design/examples/domain-workflows.md +257 -0
  51. package/augment-extensions/visual-design/examples/vendor-comparison.md +247 -0
  52. package/augment-extensions/visual-design/module.json +78 -0
  53. package/augment-extensions/visual-design/style-selector.ts +177 -0
  54. package/augment-extensions/visual-design/types.ts +302 -0
  55. package/augment-extensions/visual-design/visual-design-core.ts +469 -0
  56. package/augment-extensions/workflows/adr-support/README.md +227 -0
  57. package/augment-extensions/workflows/adr-support/__tests__/adr-validator.test.ts +203 -0
  58. package/augment-extensions/workflows/adr-support/adr-validator.ts +162 -0
  59. package/augment-extensions/workflows/adr-support/examples/complete-lifecycle-example.md +449 -0
  60. package/augment-extensions/workflows/adr-support/examples/integration-example.md +580 -0
  61. package/augment-extensions/workflows/adr-support/examples/superseding-example.md +436 -0
  62. package/augment-extensions/workflows/adr-support/module.json +112 -0
  63. package/augment-extensions/workflows/adr-support/rules/adr-creation.md +372 -0
  64. package/augment-extensions/workflows/adr-support/rules/beads-integration.md +443 -0
  65. package/augment-extensions/workflows/adr-support/rules/conflict-detection.md +486 -0
  66. package/augment-extensions/workflows/adr-support/rules/decision-detection.md +362 -0
  67. package/augment-extensions/workflows/adr-support/rules/lifecycle-management.md +427 -0
  68. package/augment-extensions/workflows/adr-support/rules/openspec-integration.md +465 -0
  69. package/augment-extensions/workflows/adr-support/rules/template-selection.md +405 -0
  70. package/augment-extensions/workflows/adr-support/rules/validation-rules.md +543 -0
  71. package/augment-extensions/workflows/adr-support/schemas/adr-config.json +191 -0
  72. package/augment-extensions/workflows/adr-support/schemas/adr-metadata.json +172 -0
  73. package/augment-extensions/workflows/adr-support/templates/business-case.md +235 -0
  74. package/augment-extensions/workflows/adr-support/templates/madr-elaborate.md +197 -0
  75. package/augment-extensions/workflows/adr-support/templates/madr-simple.md +68 -0
  76. package/augment-extensions/workflows/adr-support/templates/nygard.md +84 -0
  77. package/augment-extensions/workflows/beads/rules/workflow.md +1 -1
  78. package/cli/dist/utils/__tests__/adr-validator.example.d.ts +6 -0
  79. package/cli/dist/utils/__tests__/adr-validator.example.d.ts.map +1 -0
  80. package/cli/dist/utils/__tests__/adr-validator.example.js +148 -0
  81. package/cli/dist/utils/__tests__/adr-validator.example.js.map +1 -0
  82. package/cli/dist/utils/adr-validator.d.ts +65 -0
  83. package/cli/dist/utils/adr-validator.d.ts.map +1 -0
  84. package/cli/dist/utils/adr-validator.js +203 -0
  85. package/cli/dist/utils/adr-validator.js.map +1 -0
  86. package/modules.md +40 -3
  87. package/package.json +1 -1
@@ -0,0 +1,882 @@
1
+ # IoT Architecture Example: Tesla-Style OTA Update System
2
+
3
+ ## Overview
4
+
5
+ This document provides a comprehensive example of an IoT architecture for Over-The-Air (OTA) firmware updates, inspired by Tesla's vehicle update system, focusing on scalability, security, and reliability.
6
+
7
+ ---
8
+
9
+ ## System Context
10
+
11
+ ### Business Requirements
12
+
13
+ **Functional Requirements**
14
+ - Remote firmware updates for millions of devices
15
+ - Staged rollout with canary deployments
16
+ - Real-time device telemetry and monitoring
17
+ - Device health checks and diagnostics
18
+ - Rollback capability for failed updates
19
+ - Update scheduling and prioritization
20
+ - Bandwidth optimization (delta updates)
21
+ - Offline update support
22
+
23
+ **Non-Functional Requirements**
24
+ - **Scalability**: Support 10M+ devices
25
+ - **Availability**: 99.99% uptime
26
+ - **Security**: Encrypted updates, signed firmware
27
+ - **Latency**: < 100ms for telemetry
28
+ - **Bandwidth**: Minimize data transfer
29
+ - **Reliability**: Zero-downtime updates
30
+
31
+ ### Use Cases
32
+
33
+ - **Automotive**: Vehicle firmware updates (Tesla, Rivian)
34
+ - **Smart Home**: IoT device updates (thermostats, cameras)
35
+ - **Industrial IoT**: Factory equipment, sensors
36
+ - **Medical Devices**: Remote diagnostics and updates
37
+
38
+ ---
39
+
40
+ ## Architecture Overview
41
+
42
+ ### High-Level Architecture
43
+
44
+ ```
45
+ ┌─────────────────────────────────────────────────────────────┐
46
+ │ IoT OTA Update Platform │
47
+ ├─────────────────────────────────────────────────────────────┤
48
+ │ │
49
+ │ Devices → MQTT Broker → IoT Core → Event Stream │
50
+ │ ↓ ↓ │
51
+ │ Telemetry Device Shadow Service │
52
+ │ ↓ ↓ │
53
+ │ Time-Series DB Update Orchestrator │
54
+ │ ↓ │
55
+ │ Firmware Repository │
56
+ │ ↓ │
57
+ │ CDN (Edge Distribution) │
58
+ │ ↓ │
59
+ │ Devices (Download) │
60
+ │ │
61
+ └─────────────────────────────────────────────────────────────┘
62
+ ```
63
+
64
+ ### Event Flow
65
+
66
+ ```
67
+ 1. Telemetry Flow
68
+ Device → MQTT → IoT Core → Kinesis → Lambda → InfluxDB
69
+
70
+ 2. Update Flow
71
+ Admin → Update Service → Device Shadow → MQTT → Device
72
+
73
+ 3. Rollback Flow
74
+ Monitor → Detect Failure → Rollback Service → Device Shadow → Device
75
+ ```
76
+
77
+ ---
78
+
79
+ ## Service Architecture
80
+
81
+ ### Core Components
82
+
83
+ **1. Device Layer**
84
+ - Embedded firmware (C/C++)
85
+ - MQTT client for communication
86
+ - Local update manager
87
+ - Health monitoring agent
88
+
89
+ **2. Gateway Layer (IoT Core)**
90
+ - MQTT broker (AWS IoT Core, Azure IoT Hub)
91
+ - Device authentication (X.509 certificates)
92
+ - Message routing
93
+ - Device registry
94
+
95
+ **3. Platform Layer**
96
+ - Device Shadow Service (digital twin)
97
+ - Update Orchestrator
98
+ - Telemetry Processor
99
+ - Analytics Engine
100
+
101
+ **4. Application Layer**
102
+ - Admin Dashboard
103
+ - Monitoring and Alerts
104
+ - Firmware Management
105
+ - Reporting
106
+
107
+ ---
108
+
109
+ ## Technology Stack
110
+
111
+ ### Cloud Services (AWS)
112
+ - **IoT Core**: MQTT broker, device management
113
+ - **IoT Device Shadow**: Device state management
114
+ - **S3**: Firmware storage
115
+ - **CloudFront**: CDN for firmware distribution
116
+ - **Kinesis**: Real-time telemetry streaming
117
+ - **Lambda**: Event processing
118
+ - **DynamoDB**: Device metadata, update status
119
+ - **InfluxDB**: Time-series telemetry data
120
+ - **SNS/SQS**: Notifications and queuing
121
+
122
+ ### Device Stack
123
+ - **OS**: FreeRTOS, Linux (Yocto)
124
+ - **Protocol**: MQTT, CoAP
125
+ - **Security**: TLS 1.3, X.509 certificates
126
+ - **OTA Library**: AWS IoT Device SDK
127
+
128
+ ### Monitoring
129
+ - **Grafana**: Telemetry dashboards
130
+ - **Prometheus**: Metrics collection
131
+ - **CloudWatch**: AWS service monitoring
132
+ - **PagerDuty**: Alerting
133
+
134
+ ---
135
+
136
+ ## Implementation Details
137
+
138
+ ### 1. Device Firmware (Embedded C)
139
+
140
+ **MQTT Client and Telemetry**
141
+
142
+ ```c
143
+ // device/mqtt_client.c
144
+ #include <stdio.h>
145
+ #include <stdlib.h>
146
+ #include <string.h>
147
+ #include "aws_iot_mqtt_client.h"
148
+ #include "aws_iot_json_utils.h"
149
+
150
+ #define MQTT_BROKER "a1b2c3d4e5f6g7.iot.us-east-1.amazonaws.com"
151
+
152
+
153
+ // OTA Update Handler
154
+ void ota_update_callback(AWS_IoT_Client *client, char *topic, uint16_t topic_len,
155
+ IoT_Publish_Message_Params *params, void *data) {
156
+ char *payload = (char *)params->payload;
157
+
158
+ // Parse update message
159
+ jsmn_parser parser;
160
+ jsmntok_t tokens[128];
161
+ jsmn_init(&parser);
162
+ int token_count = jsmn_parse(&parser, payload, params->payloadLen, tokens, 128);
163
+
164
+ // Extract firmware URL and version
165
+ char firmware_url[256];
166
+ char new_version[16];
167
+
168
+ // Download firmware from S3/CloudFront
169
+ download_firmware(firmware_url);
170
+
171
+ // Verify signature
172
+ if (verify_firmware_signature()) {
173
+ // Apply update
174
+ apply_firmware_update();
175
+
176
+ // Report success
177
+ report_update_status("SUCCESS", new_version);
178
+ } else {
179
+ // Report failure
180
+ report_update_status("FAILED", "Signature verification failed");
181
+ }
182
+ }
183
+
184
+ // Subscribe to shadow updates
185
+ void subscribe_to_shadow(AWS_IoT_Client *client) {
186
+ aws_iot_mqtt_subscribe(client, SHADOW_TOPIC, strlen(SHADOW_TOPIC),
187
+ QOS1, ota_update_callback, NULL);
188
+ }
189
+ ```
190
+
191
+ ### 2. Device Shadow Service (Cloud)
192
+
193
+ **Manage Device State**
194
+
195
+ ```python
196
+ # cloud/device_shadow_service.py
197
+ import json
198
+ import boto3
199
+ from datetime import datetime
200
+
201
+ iot_data = boto3.client('iot-data')
202
+ dynamodb = boto3.resource('dynamodb')
203
+ devices_table = dynamodb.Table('Devices')
204
+
205
+ class DeviceShadow:
206
+ def __init__(self, device_id):
207
+ self.device_id = device_id
208
+ self.thing_name = f"vehicle-{device_id}"
209
+
210
+ def get_shadow(self):
211
+ """Get current device shadow"""
212
+ response = iot_data.get_thing_shadow(thingName=self.thing_name)
213
+ shadow = json.loads(response['payload'].read())
214
+ return shadow
215
+
216
+ def update_shadow(self, desired_state):
217
+ """Update desired state in device shadow"""
218
+ payload = {
219
+ "state": {
220
+ "desired": desired_state
221
+ }
222
+ }
223
+
224
+ iot_data.update_thing_shadow(
225
+ thingName=self.thing_name,
226
+ payload=json.dumps(payload)
227
+ )
228
+
229
+ def trigger_ota_update(self, firmware_version, firmware_url):
230
+ """Trigger OTA update for device"""
231
+ desired_state = {
232
+ "firmwareVersion": firmware_version,
233
+ "firmwareUrl": firmware_url,
234
+ "updateStatus": "PENDING",
235
+ "updateTimestamp": datetime.utcnow().isoformat()
236
+ }
237
+
238
+ self.update_shadow(desired_state)
239
+
240
+ # Log update request
241
+ devices_table.update_item(
242
+ Key={'deviceId': self.device_id},
243
+ UpdateExpression='SET updateStatus = :status, targetVersion = :version',
244
+ ExpressionAttributeValues={
245
+ ':status': 'PENDING',
246
+ ':version': firmware_version
247
+ }
248
+ )
249
+
250
+ # Example usage
251
+ shadow = DeviceShadow("12345")
252
+ shadow.trigger_ota_update("v2.6.0", "https://cdn.example.com/firmware/v2.6.0.bin")
253
+ ```
254
+
255
+ ### 3. Update Orchestrator
256
+
257
+ **Staged Rollout with Canary Deployment**
258
+
259
+ ```python
260
+ # cloud/update_orchestrator.py
261
+ import boto3
262
+ from datetime import datetime, timedelta
263
+
264
+ dynamodb = boto3.resource('dynamodb')
265
+ devices_table = dynamodb.Table('Devices')
266
+ updates_table = dynamodb.Table('Updates')
267
+
268
+ class UpdateOrchestrator:
269
+ def __init__(self):
270
+ self.iot_data = boto3.client('iot-data')
271
+
272
+ def create_update_campaign(self, firmware_version, firmware_url, rollout_config):
273
+ """Create a new OTA update campaign"""
274
+ campaign = {
275
+ 'campaignId': f"campaign-{datetime.utcnow().timestamp()}",
276
+ 'firmwareVersion': firmware_version,
277
+ 'firmwareUrl': firmware_url,
278
+ 'status': 'CREATED',
279
+ 'rolloutConfig': rollout_config,
280
+ 'createdAt': datetime.utcnow().isoformat()
281
+ }
282
+
283
+ updates_table.put_item(Item=campaign)
284
+ return campaign
285
+
286
+ def execute_staged_rollout(self, campaign_id):
287
+ """Execute staged rollout with canary deployment"""
288
+ campaign = updates_table.get_item(Key={'campaignId': campaign_id})['Item']
289
+ rollout_config = campaign['rolloutConfig']
290
+
291
+ # Stage 1: Canary (1% of devices)
292
+ canary_devices = self.select_devices(percentage=1)
293
+ self.deploy_to_devices(canary_devices, campaign)
294
+
295
+ # Wait for canary results
296
+ if self.monitor_canary_health(canary_devices, duration_minutes=30):
297
+ # Stage 2: 10% rollout
298
+ stage2_devices = self.select_devices(percentage=10, exclude=canary_devices)
299
+ self.deploy_to_devices(stage2_devices, campaign)
300
+
301
+ # Stage 3: 50% rollout
302
+ if self.monitor_health(stage2_devices, duration_minutes=60):
303
+ stage3_devices = self.select_devices(percentage=50, exclude=canary_devices + stage2_devices)
304
+ self.deploy_to_devices(stage3_devices, campaign)
305
+
306
+ # Stage 4: 100% rollout
307
+ if self.monitor_health(stage3_devices, duration_minutes=120):
308
+ remaining_devices = self.select_remaining_devices()
309
+ self.deploy_to_devices(remaining_devices, campaign)
310
+ else:
311
+ # Canary failed, rollback
312
+ self.rollback_campaign(campaign_id)
313
+
314
+ def deploy_to_devices(self, devices, campaign):
315
+ """Deploy update to selected devices"""
316
+ for device in devices:
317
+ shadow = DeviceShadow(device['deviceId'])
318
+ shadow.trigger_ota_update(
319
+ campaign['firmwareVersion'],
320
+ campaign['firmwareUrl']
321
+ )
322
+
323
+ def monitor_canary_health(self, devices, duration_minutes):
324
+ """Monitor canary deployment health"""
325
+ # Check success rate, error rate, telemetry anomalies
326
+ success_count = 0
327
+ failure_count = 0
328
+
329
+ for device in devices:
330
+ status = self.get_update_status(device['deviceId'])
331
+ if status == 'SUCCESS':
332
+ success_count += 1
333
+ elif status == 'FAILED':
334
+ failure_count += 1
335
+
336
+ success_rate = success_count / len(devices)
337
+
338
+ # Require 95% success rate to proceed
339
+ return success_rate >= 0.95
340
+
341
+ def rollback_campaign(self, campaign_id):
342
+ """Rollback failed update campaign"""
343
+ campaign = updates_table.get_item(Key={'campaignId': campaign_id})['Item']
344
+
345
+ # Get all devices with pending/in-progress updates
346
+ affected_devices = self.get_affected_devices(campaign_id)
347
+
348
+ # Trigger rollback to previous version
349
+ for device in affected_devices:
350
+ shadow = DeviceShadow(device['deviceId'])
351
+ shadow.trigger_ota_update(
352
+ device['previousVersion'],
353
+ device['previousFirmwareUrl']
354
+ )
355
+
356
+ # Update campaign status
357
+ updates_table.update_item(
358
+ Key={'campaignId': campaign_id},
359
+ UpdateExpression='SET #status = :status',
360
+ ExpressionAttributeNames={'#status': 'status'},
361
+ ExpressionAttributeValues={':status': 'ROLLED_BACK'}
362
+ )
363
+ ```
364
+
365
+ ### 4. Telemetry Processing Pipeline
366
+
367
+ **Real-Time Telemetry Streaming**
368
+
369
+ ```python
370
+ # cloud/telemetry_processor.py
371
+ import json
372
+ import boto3
373
+ from datetime import datetime
374
+ from influxdb_client import InfluxDBClient, Point
375
+ from influxdb_client.client.write_api import SYNCHRONOUS
376
+
377
+ kinesis = boto3.client('kinesis')
378
+ influx_client = InfluxDBClient(url="http://influxdb:8086", token="my-token", org="my-org")
379
+ write_api = influx_client.write_api(write_options=SYNCHRONOUS)
380
+
381
+ def process_telemetry_event(event):
382
+ """Process telemetry from Kinesis stream"""
383
+ for record in event['Records']:
384
+ # Decode Kinesis record
385
+ payload = json.loads(record['kinesis']['data'])
386
+
387
+ device_id = payload['deviceId']
388
+ firmware_version = payload['firmwareVersion']
389
+ battery_level = payload['batteryLevel']
390
+ temperature = payload['temperature']
391
+ odometer = payload['odometer']
392
+ timestamp = payload['timestamp']
393
+
394
+ # Write to InfluxDB (time-series database)
395
+ point = Point("telemetry") \
396
+ .tag("deviceId", device_id) \
397
+ .tag("firmwareVersion", firmware_version) \
398
+ .field("batteryLevel", battery_level) \
399
+ .field("temperature", temperature) \
400
+ .field("odometer", odometer) \
401
+ .time(timestamp)
402
+
403
+ write_api.write(bucket="iot-telemetry", record=point)
404
+
405
+ # Check for anomalies
406
+ detect_anomalies(device_id, payload)
407
+
408
+ def detect_anomalies(device_id, telemetry):
409
+ """Detect telemetry anomalies"""
410
+ # Check battery level
411
+ if telemetry['batteryLevel'] < 20:
412
+ send_alert(device_id, "LOW_BATTERY", f"Battery level: {telemetry['batteryLevel']}%")
413
+
414
+ # Check temperature
415
+ if telemetry['temperature'] > 80:
416
+ send_alert(device_id, "HIGH_TEMPERATURE", f"Temperature: {telemetry['temperature']}°C")
417
+
418
+ def send_alert(device_id, alert_type, message):
419
+ """Send alert via SNS"""
420
+ sns = boto3.client('sns')
421
+ sns.publish(
422
+ TopicArn='arn:aws:sns:us-east-1:123456789012:iot-alerts',
423
+ Subject=f"IoT Alert: {alert_type}",
424
+ Message=json.dumps({
425
+ 'deviceId': device_id,
426
+ 'alertType': alert_type,
427
+ 'message': message,
428
+ 'timestamp': datetime.utcnow().isoformat()
429
+ })
430
+ )
431
+ ```
432
+
433
+ ---
434
+
435
+ ## Security Implementation
436
+
437
+ ### 1. Device Authentication
438
+
439
+ **X.509 Certificate-Based Authentication**
440
+
441
+ ```python
442
+ # cloud/device_provisioning.py
443
+ import boto3
444
+ from cryptography import x509
445
+ from cryptography.hazmat.primitives import hashes, serialization
446
+ from cryptography.hazmat.primitives.asymmetric import rsa
447
+
448
+ iot = boto3.client('iot')
449
+
450
+ def provision_device(device_id):
451
+ """Provision new IoT device with certificate"""
452
+
453
+ # Create certificate and keys
454
+ response = iot.create_keys_and_certificate(setAsActive=True)
455
+
456
+ certificate_arn = response['certificateArn']
457
+ certificate_pem = response['certificatePem']
458
+ private_key = response['keyPair']['PrivateKey']
459
+ public_key = response['keyPair']['PublicKey']
460
+
461
+ # Create IoT Thing
462
+ iot.create_thing(thingName=f"vehicle-{device_id}")
463
+
464
+ # Attach certificate to thing
465
+ iot.attach_thing_principal(
466
+ thingName=f"vehicle-{device_id}",
467
+ principal=certificate_arn
468
+ )
469
+
470
+ # Attach policy to certificate
471
+ iot.attach_policy(
472
+ policyName='IoTDevicePolicy',
473
+ target=certificate_arn
474
+ )
475
+
476
+ return {
477
+ 'deviceId': device_id,
478
+ 'certificatePem': certificate_pem,
479
+ 'privateKey': private_key,
480
+ 'publicKey': public_key
481
+ }
482
+
483
+ # IoT Policy (least privilege)
484
+ iot_policy = {
485
+ "Version": "2012-10-17",
486
+ "Statement": [
487
+ {
488
+ "Effect": "Allow",
489
+ "Action": ["iot:Connect"],
490
+ "Resource": ["arn:aws:iot:us-east-1:123456789012:client/${iot:Connection.Thing.ThingName}"]
491
+ },
492
+ {
493
+ "Effect": "Allow",
494
+ "Action": ["iot:Publish"],
495
+ "Resource": [
496
+ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/${iot:Connection.Thing.ThingName}",
497
+ "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update"
498
+ ]
499
+ },
500
+ {
501
+ "Effect": "Allow",
502
+ "Action": ["iot:Subscribe", "iot:Receive"],
503
+ "Resource": [
504
+ "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/${iot:Connection.Thing.ThingName}/shadow/update/delta"
505
+ ]
506
+ }
507
+ ]
508
+ }
509
+ ```
510
+
511
+ ### 2. Firmware Signing and Verification
512
+
513
+ **Code Signing for Firmware**
514
+
515
+ ```python
516
+ # cloud/firmware_signing.py
517
+ from cryptography.hazmat.primitives import hashes, serialization
518
+ from cryptography.hazmat.primitives.asymmetric import padding, rsa
519
+ import boto3
520
+
521
+ s3 = boto3.client('s3')
522
+
523
+ def sign_firmware(firmware_path, private_key_path):
524
+ """Sign firmware binary with private key"""
525
+
526
+ # Load private key
527
+ with open(private_key_path, 'rb') as key_file:
528
+ private_key = serialization.load_pem_private_key(
529
+ key_file.read(),
530
+ password=None
531
+ )
532
+
533
+ # Read firmware binary
534
+ with open(firmware_path, 'rb') as f:
535
+ firmware_data = f.read()
536
+
537
+ # Sign firmware
538
+ signature = private_key.sign(
539
+ firmware_data,
540
+ padding.PSS(
541
+ mgf=padding.MGF1(hashes.SHA256()),
542
+ salt_length=padding.PSS.MAX_LENGTH
543
+ ),
544
+ hashes.SHA256()
545
+ )
546
+
547
+ # Upload firmware and signature to S3
548
+ s3.put_object(
549
+ Bucket='firmware-bucket',
550
+ Key='firmware/v2.6.0.bin',
551
+ Body=firmware_data
552
+ )
553
+
554
+ s3.put_object(
555
+ Bucket='firmware-bucket',
556
+ Key='firmware/v2.6.0.bin.sig',
557
+ Body=signature
558
+ )
559
+
560
+ return signature
561
+ ```
562
+
563
+ **Device-Side Verification (C)**
564
+
565
+ ```c
566
+ // device/firmware_verification.c
567
+ #include <mbedtls/pk.h>
568
+ #include <mbedtls/sha256.h>
569
+
570
+ int verify_firmware_signature(const uint8_t *firmware, size_t firmware_len,
571
+ const uint8_t *signature, size_t sig_len) {
572
+ mbedtls_pk_context pk;
573
+ mbedtls_pk_init(&pk);
574
+
575
+ // Load public key (embedded in device)
576
+ int ret = mbedtls_pk_parse_public_key(&pk, public_key_pem, strlen(public_key_pem) + 1);
577
+ if (ret != 0) {
578
+ return -1;
579
+ }
580
+
581
+ // Calculate firmware hash
582
+ uint8_t hash[32];
583
+ mbedtls_sha256(firmware, firmware_len, hash, 0);
584
+
585
+ // Verify signature
586
+ ret = mbedtls_pk_verify(&pk, MBEDTLS_MD_SHA256,
587
+ hash, sizeof(hash),
588
+ signature, sig_len);
589
+
590
+ mbedtls_pk_free(&pk);
591
+
592
+ return (ret == 0) ? 1 : 0; // 1 = valid, 0 = invalid
593
+ }
594
+ ```
595
+
596
+
597
+ ---
598
+
599
+ ## Bandwidth Optimization
600
+
601
+ ### Delta Updates
602
+
603
+ **Generate and Apply Delta Patches**
604
+
605
+ ```python
606
+ # cloud/delta_generator.py
607
+ import bsdiff4
608
+
609
+ def generate_delta_update(old_firmware_path, new_firmware_path):
610
+ """Generate binary diff between firmware versions"""
611
+
612
+ with open(old_firmware_path, 'rb') as f:
613
+ old_firmware = f.read()
614
+
615
+ with open(new_firmware_path, 'rb') as f:
616
+ new_firmware = f.read()
617
+
618
+ # Generate delta patch
619
+ delta = bsdiff4.diff(old_firmware, new_firmware)
620
+
621
+ # Calculate size reduction
622
+ old_size = len(old_firmware)
623
+ new_size = len(new_firmware)
624
+ delta_size = len(delta)
625
+
626
+ savings = (1 - delta_size / new_size) * 100
627
+
628
+ print(f"Full update: {new_size / 1024:.2f} KB")
629
+ print(f"Delta update: {delta_size / 1024:.2f} KB")
630
+ print(f"Bandwidth savings: {savings:.2f}%")
631
+
632
+ return delta
633
+
634
+ # Example: v2.5.1 → v2.6.0
635
+ # Full update: 5.2 MB
636
+ # Delta update: 850 KB
637
+ # Bandwidth savings: 83.7%
638
+ ```
639
+
640
+ **Device-Side Delta Application (C)**
641
+
642
+ ```c
643
+ // device/delta_update.c
644
+ #include <bspatch.h>
645
+
646
+ int apply_delta_update(const char *old_firmware_path,
647
+ const char *delta_path,
648
+ const char *new_firmware_path) {
649
+ // Apply binary patch
650
+ int ret = bspatch(old_firmware_path, new_firmware_path, delta_path);
651
+
652
+ if (ret == 0) {
653
+ // Verify new firmware
654
+ if (verify_firmware_signature()) {
655
+ // Activate new firmware
656
+ activate_firmware(new_firmware_path);
657
+ return 0;
658
+ }
659
+ }
660
+
661
+ return -1;
662
+ }
663
+ ```
664
+
665
+ ---
666
+
667
+ ## Monitoring and Observability
668
+
669
+ ### Grafana Dashboard
670
+
671
+ **Telemetry Visualization**
672
+
673
+ ```python
674
+ # cloud/grafana_dashboard.py
675
+ import json
676
+
677
+ dashboard = {
678
+ "dashboard": {
679
+ "title": "IoT Fleet Monitoring",
680
+ "panels": [
681
+ {
682
+ "title": "Active Devices",
683
+ "targets": [{
684
+ "query": "SELECT count(DISTINCT deviceId) FROM telemetry WHERE time > now() - 5m"
685
+ }]
686
+ },
687
+ {
688
+ "title": "Firmware Version Distribution",
689
+ "targets": [{
690
+ "query": "SELECT count(*) FROM telemetry GROUP BY firmwareVersion"
691
+ }]
692
+ },
693
+ {
694
+ "title": "Average Battery Level",
695
+ "targets": [{
696
+ "query": "SELECT mean(batteryLevel) FROM telemetry WHERE time > now() - 1h GROUP BY time(5m)"
697
+ }]
698
+ },
699
+ {
700
+ "title": "Update Success Rate",
701
+ "targets": [{
702
+ "query": "SELECT count(*) FROM updates WHERE status='SUCCESS' / count(*) * 100"
703
+ }]
704
+ },
705
+ {
706
+ "title": "Device Temperature Heatmap",
707
+ "targets": [{
708
+ "query": "SELECT mean(temperature) FROM telemetry GROUP BY deviceId, time(10m)"
709
+ }]
710
+ }
711
+ ]
712
+ }
713
+ }
714
+ ```
715
+
716
+ ### CloudWatch Alarms
717
+
718
+ ```yaml
719
+ # cloudwatch_alarms.yaml
720
+ Alarms:
721
+ HighUpdateFailureRate:
722
+ Type: AWS::CloudWatch::Alarm
723
+ Properties:
724
+ AlarmName: IoT-HighUpdateFailureRate
725
+ MetricName: UpdateFailureRate
726
+ Namespace: IoT/OTA
727
+ Statistic: Average
728
+ Period: 300
729
+ EvaluationPeriods: 2
730
+ Threshold: 5 # 5% failure rate
731
+ ComparisonOperator: GreaterThanThreshold
732
+ AlarmActions:
733
+ - !Ref AlertTopic
734
+
735
+ DeviceOfflineAlert:
736
+ Type: AWS::CloudWatch::Alarm
737
+ Properties:
738
+ AlarmName: IoT-DeviceOffline
739
+ MetricName: ConnectedDevices
740
+ Namespace: IoT/Fleet
741
+ Statistic: Sum
742
+ Period: 300
743
+ EvaluationPeriods: 1
744
+ Threshold: 9500000 # Alert if < 95% of 10M devices
745
+ ComparisonOperator: LessThanThreshold
746
+ AlarmActions:
747
+ - !Ref AlertTopic
748
+ ```
749
+
750
+ ---
751
+
752
+ ## Scalability and Performance
753
+
754
+ ### Performance Metrics
755
+
756
+ **Fleet Scale**
757
+ - **Total Devices**: 10 million
758
+ - **Concurrent Connections**: 10 million (MQTT persistent connections)
759
+ - **Telemetry Rate**: 100 million messages/hour (27,777 msg/sec)
760
+ - **Update Throughput**: 100,000 devices/hour
761
+
762
+ **Latency**
763
+ - **Telemetry Ingestion**: < 100ms (device → cloud)
764
+ - **Shadow Update**: < 200ms (cloud → device)
765
+ - **Firmware Download**: 2-5 minutes (5MB firmware over 4G)
766
+
767
+ **Bandwidth**
768
+ - **Telemetry**: 500 bytes/message × 10M devices × 10 msg/hour = 50 GB/hour
769
+ - **Firmware Updates**: 5 MB × 100K devices/hour = 500 TB/hour (full update)
770
+ - **Delta Updates**: 850 KB × 100K devices/hour = 85 TB/hour (83% savings)
771
+
772
+ ### Cost Optimization
773
+
774
+ **Monthly Cost Estimate (10M devices)**
775
+
776
+ - **IoT Core**: $8,000 (10M connections × $0.08/month + 100M messages × $1/million)
777
+ - **Kinesis**: $2,000 (100M records/hour × 730 hours × $0.014/million)
778
+ - **InfluxDB (EC2)**: $500 (r5.2xlarge instance)
779
+ - **DynamoDB**: $1,000 (10M device records + updates)
780
+ - **S3**: $500 (firmware storage + versioning)
781
+ - **CloudFront**: $5,000 (500 TB data transfer for updates)
782
+ - **Lambda**: $200 (telemetry processing)
783
+
784
+ **Total**: ~$17,200/month for 10M devices
785
+
786
+ **Per-Device Cost**: $0.00172/month
787
+
788
+ ---
789
+
790
+ ## Key Takeaways
791
+
792
+ ### Architecture Decisions
793
+
794
+ 1. **MQTT Protocol**: Lightweight, persistent connections, QoS guarantees
795
+ 2. **Device Shadow**: Decouples device state from cloud, offline support
796
+ 3. **Staged Rollout**: Canary deployment reduces risk of bad updates
797
+ 4. **Delta Updates**: 80%+ bandwidth savings for firmware updates
798
+ 5. **Event-Driven**: Real-time telemetry processing with Kinesis
799
+ 6. **Time-Series DB**: InfluxDB for efficient telemetry storage and querying
800
+
801
+ ### Trade-offs
802
+
803
+ **Benefits**
804
+ - ✅ Massive scale (10M+ devices)
805
+ - ✅ Real-time telemetry and monitoring
806
+ - ✅ Safe OTA updates with rollback
807
+ - ✅ Bandwidth optimization (delta updates)
808
+ - ✅ Offline device support (shadow)
809
+ - ✅ Low per-device cost ($0.00172/month)
810
+
811
+ **Challenges**
812
+ - ❌ Complex orchestration (staged rollout)
813
+ - ❌ Network reliability (4G/5G connectivity)
814
+ - ❌ Security complexity (certificate management)
815
+ - ❌ Debugging distributed system
816
+ - ❌ Firmware compatibility testing
817
+
818
+ ### Performance Metrics
819
+
820
+ **Before Optimization**
821
+ - Full firmware updates: 5 MB per device
822
+ - Bandwidth cost: $10,000/month (500 TB)
823
+ - Update time: 10 minutes per device
824
+
825
+ **After Optimization**
826
+ - Delta updates: 850 KB per device
827
+ - Bandwidth cost: $1,700/month (85 TB)
828
+ - Update time: 2 minutes per device
829
+
830
+ ### Lessons Learned
831
+
832
+ 1. **Use delta updates**: 80%+ bandwidth savings for firmware
833
+ 2. **Implement canary deployments**: Catch bad updates early
834
+ 3. **Monitor telemetry anomalies**: Detect issues before they escalate
835
+ 4. **Use device shadows**: Enable offline device support
836
+ 5. **Optimize MQTT QoS**: Balance reliability vs. bandwidth
837
+ 6. **Implement rollback**: Critical for production safety
838
+ 7. **Use CloudFront**: Reduce latency and cost for firmware distribution
839
+
840
+ ---
841
+
842
+ ## Real-World Example: Tesla OTA Updates
843
+
844
+ ### Tesla's Approach
845
+
846
+ **Fleet Size**: 5+ million vehicles worldwide
847
+
848
+ **Update Frequency**: Monthly feature updates, weekly bug fixes
849
+
850
+ **Update Types**:
851
+ - **Autopilot improvements**: Neural network model updates
852
+ - **Battery management**: Optimize range and charging
853
+ - **Infotainment**: UI improvements, new features
854
+ - **Safety**: Critical security patches
855
+
856
+ **Rollout Strategy**:
857
+ 1. **Internal testing**: Tesla employees (1,000 vehicles)
858
+ 2. **Early access**: Opt-in beta testers (10,000 vehicles)
859
+ 3. **Staged rollout**: 1% → 10% → 50% → 100%
860
+ 4. **Monitoring**: Real-time telemetry, crash reports
861
+ 5. **Rollback**: Automatic if failure rate > 5%
862
+
863
+ **Key Metrics**:
864
+ - **Update success rate**: 99.5%
865
+ - **Average download time**: 25 minutes (over WiFi)
866
+ - **Bandwidth per update**: 2-4 GB (full update), 200-500 MB (delta)
867
+ - **Fleet update time**: 2-4 weeks (100% rollout)
868
+
869
+ ---
870
+
871
+ ## References
872
+
873
+ - **AWS IoT Core**: Managed MQTT broker and device management
874
+ - **MQTT Protocol**: Lightweight messaging protocol for IoT
875
+ - **Device Shadow**: AWS IoT device state management
876
+ - **InfluxDB**: Time-series database for telemetry
877
+ - **bsdiff/bspatch**: Binary diff/patch for delta updates
878
+ - **Tesla OTA**: Real-world example of large-scale IoT updates
879
+
880
+ ---
881
+
882
+ **Total Lines**: 750+