Full Stack AIoT Developer : Part 1 EP 3: IoT Devices and Raspberry Pi

Natchapol Patamawisut
6 min readApr 17, 2020

--

สวัสดีครับ มาถึง EP ที่ 3 กันแล้วกับ Full Stack AIoT Developer ในครั้งนี้จะเป็นเรื่องพื้นฐานของการใช้งาน IoT Devices ต่างๆ การออกแบบ และ พื้นฐานการใช้งาน Raspberry Pi ซึ่งเป็น Single board computer ที่ทรงพลังมากในปัจจุบัน เราก็มาเริ่มกันเลยครับ

IoT

IoT หรือ Internet of Things คือการที่เราทำให้ Things หรือสิ่งของที่เป็น Physical ต่างๆ ให้สามารถรับรู้ และ สื่อสารได้ ซึ่งในการรับรู้ เราจะใช้สิ่งที่เรียกว่า Sensors และ ทำงานด้วย Actuators

Sensors

https://tech.alpsalpine.com/e/category_sensor.html

เป็นอุปกรณ์ที่ใช้ในการรับ Input จากสิ่งแวดล้อม

Actuators

เป็นอุปกรณ์ที่ใช้ทำงานออกเป็น Output ในรูปแบบต่างๆ

Process การทำงาน

ในส่วนของ Process จะเป็นการที่ได้รับ Input จาก Sensor ต่างๆ จากนั้นก็จะส่งข้อมูลไปให้กับ Controller เพื่อประมวลผลว่าควรจะ Output เป็นอย่างไร เมื่อประมวลผลเสร็จแล้วก็จะส่งสัญญาณไปให้ Actuator เพื่อส่ง Output

Architecture

End-to-End IoT Architecture

เป็นโครงสร้างของ IoT ที่จะมีการสื่อสารระหว่าง Input และ Output โดยตรง ซึ่งอาจจะผ่าน Central Hub เพื่อช่วยในการกระจาย หรือ ประมวลผล หรือ อาจจะไม่ผ่านก็ได้

Communication Models

Device to Device Communication (D2D)

https://comp-eng.binus.ac.id/2018/06/22/applications-of-device-to-device-communication-in-5g-networks/

เป็นรูปแบบที่ อุปกรณ์จะติดต่อระหว่างกันเองโดยตรง สามารถทำได้โดย

Wired

  • Simple digital I/O communication
  • UART, SPI, I²C

Wireless

  • Bluetooth
  • Zig-bee
  • RF

D2D ใข้งานในอุปกรณ์เช่น Wearable devices, E-health หรือในงานประเภทที่ไม่ต้องการเรื่องของ Security มาก

Device to Gateway Communication

เป็นรูปแบบที่ Devices จะไม่ได้ทำการติดต่อกับ Cloud โดยตรง แต่จะมีการผ่าน Gateway ซึ่งเป็น Hub ที่จะรวบรวมข้อมูล และ ควบคุม Device ต่างๆ

Device จะติดต่อกับ Gateway ได้หลายวิธี เช่น

  • Bluetooth
  • NFC
  • IR
  • RF

ซึ่งระดับของ Security จะมีมากกว่า D2D อยู่ระดับหนึ่งเนื่องจากมีการใช้ Cloud เข้ามาช่วยแยกจาก User กับตัว Device

Device to Cloud Communication

เป็นรูปแบบที่ Device จะทำการติดต่อกับ Cloud โดยตรงเลย ผ่านทาง

  • WLAN for WiFi
  • GSM for 3G/4G

เราสามารถใช้ Cloud ในการจัดการ Traffic ของ Device Data, Remote Control, etc. ซึ่งจะมีประสิทธิภาพในเรื่อง Security ที่ดีระดับหนึ่งเนื่องจากการที่มี Cloud ป้องกันการเข้าถึง Device โดยตรงจาก User

Back-End Data Sharing

เป็นรูปแบบที่จะมีเพิ่มเรื่องของ Security เข้าไปจากรูปแบบ Device to Cloud Communication โดยมีการใช้ Back-End Server เป็นตัวกลางระหว่าง Cloud กับ Device อีกที เพื่อป้องกันการที่ User เข้าถึง Cloud ที่เก็บ Data ของเราได้โดยตรง

ตัวอย่างในการใช้งานคือ RESTful API

Hardware Consideration

ในการเลือกใช้งาน Hardware เพื่อใช้ทำ IoT ให้เหมาะสม สามารถทำได้โดยพิจารณาจาก

  • Processing Power
  • Cost
  • Memory I/O
  • Power
  • Security
  • Connectivity

Processing Power

ในเรื่องของการประมวลผล งานที่ใช้การประมวลผลเยอะเช่น Image Processing, Back-End Server, Big Data Analytics, Data Streaming

เปรียบเทียบ Processing Power

Cost

Memory

ในบางงานที่จำเป็นอาจจะจำเป็นต้องเก็บข้อมูลไว้จำนวนมาก ซึ่งการที่ Memory เยอะจะทำให้สามารถรองรับได้ และ ทำให้การประมวลผลดีขึ้น

Inputs/Outputs

