

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# Wi-Fi 라이브러리
<a name="freertos-wifi"></a>

**중요**  <a name="deprecation-message-library"></a>
이 라이브러리는 더 이상 사용되지 않는 Amazon-FreeRTOS 리포지토리에서 호스팅됩니다. 새 프로젝트를 생성할 때는 [여기서 시작](freertos-getting-started-modular.md)하는 것이 좋습니다. 현재 사용되지 않는 Amazon-FreeRTOS 리포지토리를 기반으로 하는 기존 FreeRTOS 프로젝트가 이미 있는 경우에는 [Amazon-FreeRTOS Github 리포지토리 마이그레이션 가이드](github-repo-migration.md) 섹션을 참조하세요.

## 개요
<a name="freertos-wifi-overview"></a>

FreeRTOS [Wi-Fi](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/wifi/index.html) 라이브러리는 포트별 Wi-Fi 구현을 공통 API로 추상화하여 Wi-Fi 기능을 갖춘 모든 FreeRTOS 적격 보드의 애플리케이션 개발 및 이식을 간소화합니다. 애플리케이션은 이 공통 API를 사용하여 공통 인터페이스를 통해 하위 수준의 무선 스택과 통신할 수 있습니다.

## 종속성 및 요구 사항
<a name="freertos-wifi-dependencies"></a>

