กลับไปหน้ารวมไฟล์
securely-connecting-a-mkr-gsm-1400-to-google-cloud-iot-core-23078a.md

ชื่อโปรเจกต์: เชื่อมต่อ Arduino MKR GSM 1400 เข้ากับ Google Cloud IoT Core แบบเนียนๆ และปลอดภัย

Note: เฮ้ยไอ้น้อง บทความนี้อาจจะเก่าไปนิด ถ้าอยากได้เวอร์ชันอัปเดตล่าสุดแบบสดๆ ร้อนๆ ลองไปเช็กดูในเว็บหลักเขาดูนะ

เกริ่นนำกันหน่อย

Cloud IoT Core คือบริการตัวตึงที่ช่วยให้เราเชื่อมต่อ จัดการ และดึงข้อมูลจาก Device ทั่วโลกเป็นล้านๆ เครื่องได้แบบชิลๆ แถมปลอดภัยด้วย พอเราใช้ร่วมกับบริการอื่นๆ บน Google Cloud มันจะกลายเป็นโซลูชันที่ครบเครื่องสุดๆ ทั้งเก็บข้อมูล, ประมวลผล, วิเคราะห์ ไปจนถึงทำ Dashboard แสดงผลแบบ Real-time ช่วยให้งานเราดูหล่อเท่ขึ้นเยอะ

