Flutter车载通信插件telematics_sdk的使用

Flutter车载通信插件telematics_sdk的使用

Telematics SDK 是一个用于跟踪用户的驾驶行为(如超速、转弯、刹车等)的 Flutter 插件,适用于 iOS 和 Android 平台。

免责声明: 本项目使用了属于 DAMOOV PTE. LTD. 的 Telematics SDK。在使用 Telematics SDK 时,请参阅这些使用条款

开始使用

初始应用设置与凭证

对于商业用途,您需要在 DataHub 中创建一个开发者工作区,并获取 InstanceIdInstanceKey 鉴权密钥以与我们的 API 进行交互。

Android 设置

注意事项

Android SDK 只支持 Gradle 8+ 版本。

修改 AndroidManifest.xml

在文件 ./app/src/main/AndroidManifest.xml 中添加以下属性:

<manifest
    xmlns:tools="http://schemas.android.com/tools">
    <application
        tools:replace="android:label,android:name">
        ...
    </application>
    ...
</manifest>

添加网络权限:

<manifest>
...
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
...
</manifest>

修改 build.gradle

在文件 (module)/build.gradle 中添加以下配置:

android {
    ...
    buildTypes {
        release {
            ...
            shrinkResources false
            minifyEnabled false
            ...
        }
    }
    ...
}

ProGuard 配置

在 ProGuard 配置文件中添加以下内容:

-keep public class com.raxeltelematics.** {*;}


### Android 高级设置

#### 设置跟踪设置

1. 覆盖应用程序类并扩展 `TelematicsSDKApp` 类:

