

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

# 集线器控制
<a name="hub-control"></a>

集线器控件是托管集成终端设备 SDK 的扩展，允许它与 Hub SDK 中的`MQTTProxy`组件交互。借助集线器控制，您可以使用终端设备 SDK 实现代码，并通过托管集成云作为单独的设备控制您的集线器。集线器控制 SDK 将作为单独的软件包在 Hub SDK 中提供，标记为`iot-managed-integrations-hub-control-x.x.x`。

**Topics**
+ [先决条件](#getting-started-tutorial-prequisites)
+ [终端设备 SDK 组件](#device-sdk-components)
+ [与终端设备 SDK 集成](#device-sdk-integration)
+ [示例：构建集线器控件](#build-hub-control)
+ [支持的示例](#hub-control-examples)
+ [支持的平台](#hub-control-platforms)

## 先决条件
<a name="getting-started-tutorial-prequisites"></a>

要设置集线器控制，您需要满足以下条件：
+ 已载入 Hub [SDK 的集线器](managedintegrations-sdk-v2.md)，版本 0.4.0 或更高版本。
+  从下载最新版本的[终端设备 SDK](managedintegrations-sdk-devices.md) AWS 管理控制台。
+ 在集线器上运行的 [MQTT 代理](managedintegrations-sdk-v2.md)组件，版本 0.5.0 或更高版本。

## 终端设备 SDK 组件
<a name="device-sdk-components"></a>

使用终[端设备 SDK](managedintegrations-sdk-devices.md) 中的以下组件：
+ 数据模型的代码生成器
+ 数据模型处理器

由于 Hub SDK 已经具有入门流程和云端连接，因此您不需要以下组件：
+ 预备人
+ PKCS 接口
+ 作业处理者
+ MQTT 代理

## 与终端设备 SDK 集成
<a name="device-sdk-integration"></a>

1. 按照[数据模型代码生成器](managedintegrations-sdk-device-codegen.md)中的说明生成低级 C 代码。

1. 按照[集成终端设备 SDK](managedintegrations-sdk-device-onboarding.md) 中的说明执行以下操作：

   1. <a name="managedintegrations-sdk-device-onboarding-buildenv"></a>

**设置构建环境**

      在 2023/x86\_64 作为开发主机的 Amazon Linux 上构建代码。安装必要的编译依赖项：

      ```
      dnf install make gcc gcc-c++ cmake
      ```

   1. <a name="managedintegrations-sdk-device-onboarding-hardwarecallback"></a>

**开发硬件回调函数**

      在实现硬件回调函数之前，请先了解 API 的工作原理。此示例使用 On/Off 群集和 OnOff 属性来控制设备功能。有关 API 的详细信息，请参阅[低级 C-Function API](managedintegrations-sdk-device-api.md)。

      ```
      struct DeviceState
      {
        struct iotmiDev_Agent *agent;
        struct iotmiDev_Endpoint *endpointLight;
        /* This simulates the HW state of OnOff */
        bool hwState;   
      };
      
      /* This implementation for OnOff getter just reads
         the state from the DeviceState */
      iotmiDev_DMStatus exampleGetOnOff(bool *value, void *user)
      {
         struct DeviceState *state = (struct DeviceState *)(user);
        *value = state->hwState;
        return iotmiDev_DMStatusOk;
      }
      ```

   1. <a name="managedintegrations-sdk-device-onboarding-endpoints"></a>

**设置端点并挂接硬件回调函数**

      实现函数后，创建端点并注册您的回调。完成以下任务：

      1. 创建设备代理

      1. 为要支持的每个集群结构填充回调函数点

      1. 设置终端节点并注册支持的集群

      ```
      struct DeviceState
      {
          struct iotmiDev_Agent * agent;
          struct iotmiDev_Endpoint *endpoint1;
      
          /* OnOff cluster states*/
          bool hwState;
      };
      
      
      /* This implementation for OnOff getter just reads
         the state from the DeviceState */
      iotmiDev_DMStatus exampleGetOnOff( bool * value, void * user )
      {
          struct DeviceState * state = ( struct DeviceState * ) ( user );
          *value = state->hwState;
          printf( "%s(): state->hwState: %d\n", __func__, state->hwState );
          return iotmiDev_DMStatusOk;
      }
      
      iotmiDev_DMStatus exampleGetOnTime( uint16_t * value, void * user )
      {
          *value = 0;
          printf( "%s(): OnTime is %u\n", __func__, *value );
          return iotmiDev_DMStatusOk;
      }
      
      iotmiDev_DMStatus exampleGetStartUpOnOff( iotmiDev_OnOff_StartUpOnOffEnum * value, void * user )
      {
          *value = iotmiDev_OnOff_StartUpOnOffEnum_Off;
          printf( "%s(): StartUpOnOff is %d\n", __func__, *value );
          return iotmiDev_DMStatusOk;
      }
      
      void setupOnOff( struct DeviceState *state )
      {
          struct iotmiDev_clusterOnOff clusterOnOff = {
              .getOnOff = exampleGetOnOff,
              .getOnTime = exampleGetOnTime,
              .getStartUpOnOff = exampleGetStartUpOnOff,
          };
          iotmiDev_OnOffRegisterCluster( state->endpoint1,
                                          &clusterOnOff,
                                          ( void * ) state);
      }
      
      
      /* Here is the sample setting up an endpoint 1 with OnOff
         cluster. Note all error handling code is omitted. */
      void setupAgent(struct DeviceState *state)
      {
          struct iotmiDev_Agent_Config config = {
              .thingId = IOTMI_DEVICE_MANAGED_THING_ID,
              .clientId = IOTMI_DEVICE_CLIENT_ID,
          };
          iotmiDev_Agent_InitDefaultConfig(&config);
      
          /* Create a device agent before calling other SDK APIs */
          state->agent = iotmiDev_Agent_new(&config);
          
          /* Create endpoint#1 */
          state->endpoint1 = iotmiDev_Agent_addEndpoint( state->agent,
                                                          1,
                                                          "Data Model Handler Test Device",
                                                          (const char*[]){ "Camera" },
                                                          1 );
          setupOnOff(state);
      }
      ```

## 示例：构建集线器控件
<a name="build-hub-control"></a>

集线器控制作为 Hub SDK 包的一部分提供。集线器控制子包标有与未经修改的设备 SDK 不同的库，`iot-managed-integrations-hub-control-x.x.x`并且包含不同的库。

1. 将代码生成的文件移到文件`example`夹：

   ```
   cp codegen/out/* example/dm
   ```

1. 要构建集线器控件，请运行以下命令：

   ```
   cd <hub-control-root-folder>
   ```

   ```
   mkdir build
   ```

   ```
   cd build
   ```

   ```
   cmake -DBUILD_EXAMPLE_WITH_MQTT_PROXY=ON -DIOTMI_USE_MANAGED_INTEGRATIONS_DEVICE_LOG=ON ..
   ```

   ```
   cmake -build .
   ```

1. 使用集线器上的`MQTTProxy`组件运行示例，并运行`HubOnboarding`和`MQTTProxy`组件。

   ```
   ./examples/iotmi_device_sample_camera/iotmi_device_sample_camera
   ```

 [托管集成数据模型](managedintegrations-data-model.md)有关数据模型，请参阅。按照中的[开始使用终端设备 SDK](managedintegrations-sdk-device-onboarding.md)步骤 5 设置终端并管理最终用户与物联网管理的集成之间的通信。

## 支持的示例
<a name="hub-control-examples"></a>

已构建并测试了以下示例：
+ iotmi\_device\_dm\_air\_purifier\_demo
+ iotmi 设备基本诊断
+ iotmi\_device\_dm\_camera\_demo

## 支持的平台
<a name="hub-control-platforms"></a>

下表显示了支持的集线器控制平台。


| 架构 | 操作系统 | 海湾合作委员会版本 | Binutils 版本 | 
| --- | --- | --- | --- | 
| X86\_64 | Linux | 10.5.0 | 2.37 | 
| aarch64 | Linux | 10.5.0 | 2.37 | 