พวก Device ต่างๆ สามารถคุยกับ GCP IoT Core ได้ผ่านทาง HTTP หรือ MQTT เดี๋ยววันนี้พี่จะพาทัวร์วิธีเชื่อมต่อบอร์ด [Arduino](https://s.shopee.co.th/7fUgFAWSki) MKR GSM 1400 เข้ากับ GCP IoT Core แบบ Secure โดยใช้ MQTT client ซึ่งเจ้า MQTT เนี่ยมันคือโปรโตคอลยอดฮิตสำหรับการคุยกันแบบ M2M (Machine-to-Machine) ที่เน้นส่งข้อความแบบ Subscribe และ Publish นั่นเอง

ที่สำคัญ Device ต้องใช้ JSON Web Tokens (JWTs) ในการยืนยันตัวตนด้วยนะ ซึ่ง GCP IoT Core รองรับทั้งอัลกอริทึม RSA และ Elliptic Curve สำหรับการตรวจสอบ JWS (JSON Web Signatures) ใครอยากรู้ลึกไปอ่านต่อเอาเองในพวกมาตรฐาน RFC นะน้อง

บอร์ด Arduino MKR ที่มีระบบเชื่อมต่อในตัว รวมถึง MKR GSM 1400 จะมีชิป Microchip ATECC508A หรือ ATECC608A ซึ่งเป็นชิป Crypto (Crypto element) ติดมาด้วย เจ้าตัวนี้แหละที่เป็นพระเอกในการเจนและเก็บ Private Key แบบ 256-bit ECC (Elliptic Curve Cryptography) ไว้ข้างในเครื่องแบบลับสุดยอด เราจะใช้คีย์ที่ซ่อนอยู่ในนี้แหละมาเซ็นชื่อ (Sign) ให้กับ JWT ของเรา

เตรียมของและตั้งค่า Software

ถ้าเครื่องน้องยังไม่มี Arduino IDE ก็รีบไปโหลดมาลงซะนะ

พอลงเสร็จแล้ว เช็กให้ชัวร์ว่าลงแพ็กเกจ "Arduino SAMD Boards" เวอร์ชันล่าสุดแล้วหรือยัง เข้าไปเช็กได้ที่เมนู Tools -> Board: "..." -> Board Manager... แล้ว search หาคำว่า "Arduino SAMD" ตอนที่พี่เขียนอยู่นี้เวอร์ชัน 1.6.20 คือล่าสุดแล้วนะ จัดไปวัยรุ่น

ต่อมาต้องลง Library ที่จำเป็นผ่าน Library Manager ของ Arduino IDE นะน้อง เข้าไปที่เมนู Sketch -> Include Library -> Manage Libraries... แล้ว search ชื่อพวกนี้ทีละอันแล้วกด Install ไปเลย:

  • MKRGSM
  • Arduino_JSON
  • ArduinoECCX08 (ขอเวอร์ชัน 1.3.0 ขึ้นไปนะ)
  • ArduinoMqttClient (เวอร์ชัน 0.1.3 ขึ้นไป)
  • Arduino Cloud Provider Examples (เวอร์ชัน 1.2.0 ขึ้นไป)

เอาล่ะ คราวนี้หยิบ Micro SIM ใส่ลงไปในช่องใต้บอร์ด MKR GSM 1400 ต่อเสาอากาศให้เรียบร้อย และที่สำคัญ **ห้ามลืม** เสียบ Battery LiPo 3.7V เข้าที่ช่อง JST ด้วยนะ (ใช้ไฟจาก USB อย่างเดียวมันไม่พอนะน้อง เดี๋ยวบอร์ดค้าง) จากนั้นเสียบสาย Micro USB เข้าคอม เลือก Port ให้ถูกที่เมนู Tools -> Port "..." แล้วก็เลือกบอร์ดเป็น Arduino MKR GSM 1400 ในเมนู Tools -> Board "..." ด้วยล่ะ

ตั้งค่าและเพิ่ม Board เข้าสู่ GCP IoT Core

อย่างที่บอกไป GCP IoT Core มันต้องการ JWT ในการยืนยันตัวตนผ่าน MQTT เราจะใช้ Sketch ตัวหนึ่งมาเจน Private Key และ Public Key บนบอร์ดเลย แล้วค่อยก๊อปเอาค่า PEM ของ Public Key ไปแปะใน Console ของ GCP

คีย์พวกนี้สร้างได้โดยใช้โค้ดตัวอย่างจาก Library ArduinoECCX08 นะ ไปเปิดที่ File -> Examples -> ArduinoECCX08 -> Tools -> ECCX08JWSPublicKey กดปุ่ม "Upload" เลยน้อง พอเสร็จแล้วเปิด Serial Monitor ขึ้นมา แล้วตั้งค่า Line Ending เป็น "Both NL & CR" ด้วยนะ

ตัว Sketch จะถามให้เราตั้งค่าชิป Crypto ATECC508A หรือ ECC608A แบบถาวร คำเตือน: ขั้นตอนนี้คือการ Lock ชิปแบบถาวร แก้ไขไม่ได้ (Irreversible) แต่มันจำเป็นต้องทำเพื่อใช้งานชิปตัวนี้ การตั้งค่านี้จะทำให้เรามี Slot สำหรับ Private Key 5 ช่อง (0-4) ซึ่งเอาไปใช้กับ Cloud เจ้าไหนก็ได้ และเจนคีย์ใหม่ได้ตลอดเวลา ปกติบอร์ดใหม่จากโรงงานมันจะยังไม่ถูก Lock มาน่ะ

เสร็จแล้วมันจะถามว่าจะใช้ Slot ไหน ในโปรเจกต์นี้เราจะใช้ Slot 0 เพื่อเก็บ Private Key จำไว้นะน้อง: Private Key มันถูกสร้างข้างในชิป มันจะไม่ออกมาข้างนอกบอร์ดเด็ดขาด ปลอดภัยหายห่วง ไม่มีใครแอบอ่านได้แน่นอน

ก๊อปปี้ค่า Public Key ที่มันเจนออกมาให้ ตัวอย่างหน้าตามันจะประมาณนี้:

-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEFl4+DXufU84AhDGib7aMwmYwUVAp9coRdC9jOdzR
e2kqGWFEb+QP4V4YUK9Zy7PsmRABi1sWgxiAoEhg1FEQgg==
-----END PUBLIC KEY-----

เก็บไว้ก่อน เดี๋ยวต้องเอาไปใช้ในขั้นตอนหน้าบน GCP IoT Core

เอาล่ะ ได้ Public Key มาแล้ว คราวนี้ไปที่หน้า Console ของ GCP เพื่อสร้าง Device ใหม่กัน

1) เปิด Browser ไปที่หน้า Google Cloud แล้ว Sign In ด้วย Google ID ของเราซะ

2) พอ Login แล้ว กดปุ่ม "GO TO CONSOLE" จะเจอหน้า Dashboard หลัก

3) กดปุ่ม "CREATE" เพื่อสร้างโปรเจกต์ใหม่

4) ตั้งชื่อโปรเจกต์เอาแบบหล่อๆ พี่ใช้ชื่อ "MKR GCP Tutorial" แล้วกด "CREATE" ไปเลย

5) รอแวบเดียวพอโปรเจกต์สร้างเสร็จ มันจะพาไปหน้า Dashboard ของโปรเจกต์นั้น

6) คราวนี้กดที่ไอคอนเมนูซ้ายบน เลื่อนไปหาหัวข้อ "BIG DATA" แล้วจิ้มที่ "IoT Core" เลยน้อง