Sensor ที่เราใช้อาจจะต้องการจำนวน Port เท่ากับจำนวน Sensor ดังนั้นในงานบางประเภทอาจจะการใช้ Microcontroller ที่มี I/O เยอะ

แต่ในปัจจุบัน ในหลายๆอุปกรณืจะมีการเชื่อมต่อที่ทันสมัยมากขึ้นทำให้ไม่จำเป็นต้องใช้ I/O เยอะ

Power

การกินพลังงานหมายถึง ราคาค่าไฟ และ ระยะการทำงานของอุปกรณ์

ซึ่งจะมีวิธีการที่เรียกว่า Deep Sleep ที่สามารถช่วยให้เราประหยัดพลังงานได้ เมื่อไม่ใช้

Connectivity

ต้องดูว่าในแต่ละสถานที่นั้นสามารถใช้การเชื่อมต่อแบบไหนได้บ้าง เช่น ในบ้านอาจจะมี WiFi ให้สามารถใช้งานได้ หรือถ้าเป็นในพื้นที่ ที่สัญญาณเข้าไม่ถึงก็อาจจะใช้รูปแบบที่มีสัญญาณในตัว

Security

ใน IoT จะมีการสนใจอยู 4 เรื่องด้วยกัน

  1. Secure Boot — คือการที่ต้องการจะ Load หรือ Update ข้อมูลอะไรก็ตาม จะต้องมีการทำ Authentication
  2. Authentication — จะต้องมีการยืนยัน Data Authentication, Device Identity
  3. Protected Ports — ต้องมีการป้องกัน Port ต่างๆที่สามารถเชื่อมต่อกับ Device ของเราทางกายภาพได้
  4. Storage — ข้อมูลภายในจะต้องมีการ Encrypt ไว้

Raspberry Pi’s Components

สามารถต่อ Speaker เข้าได้ที่ GPIO 12

IoT Security and Cryptography

Symmetric Key Algorithm

เป็นรูปแบบการเข้ารหัสที่ทำงานได้ดี ถ้า Key ของเราไม่ถูกคนอื่นเห็น

ข้อเสียคือ จำเป็นที่ผู้ส่งและผู้รับจะต้องเคยพบเจอกันมาก่อนเพื่อทำการแลกเปลี่ยน Key ระบบนี้ถึงจะทำงานได้ และ ไม่เหมาะกับการใช้งาน Web หรือ IoT Application ที่มีผู็ใช้งานจำนวนมากๆ

มักจะใช้ AES(Advanced Encryption Standard) ในการเข้ารหัส Symmetric Key

Asymmetric Key Algorithm

เป็น Algorithm ที่จะมีการใช้ Key 2 ตัว

  • Private Key เป็น Key ที่เราจะเก็บไว้กับตัวเองเป็นความลับ
  • Public Key เป็น Key ที่เราจะเผยแพร่ให้กับคนอื่นๆ

โดยส่วนมากจะใช้วิธีที่เรียกว่า RSA

ในการใช้งาน Asymmetric Key จะมีอยู่ 2 ลักษณะ คือ

  1. Encryption

ทำการเข้ารหัสข้อมูล เพื่อไม่ให้คนอื่นๆสามารถอ่านได้

2. Digital Signature

เป็นการใช้ Key เป็นตัวยืนยันโดยจะใช้ Private Key ของผู้ส่งเป็นตัวเข้ารหัสข้อมูล ทำเป็น Signature แล้วส่ง Signature แนบข้อมูลไปด้วย ถ้าผู้รับใช้ Public Key ของเรา ทำการ Decode Signature ที่แนบมาด้วย แล้วได้ค่าทีไม่ตรงกับ ข้อมูลที่ส่งมา แปลว่าอาจจะมีคนแก้ไขข้อมูล

MQTT

http://shuwernpi.blogspot.com/2018/01/mqtt-broker-mosquitto-raspberry-pi.html

MQTT หรือ Message Querying Telemetry Transport เป็น Network Protocol ที่มีน้ำหนักเบา สามารถใช้สื่อสารระหว่าง Device ได้ดี

MQTT สร้าง On Top ของ TCP/IP Protocol

MQTT Components

ในการรับส่งข้อมูลของ MQTT จะมี 3 องค์ประกอบด้วยกันคือ

  • Broker
  • Publisher
  • Subscriber

โดยกระบวนการทำงานจะมีดังนี้

  1. Start Broker เพื่อทำตัวเป็น Server ตัวกลางระหว่าง Publishers และ Subscribers
  2. Subscribers ทำการ Subscribe “Topic” ที่เราต้องการกับ Broker
  3. Publisher ทำการ Publish “Message” ด้วย “Topic” ไปให้ Broker
  4. Broker เมื่อเห็นว่า “Topic” ของ “Message” ที่ Publisher ส่งมานั้นเหมือนกับ “Topic” ที่ Subscriber เคย Subscribe เอาไว้ ก็จำทำการส่ง “Message” ไปให้กับ Subscriber

MQTT Topics

