Add resend mechanism for media

This commit is contained in:
Janez T
2026-03-01 19:29:09 +01:00
parent a0c4cdeede
commit 790c205541
3 changed files with 144 additions and 62 deletions

View File

@@ -5,6 +5,8 @@ Flutter app for Search and Rescue operations over a [MeshCore](https://github.co
## Features
- **Messaging** — send/receive messages to contacts and channels
- **Voice messages** — push-to-talk voice over the mesh using [Codec2](https://github.com/drowe67/codec2) ultra-low-bitrate speech compression (7003200 bps); fragments are streamed on demand via direct BLE links without requiring firmware changes
- **Image messages** — send photos over the mesh as AVIF-compressed fragments; images are fetched on demand when the recipient taps the placeholder; configurable resolution (64 / 128 / 256 px), compression level, and colour/grayscale mode
- **Contacts** — track team members, repeaters, and rooms with live telemetry
- **SAR Markers** — drop emoji-coded location pins (person found, fire, staging area) via chat messages
- **Map** — view team positions and markers on OpenStreetMap / topo / satellite; tiles cached for offline use
@@ -70,10 +72,12 @@ cd ios && pod deintegrate && pod install && cd ..
| Platform | Permissions |
|----------|-------------|
| iOS | Bluetooth, Location (when in use) |
| Android | `BLUETOOTH_SCAN`, `BLUETOOTH_CONNECT`, `ACCESS_FINE_LOCATION`, `INTERNET` |
| iOS | Bluetooth, Location (when in use), Microphone (voice), Photo Library / Camera (images) |
| Android | `BLUETOOTH_SCAN`, `BLUETOOTH_CONNECT`, `ACCESS_FINE_LOCATION`, `INTERNET`, `RECORD_AUDIO`, `READ_MEDIA_IMAGES` |
## SAR Marker format
## Wire protocols
### SAR Marker
```
S:<emoji>:<lat>,<lon>
@@ -81,6 +85,40 @@ S:<emoji>:<lat>,<lon>
Examples: `S:🧑:46.0569,14.5058` · `S:🔥:46.057,14.506` · `S:🏕️:46.0571,14.506`
### Voice messages (on-demand, direct contacts only)
Control plane (text):
```
VE1:{sid}:{mode}:{total}:{durationMs}:{senderKey6}:{ts}:{ver} ← envelope
VR1:{sid}:a:{requesterKey6}:{ts}:{ver} ← fetch request
```
Data plane (binary via `cmdSendRawData` / `pushRawData`, ≤160 bytes/packet):
```
[0x56 'V'][sessionId:4B][mode:1B][idx:1B][total:1B][Codec2 frame...]
```
Codec2 modes: 700C / 1200 / 1300 / 1400 / 1600 / 2400 / 3200 bps.
### Image messages (on-demand, direct contacts only)
Control plane (text):
```
IE1:{sid}:{fmt}:{total}:{w}:{h}:{bytes}:{senderKey6}:{ts}:{ver} ← envelope
IR1:{sid}:a:{requesterKey6}:{ts}:{ver} ← fetch request
```
Data plane (binary via `cmdSendRawData` / `pushRawData`, ≤160 bytes/packet):
```
[0x49 'I'][sessionId:4B][fmt:1B][idx:1B][total:1B][AVIF fragment...]
```
Images are compressed to AVIF (configurable up to 256×256, grayscale by default). At 152 bytes of payload per fragment a typical image takes 720 fragments — comparable to a short voice clip.
## Architecture
```