FreeRTOS Wi-Fi 라이브러리에는 [FreeRTOS\$1TCP](https://freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_TCP/index.html) 코어가 필요합니다.

## 특성
<a name="freertos-wifi-features"></a>

Wi-Fi 라이브러리에는 다음 기능이 있습니다.
+ WEP, WPA, WPA2 및 WPA3 인증 지원
+ 액세스 포인트 검색
+ 전력 관리
+ 네트워크 프로파일링

Wi-Fi 라이브러리의 기능에 대한 자세한 내용은 아래를 참조하십시오.

### Wi-Fi 모드
<a name="freertos-wifi-setup"></a>

Wi-Fi 디바이스는 스테이션, 액세스 포인트 또는 P2P 등의 세 가지 모드 중 하나일 수 있습니다. `WIFI_GetMode`를 호출하여 Wi-Fi 디바이스의 현재 모드를 가져올 수 있습니다. `WIFI_SetMode`를 호출하여 디바이스의 Wi-Fi 모드를 설정할 수 있습니다. `WIFI_SetMode`를 호출하여 모드를 전환하면 네트워크에 이미 연결된 디바이스의 연결이 해제됩니다.

**스테이션 모드**  
보드를 기존 액세스 포인트에 연결하려면 디바이스를 스테이션 모드로 설정합니다.

**액세스 포인트(AP) 모드**  
디바이스를 다른 디바이스를 연결하기 위한 액세스 포인트로 만들려면 디바이스를 AP 모드로 설정합니다. 디바이스가 AP 모드에 있는 경우, 다른 디바이스를 FreeRTOS 디바이스에 연결하고 새 Wi-Fi 자격 증명을 구성할 수 있습니다. AP 모드를 구성하려면 `WIFI_ConfigureAP`를 호출합니다. 디바이스를 AP 모드로 전환하려면 `WIFI_StartAP`를 호출합니다. AP 모드를 끄려면 `WIFI_StopAP`를 호출합니다.  
FreeRTOS 라이브러리는 AP 모드에서 Wi-Fi 프로비저닝을 제공하지 않습니다. AP 모드를 완벽하게 지원하려면 DHCP 및 HTTP 서버 기능을 비롯한 추가 기능을 제공해야 합니다.

**P2P 모드**  
액세스 포인트 없이 여러 디바이스가 서로 직접 연결할 수 있게 하려면 디바이스를 P2P 모드로 설정합니다.

### 보안
<a name="freertos-wifi-security"></a>

Wi-Fi API는 WEP, WPA, WPA2 및 WPA3 보안 유형을 지원합니다. 디바이스가 스테이션 모드에 있는 경우, `WIFI_ConnectAP` 함수를 호출할 때 네트워크 보안 유형을 지정해야 합니다. 디바이스가 AP 모드에 있는 경우 지원되는 보안 유형을 사용하도록 디바이스를 구성할 수 있습니다.
+ `eWiFiSecurityOpen`
+ `eWiFiSecurityWEP`
+ `eWiFiSecurityWPA`
+ `eWiFiSecurityWPA2`
+ `eWiFiSecurityWPA3`

### 검색 및 연결
<a name="freertos-wifi-connection"></a>

인근의 액세스 포인트를 검색하려면 디바이스를 스테이션 모드로 설정하고 `WIFI_Scan` 함수를 호출합니다. 스캔에서 원하는 네트워크를 찾은 경우 `WIFI_ConnectAP`를 호출하고 네트워크 자격 증명을 제공하여 네트워크에 연결할 수 있습니다. `WIFI_Disconnect`를 호출하여 네트워크에서 Wi-Fi 디바이스를 연결 해제할 수 있습니다. 검색 및 연결에 대한 자세한 내용은 [사용 예시](#freertos-wifi-example) 및 [API 참조](#freertos-wifi-api)를 참조하십시오.

### 전력 관리
<a name="freertos-wifi-power-management"></a>

애플리케이션과 사용 가능한 전원에 따라 Wi-Fi 디바이스마다 전력 요구 사항이 다릅니다. 디바이스를 항상 켜서 지연 시간을 줄이거나, 디바이스를 간헐적으로 연결한 후 Wi-Fi가 필요하지 않을 때 저전력 모드로 전환할 수 있습니다. 인터페이스 API는 항상 연결, 저전력, 일반 모드 등 다양한 전력 관리 모드를 지원합니다. `WIFI_SetPMMode` 함수를 사용하여 디바이스에 대한 전력 모드를 설정합니다. `WIFI_GetPMMode` 함수를 호출하여 디바이스의 현재 전력 모드를 가져올 수 있습니다.

### 네트워크 프로필
<a name="freertos-wifi-profiles"></a>

Wi-Fi 라이브러리를 사용하여 네트워크 프로필을 디바이스의 비휘발성 메모리에 저장할 수 있습니다. 따라서 디바이스가 Wi-Fi 네트워크에 다시 연결될 때 검색할 수 있도록 네트워크 설정을 저장할 수 있습니다. 그러면 네트워크에 연결된 이후에 디바이스를 다시 프로비저닝할 필요가 없습니다. `WIFI_NetworkAdd`는 네트워크 프로필을 추가하고, `WIFI_NetworkGet`은 네트워크 프로필을 검색하고, `WIFI_NetworkDel`은 네트워크 프로필을 삭제합니다. 저장할 수 있는 프로필 수는 플랫폼에 따라 다릅니다.

## 구성
<a name="freertos-wifi-config"></a>

Wi-Fi 라이브러리를 사용하려면 구성 파일에서 여러 식별자를 정의해야 합니다. 이러한 식별자에 대한 자세한 내용은 [API 참조](#freertos-wifi-api)를 참조하십시오.

**참고**  
이 라이브러리에는 필요한 구성 파일이 포함되어 있지 않으므로 하나를 생성해야 합니다. 구성 파일을 생성할 때 보드에 필요한 보드 관련 구성 식별자를 포함시켜야 합니다.

## Initialization(초기화)
<a name="freertos-wifi-init"></a>

Wi-Fi 라이브러리를 사용하기 전에 FreeRTOS 구성 요소 외에도 일부 보드 관련 구성 요소를 초기화해야 합니다. `vendors/vendor/boards/board/aws_demos/application_code/main.c` 파일을 초기화를 위한 템플릿으로 사용하여 다음을 수행합니다.

1. 애플리케이션이 Wi-Fi 연결을 처리하는 경우 `main.c`에서 샘플 Wi-Fi 연결 로직을 제거합니다. 다음 `DEMO_RUNNER_RunDemos()` 함수 호출을

   ```
   if( SYSTEM_Init() == pdPASS )
       {
       ...
           DEMO_RUNNER_RunDemos();
       ...
           }
   ```

   자체 애플리케이션 호출로 바꿉니다.

   ```
   if( SYSTEM_Init() == pdPASS )
       {
       ...
           // This function should create any tasks
           // that your application requires to run.
           YOUR_APP_FUNCTION();
       ...
           }
   ```

1. `WIFI_On()`을 호출하여 Wi-Fi 칩을 초기화하고 전원을 켭니다.
**참고**  
일부 보드에는 추가 하드웨어 초기화가 필요할 수 있습니다.

1. 구성된 `WIFINetworkParams_t` 구조를 `WIFI_ConnectAP()`로 전달하여 보드를 사용 가능한 Wi-Fi 네트워크에 연결합니다. `WIFINetworkParams_t` 구조에 대한 자세한 내용은 [사용 예시](#freertos-wifi-example) 및 [API 참조](#freertos-wifi-api)를 참조하세요.

## API 참조
<a name="freertos-wifi-api"></a>

전체 API 참조는 [Wi-Fi API 참조](https://docs.aws.amazon.com/freertos/latest/lib-ref/html2/wifi/index.html)를 참조하십시오.

## 사용 예시
<a name="freertos-wifi-example"></a>

### 알려진 AP에 연결
<a name="w2aac31b9c13c53c21b3"></a>

```
#define clientcredentialWIFI_SSID    "MyNetwork"
#define clientcredentialWIFI_PASSWORD   "hunter2"

WIFINetworkParams_t xNetworkParams;
WIFIReturnCode_t xWifiStatus;

xWifiStatus = WIFI_On(); // Turn on Wi-Fi module

// Check that Wi-Fi initialization was successful
if( xWifiStatus == eWiFiSuccess )
{
    configPRINT( ( "WiFi library initialized.\n") );
}
else
{
    configPRINT( ( "WiFi library failed to initialize.\n" ) );
    // Handle module init failure
}

/* Setup parameters. */
xNetworkParams.pcSSID = clientcredentialWIFI_SSID;
xNetworkParams.ucSSIDLength = sizeof( clientcredentialWIFI_SSID );
xNetworkParams.pcPassword = clientcredentialWIFI_PASSWORD;
xNetworkParams.ucPasswordLength = sizeof( clientcredentialWIFI_PASSWORD );
xNetworkParams.xSecurity = eWiFiSecurityWPA2;

// Connect!
xWifiStatus = WIFI_ConnectAP( &( xNetworkParams ) );

if( xWifiStatus == eWiFiSuccess )
{
    configPRINT( ( "WiFi Connected to AP.\n" ) );
    // IP Stack will receive a network-up event on success
}
else
{
    configPRINT( ( "WiFi failed to connect to AP.\n" ) );
    // Handle connection failure
}
```

### 인근 AP 검색
<a name="w2aac31b9c13c53c21b5"></a>

```
WIFINetworkParams_t xNetworkParams;
WIFIReturnCode_t xWifiStatus;

configPRINT( ("Turning on wifi...\n") );
xWifiStatus = WIFI_On();

configPRINT( ("Checking status...\n") );
if( xWifiStatus == eWiFiSuccess )
{
    configPRINT( ("WiFi module initialized.\n") );
}
else
{
    configPRINTF( ("WiFi module failed to initialize.\n" ) );
    // Handle module init failure
}

WIFI_SetMode(eWiFiModeStation);

/* Some boards might require additional initialization steps to use the Wi-Fi library. */

while (1)
{
    configPRINT( ("Starting scan\n") );
    const uint8_t ucNumNetworks = 12; //Get 12 scan results
    WIFIScanResult_t xScanResults[ ucNumNetworks ];
    xWifiStatus = WIFI_Scan( xScanResults, ucNumNetworks ); // Initiate scan

    configPRINT( ("Scan started\n") );

    // For each scan result, print out the SSID and RSSI
    if ( xWifiStatus == eWiFiSuccess )
    {
        configPRINT( ("Scan success\n") );
        for ( uint8_t i=0; i<ucNumNetworks; i++ ) 
        {
            configPRINTF( ("%s : %d \n", xScanResults[i].cSSID, xScanResults[i].cRSSI) );
        }
    } else {
        configPRINTF( ("Scan failed, status code: %d\n", (int)xWifiStatus) );
    }
    
    vTaskDelay(200);
}
```

## 이식
<a name="freertos-wifi-porting"></a>

`iot_wifi.c` 구현은 `iot_wifi.h`에 정의된 함수를 구현해야 합니다. 적어도 이 구현은 필수적이지 않거나 지원되지 않는 함수에 대해 `eWiFiNotSupported`를 반환해야 합니다.

Wi-Fi 라이브러리 이식에 대한 자세한 내용은 FreeRTOS 이식 안내서의 [Wi-Fi 라이브러리 이식](https://docs.aws.amazon.com/freertos/latest/portingguide/afr-porting-wifi.html)을 참조하세요.