Full Stack AIoT Developer : Part 1 EP 3: IoT Devices and Raspberry Pi
สวัสดีครับ มาถึง EP ที่ 3 กันแล้วกับ Full Stack AIoT Developer ในครั้งนี้จะเป็นเรื่องพื้นฐานของการใช้งาน IoT Devices ต่างๆ การออกแบบ และ พื้นฐานการใช้งาน Raspberry Pi ซึ่งเป็น Single board computer ที่ทรงพลังมากในปัจจุบัน เราก็มาเริ่มกันเลยครับ
IoT
IoT หรือ Internet of Things คือการที่เราทำให้ Things หรือสิ่งของที่เป็น Physical ต่างๆ ให้สามารถรับรู้ และ สื่อสารได้ ซึ่งในการรับรู้ เราจะใช้สิ่งที่เรียกว่า Sensors และ ทำงานด้วย Actuators
Sensors
เป็นอุปกรณ์ที่ใช้ในการรับ 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)
เป็นรูปแบบที่ อุปกรณ์จะติดต่อระหว่างกันเองโดยตรง สามารถทำได้โดย
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 เรื่องด้วยกัน
- Secure Boot — คือการที่ต้องการจะ Load หรือ Update ข้อมูลอะไรก็ตาม จะต้องมีการทำ Authentication
- Authentication — จะต้องมีการยืนยัน Data Authentication, Device Identity
- Protected Ports — ต้องมีการป้องกัน Port ต่างๆที่สามารถเชื่อมต่อกับ Device ของเราทางกายภาพได้
- 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 ลักษณะ คือ
- Encryption
ทำการเข้ารหัสข้อมูล เพื่อไม่ให้คนอื่นๆสามารถอ่านได้
2. Digital Signature
เป็นการใช้ Key เป็นตัวยืนยันโดยจะใช้ Private Key ของผู้ส่งเป็นตัวเข้ารหัสข้อมูล ทำเป็น Signature แล้วส่ง Signature แนบข้อมูลไปด้วย ถ้าผู้รับใช้ Public Key ของเรา ทำการ Decode Signature ที่แนบมาด้วย แล้วได้ค่าทีไม่ตรงกับ ข้อมูลที่ส่งมา แปลว่าอาจจะมีคนแก้ไขข้อมูล
MQTT
MQTT หรือ Message Querying Telemetry Transport เป็น Network Protocol ที่มีน้ำหนักเบา สามารถใช้สื่อสารระหว่าง Device ได้ดี
MQTT สร้าง On Top ของ TCP/IP Protocol
MQTT Components
ในการรับส่งข้อมูลของ MQTT จะมี 3 องค์ประกอบด้วยกันคือ
- Broker
- Publisher
- Subscriber
โดยกระบวนการทำงานจะมีดังนี้
- Start Broker เพื่อทำตัวเป็น Server ตัวกลางระหว่าง Publishers และ Subscribers
- Subscribers ทำการ Subscribe “Topic” ที่เราต้องการกับ Broker
- Publisher ทำการ Publish “Message” ด้วย “Topic” ไปให้ Broker
- 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)
เป็นรูปแบบที่เหมือนกับ ส่งแล้วช่างมัน ก็คือ เมื่อ 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 ในการส่งข้อมูล อุณหภูมิ