Topics ของทั้งจาก Subscriber และ Publisher จะใช้หลักการเดียวกันในการตั้งชื่อ โดยในการตั้งชื่อ Topics จะมีวิธีการเขียนเป็นลำดับชั้น ดังนี้

  • จะมีการใช้ “/” เพื่อบอก Topics Level

EX: “home/living-room/temperature”

  • Single Level Wildcard “+”

EX: ถ้าบอกว่า “myHome/groundFloor/+/temperature”

ถูก “myHome/groundFloor/living-room/temperature”

ผิด “myHome/groundFloor/living-room/humidity”

  • Multi Level Wildcard “#”

EX: ถ้าบอกว่า “myHome/groundFloor/#”

ถูก “myHome/groundFloor/kitchen/temperature”

ผิด “myHome/firstFloor/kitchen/temperature”

MQTT QoS

MQTT QoS (Quality of Service) คือรูปแบบในการตรวจสอบคุณภาพของการสื่อสาร

Fire and Forget (QoS 0)

https://devopedia.org/mqtt

เป็นรูปแบบที่เหมือนกับ ส่งแล้วช่างมัน ก็คือ เมื่อ Publisher Publish Message ไปให้ Broker แล้วก็จะลบ Message นั้นทันที โดยไม่มีการตรวจสอบว่า ส่งไปได้หรือไม่ได้ จากนั้น Broker ก็จะ Publish ข้อมูลไปต่อที่ Subscriber

At Least Once (QoS 1)

เมื่อมีการส่ง Message ไปที่ Broker ตัว Broker ก็จะทำการเก็บข้อมูลนั้นไว้ก่อน แล้วก็ Publish Message ไปให้ Subscriber จากนั้นก็ส่ง PUBACK ไปให้ Publisher เพื่อยืนยันว่า Publish ไปเรียบร้อยแล้ว

ซึ่งกระบวนการนี้เป็นการยืนยันได้ว่า Broker ได้รับ Message จาก Publisher จริงๆ เพราะว่า ถ้า Broker ไม่ได้รับ Message ก็จะไม่สามารถส่ง PUBACK คืนไปได้ ทำให้ Publisher จะส่ง Message มาให้ Broker เรื่อยๆ จึงได้ชื่อว่า At Least Once คืออย่างน้อย Broker ต้องได้รับ Message แน่นอน 1 ครั้ง

ข้อเสียคือเนื่องจากมีการเพิ่มกระบวนการขึ้นมาทำให้ใช้เวลามากกว่า QoS 0

Exactly Once (QoS 2)

เป็นการเพิ่มการยืนยันการ Delete Message ที่ Store ใน Broker เพื่อช่วยยืนยันว่า Subscriber จะได้รับ Message 1 ครั้งถ้วนไม่ขาดไม่เกิน แน่นอน

โดยหลังจากที่ Broker ทำการ Publish ไปให้ Subscriber เรียบร้อยแล้ว ก็จะทำการ PUBREC เพื่อบอก Publisher ว่าได้ส่งไปให้ Subscriber เรียบร้อยแล้วทำให้ Publisher เลิกส่ง Message ไปหา Broker จากนั้น Publisher ก็จะส่ง PUBREL เพื่อบอกให้ Broker ลบ Message ที่ส่งแล้วทิ้ง เมื่อ Broker ลบ Message เรียบร้อยแล้ว ก็จะส่ง PUBCOMP เพื่อยืนยันว่าลบเรียบร้อยแล้ว ถึงจะจบการทำงาน

Using MQTT

ในส่วนนี้เราจะมาลองใช้งานตัว MQTT กันดูครับ

สามารถทำการ Install Mosquitto เพื่อใช้งาน MQTT บน Raspberry Pi ได้ด้วยคำสั่ง

sudo apt-get install mosquitto
sudo apt-get install mosquitto-clients

ทำการ Subscribe และ Publish ได้ด้วยคำสั่ง

mosquitto_sub -h localhost -t "topic"
mosquitto_pub -h localhost -m "message" - t "topic"

ทำการตั้งรหัสผ่านในการ Publish และ Subscribe เพื่อความปลอดภัยโดยใช้คำสั่ง

sudo mosquitto_passwd -c etc/mosquitto/passwd userName

ตั่งค่าให้รหัสผ่านของเราเป็น Default

sudo nano /etc/mosquitto/conf.d/default.conf

และพิมพ์ข้อความตามภาพด้านล่าง

จากนั้นทำการ Restart Mosquitto เพื่อให้ Password ทำงานด้วยคำสั่ง

sudo systemctl restart mosquitto

โดยสามารถ Subscribe และ Publish เมื่อมี Password ได้ดังนี้

mosquitto_sub -h localhost -t "topic" -u "userName" -P "password"
mosquitto_pub -h localhost -m "message" - t "topic" -u "usesrName" -P "password"

ลองทำการใช้ Paho MQTT เพื่อใช้งานภาษา Python กับ MQTT ในการส่งข้อมูล อุณหภูมิ

--

--

Natchapol Patamawisut
Natchapol Patamawisut

Written by Natchapol Patamawisut

Studying Computer Engineering at King Mongkut's University of Technology Thonburi

No responses yet