

# 작업 정의를 사용하여 펌웨어 업데이트 예약 및 실행
<a name="lorawan-schedule-firmware-update"></a>

작업 정의를 사용하여 펌웨어 업데이트에 대한 세부 정보를 포함하고 업데이트를 정의할 수 있습니다. AWS IoT Core for LoRaWAN은 게이트웨이와 관련된 다음 세 필드의 정보를 기반으로 펌웨어 업데이트를 제공합니다.
+ 

**스테이션**  
Basic Station 소프트웨어의 버전 및 빌드 시간입니다. 이 정보를 식별하기 위해, 게이트웨이에 의해 실행되는 Basic Station 소프트웨어를 사용하여 이 정보를 생성할 수도 있습니다(예: `2.0.5(rpi/std) 2021-03-09 03:45:09`).
+ 

**PackageVersion**  
게이트웨이에서 `version.txt` 파일에 의해 지정된 펌웨어 버전입니다. 이 정보는 게이트웨이에 없을 수도 있지만 펌웨어 버전을 정의하는 방법으로 사용하는 것이 좋습니다(예: `1.0.0`).
+ 

**모델**  
게이트웨이에서 사용 중인 플랫폼 또는 모델(예: Linux)입니다.

이 절차를 완료하는 데 20분이 소요됩니다.

