---
title: "W5100S-EVB Pico + AWS IoT Core + MQTT Example"
url: "https://maker.wiznet.io/TheoIm/projects/w5100s-evb-pico-aws-iot-core-mqtt-example/"
markdown_url: "https://maker.wiznet.io/TheoIm/projects/w5100s-evb-pico-aws-iot-core-mqtt-example/md"
type: "UCC: User Created Content"
author: "Kyeoneun Lee"
author_url: "https://velog.io/@dlruddms5619/W5100S-EVB-Pico-AWS-IoT-Core-MQTT-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-%EB%B0%8F-%EC%8B%A4%EC%8A%B5"
editor: "WIZnet"
editor_url: "https://maker.wiznet.io/"
original_author: "Kyeoneun Lee"
original_url: "https://velog.io/@dlruddms5619/W5100S-EVB-Pico-AWS-IoT-Core-MQTT-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-%EB%B0%8F-%EC%8B%A4%EC%8A%B5"
published: "2023-12-04"
language: "en"
hardware: ["WIZnet W5100"]
likes: 0
views: 1224
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# W5100S-EVB Pico + AWS IoT Core + MQTT Example

> Creating a hands-on project for AWS integration using W5100 pico

Original author: Kyeoneun Lee (source: https://velog.io/@dlruddms5619/W5100S-EVB-Pico-AWS-IoT-Core-MQTT-%EA%B0%9C%EB%B0%9C-%ED%99%98%EA%B2%BD-%EA%B5%AC%EC%B6%95-%EB%B0%8F-%EC%8B%A4%EC%8A%B5)

## Components

- **WIZnet W5100** x 1 ([docs](https://docs.wiznet.io/Product/Chip/Ethernet/W5100))
- Software: **microsoft VS Code** ([docs](https://code.visualstudio.com/))

## Article

## 0. 들어가기

### ✔ W5100S-EVB 피코

개발 보드. 이더넷 연결이 가능함. 자세한 건 홈페이지 [참조](https://docs.wiznet.io/Product/iEthernet/W5100S/w5100s-evb-pico)

> W5100S-EVB-Pico는 Raspberry Pi RP2040 마이크로컨트롤러 칩과 완전 유선 TCP/IP 컨트롤러 W5100S 칩을 기반으로 하는 마이크로컨트롤러 평가 보드입니다. W5100S-EVB-Pico는 Raspberry Pi Pico 플랫폼과 동일한 역할을 하며 W5100S를 포함하므로 이더넷 기능이 기본적으로 포함되어 있습니다.

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F8dd95f3c-7d91-4308-8127-c2ae65c9ff11%2Fimage.png)

### ✔ AWS IoT 코어

- IoT 디바이스를 다른 디바이스에 연결하는 클라우드 서비스와 AWS 클라우드 서비스를 제공함.

- IoT 디바이스를 AWS IoT 기반 솔루션에 통합하는 데 도움이 되는 디바이스 소프트웨어 제공.

- 지원 프로토콜
  - MQTT
  - WSS를 통한 MQTT
  - HTTPS
  - LoRaWAN

### ✔ MQTT

- MQTT(Message Queueing Telemetry Transport)의 약자로, 최소한의 전력과 패킷량으로 통신하는 프로토콜이다.

- 저전력 배터리나 네트워크 상태가 좋지 않은 제한적인 환경에서 동작하게 하기 위한 용도로 만들어졌다.

- ⇒ 낮은 전력과 낮은 대역폭 환경에서 사용할 수 있어, IoT Device에서 유용.

## 1. 개발 환경 구축

[참조 문서](https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf)

### 1) Toolchain 설치

#### [ARM GCC 컴파일러](https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads)

- 링크에서 windows용 exe를 다운받고 설치.

- 유의할 점은 설치 시에 **Add path to environment variable**을 선택해준다. 다른 옵션은 이미 선택되어 있지만 저 옵션만 선택되어 있지 않으니 선택해준다.

#### [CMake](https://cmake.org/download/)

- 링크에서 windows용 installer을 다운받아서 설치.

- 설치 시에 all users path 관련 옵션 선택.

#### [비주얼 스튜디오](https://visualstudio.microsoft.com/ko/downloads/)

- 문서에는 2019 버전을 다운로드하라고 되어 있지만 2022 버전을 받아도 잘 돌아감.

- **C++을 사용한 데스크톱 개발** 옵션만 선택해서 설치.

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F4659f249-598a-40e6-9d5e-f9581fb247f7%2Fimage.png)

- [참조](https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf)

#### [파이썬](https://www.python.org/downloads/windows/)

- 문서에는 3.9버전을 설치하라고 되어 있다.

- 이미 3.9 버전이 설치되어 있어서, 다른 버전이 안되는지는 정확하지 않다.

#### [힘내](https://git-scm.com/download/win)

- git이 설치되어 있어야 한다.

### 2) 설치 확인

#### SDK 및 예제 가져오기

원하는 폴더 경로에 가서 아래의 git 명령어를 실행.

```plaintext
C:\[userpath]> git clone -b master https://github.com/raspberrypi/pico-sdk.git
C:\[userpath]> cd pico-sdk
C:\[userpath]\pico-sdk> git submodule update --init
C:\[userpath]\pico-sdk> cd ..
C:\[userpath]> git clone -b master https://github.com/raspberrypi/pico-examples.git
```

#### 명령줄에서 "Hello World" 빌드

- 커맨드 창에서 빌드 테스트. 아래 명령어 실행

- 빌드가 완료되면 hello_world/serial 폴더와 hello_world/usb 디렉토리에 bulid 디렉터리가 생성됨.

- 생성된 UF2 파일을, 컴퓨터와 연결된 보드에 drag and drop 해주면 실행할 수 있음.

```plaintext
C:\[userpath]> setx PICO_SDK_PATH "..\..\pico-sdk"
C:\[userpath]> cd pico-examples
C:\[userpath]\pico-examples> mkdir build
C:\[userpath]\pico-examples> cd build
C:\[userpath]\pico-examples\build> cmake -G "NMake Makefiles" ..
C:\[userpath]\pico-examples\build> nmake
```

#### Visual Studio Code에서 "Hello World" 빌드

- 위와 똑같은 테스트이지만 VS Code에서 실행.

- Developer Command Prompt for VS 2022 에 들어가서 code 입력.

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2Ff87f7587-3c91-47c8-a09a-eebf13295913%2Fimage.png)

- 입력하면 자동으로 VS Code가 실행된다.

- C/C++을 사용하려면 VS Code에서 몇 가지 설정을 해줘야 한다.
  1) CMake Tools 설치

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2Fc74cf7b7-dcea-4569-87d5-68a7e8146134%2Fimage.png)

- 2) Settings(설정)에서 Configure Envionment 설정

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F3cf4e61c-e7f2-4351-b990-66d11b5df465%2Fimage.png)