7) ถ้ามันให้ Enable API ก็กดปุ่ม "Enable API" ไปตามระเบียบ

8) พอ API พร้อมแล้ว กดปุ่ม "Create a device registry" ได้เลย

9) กรอกข้อมูลลงไปRegistry ID ตั้งชื่อว่า "MKR_GCP_Tutorial" ส่วน Region พี่เลือก "us-central1" ตามตัวอย่างนะ เสร็จแล้วกด "Create"

10) จะเห็นหน้ารายละเอียดของ Registry ที่เราสร้างขึ้นมา

11) ขั้นตอนเพิ่มบอร์ด ให้กดเมนู "Devices" ที่แถบด้านซ้าย

12) แล้วกดปุ่ม "+ CREATE A DEVICE" ข้างบนนู่น

13) ตั้งชื่อ Device เป็น "MyMKRGSM1400" ตรง "Public key format" **ต้องเลือก** เป็น "ES256" เท่านั้นนะน้อง จากนั้นเอา Public Key ที่เราก๊อปจาก Serial Monitor เมื่อกี้มาวางในช่อง "Public key value" แล้วกด "Create" เลย หล่อเท่!

เชื่อมต่อบอร์ดเข้ากับ GCP IoT Core (ของจริงมาแล้ว!)

1) เปิดโค้ดตัวอย่างใน Arduino IDE ไปที่ File -> Examples -> Arduino Cloud Provider Examples -> GoogleCloudPlatformIoTCore-> GCP_IoT_Core_GSM

2) ไปที่แท็บ `arduino_secrets.h` กรอกรหัส PIN ของ SIM (ถ้ามี) แล้วก็ใส่พวกค่า GPRS APN, Username, Password ของค่ายมือถือที่น้องใช้อยู่

// GSM settings
#define SECRET_PINNUMBER ""
#define SECRET_GPRS_APN "GPRS_APN" // ใส่ APN ของค่ายที่ใช้ซะ
#define SECRET_GPRS_LOGIN "login" // ใส่ login ของ GPRS
#define SECRET_GPRS_PASSWORD "password" // ใส่ password ของ GPRS

4) จากนั้นก็กรอกพวก Project ID, Cloud Region, Registry ID และ Device ID ที่เราตั้งไว้ในขั้นตอนก่อนหน้า

// ข้อมูลจาก Google Cloud Platform - IoT Core
#define SECRET_PROJECT_ID ""
#define SECRET_CLOUD_REGION ""
#define SECRET_REGISTRY_ID ""
#define SECRET_DEVICE_ID ""

Project ID ดูได้จากเมนูบาร์ด้านบนของ GCP Console นะ ตัวอย่างที่พี่ทำมาค่าจะเป็นแบบนี้:

#define SECRET_PROJECT_ID   "mkr-gcp-tutorial"
#define SECRET_CLOUD_REGION "us-central1"
#define SECRET_REGISTRY_ID "MKR_GCP_Tutorial"
#define SECRET_DEVICE_ID "MyMKRGSM1400"

5) กด Upload ลงบอร์ด แล้วเปิด Serial Monitor ดู บอร์ดจะพยายามต่อเน็ตมือถือ ถ้าผ่านมันจะไปต่อกับ GCP IoT Core ผ่าน MQTT ให้เอง สู้งานนะน้อง!

สั่งงานบอร์ดผ่าน GCP IoT Core

พอบอร์ดเราออนไลน์แล้ว เราก็สั่งงานมันผ่าน Console ได้เลย โค้ดที่เราลงไปเนี่ยมันจะส่งข้อความไปที่ Topic /devices/{deviceId}/state ทุกๆ 5 วินาที และจะคอยฟังคำสั่งจาก Topic /devices/{deviceId}/config กับ /devices/{deviceId}/commands/# อยู่ตลอด

ในหน้า Device บน GCP Console ให้กดปุ่ม "SEND COMMAND"

มันจะมีหน้าต่างเด้งขึ้นมา ให้เราพิมพ์ข้อความลงไป เช่น "Hello There!" แล้วกด "SEND COMMAND" ส่งไปเลย

พอบอร์ดได้รับข้อความปุ๊บ มันก็จะโชว์ใน Serial Monitor ทันที เท่ป่ะล่ะ?

ถ้าอยากเห็นข้อมูลที่บอร์ดส่งมา ให้กดที่แท็บ "Configuration & state history"

ข้อความมันจะเป็นรหัส Base64 นะน้อง ไม่ต้องตกใจ ถ้าอยากอ่านแบบภาษาคนให้กดที่รายการในลิสต์แล้วเลือกปุ่ม "Text"