**Topics**
+ [게이트웨이에서 실행 중인 현재 버전 가져오기](#lorawan-gateway-current-version)
+ [무선 게이트웨이 작업 정의 생성](#lorawan-create-task-definition)
+ [펌웨어 업데이트 작업 실행 및 진행률 추적](#lorawan-run-fwupdate-task)

## 게이트웨이에서 실행 중인 현재 버전 가져오기
<a name="lorawan-gateway-current-version"></a>

펌웨어 업데이트에 대한 게이트웨이의 적격성을 확인하기 위해 CUPS 서버는 게이트웨이가 CUPS 요청 중에 세 개의 필드 `Station`, `PackageVersion`, 및 `Model` 정보를 제시할 때 해당 정보가 일치하는지 확인합니다. 작업 정의를 사용할 때 이러한 필드는 `CurrentVersion` 필드의 일부로 저장됩니다.

AWS IoT Core for LoRaWAN API 또는 AWS CLI를 사용하여 게이트웨이를 위한 `CurrentVersion`을 얻습니다. 다음 명령은 CLI를 사용하여 이 정보를 가져오는 방법을 보여줍니다.

1. 게이트웨이를 이미 프로비저닝한 경우 [get-wireless-gateway](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway.html) 명령을 사용하여 게이트웨이에 대한 정보를 가져올 수 있습니다.

   ```
   aws iotwireless get-wireless-gateway \ 
       --identifier 5a11b0a85a11b0a8 \ 
           --identifier-type GatewayEui
   ```

   다음은 이 명령에 대한 샘플 출력의 일부입니다.

   ```
   {
       "Name": "Raspberry pi",
       "Id": "1352172b-0602-4b40-896f-54da9ed16b57",
       "Description": "Raspberry pi",
       "LoRaWAN": {
           "GatewayEui": "5a11b0a85a11b0a8",
           "RfRegion": "US915"
       },
       "Arn": "arn:aws:iotwireless:us-east-1:231894231068:WirelessGateway/1352172b-0602-4b40-896f-54da9ed16b57"
   }
   ```

1. `get-wireless-gateway` 명령에 의해 보고된 무선 게이트웨이 ID를 사용하여 [get-wireless-gateway-firmware-information](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-firmware-information.html) 명령을 통해 `CurrentVersion`를 가져올 수 있습니다.

   ```
   aws iotwireless get-wireless-gateway-firmware-information \
       --id "3039b406-5cc9-4307-925b-9948c63da25b"
   ```

   다음은 명령에 대한 샘플 출력이며, `CurrentVersion`에 의해 표시되는 세 필드 정보를 보여줍니다.

   ```
   {
       "LoRaWAN": {
           "CurrentVersion": {
               "PackageVersion": "1.0.0",
               "Model": "rpi",
               "Station": "2.0.5(rpi/std) 2021-03-09 03:45:09"
           }
       }
   }
   ```

## 무선 게이트웨이 작업 정의 생성
<a name="lorawan-create-task-definition"></a>

작업 정의를 만들 때 AutoCreateTasks 파라미터를 사용하여 작업의 자동 생성을 지정하는 것이 좋습니다. `AutoCreateTasks`는 앞에서 언급한 세 파라미터 모두와 일치하는 게이트웨이에 적용됩니다. 이 파라미터를 비활성화하면 파라미터를 게이트웨이에 수동으로 할당해야 합니다.

AWS IoT Core for LoRaWAN API 또는 AWS CLI를 사용하여 무선 게이트웨이 작업 정의를 생성할 수 있습니다. 다음 명령은 CLI를 사용하여 작업 정의를 만드는 방법을 보여줍니다.

1. `CreateWirelessGatewayTaskDefinition` API에 전달할 정보가 포함될 `input.json` 파일을 생성합니다. `input.json` 파일에서, 이전에 얻은 다음 정보를 제공합니다.
   + 

**UpdateDataSource**  
S3 버킷에 업로드한 펌웨어 업데이트 파일이 들어 있는 객체에 대한 링크를 제공합니다(예: `s3://iotwirelessfwupdate/fwstation`).
   + 

**UpdateDataRole**  
S3 버킷을 읽을 수 있는 권한을 제공하는 IAM 역할의 역할 ARN에 대한 링크를 제공합니다(예: `arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole`).
   + 

**SigKeyCRC 및 UpdateSignature**  
이 정보는 게이트웨이 제조업체에서 제공할 수 있지만 [펌웨어 업데이트 파일 및 서명 생성](lorawan-script-fwupdate-sigkey.md)에 설명된 절차를 따랐다면 서명을 생성할 때 이 정보를 찾을 수 있습니다.
   + 

**CurrentVersion**  
`get-wireless-gateway-firmware-information ` 명령을 실행하여 이전에 얻은 `CurrentVersion` 출력을 제공하세요.

     ```
     cat input.json
     ```

     다음은 `input.json` 파일의 내용을 보여줍니다.

     ```
     {
         "AutoCreateTasks": true,
         "Name": "FirmwareUpdate",
         "Update":
         {
             "UpdateDataSource" : "s3://iotwirelessfwupdate/fwstation",
             "UpdateDataRole" : "arn:aws:iam::123456789012:role/IoTWirelessFwUpdateRole",
             "LoRaWAN" :
             {
                 "SigKeyCrc": 3434210794,
                 "UpdateSignature": "MEQCIDPY/p2ssgXIPNCOgZr+NzeTLpX+WfBo5tYWbh5pQWN3AiBROen+XlIdMScvAsfVfU/ZScJCalkVNZh4esyS8mNIgA==",
                 "CurrentVersion" :
                 {
                 "PackageVersion": "1.0.0",
                 "Model": "rpi",
                 "Station": "2.0.5(rpi/std) 2021-03-09 03:45:09"
                 }
             }
         }
     }
     ```

1. `input.json` 파일을 [create-wireless-gateway-task-definition](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task-definition.html) 명령에 전달하여 작업 정의를 생성합니다.

   ```
   aws iotwireless create-wireless-gateway-task-definition \ 
       --cli-input-json file://input.json
   ```

   다음은 해당 명령 출력을 보여 줍니다.

   ```
   {
       "Id": "4ac46ff4-efc5-44fd-9def-e8517077bb12",
       "Arn": "arn:aws:iotwireless:us-east-1:231894231068:WirelessGatewayTaskDefinition/4ac46ff4-efc5-44fd-9def-e8517077bb12"
   }
   ```

## 펌웨어 업데이트 작업 실행 및 진행률 추적
<a name="lorawan-run-fwupdate-task"></a>

게이트웨이는 펌웨어 업데이트를 받을 준비가 되어 있으며 전원이 켜지면 CUPS 서버에 연결됩니다. CUPS 서버가 게이트웨이 버전의 일치를 발견하면 펌웨어 업데이트를 예약합니다.

작업은 프로세스의 작업 정의입니다. `AutoCreateTasks`을(를) `True`(으)로 설정하여 자동 작업 생성을 지정했으므로 일치하는 게이트웨이가 발견되는 즉시 펌웨어 업데이트 작업이 시작됩니다.

`GetWirelessGatewayTask` API를 사용하여 작업의 진행을 추적할 수 있습니다. [get-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/get-wireless-gateway-task.html) 명령을 처음 실행하면 작업 상태가 `IN_PROGRESS`로 표시됩니다.

```
aws iotwireless get-wireless-gateway-task \ 
    --id 1352172b-0602-4b40-896f-54da9ed16b57
```

다음은 해당 명령 출력을 보여 줍니다.

```
{
    "WirelessGatewayId": "1352172b-0602-4b40-896f-54da9ed16b57",
    "WirelessGatewayTaskDefinitionId": "ec11f9e7-b037-4fcc-aa60-a43b839f5de3",
    "LastUplinkReceivedAt": "2021-03-12T09:56:12.047Z",
    "TaskCreatedAt": "2021-03-12T09:56:12.047Z",
    "Status": "IN_PROGRESS"
}
```

다음에 명령을 실행할 때 펌웨어 업데이트가 적용되면 업데이트된 필드 `Package`, `Version` 및 `Model`이 표시되고 작업 상태가 `COMPLETED`로 변경됩니다.

```
aws iotwireless get-wireless-gateway-task \ 
    --id 1352172b-0602-4b40-896f-54da9ed16b57
```

다음은 해당 명령 출력을 보여 줍니다.

```
{
    "WirelessGatewayId": "1352172b-0602-4b40-896f-54da9ed16b57",
    "WirelessGatewayTaskDefinitionId": "ec11f9e7-b037-4fcc-aa60-a43b839f5de3",
    "LastUplinkReceivedAt": "2021-03-12T09:56:12.047Z",
    "TaskCreatedAt": "2021-03-12T09:56:12.047Z",
    "Status": "COMPLETED"
}
```

이 예에서는 Raspberry Pi 기반 RAKWireless 게이트웨이를 사용하여 펌웨어 업데이트를 보여 주었습니다. 펌웨어 업데이트 스크립트는 실행 중인 BasicStation을 중지하여 업데이트된 `Package`, `Version` 및 `Model` 필드를 저장하므로 BasicStation을 다시 시작해야 합니다.

```
2021-03-12 09:56:13.108 [CUP:INFO] CUPS provided update.bin
2021-03-12 09:56:13.108 [CUP:INFO] CUPS provided signature len=70 keycrc=37316C36
2021-03-12 09:56:13.148 [CUP:INFO] ECDSA key#0 -> VERIFIED
2021-03-12 09:56:13.148 [CUP:INFO] Running update.bin as background process
2021-03-12 09:56:13.149 [SYS:VERB] /tmp/update.bin: Forked, waiting...
2021-03-12 09:56:13.151 [SYS:INFO] Process /tmp/update.bin (pid=6873) completed
2021-03-12 09:56:13.152 [CUP:INFO] Interaction with CUPS done - next regular check in 10s
```

펌웨어 업데이트가 실패하면 CUPS 서버에서 상태 `FIRST_RETRY`가 표시되고 게이트웨이가 동일한 요청을 보냅니다. CUPS 서버가 `SECOND_RETRY` 이후에 게이트웨이에 연결할 수 없으면 `FAILED` 상태를 표시합니다.

이전 작업이 `COMPLETED` 또는 `FAILED`였으면 새 작업을 시작하기 전에 [delete-wireless-gateway-task](https://docs.aws.amazon.com/cli/latest/reference/iotwireless/delete-wireless-gateway-task.html) 명령을 사용하여 이전 작업을 삭제합니다.

```
aws iotwireless delete-wireless-gateway-task \ 
    --id 1352172b-0602-4b40-896f-54da9ed16b57
```