API Pública
Referencia completa de los métodos del SDK orientados al partner. Los métodos deprecados y de compatibilidad se omiten intencionadamente — consulta los docs internos completos para esas superficies.
Bootstrap
EixamConnectSdk.bootstrap(...)
Crea el SDK, resuelve el entorno seleccionado, valida la config y aplica la sesión firmada inicial cuando se proporciona.
Devuelve: Future<EixamConnectSdk>
Entradas clave: appId, environment, initialSession
El backend del partner posee el secreto de la app y firma la sesión. La app móvil recibe appId, externalUserId y userHash. La misma identidad se reutiliza en HTTP y MQTT.
final sdk = await EixamConnectSdk.bootstrap(
const EixamBootstrapConfig(
appId: 'partner-app',
environment: EixamEnvironment.sandbox,
initialSession: EixamSession.signed(
appId: 'partner-app',
externalUserId: 'partner-user-123',
userHash: 'signed-session-hash',
),
),
);
final session = await sdk.getCurrentSession();
debugPrint('session user=${session?.externalUserId}');
Diagnósticos
getOperationalDiagnostics()
Devuelve el último snapshot operacional del runtime para el estado de sesión, transporte, bridge y rehidratación de SOS.
Devuelve: SdkOperationalDiagnostics
final diagnostics = await sdk.getOperationalDiagnostics();
debugPrint('mqtt=${diagnostics.connectionState.name}');
debugPrint('telTopic=${diagnostics.telemetryPublishTopic}');
debugPrint('lastDecision=${diagnostics.bridge.lastDecision}');
debugPrint('pendingSos=${diagnostics.bridge.pendingSos != null}');
watchOperationalDiagnostics()
Emite cambios operacionales tras bootstrap, actualizaciones de sesión, reconexiones y cambios de bridge/runtime.
Devuelve: Stream<SdkOperationalDiagnostics>
final sub = sdk.watchOperationalDiagnostics().listen((diagnostics) {
debugPrint('mqtt=${diagnostics.connectionState.name}');
debugPrint('bridge=${diagnostics.bridge.lastDecision}');
});
Ciclo de vida del dispositivo
connectDevice(...)
Empareja o reconecta el dispositivo seleccionado por el partner y devuelve el estado runtime resultante.
Devuelve: DeviceStatus
final status = await sdk.connectDevice(pairingCode: '123456');
debugPrint('device=${status.deviceId}');
debugPrint('lifecycle=${status.lifecycleState.name}');
debugPrint('ready=${status.isReadyForSafety}');
getDeviceStatus()
Lee el último snapshot runtime del dispositivo en caché sin iniciar un nuevo flujo de emparejamiento.
Devuelve: DeviceStatus
final status = await sdk.getDeviceStatus();
debugPrint('connected=${status.connected}');
debugPrint('lastSeen=${status.lastSeen}');
debugPrint('firmware=${status.firmwareVersion}');
deviceStatusStream
Emite cambios de ciclo de vida mientras el dispositivo se conecta, activa, desconecta o se recupera.
Devuelve: Stream<DeviceStatus>
final sub = sdk.deviceStatusStream.listen((status) {
debugPrint('lifecycle=${status.lifecycleState.name}');
debugPrint('connected=${status.connected}');
debugPrint('battery=${status.approximateBatteryPercentage}');
});
getDeviceSosStatus()
Devuelve el estado SOS actual del dispositivo rastreado por el runtime del SDK.
Devuelve: DeviceSosStatus
final status = await sdk.getDeviceSosStatus();
debugPrint('state=${status.state.name}');
debugPrint('event=${status.lastEvent}');
debugPrint('countdown=${status.countdownRemainingSeconds}');
SOS
triggerSos(...)
Crea un incidente SOS originado en la app usando la sesión firmada actual y el runtime operacional.
Devuelve: SosIncident
final incident = await sdk.triggerSos(
const SosTriggerPayload(
message: 'Need assistance',
triggerSource: 'button_ui',
),
);
debugPrint('incident=${incident.id}');
debugPrint('state=${incident.state.name}');
getCurrentSosIncident()
Devuelve el último incidente SOS activo o recientemente cerrado conocido tras la rehidratación del runtime.
Devuelve: Future<SosIncident?>
final incident = await sdk.getCurrentSosIncident();
if (incident != null) {
debugPrint('incident=${incident.id}');
debugPrint('state=${incident.state.name}');
debugPrint('hasPosition=${incident.positionSnapshot != null}');
}
getSosState()
Devuelve el estado actual del ciclo de vida SOS.
Devuelve: Future<SosState>
Valores: idle, sent, acknowledged, cancelRequested, cancelled
final state = await sdk.getSosState();
debugPrint('sosState=${state.name}');
Contactos
listEmergencyContacts()
Carga los contactos de emergencia sincronizados con el backend para el usuario firmado.
Devuelve: Future<List<EmergencyContact>>
final contacts = await sdk.listEmergencyContacts();
for (final contact in contacts) {
debugPrint('${contact.priority}: ${contact.name} ${contact.phone}');
}
createEmergencyContact(...)
Crea un nuevo contacto de emergencia y devuelve el registro guardado.
Devuelve: EmergencyContact
final contact = await sdk.createEmergencyContact(
name: 'Mountain Rescue Desk',
phone: '+34600000000',
email: 'rescue@example.com',
priority: 1,
);
debugPrint('contact=${contact.id}');
debugPrint('priority=${contact.priority}');
updateEmergencyContact(...)
Actualiza un contacto existente y devuelve el registro guardado.
Devuelve: EmergencyContact
final current = (await sdk.listEmergencyContacts()).first;
final updated = await sdk.updateEmergencyContact(
current.copyWith(name: 'Mountain Rescue 24/7'),
);
debugPrint('contact=${updated.id}');
debugPrint('name=${updated.name}');
debugPrint('updatedAt=${updated.updatedAt}');
Permisos
getPermissionState()
Devuelve un snapshot agregado para ubicación, notificaciones, Bluetooth y disponibilidad del servicio Bluetooth.
Devuelve: PermissionState
final state = await sdk.getPermissionState();
debugPrint('location=${state.location.name}');
debugPrint('notifications=${state.notifications.name}');
debugPrint('bluetoothReady=${state.canUseBluetooth}');
Modo Protección
La continuidad en segundo plano es significativamente mayor en Android cuando el Modo Protección (servicio nativo en primer plano) posee el transporte BLE. El BLE gestionado únicamente por Flutter no garantiza una ejecución completa en segundo plano.
getProtectionStatus()
Devuelve el estado runtime actual para el estado armado/degradado/apagado y la propiedad nativa del BLE.
Devuelve: ProtectionStatus
final status = await sdk.getProtectionStatus();
debugPrint('mode=${status.modeState.name}');
debugPrint('runtime=${status.runtimeState.name}');
debugPrint('owner=${status.bleOwner.name}');
debugPrint('protectedDevice=${status.protectedDeviceId}');
getProtectionDiagnostics()
Devuelve los últimos diagnósticos nativo/runtime para reconexiones, eventos de wake, colas y enrutamiento de comandos.
Devuelve: ProtectionDiagnostics
final diagnostics = await sdk.getProtectionDiagnostics();
debugPrint('wake=${diagnostics.lastWakeReason}');
debugPrint('reconnects=${diagnostics.reconnectAttemptCount}');
debugPrint('lastCommandRoute=${diagnostics.lastCommandRoute}');
Registro de dispositivos en backend
listRegisteredDevices()
Devuelve los registros de dispositivos del backend asociados al usuario firmado.
Devuelve: Future<List<BackendRegisteredDevice>>
final devices = await sdk.listRegisteredDevices();
for (final device in devices) {
debugPrint('${device.hardwareId} ${device.firmwareVersion}');
}
:::note Sincronización del dispositivo emparejado
Tras emparejar/conectar un dispositivo y cuando la identidad de la sesión firmada está lista, el SDK puede intentar una sincronización automática con el backend. La sincronización utiliza hardware_id, firmware_version, hardware_model y paired_at, y solo es segura cuando se puede resolver un hardware ID canónico compatible con el backend.
:::
Omitido del path de partner
La API del partner omite intencionadamente:
- Métodos deprecados de compatibilidad mantenidos solo para migración
- Grupos de capacidades internos de validación como Guided Rescue Phase 1
- Ejemplos de control de dispositivo de bajo nivel fuera del path de onboarding recomendado