# MQTT Contract Draft - QRIS Soundbox Platform v1

## 1. Prinsip MQTT
- topic harus namespaced per device atau tenant
- device hanya boleh publish/subscribe ke topic yang diizinkan
- semua pesan request harus punya request_id
- semua pesan response harus punya correlation_id
- notifikasi harus punya event_id untuk dedup

## 2. Topic Convention
### Uplink dari device
- `devices/{deviceId}/uplink/heartbeat`
- `devices/{deviceId}/uplink/dynamic-qr/request`
- `devices/{deviceId}/uplink/config/ack`
- `devices/{deviceId}/uplink/command/ack`

### Downlink ke device
- `devices/{deviceId}/downlink/dynamic-qr/response`
- `devices/{deviceId}/downlink/payment/success`
- `devices/{deviceId}/downlink/config/push`
- `devices/{deviceId}/downlink/command`

## 3. Heartbeat Payload
```json
{
  "message_type": "heartbeat",
  "device_id": "sbx_001",
  "timestamp": "2026-05-23T10:00:00Z",
  "firmware_version": "1.0.3",
  "state": "idle",
  "network_strength": 78,
  "battery_level": 92
}
```

## 4. Dynamic QR Request Payload
```json
{
  "message_type": "dynamic_qr_request",
  "request_id": "req_123",
  "device_id": "sbx_001",
  "terminal_id": "term_001",
  "amount": 50000,
  "currency": "IDR",
  "created_at": "2026-05-23T10:00:00Z"
}
```

## 5. Dynamic QR Response Payload
```json
{
  "message_type": "dynamic_qr_response",
  "correlation_id": "req_123",
  "transaction_id": "tx_123",
  "status": "success",
  "qr_payload": "000201010212...",
  "expires_at": "2026-05-23T10:05:00Z"
}
```

## 6. Payment Success Notification Payload
```json
{
  "message_type": "payment_success",
  "event_id": "evt_123",
  "transaction_id": "tx_123",
  "merchant_name": "Toko Berkah",
  "amount": 50000,
  "currency": "IDR",
  "paid_at": "2026-05-23T10:02:10Z",
  "audio_text": "Pembayaran diterima lima puluh ribu rupiah",
  "display_text": "Pembayaran diterima Rp50.000"
}
```

## 7. Config Push Payload
```json
{
  "message_type": "config_push",
  "config_version": 3,
  "settings": {
    "volume": 80,
    "language": "id-ID",
    "heartbeat_interval_seconds": 60
  }
}
```

## 8. Command Payload
```json
{
  "message_type": "command",
  "command_id": "cmd_123",
  "command_name": "test_speaker",
  "parameters": {}
}
```

## 9. QoS dan Delivery
- heartbeat dapat memakai QoS rendah sesuai kebutuhan
- payment success sebaiknya QoS lebih tinggi
- retained message jangan dipakai untuk notifikasi sukses transaksi
- ack command dan ack config harus dicatat
