Skip to Content
КонфигурацияКорпоративные функции

Корпоративные функции

Tracelet оснащен несколькими функциями высокого уровня безопасности, предназначенными для корпоративных случаев, такими как отслеживание в военных целях, мониторинг пациентов в соответствии с требованиями HIPAA и логистика с криптографической проверкой.


1. Шифрование данных (SQLCipher).

Когда Tracelet записывает местоположение в фоновом режиме, он временно сохраняет его во внутренней базе данных SQLite, прежде чем синхронизировать с вашим сервером. Если устройство украдено, физический доступ потенциально может позволить злоумышленнику прочитать эти исторические маршруты.

Tracelet решает эту проблему, предлагая Шифрование базы данных при хранении с использованием SQLCipher.

Как работает шифрование данных

  1. Когда вы включаете флаг encryptDatabase, базовая база данных Rust SQLite мгновенно шифруется с помощью AES-256 через SQLCipher.
  2. По умолчанию Tracelet автоматически генерирует безопасный 256-битный ключ и безопасно сохраняет его в собственном безопасном хранилище платформы (хранилище ключей Android/связка ключей iOS). Вам не придется управлять ключом вручную!
  3. Все данные, записанные на диск, становятся совершенно нечитаемыми без ключа.
  4. Существующие незашифрованные базы данных автоматически переводятся в зашифрованные при включении флага.

Выполнение

Чтобы включить шифрование с помощью безопасного ключа, управляемого платформой (рекомендуется):