- 3) Settings에서 Generator 설정

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F624bbef4-29ab-42e4-bfa2-3ea8488a0074%2Fimage.png)

- 이제 설정 화면을 닫고, pico-examples 폴더를 열어줍니다.

- 폴더를 열고, 아래의 build 버튼을 누르거나 F7을 눌러서 빌드합니다.

- 빌드가 완료되면 build 디렉토리에 있는 uf2 파일을 보드에 넣어서 실행합니다.

## 2. MQTT를 통해 AWS IoT 연결하기

[원본 링크](https://github.com/Wiznet/RP2040-HAT-AWS-C/tree/main/examples/aws_iot_mqtt) [참조 링크](https://www.hackster.io/viktor-shin/connect-w5100s-evb-pico-to-aws-iot-core-4ac135)

### 1) 터미널 프로그램 설치

- [Tera Term](https://osdn.net/projects/ttssh2/releases/) 을 사용했음.

- 다른 터미널 프로그램을 사용해도 관계없음.

### 2) 하드웨어 연결

- 이더넷 케이블을 사용해서 W5100S-EVB-Pico 이더넷 포트에 연결해준다.

- 연결된 보드를 5pin usb 케이블을 통해서 컴퓨터와 연결해둔다.

### 3) AWS IoT 설정

[IoT Core resource 생성 참조](https://docs.aws.amazon.com/iot/latest/developerguide/create-iot-resources.html)

### 4) MQTT 예를 통해 Connect AWS IoT 설정

#### ✅ 자식 클론

```plaintext
git clone --recurse-submodules https://github.com/Wiznet/RP2040-HAT-AWS-C.git
```

#### ✅ SPI 포트 및 핀 설정

- 'RP2040-HAT-AWS-C/port/ioLibrary_Driver/' 디렉토리에 있는 **'w5x00_spi.h'** 파일에서 설정.

```c
/* SPI */
#define SPI_PORT spi0

#define PIN_SCK 18
#define PIN_MOSI 19
#define PIN_MISO 16
#define PIN_CS 17
#define PIN_RST 20
```

#### ✅ 네트워크 구성 설정

- 'RP2040-HAT-AWS-C/examples/aws_iot_mqtt/' 디렉토리에 있는 'aws_iot_mqtt.c' 파일에서 설정.

- 보드가 공유기와 연결된 것이라면 알아서 할당되므로 파일을 수정할 필요 없음.

```c
/* Network */
static wiz_NetInfo g_net_info =
    {
        .mac = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}, // MAC address
        .ip = {192, 168, 11, 2},                     // IP address
        .sn = {255, 255, 255, 0},                    // Subnet Mask
        .gw = {192, 168, 11, 1},                     // Gateway
        .dns = {8, 8, 8, 8},                         // DNS server
        .dhcp = NETINFO_DHCP                         // DHCP enable/disable
};
```

#### ✅ AWS IoT 구성 설정

- 도메인은 AWS IoT data endpoint 이다.

- AWS IoT Core에서 설정에 들어가서 복사한 후, 변경 해준다

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2Fb669191d-0aae-4127-a644-c2fab245ef0e%2Fimage.png)

- my_rp2040_thing은 자신이 만든 사물(device) 이름으로 바꾼다.

- username과 password는 설정하지 않는다.

```c
/* AWS IoT */
#define MQTT_DOMAIN "account-specific-prefix-ats.iot.ap-northeast-2.amazonaws.com"
#define MQTT_PUB_TOPIC "$aws/things/my_rp2040_thing/shadow/update"
#define MQTT_SUB_TOPIC "$aws/things/my_rp2040_thing/shadow/update/accepted"
#define MQTT_USERNAME NULL
#define MQTT_PASSWORD NULL
#define MQTT_CLIENT_ID "my_rp2040_thing"
```

#### ✅ 장치 인증서 및 키 설정

- 'RP2040-HAT-AWS-C/examples/aws_iot_mqtt/' 디렉토리의 **mqtt_certificate.h** 파일에 설정한다.

- AWS에서 사물(Device) 생성 시에 발급받은 인증키를 넣어준다.

- root_ca에는 Amazon Root CA1 인증서를 넣어주고,

- client_cert에는 Private key를 넣어주고,

- private key에는 RSA를 넣어준다.

- 아래의 입력 형식에 맞춰서 넣어줘야 한다. 각 줄마다 따옴표와 \r\n을 넣어준다.

```c
uint8_t mqtt_root_ca[] =
"-----BEGIN CERTIFICATE-----\r\n"
"...\r\n"
"-----END CERTIFICATE-----\r\n";

uint8_t mqtt_client_cert[] =
"-----BEGIN CERTIFICATE-----\r\n"
"...\r\n"
"-----END CERTIFICATE-----\r\n";

uint8_t mqtt_private_key[] =
"-----BEGIN RSA PRIVATE KEY-----\r\n"
"...\r\n"
"-----END RSA PRIVATE KEY-----\r\n";
```

### 5) 빌드

- 파일 수정을 완료했다면, vs code에서 빌드 버튼을 누르거나 f7을 누른다.

- 빌드가 완료되면, 'RP2040-HAT-AWS-C/build/examples/aws_iot_mqtt/' 디렉토리에 **'aws_iot_mqtt.uf2'** 파일이 생성된다.

### 6) 업로드 및 실행

#### ✅ Tera Term 실행

- W5100S-EVB-Pico의 BOOTSEL 버튼을 누르고 usb 포트를 연결하면 RPI-RP2 드라이브가 자동으로 마운트됨.

- 드라이브 안에 'aws_iot_mqtt.uf2' 파일을 복사 후 붙여넣기 해줌

- 보드의 시리얼 COM 포트를 Tera Term과 연결

- 연결 후에 바로 실행될 수도 있으나, 실행되지 않으면 usb를 뽑았다가 다시 연결시킴.

- 정상적으로 연결되었다면 아래와 같은 화면 출력

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F740a710e-910f-483f-9b77-8a5e9e0351dc%2Fimage.png)

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F98cd2ee8-9d6e-47a3-be8f-992e68d9ddd4%2Fimage.png)

#### ✅ AWS MQTT test client 실행

- AWS IoT 콘솔에서 Test 메뉴 선택

- 주제를 구독하고, 주제를 게시함

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2Fc20212c2-a6b5-46b1-8157-ad3074ce4026%2Fimage.png)

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F54d3cb84-e277-48be-a33b-36ec74c9f90f%2Fimage.png)

- 주제를 게시하면 tera term 창에서 message를 받은 것을 확인할 수 있음.

![](https://velog.velcdn.com/images%2Fdlruddms5619%2Fpost%2F87dd333d-8b5f-47ef-9ba0-45af53cc829f%2Fimage.png)

---

Source: https://maker.wiznet.io/TheoIm/projects/w5100s-evb-pico-aws-iot-core-mqtt-example/
