

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 教程：使用自定义解码接口配置与网络无关的数据收集
<a name="network-agnostic-data-collection"></a>

**重要**  
目前对某些 AWS 物联网 FleetWise 功能的访问受到限制。有关更多信息，请参阅 [AWS AWS 物联网中的区域和功能可用性 FleetWise](fleetwise-regions.md)。

## 简介
<a name="network-agnostic-data-collection-intro"></a>

本教程概述了如何使用网络不可知的数据收集（使用自定义解码接口）配置 AWS 物联 FleetWise 网以收集数据和运行命令。通过与网络无关的数据收集，您可以使用自己的方法对信号进行解码，然后再将信号发送到指定的数据目的地。这可以节省时间，因为您无需专门为 AWS 物联网 FleetWise创建信号解码器。您可以使用自己的实现对信号子集进行解码，也可以在创建或更新解码器清单`defaultForUnmappedSignals`时使用。这也为收集车辆内各种信号源的信号和触发器提供了灵活性。

 本教程适用于不在标准控制器局域网 (CAN 总线) 接口上的车辆信号。例如，以自定义车载格式或方案编码的数据。

## 环境设置
<a name="network-agnostic-data-collection-setup"></a>

本教程假设您已经完成了设置环境以访问 AWS 物联网 FleetWise 云以及边缘实现 APIs 和代码库的步骤。

## 数据模型
<a name="network-agnostic-data-models"></a>

下一节说明如何使用自定义解码接口对车辆属性进行建模。这适用于数据收集和命令用例。例如，它也适用于车辆中使用的任何基础数据源建模 IDLs。

在示例中，有两个车辆属性：要收集的车辆传感器（当前车辆位置）和用于远程控制的车辆执行器（空调）。这两个都是在这个方案中定义的：

```
// Vehicle WGS84 Coordinates
double Latitude;
double Longitude;

// Vehicle AC 
Boolean ActivateAC;
```

下一步是 FleetWise 使用自定义解码接口 APIs将这些定义导入 AWS 物联网。

### 信号目录更新
<a name="network-agnostic-signal-catalog-updates"></a>

将这些定义导入您的信号目录。如果您在 AWS 物联网中 FleetWise 已经有信号目录，请直接使用更新 API。如果没有，请先创建一个信号目录，然后调用更新 API。

首先，必须创建这些车辆信号的 VSS 表示形式。VSS 用作分类法来表示物联网 AWS 中的车辆数据。 FleetWise创建一个名为 “vehicle-signals.json” 的 json 文件，其中包含以下内容：

```
// vehicle-signals.json
// Verify that branches and nodes are unique in terms of fully qualified name
// in the signal catalog.
[
 {
    "branch": {
      "fullyQualifiedName": "Vehicle",
      "description": "Vehicle Branch"
    }
  },
  {
    "branch": {
      "fullyQualifiedName": "Vehicle.CurrentLocation",
      "description": "CurrentLocation"
    }
  },
  {
    "sensor": {
      "dataType": "DOUBLE",
      "fullyQualifiedName": "Vehicle.CurrentLocation.Latitude",
      "description": "Latitude"
    }
  },
  {
    "sensor": {
      "dataType": "DOUBLE",
      "fullyQualifiedName": "Vehicle.CurrentLocation.Longitude",
      "description": "Longitude"
    }
  },
  {
    "actuator": {
      "fullyQualifiedName": "Vehicle.ActivateAC",
      "description": "AC Controller",
      "dataType": "BOOLEAN"
    }
  }
]
```

如果您没有信号目录，则需要调用`create-signal-catalog`：

```
VEHICLE_NODES=`cat vehicle-signals.json`
aws iotfleetwise create-signal-catalog \ 
        --name my-signal-catalog \
        --nodes "${VEHICLE_NODES}"
```

如果您已经有信号目录，则可以使用 `update-signal-catalog` API 添加这些信号：

```
VEHICLE_NODES=`cat vehicle-signals.json`
aws iotfleetwise update-signal-catalog \
        --name my-signal-catalog \
        --nodes-to-add "${VEHICLE_NODES}"
```

### 车辆模型和解码器
<a name="network-agnostic-vehicle-model-decoder"></a>

在信号目录中插入信号后，下一步是创建车辆模型并实例化这些信号。为此，你可以使用`create-model-manifest`和`create-decoder-manifest` APIs。

首先，格式化要插入车辆模型的信号名称：

```
# Prepare the signals for insertion into the vehicle model.
VEHICLE_NODES=`cat vehicle-signals.json` 
VEHICLE_NODES=`echo ${VEHICLE_NODES} | jq -r ".[] | .actuator,.sensor | .fullyQualifiedName" | grep Vehicle\\.`
VEHICLE_NODES=`echo "${VEHICLE_NODES}" | jq -Rn [inputs]`
# This is how the vehicle model input looks. 
echo $VEHICLE_NODES
# [ "Vehicle.CurrentLocation.Latitude",
#   "Vehicle.CurrentLocation.Longitude",
#   "Vehicle.ActivateAC" ]
# Create the vehicle model with those signals.
aws iotfleetwise create-model-manifest \
    --name my-model-manifest \
    --signal-catalog-arn arn:xxxx:signal-catalog/my-signal-catalog \
    --nodes "${VEHICLE_NODES}"  
 
# Activate the vehicle model. 
 aws iotfleetwise update-model-manifest \
    --name my-model-manifest --status ACTIVE
```

现在，使用自定义解码接口创建解码器清单。