```kotlin
import com.telematicssdk.TelematicsSDKApp

class App: TelematicsSDKApp() {

    override fun onCreate() {
        val api = TrackingApi.getInstance()
        api.initialize(this, setTelematicsSettings())
        super.onCreate()
    }

    override fun setTelematicsSettings(): Settings {
        val settings = Settings(
            stopTrackingTimeout = Settings.stopTrackingTimeHigh, 
            accuracy = Settings.accuracyHigh,
            autoStartOn = true,
            elmOn = false,
            hfOn = true
        )
        return settings
    }
}
  1. 在文件 ./app/src/main/AndroidManifest.xml<application> 标签中添加以下内容:
<application
    android:name=".App">
    ...
</application>
  1. 在文件 (module)/build.gradle 中添加 Telematics SDK 依赖项:
dependencies {
    //...
    implementation "com.telematicssdk:tracking:2.2.263"
}

iOS 设置

在项目的 ios/Runner/Info.plist 文件中添加以下权限:

    <key>UIBackgroundModes</key>
    <array>
        <string>fetch</string>
        <string>location</string>
        <string>remote-notification</string>
    </array>
    <key>NSMotionUsageDescription</key>
    <string>请提供此 Demo 的权限</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>请提供此 Demo 的权限</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>请提供此 Demo 的权限</string>
    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>请提供此 Demo 的权限</string>
    <key>BGTaskSchedulerPermittedIdentifiers</key>
    <array>
        <string>sdk.damoov.apprefreshtaskid</string>
        <string>sdk.damoov.appprocessingtaskid</string>
    </array>

从 iOS 15 版本及更高版本以及 Flutter 2.0.6 开始,需要修改 ios/Runner/AppDelegate.swift 文件。必须在 GeneratedPluginRegistrant 之前请求权限。

启用和禁用 SDK

首先,创建一个 TrackingApi 对象以与 SDK 交互:

import 'package:telematics_sdk/telematics_sdk.dart';

final _trackingApi = TrackingApi();

登录

await _trackingApi.setDeviceID(deviceId: "DEVICE_TOKEN");

注销

await _trackingApi.clearDeviceID();

启用 SDK

await _trackingApi.setEnableSdk(enable: true);

禁用 SDK

await _trackingApi.setEnableSdk(enable: false);

强制上传数据后禁用 SDK

await _trackingApi.setDisableWithUpload();

可用方法

手动启动跟踪

await _trackingApi.startManualTracking();

手动启动持续跟踪

await _trackingApi.startManualPersistentTracking();

注意:持续跟踪会忽略所有停止跟踪的原因,并在调用 stopTracking 方法之前一直进行。最大持续跟踪时长为 10 小时。

手动停止跟踪

await _trackingApi.stopManualTracking();

上传未发送的行程

await _trackingApi.uploadUnsentTrips();

获取未发送的行程数量

final unsentTripsCount = await _trackingApi.getUnsentTripCount();

发送自定义心跳

String reason = 'CustomHeartbeat';
await _trackingApi.sendCustomHeartbeats(reason: reason);

检查是否正在跟踪

final isTracking = await _trackingApi.isTracking();

启用高频率数据收集 (HF)

我们强烈建议默认启用此功能。

await _trackingApi.enableHF(value: true);

添加未来轨迹标签

String tag = 'TAG';
String source = 'App';
await _trackingApi.addFutureTrackTag(tag: tag, source: source);

删除一个标签

String tag = 'TAG';
await _trackingApi.removeFutureTrackTag(tag: tag);

删除所有标签

await _trackingApi.removeAllFutureTrackTags();

设置权限向导

如果没有这些权限,SDK 将无法启用。如果您希望用自己的方式请求权限,可以跳过此部分。

要显示权限向导,请执行以下步骤:

  1. 在您的小部件中创建并初始化 StreamSubscription
late StreamSubscription&lt;PermissionWizardResult?&gt; _onPermissionWizardStateChanged;

[@override](/user/override)
void initState() {
    _onPermissionWizardStateChanged = _trackingApi
        .onPermissionWizardClose
        .listen(_onPermissionWizardResult);
        
void _onPermissionWizardResult(PermissionWizardResult result) {
    if (result == PermissionWizardResult.allGranted) {
        //所有权限已授予。在此处执行操作。
    } else {
        //权限未授予。在此处执行操作。
    }
}
  1. 请求显示权限向导:
await _trackingApi.showPermissionWizard(
    enableAggressivePermissionsWizard: false, 
    enableAggressivePermissionsWizardPage: true
);

如果 [enableAggressivePermissionsWizard] 设置为 true,则向导将在所有所需权限授予后完成(用户不能通过返回按钮取消),否则如果设置为 false,则向导可以在未授予所有权限或通过返回按钮取消的情况下完成。

如果 [enableAggressivePermissionsWizardPage] 设置为 true,则向导将在当前页面上的请求权限授予后滑到下一页,否则如果设置为 false,则向导可以在未授予权限的情况下滑动。

iOS 仅限方法

启用/禁用自动跟踪

bool disableTracking = false;
//true 以禁用自动跟踪(跟踪默认启用)
await _trackingApi.setDisableTracking(value: disableTracking);

检查自动跟踪状态

final isTrackingDisabled = await _trackingApi.isDisableTracking();

启用/禁用激进心跳

Telematics SDK (仅限 iOS) 支持两种心跳模式:

  • 激进心跳 - 心跳每 20 分钟发送一次。SDK 始终处于活动状态。
  • 普通心跳 - 心跳每 20 分钟发送一次,但在 SDK 进入待机模式时,只有新行程触发时才会激活,相应的心跳会被发送。

模式切换器

bool enable = true; //false 以禁用激进心跳
await _trackingApi.setAggressiveHeartbeats(value: enable)

检查状态

final isAggressiveHeartbeats = await _trackingApi.isAggressiveHeartbeat()

启用事故检测

事故检测默认禁用。您可以启用检测。为了使事故检测正常工作,您需要启用高频率数据收集

await _trackingApi.enableAccidents(value: true);
    
//检查当前事故状态
final isEnabledAccidents = await _trackingApi.isEnabledAccidents();

示例代码

以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:telematics_sdk/telematics_sdk.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'TelematicsSDK Example',
      home: TitleScreen(),
    );
  }
}

更多关于Flutter车载通信插件telematics_sdk的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter车载通信插件telematics_sdk的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中集成并使用telematics_sdk插件进行车载通信的示例代码。请注意,这只是一个基本示例,实际项目中可能需要根据具体需求进行调整和扩展。

首先,确保你已经在pubspec.yaml文件中添加了telematics_sdk依赖:

dependencies:
  flutter:
    sdk: flutter
  telematics_sdk: ^最新版本号  # 请替换为实际的最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们编写一个简单的Flutter应用来演示如何使用telematics_sdk插件。

main.dart

import 'package:flutter/material.dart';
import 'package:telematics_sdk/telematics_sdk.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Telematics SDK Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: TelematicsScreen(),
    );
  }
}

class TelematicsScreen extends StatefulWidget {
  @override
  _TelematicsScreenState createState() => _TelematicsScreenState();
}

class _TelematicsScreenState extends State<TelematicsScreen> {
  late TelematicsSdk _telematicsSdk;
  String _status = 'Not Initialized';

  @override
  void initState() {
    super.initState();
    _initializeTelematicsSdk();
  }

  Future<void> _initializeTelematicsSdk() async {
    try {
      // 初始化Telematics SDK,这里假设需要一些初始化参数
      // 具体的初始化参数和方法请参照telematics_sdk的文档
      _telematicsSdk = TelematicsSdk();
      await _telematicsSdk.initialize(
        apiKey: 'your_api_key', // 替换为你的API密钥
        userId: 'user_12345',   // 替换为用户ID
      );
      
      setState(() {
        _status = 'Initialized';
      });
      
      // 开始监听车辆状态变化
      _telematicsSdk.onVehicleStatusChanged.listen((VehicleStatus status) {
        print('Vehicle Status Changed: $status');
        // 更新UI或执行其他操作
      });
      
      // 开始监听位置更新
      _telematicsSdk.onLocationUpdated.listen((Location location) {
        print('Location Updated: $location');
        // 更新UI或执行其他操作
      });
      
    } catch (e) {
      print('Failed to initialize Telematics SDK: $e');
      setState(() {
        _status = 'Initialization Failed';
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Telematics SDK Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'Telematics SDK Status: $_status',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () async {
                try {
                  // 示例:发送车辆控制命令
                  // 具体的命令和参数请参照telematics_sdk的文档
                  await _telematicsSdk.sendVehicleCommand(
                    command: 'START_ENGINE', // 示例命令
                    params: {'key': 'value'}, // 示例参数
                  );
                  print('Command sent successfully');
                } catch (e) {
                  print('Failed to send command: $e');
                }
              },
              child: Text('Send Vehicle Command'),
            ),
          ],
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 释放资源
    _telematicsSdk.dispose();
    super.dispose();
  }
}

// 示例数据结构,具体结构请参照telematics_sdk的文档
class VehicleStatus {
  String status;
  // 其他属性...

  @override
  String toString() {
    return 'VehicleStatus{status: $status}';
  }
}

class Location {
  double latitude;
  double longitude;
  // 其他属性...

  @override
  String toString() {
    return 'Location{latitude: $latitude, longitude: $longitude}';
  }
}

注意事项:

  1. 依赖版本:确保你使用的是telematics_sdk的最新版本,并查阅其官方文档以获取最新的API和初始化方法。
  2. 初始化参数:上述代码中的apiKeyuserId是示例参数,你需要根据实际情况替换为有效的值。
  3. 命令和参数sendVehicleCommand方法中的命令和参数是示例,你需要根据telematics_sdk的文档发送正确的命令和参数。
  4. 错误处理:在实际项目中,你需要添加更多的错误处理逻辑以确保应用的稳定性。
  5. UI更新:上述代码在接收到车辆状态变化或位置更新时只是简单地打印了日志,你可以根据需要更新UI或执行其他操作。

希望这个示例能帮助你快速上手telematics_sdk的使用。如果你有任何其他问题或需要进一步的帮助,请随时提问。

回到顶部