

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 開發自訂佈建外掛程式
<a name="develop-custom-provisioning-plugins"></a>

若要開發自訂佈建外掛程式，請建立實作`com.aws.greengrass.provisioning.DeviceIdentityInterface`界面的 Java 類別。您可以在專案中包含 Greengrass 核 JAR 檔案，以存取此界面及其類別。此界面會定義輸入外掛程式組態並輸出佈建組態的方法。佈建組態會定義系統和 [Greengrass 核元件](greengrass-nucleus-component.md)的組態。Core AWS IoT Greengrass 軟體安裝程式使用此佈建組態在裝置上設定 AWS IoT Greengrass Core 軟體。

在您開發自訂佈建外掛程式之後，將其建置為 JAR 檔案，您可以提供給 AWS IoT Greengrass Core 軟體安裝程式，以在安裝期間執行外掛程式。安裝程式會在安裝程式使用的相同 JVM 中執行自訂佈建外掛程式，因此您可以建立僅包含外掛程式程式碼的 JAR。

**注意**  
[AWS IoT 機群佈建外掛程式](fleet-provisioning.md)實作 `DeviceIdentityInterface`，以在安裝期間使用機群佈建。機群佈建外掛程式是開放原始碼，因此您可以探索其原始程式碼，以查看如何使用佈建外掛程式界面的範例。如需詳細資訊，請參閱 GitHub 上的[AWS IoT 機群佈建外掛程式](https://github.com/aws-greengrass/aws-greengrass-fleet-provisioning-by-claim)。

**Topics**
+ [要求](#custom-provisioning-plugin-requirements)
+ [實作 DeviceIdentityInterface 介面](#implement-device-identity-interface)

## 要求
<a name="custom-provisioning-plugin-requirements"></a>

若要開發自訂佈建外掛程式，您必須建立符合下列要求的 Java 類別：
+ 使用`com.aws.greengrass`套件或套件內的`com.aws.greengrass`套件。
+ 具有不含任何引數的建構函數。
+ 實作 `DeviceIdentityInterface` 界面。如需詳細資訊，請參閱[實作 DeviceIdentityInterface 介面](#implement-device-identity-interface)。

## 實作 DeviceIdentityInterface 介面
<a name="implement-device-identity-interface"></a>

若要在自訂外掛程式中使用 `com.aws.greengrass.provisioning.DeviceIdentityInterface` 界面，請將 Greengrass 核新增為專案的相依性。

**在自訂佈建外掛程式專案中使用 DeviceIdentityInterface**
+ 您可以新增 Greengrass 核 JAR 檔案做為程式庫，或新增 Greengrass 核做為 Maven 相依性。執行以下任意一項：
  + 若要將 Greengrass 核 JAR 檔案新增為程式庫，請下載包含 Greengrass 核 JAR AWS IoT Greengrass 的核心軟體。您可以從下列位置下載最新版本的 AWS IoT Greengrass Core 軟體：
    + [https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip](https://d2s8p88vqu9w66.cloudfront.net/releases/greengrass-nucleus-latest.zip)

    您可以在 ZIP 檔案的 `lib` 資料夾中找到 Greengrass 核 JAR 檔案 (`Greengrass.jar`)。將此 JAR 檔案新增至您的專案。
  + 若要在 Maven 專案中使用 Greengrass 核，請在 `com.aws.greengrass`群組中的`nucleus`成品上新增相依性 。您也必須新增`greengrass-common`儲存庫，因為 Maven Central Repository 中無法使用 Greengrass 核。

    ```
    <project ...>
        ...
        <repositories>
            <repository>
                <id>greengrass-common</id>
                <name>greengrass common</name>
                <url>https://d2jrmugq4soldf.cloudfront.net/snapshots</url>
            </repository>
        </repositories>
        ...
        <dependencies>
            <dependency>
                <groupId>com.aws.greengrass</groupId>
                <artifactId>nucleus</artifactId>
                <version>2.5.0-SNAPSHOT</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    </project>
    ```

### DeviceIdentityInterface 介面
<a name="device-identity-interface-shape"></a>

`com.aws.greengrass.provisioning.DeviceIdentityInterface` 界面的形狀如下。

**注意**  
您也可以在 GitHub 上 [Greengrass 核原始碼](https://github.com/aws-greengrass/aws-greengrass-nucleus)的 [com.aws.greengrass.provisioning 套件](https://github.com/aws-greengrass/aws-greengrass-nucleus/tree/main/src/main/java/com/aws/greengrass/provisioning)中探索這些類別。

```
public interface com.aws.greengrass.provisioning.DeviceIdentityInterface {
    ProvisionConfiguration updateIdentityConfiguration(ProvisionContext context)
            throws RetryableProvisioningException, InterruptedException;

    // Return the name of the plugin.
    String name(); 
}

com.aws.greengrass.provisioning.ProvisionConfiguration {
    SystemConfiguration systemConfiguration;
    NucleusConfiguration nucleusConfiguration    
}

com.aws.greengrass.provisioning.ProvisionConfiguration.SystemConfiguration {
    String certificateFilePath;
    String privateKeyPath;
    String rootCAPath;
    String thingName;
}

com.aws.greengrass.provisioning.ProvisionConfiguration.NucleusConfiguration {
    String awsRegion;
    String iotCredentialsEndpoint;
    String iotDataEndpoint;
    String iotRoleAlias;
}

com.aws.greengrass.provisioning.ProvisioningContext {
    Map<String, Object> parameterMap;
    String provisioningPolicy;  // The policy is always "PROVISION_IF_NOT_PROVISIONED".
}
   
com.aws.greengrass.provisioning.exceptions.RetryableProvisioningException {}
```

`SystemConfiguration` 和 中的每個組態值`NucleusConfiguration`都需要安裝 AWS IoT Greengrass Core 軟體，但您可以傳回 `null`。如果您的自訂佈建外掛程式傳回`null`任何組態值，則必須在建立 `config.yaml` 檔案以提供給 AWS IoT Greengrass Core 軟體安裝程式時，在系統或核心組態中提供該值。如果您的自訂佈建外掛程式針對您也在 中定義的選項傳回非空值`config.yaml`，則安裝程式會將 中的值取代`config.yaml`為外掛程式傳回的值。