final config = Config.balanced( security: tl.SecurityConfig( encryptDatabase: true, // This MUST be true to enable encryption ), );

Пользовательское управление ключами (расширенное)

Если ваше приложение предпочитает управлять собственным материалом ключа (например, используя flutter_secure_storage), вы можете предоставить собственный encryptionKey. Обратите внимание, что encryptDatabase должно быть истинным.

// Generate a secure random key final customKey = await tl.Tracelet.generateEncryptionKey(); await secureStorage.write(key: 'my_db_key', value: customKey); // Pass it to Tracelet final config = Config.balanced( security: tl.SecurityConfig( encryptDatabase: true, encryptionKey: await secureStorage.read(key: 'my_db_key'), ), );

2. Управление аудиторским следом и проверка

В сфере логистики или правоохранительных органов вы должны иметь возможность математически доказать, что запись о местоположении не была подделана, подделана или изменена постфактум. Tracelet предоставляет функцию Audit Trail для создания криптографической цепочки хранения.

Как работает управление аудиторским следом

Если для параметра AuditConfig.enabled установлено значение true, Tracelet не просто сохраняет широту и долготу. Он создает запись, подобную блокчейну, для каждого местоположения. Базовый движок Rust гарантирует, что этот процесс является атомарным и надежным:

  1. Блок Genesis: Когда движок впервые запускается на новом устройстве, он вычисляет хэш Genesis: SHA-256("tracelet:genesis:{device_id}").
  2. Генерация канонической строки. Для каждого местоположения Tracelet генерирует строгий детерминированный формат строки, объединяющий предыдущий хэш и точные данные нового местоположения.
  3. Хеширование. Эта каноническая строка хешируется (по умолчанию с использованием SHA-256), создавая hash для текущего местоположения.
  4. Цепочка: Этот хеш становится previous_hash для следующего местоположения, создавая непрерывную цепочку. Если злоумышленник изменит хотя бы одну координату прошлого местоположения в базе данных, хэш этого местоположения изменится, разрывая всю цепочку последующих хэшей.

Конфигурация

final config = Config.highAccuracy( audit: tl.AuditConfig( enabled: true, hashAlgorithm: tl.HashAlgorithm.sha256, ), );

Полезная нагрузка JSON

Когда Tracelet синхронизирует эти местоположения с вашим сервером, полезные данные JSON для каждого местоположения будут напрямую содержать поля аудита.

{ "device": "tracelet-example", "locationCount": 1, "locations": [ { "uuid": "loc-1234-abcd", "timestamp": "2024-01-01T00:00:00Z", "is_moving": true, "coords": { "latitude": 37.774900, "longitude": -122.419400, "accuracy": 10.0, "speed": 15.5, "heading": 90.0, "altitude": 100.0 }, "audit_hash": "a1b2c3d4e5f6...", "audit_previous_hash": "f6e5d4c3b2a1...", "audit_chain_index": 42 } ] }

Проверка на стороне сервера (как проверить код)

Чтобы проверить целостность данных на вашем сервере, вы должны воссоздать точную каноническую строку, которую использует ядро ​​Tracelet Rust, и сравнить полученный хэш с полем audit_hash в полезных данных.

1. Создайте каноническую строку

Строка ДОЛЖНА быть отформатирована точно так же, разделенная символом вертикальной черты |: НЕ ПЕРЕВОДИТЬ

Важные правила форматирования (на основе ядра ржавчины Tracelet):

  • latitude и longitude: форматируется ровно до 6 десятичных знаков (например, 37.774900).
  • accuracy, speed, heading, altitude: форматируется ровно до 2 десятичных знаков (например, 10.00).
  • is_moving: в формате 1 (истина) или 0 (ложь).

Пример канонической строки:

f6e5d4c3b2a1...|TRACELET_AUDIT|42|loc-1234-abcd|37.774900|-122.419400|2024-01-01T00:00:00Z|10.00|15.50|90.00|100.00|1

2. Хэш и сравнение

Передайте построенную каноническую строку через стандартную функцию хеширования SHA-256 и преобразуйте ее в шестнадцатеричную строку нижнего регистра.

  • Если вычисленный хэш совпадает с полем audit_hash: математически доказано, что местоположение не изменено.
  • Если они не совпадают: данные о местоположении были изменены. Вам следует немедленно пометить эту запись и исследовать устройство.

3. Профили точности определения местоположения (HF/LF)

При просмотре примера приложения Tracelet вы заметите кнопки Точность НЧ и Точность ВЧ. Они напрямую соответствуют предварительно созданным профилям конфигурации Tracelet.

  • LF (низкая частота/низкая точность): соответствует профилю Config.lowPower(). Он ограничивает движок использованием только триангуляции Cell-Tower и Wi-Fi (без GPS). Он очень экономичен, но обеспечивает более широкий радиус точности.
  • HF (высокая частота/высокая точность): соответствует профилю Config.highAccuracy(). Он принудительно включает физический чип GPS, обеспечивая точность 1–5 метров за счет более высокого расхода заряда батареи.

4. Оценка углеродного следа и отчеты о поездках

Tracelet включает встроенную утилиту CarbonEstimator. Он объединяет распознавание активности (определяет, едет ли пользователь за рулем, ходит пешком или ездит на велосипеде) с точным географическим расстоянием для расчета предполагаемых выбросов CO₂ за поездку. Это имеет решающее значение для отчетности об устойчивом развитии, программ компенсации выбросов углерода или соблюдения ESG (экологических, социальных и управленческих норм).

Как это работает

  1. Вы создаете экземпляр CarbonEstimator.
  2. Когда пользователь начинает двигаться (isMoving == true), вы вызываете startTrip().
  3. Вы в реальном времени передаете изменения активности (например, переход от ходьбы к вождению) и местоположения в оценщик.
  4. Когда пользователь перестает двигаться (isMoving == false), вы вызываете endTrip() для генерации TripCarbonSummary.

Пример реализации

final carbonEstimator = tl.CarbonEstimator(); // 1. Listen for motion changes to start and end trips Tracelet.onMotionChange((loc) { if (loc.isMoving) { carbonEstimator.startTrip(); } else { final summary = carbonEstimator.endTrip(); if (summary != null) { print('Trip ended: \${summary.totalCarbonGrams}g CO2'); print('Total Distance: \${summary.totalDistanceMeters}m'); print('Dominant Mode: \${summary.dominantMode}'); // e.g. "driving" } } }); // 2. Feed Activity Recognition data to detect the transport mode Tracelet.onActivityChange((evt) { // Activity names map to emissions factors internally (e.g., driving vs walking) carbonEstimator.setActivity(evt.activity.name); }); // 3. Feed location coordinates to accumulate distance accurately Tracelet.onLocation((loc) { carbonEstimator.onLocationReceived( loc.coords.latitude, loc.coords.longitude, ); });

Полученный результат TripCarbonSummary можно затем синхронизировать с вашим сервером или отобразить непосредственно пользователю, чтобы стимулировать выбор экологически чистого транспорта.


5. Удаленная настройка

Скачивается и применяется как на iOS, так и на Android, начиная с версии 3.6.2. Более ранние версии принимали remoteConfigUrl, но никогда его не получали — нативная сторона молча возвращалась к локальной конфигурации.

Для автопарков и крупных развертываний вам часто необходимо изменить поведение отслеживания — точность, частоту синхронизации, радиус геозоны, расход заряда батареи — без выпуска обновления приложения. Удаленная настройка Tracelet позволяет SDK извлекать документ конфигурации из вашей конечной точки HTTPS и применять его поверх локальной конфигурации во время выполнения.

Как работает удаленная настройка

  1. Вы устанавливаете remoteConfigUrl (и дополнительные заголовки) в свой AppConfig.
  2. В ready() SDK сначала применяет последнюю успешно полученную конфигурацию из кэша на устройстве, поэтому перезапуск возобновляется с последними опубликованными настройками мгновенно и автономно, до любого сетевого вызова и без блокировки ready().
  3. Затем он извлекает новую копию из вашей конечной точки в фоновом режиме и применяет ее по тому же пути выполнения, что и setConfig() — перезапуская активный конвейер отслеживания только тогда, когда ключ, релевантный для отслеживания, действительно изменяется.
  4. Он сохраняет конфигурацию свежей за счет повторной загрузки с частотой remoteConfigRefreshInterval (в минутах).

Учитываются только URL-адреса HTTPS. URL-адрес http:// отклоняется и регистрируется, поскольку конфигурация контролирует поведение отслеживания и не должна быть изменена при передаче.

Контракт конечной точки

Ваша конечная точка отвечает на GET объектом JSON, имеющим форму карты конфигурации Tracelet — либо плоскую, либо вложенную форму { "geo": {…}, "app": {…}, "http": {…} }, которую создает Config.toMap(). Переопределяются только те ключи, которые вы включаете; все остальные настройки сохраняют свое локальное значение.

{ "geo": { "distanceFilter": 25.0, "desiredAccuracy": 0 }, "app": { "heartbeatInterval": 120 }, "http": { "autoSync": true } }

Конфигурация

final config = Config.balanced().copyWith( app: tl.AppConfig( remoteConfigUrl: 'https://config.mycompany.com/tracelet/fleet-a.json', remoteConfigHeaders: {'Authorization': 'Bearer $token'}, remoteConfigTimeout: 15000, // milliseconds remoteConfigRefreshInterval: 60, // minutes ), );
ПолеТипПо умолчаниюОписание
НОТРАНС0ЛАТЕНОТРАНС1ЛАТЕНОТРАНС2ЛАТЕКонечная точка HTTPS, возвращающая карту конфигурации JSON. null отключает удаленную настройку.
НОТРАНС0ЛАТЕНОТРАНС1ЛАТЕНОТРАНС2ЛАТЕЗаголовки, отправляемые при извлечении (например, токен аутентификации).
НОТРАНС0ЛАТЕНОТРАНС1ЛАТЕНОТРАНС2ЛАТЕПолучить тайм-аут в миллисекундах.
НОТРАНС0ЛАТЕНОТРАНС1ЛАТЕНОТРАНС2ЛАТЕМинуты между фоновыми обновлениями (изначально 15 минут). 0 извлекает данные один раз и никогда не повторяется.

Примененные удаленные значения объединяются с постоянной конфигурацией устройства, а удаленные переопределения имеют преимущественную силу над локальными. Публикуйте только те значения, которые вы планируете принять каждым устройством, получающим этот URL-адрес, — ограничьте масштаб для каждого парка или когорты, указывая для каждой сборки отдельный URL-адрес.

Наблюдение за примененной удаленной конфигурацией из Dart

Удаленная конфигурация извлекается и применяется на собственной стороне. Начиная с версии 3.6.10, каждый раз, когда применяется удаленное переопределение (как кэшированная копия, восстановленная в ready() , так и каждое фоновое обновление), SDK возвращает ее обратно в Dart:

  • Tracelet.activeConfig (и, следовательно, tracelet_doctor и механизм управления бюджетом батареи на стороне Dart) теперь отражают полученные значения, а не только последнюю конфигурацию, которую вы установили локально.
  • Подпишитесь, чтобы реагировать на изменения, вносимые сервером:
// Callback — fires after a remote override is applied. // Tracelet.activeConfig already reflects the new values when this fires. Tracelet.onRemoteConfig((Config config) { print('Remote battery budget: ${config.geo.batteryBudgetPerHour}%/hr'); }); // …or listen to the broadcast stream directly. final sub = Tracelet.remoteConfigStream.listen((config) { // react to the merged, now-active config });

До версии 3.6.10 удаленные значения применялись к собственному отслеживанию, но не зеркально отображались в Tracelet.activeConfig, поэтому диагностика все равно могла отображать последнее локально установленное значение, даже если отслеживание уже использовало удаленное значение.