อย่างในรูปเนี่ย บอร์ดส่งคำว่า "hello 464488" มา ซึ่งไอ้เลข 464488 มันก็คือค่าจากฟังก์ชัน millis() บนบอร์ดนั่นเอง

สรุปงาน

ในบทความนี้ เราก็ได้รู้วิธีใช้บอร์ด Arduino MKR GSM 1400 ร่วมกับ GCP IoT Core แบบปลอดภัยสุดๆ โดยใช้ JWT ที่เซ็นลายเซ็นอิเล็กทรอนิกส์ด้วยชิป Crypto ATECC508A หรือ ATECC608A เป็นตัวเก็บ Private Key ไว้ข้างใน การส่งข้อมูลผ่าน MQTT ก็ลื่นไหลทั้งรับและส่ง

นี่แค่เริ่มต้นนะน้อง น้องยังเอาไปเล่นกับบริการอื่นๆ ของ Google Cloud ได้อีกเพียบ จัดไปอย่าให้เสีย!

ข้อมูลทางเทคนิคเพิ่มเติม (สำหรับสายโหด)

ความปลอดภัยระดับ Enterprise

โปรเจกต์ระดับสูงตัวนี้เชื่อมต่อ Arduino MKR GSM 1400 เข้ากับ Google Cloud IoT Core ผ่านเครือข่ายมือถือแบบไร้รอยต่อ

  • Hardware Cryptography: มีการใช้ชิป ECC508 crypto-element ในการสร้าง JWT (JSON Web Token) และยืนยันตัวตน โดยที่ Private Key จะไม่มีทางหลุดออกจากบอร์ด ปลอดภัยระดับเดียวกับที่ธนาคารใช้เลยนะน้อง
  • Cellular Connectivity: ตัวโมเด็ม GSM ในบอร์ดจะจัดการ TCP/IP stack ให้เสร็จสรรพ ทำให้ส่งข้อมูลได้เสถียรแม้จะอยู่ในที่ห่างไกลที่ไม่มี Wi-Fi

ระบบท่อส่งข้อมูลบน Cloud (Data Pipeline)

  • MQTT over GSM: บอร์ดจะ Publish ข้อมูล Telemetry (เช่น ค่าจาก Sensor) ไปยัง MQTT Bridge ของ Google
  • Data Orchestration: พอข้อมูลถึง Google Cloud แล้ว น้องจะโยนไปเก็บที่ BigQuery เพื่อวิเคราะห์ข้อมูลชุดใหญ่ หรือจะส่งไป Firebase เพื่อทำ Dashboard แบบ Real-time ก็ได้ นี่แหละคือการทำระบบ IoT ของจริงตั้งแต่ต้นทางที่เป็น Sensor ยันปลายทางที่เป็น Cloud ระดับโลก!

ข้อมูล Frontmatter ดั้งเดิม

title: "Securely Connecting a MKR GSM 1400 to Google Cloud IoT Core"
description: "In this tutorial, you'll learn how to connect your Arduino MKR GSM 1400 board securely to Google Cloud Platform (GCP) IoT Core."
author: "Arduino_Genuino"
category: "Internet of Things, BT & Wireless"
tags: []
views: 31574
likes: 21
price: 1499
difficulty: "Intermediate"
components:
  - "1x Micro SIM card"
  - "1x Micro-USB to USB Cable (Generic)"
  - "1x Arduino MKR GSM 1400"
  - "1x 3.7V Lipo Battery"
  - "1x Cellular UF.L Antenna"
tools: []
apps:
  - "1x Cloud IoT Core"
  - "1x Arduino IDE"
downloadableFiles:
  - "https://github.com/arduino/ArduinoCloudProviderExamples"
documentationLinks: []
passwordHash: "c678d8ae7df43db595f4baa304d4bd2aa0defb7e6a48a93a28831de12f1578e0"
encryptedPayload: "U2FsdGVkX19gRvNe+Pku8vvUfcYZfIuPjPp32IgFMitdUeRyKlRRWXZ1V/4206C9rhjTc/ZzbaAOre3rmyamfqyXSJKG/cbFVNMK6WeSyUCdmDq5vzEkNMnERHJID9jb"
seoDescription: "Securely connect Arduino MKR GSM 1400 to Google Cloud IoT Core. Step-by-step guide for GCP IoT integration."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/securely-connecting-a-mkr-gsm-1400-to-google-cloud-iot-core-23078a_cover.jpg"
lang: "th"