디바이스는 HTTP 또는 MQTT를 사용하여 GCP IoT Core에 연결할 수 있습니다. 이 튜토리얼에서는 MQTT 클라이언트를 사용하여 아두이노 MKR GSM 1400 보드를 안전하게 GCP IoT Core에 연결하는 방법을 안내합니다. MQTT(Message Queuing Telemetry Transport)는 M2M(머신 투 머신) 연결 프로토콜로 메시징 구독 및 발행 전송을 제공합니다.
디바이스는 인증을 위해 JSON Web Tokens(JWT)를 사용해야 합니다. JWT에 대한 자세한 내용은 RFC 7519를 참조하세요. GCP IoT Core는 JSON Web Signatures(JWS) 검증을 위해 RSA와 타원 곡선 알고리즘을 모두 지원합니다. JWS에 대한 자세한 내용은 RFC 7515를 참조하세요.
온보드 연결 기능이 있는 모든 아두이노 MKR 보드(MKR GSM 1400 포함)에는 Microchip ATECC508A 또는 ATECC608A 암호화 요소가 장착되어 있습니다. 이 암호화 요소는 256비트 ECC(타원 곡선 암호화) 키를 안전하게 생성하고 저장하는 데 사용됩니다. 우리는 암호화 요소 내부에 저장된 개인 키를 사용하여 JWT에 서명할 것입니다.
소프트웨어 및 하드웨어 설정
컴퓨터에 아두이노 IDE가 설치되어 있지 않다면 다운로드하여 설치하세요.
설치 후, 최신 "Arduino SAMD Boards" 패키지가 설치되어 있는지 확인하세요. 아두이노 IDE를 열고 Tools → Board: "..." → Board Manager... 메뉴에서 "Arduino SAMD"를 검색하여 확인할 수 있습니다. 작성 당시 최신 버전은 1.6.20이었습니다.
다음으로 아두이노 IDE의 라이브러리 매니저를 사용하여 사용할 라이브러리를 설치하세요. Sketch → Include Library → Manage Libraries... 메뉴를 열고 다음 라이브러리를 각각 검색하여 설치하세요:
MKRGSM
Arduino_JSON
ArduinoECCX08 (버전 1.3.0 이상)
ArduinoMqttClient (버전 0.1.3 이상)
Arduino Cloud Provider Examples (버전 1.2.0 이상)
이제 MKR GSM 1400 보드 하단의 슬롯에 마이크로 SIM 카드를 삽입하고, 안테나를 연결하고, 3.7V 리포 배터리를 JST 커넥터에 연결하세요. 그런 다음 마이크로 USB 케이블로 MKR GSM 1400을 컴퓨터에 연결하고, 아두이노 IDE에서 Tools → Port "..." 메뉴로 시리얼 포트를 선택하고 Tools → Board "..." 메뉴에서 Arduino MKR GSM 1400을 선택하세요.
보드를 GCP IoT Core에 구성 및 추가하기
앞서 언급했듯이, GCP IoT Core는 MQTT 프로토콜로 연결하는 디바이스에 JWT 인증을 요구합니다. 보드에서 개인 키와 공개 키를 생성하는 스케치를 사용한 다음, 공개 키의 PEM 값을 GCP IoT Core 콘솔에 추가합니다.
개인 키와 공개 키는 ArduinoECCX08 라이브러리의 예제 스케치를 사용하여 생성할 수 있습니다. 아두이노 IDE에서 File → Examples → ArduinoECCX08 → Tools → ECCX08JWSPublicKey를 사용하여 스케치를 여세요. "Upload" 버튼을 클릭하여 스케치를 보드에 빌드 및 업로드한 다음 시리얼 모니터를 여세요. 줄 끝 구성이 "Both NL & CR"로 설정되어 있는지 확인하세요.
이 스케치는 ATECC508A 또는 ECC608A 암호화 요소가 구성되지 않고 잠금 해제된 경우 영구적으로 구성하라는 메시지를 표시합니다. 참고: 이 잠금 프로세스는 영구적이고 되돌릴 수 없지만, 암호화 요소를 사용하려면 필요합니다. 이 스케치가 설정하는 구성은 5개의 개인 키 슬롯(0-4)을 모든 클라우드 제공자(또는 서버)에서 사용할 수 있게 하며, 5개 슬롯 중 어느 것이든 언제든지 개인 키를 재생성할 수 있습니다. 출고 시 암호화 요소는 구성되지 않고 잠금 해제된 상태입니다.
이후 사용할 슬롯을 묻는 메시지가 나타납니다. 이 튜토리얼에서는 공개 키에 사용할 개인 키를 생성하고 저장하기 위해 슬롯 0을 사용합니다(슬롯 1-4는 필요시 추가 개인 키 생성 및 저장에 사용 가능). 참고: 개인 키는 암호화 요소 내부에서 생성되므로 디바이스를 떠나지 않고 안전하게 저장되며 읽을 수 없습니다.
생성된 공개 키 값을 복사하세요. 스크린샷의 값은 다음과 같습니다:
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFl4+DXufU84AhDGib7aMwmYwUVAp9coRdC9jOdzR
e2kqGWFEb+QP4V4YUK9Zy7PsmRABi1sWgxiAoEhg1FEQgg==
-----END PUBLIC KEY-----
나중에 GCP IoT Core에 디바이스를 추가할 때 이 값을 사용합니다.
이제 PEM 공개 키가 있으므로, GCP IoT Core 콘솔에 로그인하여 새 디바이스를 생성해야 합니다.
API가 활성화되면 디바이스 레지스트리 생성을 요청받습니다. "Create a device registry" 버튼을 클릭하세요.
폼이 표시됩니다. "Registry ID"를 입력하고 리전을 선택하세요. 스크린샷에서는 레지스트리 ID로 "MKR_GCP_Tutorial", 리전으로 "us-central1"을 선택했습니다. 폼을 작성한 후 "Create" 버튼을 클릭하세요.
레지스트리 세부 정보가 표시됩니다.
왼쪽 탐색 바의 "Devices" 링크를 클릭하세요.
페이지 상단 제목의 "+ CREATE A DEVICE"를 클릭하세요.
디바이스 이름을 입력하세요. 스크린샷에서는 "MyMKRGSM1400"을 사용했습니다. "Public key format"으로 "ES256"을 반드시 선택하세요. 앞서 보드에서 생성한 PEM 공개 키를 "Public key value" 텍스트 영역에 붙여넣으세요. "Create" 버튼을 클릭하세요.
arduino_secrets.h 탭에서 SIM 카드 PIN(필요한 경우), GPRS APN, 사용자 이름, 비밀번호를 이동통신사에 맞게 입력하세요.
// GSM 설정
#define SECRET_PINNUMBER ""
#define SECRET_GPRS_APN "GPRS_APN" // 본인의 GPRS APN으로 교체
#define SECRET_GPRS_LOGIN "login" // 본인의 GPRS 로그인으로 교체
#define SECRET_GPRS_PASSWORD "password" // 본인의 GPRS 비밀번호로 교체
프로젝트 ID, 클라우드 리전, 레지스트리 ID, 디바이스 ID 값을 업데이트하세요.
// Google Cloud Platform - IoT Core 정보 입력
#define SECRET_PROJECT_ID ""
#define SECRET_CLOUD_REGION ""
#define SECRET_REGISTRY_ID ""
#define SECRET_DEVICE_ID ""
프로젝트 ID 값은 GCP 콘솔 상단의 메뉴 바를 클릭하여 찾을 수 있습니다. 위 단계의 값은 다음과 같습니다:
스케치를 보드에 업로드하고 시리얼 모니터를 여세요. 보드가 셀룰러 네트워크에 연결을 시도하고, 성공하면 MQTT를 사용하여 GCP IoT Core에 연결을 시도합니다.
GCP IoT Core에서 보드와 상호작용하기
보드가 GCP IoT Core에 성공적으로 연결되었으므로, GCP IoT Core 콘솔을 사용하여 상호작용할 수 있습니다. 스케치는 5초마다 /devices/{deviceId}/state 토픽으로 메시지를 전송하고, /devices/{deviceId}/config 토픽과 /devices/{deviceId}/commands/# 토픽의 메시지를 수신 대기합니다.
GCP IoT Core 콘솔의 디바이스 페이지에서 "SEND COMMAND" 버튼을 클릭하세요.
모달 대화상자가 나타나면 메시지를 입력하세요. 스크린샷에서는 "Hello There!"를 입력했습니다. "SEND COMMAND" 버튼을 클릭하여 전송하세요.
보드가 메시지를 수신하면 시리얼 모니터에 출력됩니다.
보드가 전송하는 메시지를 보려면 "Configuration & state history" 탭을 클릭하세요.
메시지는 Base64 인코딩 형식으로 나타납니다. 리스트의 항목을 클릭하고 "Text" 라디오 버튼을 선택하여 값을 확인하세요.
위 스크린샷에서 보드는 "hello 464488" 값을 전송했으며, 464488은 보드의 millis() 함수 결과입니다.
결론
이 튜토리얼에서는 아두이노 MKR GSM 1400 보드를 GCP IoT Core와 안전하게 사용하는 방법을 다루었습니다. ATECC508A 또는 ATECC608A에 저장된 개인 키로 서명된 JWT를 사용하여 MQTT 프로토콜로 GCP IoT Core에 인증했습니다. 보드와 MQTT 메시지를 주고받았습니다.
이는 시작에 불과합니다. GCP가 제공하는 다른 많은 서비스와 함께 GCP IoT Core를 사용할 수 있습니다!