**注意**  
如果要指定自定义，则只需要创建网络接口和信号 IDs，这不是本示例的一部分。  
有关在完全限定名称 (FQN) 与自定义解码信号 ID 不同时映射解码信息的信息，请参阅 [https://github.com/aws/aws-iot-fleetwise-edge/blob/main/docs/dev-guide/network-agnostic-dev-guide.md#aaos-vhal](https://github.com/aws/aws-iot-fleetwise-edge/blob/main/docs/dev-guide/network-agnostic-dev-guide.md#aaos-vhal) 开发者指南。

```
// Create a network interface that is of type : CUSTOM_DECODING_INTERFACE
// custom-interface.json
[
  {
    "interfaceId": "NAMED_SIGNAL",
    "type": "CUSTOM_DECODING_INTERFACE",
    "customDecodingInterface": {
      "name": "NamedSignalInterface"
    }
  },
  {
    "interfaceId": "AC_ACTUATORS",
    "type": "CUSTOM_DECODING_INTERFACE",
    "customDecodingInterface": {
      "name": "NamedSignalInterface"
    }
  }
]
// custom-decoders.json
// Refer to the fully qualified names of the signals, make them of 
// type CUSTOM_DECODING_SIGNAL, and specify them as part of the same interface ID
// that was defined above.
[
    {
      "fullyQualifiedName": "Vehicle.CurrentLocation.Longitude",
      "interfaceId": "NAMED_SIGNAL",
      "type": "CUSTOM_DECODING_SIGNAL",
      "customDecodingSignal": {
        "id": "Vehicle.CurrentLocation.Longitude"
      }
    },
    {
      "fullyQualifiedName": "Vehicle.CurrentLocation.Latitude",
      "interfaceId": "NAMED_SIGNAL",
      "type": "CUSTOM_DECODING_SIGNAL",
      "customDecodingSignal": {
        "id": "Vehicle.CurrentLocation.Latitude"
      }
    },
    {
        "fullyQualifiedName": "Vehicle.ActivateAC",
        "interfaceId": "AC_ACTUATORS",
        "type": "CUSTOM_DECODING_SIGNAL",
        "customDecodingSignal": {
          "id": "Vehicle.ActivateAC"
        }
    }
]
# Create the decoder manifest.
 CUSTOM_INTERFACE=`cat custom-interface.json`
 CUSTOM_DECODERS=`cat custom-decoders.json`

aws iotfleetwise create-decoder-manifest \
   --name my-decoder-manifest \
   --model-manifest-arn arn:xxx:model-manifest/my-model-manifest \
   --network-interfaces "${CUSTOM_INTERFACE}" \
   --signal-decoders "${CUSTOM_DECODERS}"

 # Activate the decoder manifest.
 aws iotfleetwise update-decoder-manifest \
    --name my-decoder-manifest \
    --status ACTIVE
```

此时，您已经在 AWS 物联网中对这些信号进行了全面建模 FleetWise。接下来，创建车辆并将其与您创建的模型相关联。你可以使用 `create-vehicle` API 来做到这一点：

```
aws iotfleetwise create-vehicle \
    --decoder-manifest-arn arn:xxx:decoder-manifest/my-decoder-manifest \
    --association-behavior ValidateIotThingExists \
    --model-manifest-arn arn:xxx:model-manifest/my-model-manifest \
    --vehicle-name "my-vehicle"
```

下一步是重点关注 AWS IoT FleetWise Edge 代码库并编写必要的代码扩展。

**注意**  
有关 Edge 实现的信息，请参阅《[https://github.com/aws/aws-iot-fleetwise-edge/blob/main/docs/dev-guide/network-agnostic-dev-guide.md#implementing-your-own-sensors-and-actuators](https://github.com/aws/aws-iot-fleetwise-edge/blob/main/docs/dev-guide/network-agnostic-dev-guide.md#implementing-your-own-sensors-and-actuators)。

## 发送命令
<a name="test-command"></a>

现在，编译软件（确保将头文件和 C\$1\$1 CMake 文件添加到文件中），然后返回云端 APIs 在此执行器上测试命令：

```
// Create a command targeting your vehicle.
aws iot create-command --command-id activateAC \
    --namespace "AWS-IoT-Fleetwise" \
    --endpoint-url endpoint-url \ 
    --role-arn ${SERVICE_ROLE_ARN} \
    --mandatory-parameters '[ { "name": "$actuatorPath.Vehicle.ActivateAC", "defaultValue": {"B": "false"} } ]' \
// You will receive the command ARN. 

{
    "commandId": "activateAC",
    "commandArn": "arn:aws:iot:xxx:command/activateAC"
}

// You can send the command to activate the AC targeting your vehicle. 

JOBS_ENDPOINT_URL=`aws iot describe-endpoint --endpoint-type iot:Jobs | jq -j .endpointAddress`
aws iot-jobs-data start-command-execution \
    --command-arn arn:aws:iot:xxx:command/activateAC \
    --target-arn arn:xxx:vehicle/my-vehicle \
    --parameters '{ "$actuatorPath.Vehicle.ActivateAC" : {"B": "true"}}' \
    --endpoint-url https://${JOBS_ENDPOINT_URL}
// You will receive the corresponding execution ID.
{
    "executionId": "01HSK4ZH6ME7D43RB2BV8JC51D"
}

// If you have the AWS IoT FleetWise Edge Agent running, you can see the logs.
[AcCommandDispatcher.cpp:26] [setActuatorValue()]:
[Actuator Vehicle.ActivateAC executed successfully for command ID 01HSK4ZH6ME7D43RB2BV8JC51D]
```