บทความ IoT
ไม่ว่าจะ ข่าวสาร บทสัมภาษณ์ และ Digital Skill บนสื่อ
มีให้คุณได้อ่านบทความดี ๆ มากมายแล้วที่นี่
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (4)
Asset/People Tracking using BLE Beacons — Scanner Setup IIสวัสดีคะ…… จากบทความที่แล้ว ( Scanner Setup I) เราได้ทำการ Setup Scanner ตาม 4 ขั้นตอนนี้ไปแล้ว1. Sign up and login2. Create an application3. Add a device and download the OS4. Flash your SD card and boot the deviceแต่เรายังไม่ได้เพิ่ม Environment Variables และ Deploy โค้ดค่ะ …งั้นเราไปต่อกันเลยค่ะ กับขั้นตอนที่ 5. Add application environment variables5. Add application environment variablesตรงนี้เราจะยังอยู่ในส่วนของ Application Configuration นะคะ เราจะเพิ่ม Application Environment Variables ตามนี้ค่ะ :beacon_serivce_uuid — <ใช้ uuid generator ทั่วไป generate ค่าได้เลยค่ะ>device_name — new_nodemqttClientId — clientIdmqttUsername — usernamemqttPassword — passwordmqttUrl — mqtt://gb.netpie.iotopicBeaconExit — /Beacon/gearname/scanner/beacon/exittopicBeaconStay — /Beacon/gearname/scanner/beacon/updateเสร็จจาก Application Environment Variables ก็ไปต่อที่ Device Environment Variables กันค่ะ ค่าต่างๆในส่วนของ Device จะ override ค่าที่ตั้งไว้ใน Application Environment Variables นะคะ ถ้าชื่อตรงกัน ซึ่งเราจะ override ตัวแปร 4 ตัวนี้ค่ะ :device_namemqttClientIdmqttUsernamemqttPassworddevice_nameสามารถเป็นชื่ออะไรก็ได้นะคะ ในบทความจะใช้ชื่อว่า Node A ละกันนะคะ เวลาดึงไปโชว์บนเวปจะได้เข้าใจง่ายค่ะ ว่าตัวไหนเป็นตัวไหนmqttClientId, mqttUsername, mqttPasswordส่วนสามตัวนี้ถ้าสังเกตุจากชื่อ mqtt* พอจะเดาได้ใช่มั้ยค่ะว่าต้องเกี่ยวข้องกะ MQTT ที่เราเคยพูดถึงกันไปแล้วแน่ๆ ในการเซทค่าเกี่ยวกับ mqtt ตรงนี้เราจะใช้ NETPIE เป็นตัวช่วยในการจัดการเกี่ยวกับ Ownership และ Authorization ค่ะ (อย่าเพิ่ง งง นะค่ะ ตามมาอ่านคำอธิบายด้านล่างกันค่ะ …)….เราจะ Pause เรื่องการเซทค่าตรงนี้แปบนึง ละไปคุยกันเรื่อง NETPIE กันก่อนคะ…NETPIE | Network Platform for Internet of EverythingNetwork Platform for Internet of EverythingNetwork Platform for Internet of Everythingnetpie.ioNETPIE — Network Platform for Internet of Everything เป็น Cloud Platform สำหรับเชื่อมต่ออุปกรณ์ หรือ Things ใน IoT ค่ะ (Distibuted MQTT Broker) มี Client Library ที่เรียกว่า Microgear ค่ะพัฒนาขึ้นมาโดย NECTEC และเปิดให้บุคคลทั่วไปใช้ได้ FREE ค่ะแต่ต้องลงทะเบียนและจัดการตัวตน(Ownership)และสิทธิ์ของแอปพลิเคชั่น (Authorization)และอุปกรณ์กันก่อน ซึ่งจะใช้ Client ID, Username และ Password ในการพิสูจน์ตัวตนก่อนเข้าใช้ NETPIE ซึ่งเป็นไปตามมาตรฐานของ MQTT 3.1.1 ค่ะClient ID มีไว้เพื่อให้ Broker ใช้ระบุตัวตนของ Client ดังนั้น Client ID จะต้องไม่ซ้ำกันค่ะUsername และ Password มีความจำเป็นสำหรับให้ Broker ใช้ในการ Authentication และ Authorization ซึ่งเป็นไปตามมาตรฐานของ MQTT 3.1.1 เช่นเดียวกันค่ะ…มาเริ่มใช้งาน NETPIE เพื่อนำมาเซทค่าให้mqttClientId, mqttUsername, mqttPassword กันค่ะ …เริ่มต้นสมัครและลงทะเบียนกันก่อนค่ะในส่วนของMobile Phone Number มีความสำคัญนะคะ เพราะจะใช้รับ OTP SMS ค่ะได้รับ OTP เสร็จ ก็จัดการ Login เลยค่ะ2. เริ่มสร้าง Application (AppID) ค่ะ ใช้ชื่อว่า Beacon3. สร้าง Application Key ค่ะตั้งชื่อ Application Key ว่า Scanner และเลือกใช้ Device Key นะค่ะNote: ข้อแตกต่างระหว่าง Device Key และ Session Key ค่ะDevice Key คือ Key ที่ใช้กับอุปกรณ์ Device Key ของอุปกรณ์จะถูกจำไว้ตลอดค่ะ ถึงแม้อุปกรณ์จะไม่ได้เชื่อมต่อกับ NETPIE แล้ว (Offline)แต่เมื่อมีการเชื่อมต่อกลับเข้ามาใหม่ จะถูกมองว่าเป็นอุปกรณ์ตัวเดิมค่ะSession Key คือ Key ที่ใช้กับอุปกรณ์ที่มีการใช้งานไม่ถาวรเช่น Browser ค่ะลองตรวจสอบข้อมูลและดูรายละเอียดของ Key ที่เราสร้างกันค่ะ ซึ่งประกอบด้วย Application Key NameKey สำหรับให้อุปกรณ์ใช้สำหรับเชื่อมต่อ NETPIESecret เป็นรหัสลับหรือรหัสผ่านที่อุปกรณ์ต้องใช้คู่กับ Key สำาหรับให้อุปกรณ์เชื่อมต่อ NETPIEREST API auth เป็น key ที่ใช้สำหรับการใช้งานด้วย REST API ค่ะถึงตรงนี้เราจะได้ AppID, AppKey, และ AppSecret มาแล้ว แต่ยังค่ะ… นี่ยังไม่ใช่สิ่งที่เราต้องการ เป็นแค่เพียงสารตั้งต้นค่ะ เราจะต้องนำ AppID, AppKey, และ AppSecret ไปทำการ generate ค่าของ ClientId, Username, และ Password ผ่าน netpie-auth (สามารถทำตามขั้นตอนได้เลยค่ะ ง่ายๆ…)netpie-authUsage $ netpie-auth
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (3)
Asset/People Tracking using BLE Beacons — Scanner Setup สวัสดีค่ะ จากบทความที่แล้วเราได้ทำความเข้าใจกับ Architecture และภาพรวมของระบบติดตามด้วย Beacon ที่เราจะทำกันไปแล้วนะคะ ในบทความนี้…..เราจะมาเริ่มทำ Scanner ด้วย Raspberry Pi (RPi)กันค่ะ ซึ่งเราจะใช้ balenaCloud ค่ะ เป็น Container-based Server Platform (เดิม resin.io) ในการ ช่วย manage & monitor ตัว Scanner และยังช่วย deploy โค้ดของเรา บน RPi ค่ะbalena.ioสิ่งที่เรากำลังจะทำในขั้นตอน Scanner setup นี้นะคะ…พระเอกของเราก็คือ balena นี่แหละค่ะ จัดการทุกอย่างให้น้องพาย น้องพายของเรามีหน้าที่แค่อยู่เฉยๆ รอเสียบปลั๊กจ่ายไฟแค่นั้นละค่ะเราจะใช้ balena เพื่อทำการติดตั้ง balenaOS บนน้องพายของเราค่ะและเราจะใช้ balena เพื่อ push โค้ดของเรา ขึ้นไปที่ balena server เพื่อทำการ deploy ค่ะและสิ่งที่ต้องมีค่ะ…..SD cardRaspberry Pi 3 B/B+balenaCloud accountbalenaCloudSign in to monitor and manage your device fleet from the balenaCloud dashboard.dashboard.balena-cloud.com4. โปรแกรมสำหรับ flash ค่ะ balenaEtcherbalenaEtcher - HomeA cross-platform tool for flashing images to SD cards & USB drives.www.balena.io…..มาเริ่มกันเลยคะ ……1. Sign up and loginเริ่มต้นด้วยการ Sign up for a free account กันก่อนค่ะ แต่ถ้าหากใครมี GitHub หรือ Google account แล้วก็สามารถข้าม Signup ไป Login ได้เลยค่ะ2. Create an applicationหลังจาก Sign up และ Login เข้ามาแล้ว จะเจอหน้า Dashboard ค่ะ จากนั้นก็ Create Application ค่ะ (Step 1)Create a new application(Step 2)ใส่ชื่อ Application Name ค่ะ (ตั้งชื่ออะไรก็ได้นะคะ เดี๋ยวเราจะเอาไว้ใช้ push โค้ดทีหลังค่ะ) แล้วเลือก Default Device Type ที่เราจะใช้ค่ะ น้องพาย 3 ของเราค่ะ Raspberry Pi 3 ส่วน Application Type เลือก Starter ค่ะ (สามารถเพิ่มได้ฟรี 10 Device ค่ะ) เสร็จแล้ว (Step3) คลิก Creatae New Application เลยค่ะ3. Add a device and download the OSหลังจากนั้น จะเห็นหน้า Application Dashbaord ค่ะ ในหน้านี้เราสามารถเพิ่ม Device ตามขั้นตอนในรูปข้างล่างนี้เลยค่ะ ถ้าหากเราจะให้ RPi เราเชื่อมต่อด้วย Wi-fi ก็อย่าลืมเปลี่ยน Network Connection เป็น Wifi + Ethernet และใส่ SSID/ Password ของ Wifi ด้วยค่ะ …เสร็จแล้วเลื่อนลงมาข้างล่างสุดเลยค่ะ ให้คลิก Download balenaOS เพื่อดาวน์โหลด belanaOS image ได้เลยค่ะbalena.ioในขั้นตอนนี้เราสามารถเพิ่ม RPi ได้มากกว่า 1 ตัวนะคะ ใน Application เดียวกัน Device ทุกตัวจะเแชร์โค้ดกันค่ะ และใช้ Dashboard เดียวกันค่ะ4. Flash your SD card and boot the deviceหลังจากได้ไฟล์ image จากขั้นตอนที่ 3 แล้วนะคะ เราจะ flash ลง SD card ที่เราเตรียมไว้ โดยผ่านโปรแกรมที่ชื่อ balenaEtcher ค่ะbalena.ioflash เสร็จก็นำ SD card เสียบลง RPi เลยค่ะ แล้วเสียบ power supply ให้ น้องพายเลยค่าbalena.ioหลังจากเสียบปลั๊กแล้วรอสักพักค่ะ 1–2 นาทีให้เวลาน้องพายเรา install ทุกอย่าง และเชื่อมต่อเข้ากับ balena server ค่ะระหว่างรอกลับมาหน้า Dashboard ของเรากันค่ะ หลังจาก RPi ทำการเชื่อมต่อกับ balena server แล้วเราจะเห็นว่ามีสิ่งนึงโผล่มาบนหน้า Dashboard เราค่ะ หน้าตาก็จะคล้ายๆรูปข้างล่างนี้เลยค่ะ ซึ่งก็คือน้องพายของเราเองค่ะ ถึงตรงนี้ถ้าเราเพิ่ม RPi ไปอีก(มากกว่า 1 ตัว) ก็จะมีจำนวน Device โผล่ขึ้นมาตามจำนวน RPi ของเราคะมาถึงตรงนี้จะเห็นว่า พายของเราในชื่อ silent-violet ได้ online บน balena เรียบร้อยแล้ว ถ้าคลิกเข้าไปดู ก็จะเห็นรายละเอียดของอุปกรณ์ตัวนี้เหมือนรูปข้างล่างค่ะsilent-violetในขั้นตอนต่อไป… เราจะทำการเพิ่ม Environment Variables ให้กับ Application ของเราค่ะ และเริ่ม Deploy โค้ดของเราบนพายกันค่ะ ซึ่งจะนำเสนอในบทความต่อไป… คอยติดตามนะคะอ้างอิงจาก Get started with Raspberry Pi 3 and Node.js
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (2)
Asset/People Tracking — An Introductionจากบทความที่แล้วเราพูดถึง Beacon Technology กันไป รวมไปถึง Use cases ต่างๆที่น่าสนใจในการนำเจ้าตัว Beacon มาใช้งาน ซึ่งเราจะมาทำ Proximity Beacon กันค่ะ ผู้เขียนจะหยิบ Use case สำหรับทำ Asset/People Tracking มาให้ทำกันค่ะ เนื่องจากได้ลองทำใช้จริงมาแล้ว และอยากจะนำแชร์ให้ผู้อ่านได้ลองทำกันค่ะก่อนอื่นขออธิบายเพิ่มเติมเกี่ยวกับ Asset / People Tracking โดยใช้ Proximity Beacon แบบย่อนิดนึงนะคะ เพราะว่าปัจจุบัน Beacon ถูกนำมาใช้ได้หลากหลายรูปแบบหลากหลายวิธี ไม่ว่าจะติด Beacon ไว้ที่ใดที่นึง (Fixed Beacons) อย่างเช่น ผนัง หรือว่า แบบที่ Beacon ถูกนำไปแปะกับสิ่งที่เราต้องการ Track (Roaming Beacons) ที่มีการเคลื่อนที่ได้ตลอดเวลาโดยปกติทั่วไปแล้วเนี่ย Beacon ถูกมาใช้แบบ Fixed Beacons ค่ะ คือนำมาติดไว้กับที่ ที่ใดที่นึง เช่น ผนัง หรือ เพดาน และใช้มือถือเป็นตัวรับสัญญาณ ซึ่งก็จะเหมาะกับเอาไว้ทำ Check-point ค่ะ เช่น เอาไว้เชคว่า รปภ เข้ามาเดินตรวจในพื้นที่แล้วหรือยัง ก็จะมีการเก็บข้อมูลตรงนี้ไว้ หรือ ในเคส โรงพยาบาล สามารถนำมาใช้ตามหาคุณหมอ หรือว่าพยาบาล ว่าอยู่ที่ไหนภายในตึก (ลองนึกว่าถ้าโรงพยาบาลมีหลายชั้น หลายแผนก การจะถามหาใครสักคน ถ้าไม่โทรถามก็น่าจะเป็นเรื่องยากใช่มั้ยค่ะ ) เมื่อมีเหตุฉุกเฉินเกิดขึ้นlighthouse.io — fixed asset beacons, roaming mobile devicesข้อดีคือ ง่ายในการติดตั้ง ประหยัด เพราะสามารถนำมือถือมาเป็นตัวรับสัญญาณ​ Beacon ได้เลยซึ่งก็จะมีข้อเสียว่า จำเป็นจะต้องใช้คนในการถืออุปกรณ์ตัวรับ เช่น มือถือ ไว้กับตัวตลอดเวลาจึงทำให้เกิดการเปลี่ยนวิธี (Approach) ในการนำ Beacon มาใช้งานค่ะ ด้วยการสลับกัน ระหว่าง Beacon (Roaming Beacons) และ ตัวรับ (Fixed Receiver/Scanner)lighthouse.io — fixed BLE scanners, roaming asset beaconsข้อดีคือ ไม่จำเป็นต้องใช้มือถือเป็นตัวรับสัญญาณค่ะ และสามารถติดตาม (Track) Beacons ได้ทีละหลายตัวๆ แบบ Real-time ค่ะอาจจะมีข้อเสียตรงที่ เนื่องจากเราใช้ตัวรับแบบติดผนัง อาจจะทำให้มีค่าใช้จ่ายในการติดตั้ง ในการจัดสรรระบบไฟให้กับตัวรับค่ะ แต่ก็แลกมาด้วยการที่เราจะได้รับข้อมูลเสถียรขึ้น ซึ่งก็ถือว่าคุ้มค่ะ….ทีนี้ลองมาดูระบบที่เราจะทำกันคร่าวๆก่อนนะคะ…. เราจะใช้วิธีแบบ Fixed Scannerห & Roaming asset Beacons นะคะ เพราะเหมาะสมกะเคสใช้งานของเราค่ะAsset/People Tracking using BLE Beaconsเราจะติดตั้งพื้นที่ของเราด้วยตัวรับ(Scanner) โดยใช้ RasperryPi ค่ะ เมื่อมี Proximity Beacon เข้ามารัศมี ที่ตัวรับสามารถ Detect เจอ ตัวรับก็ทำการส่งข้อมูลผ่าน MQTT ไปยัง NETPIE ซึ่งเป็น Cloud Platform ค่ะ (รายละเอียดเพิ่มเติมในบทความถัดไปนะคะ) และส่งไปยัง Server ของเราค่ะที่ Server เราจะนำข้อมูลเหล่านี้มาคำนวณหาระยะทาง เพื่อให้แน่ใจว่าสามารถระบุตำแหน่งให้ถูกต้องแม่นยำที่สุด (จะเห็นว่า รัศมีของตัวรับ มีการทับซ้อน (Overlap)กันอยู่ค่ะ จึงต้องนำมาคำนวณว่า Beacon อยู่ในพื้นที่ของตัวรับตัวไหนค่ะ )และเก็บไว้ที่ Database(sqlite) ค่ะ ซึ่งจะมีการนำข้อมูลเหล่านี้มานำเสนอบนหน้าเวปของเราค่ะส่ิงที่ต้องใช้ค่ะ (Hardware)Server ค่ะ เราจะใช้เป็นที่เก็บข้อมูล และ สำหรับทำ Web server ค่ะBeacon ค่ะScanner ค่ะ — ในบทความนี้เราเลือกใช้ Raspberry Pi 3 B/B+ ค่ะ เพราะมี On Board BluetoothRaspberry Pi 3 Bsource: radius networksในบทความนี้เราเลือกใช้ RadBeacon Dot ของ Radius Networks ค่ะ ซึ่งมีขนาดเล็ก และรองรับiBeacon™ (Apple)Eddystone™(Google)และที่สำคัญเลยมี Configuration App ให้ใช้ค่ะ ง่าย และ สะดวกดีค่ะ สามารถใช้ได้ทั้ง ios และ android ค่ะเตรียมอุปกรณ์กันครบแล้วใช่มั้ยค่ะ งั้นเราตามไปดูวิธีติดตั้ง Scanner และ Server ในบทความถัดไปได้เลยค่ะอ้างอิงจาก 6 ways to use BLE beacons for people and asset tracking
โดย: Laris
| IoT
สิ่งเล็กๆที่เรียกว่า Beacon (1)
Bluetooth Low Energy Beacon Technology — An Introductionหลังจากที่เราได้ทำความรู้จักกับ MQTT หนึ่งใน Protocol สำคัญสำหรับ IoT ได้ลองเล่นกับ บอร์ด ESP32 และ Arduino IDE และได้ลองทำ Home Automationในบทความของ Home Assistant กันไปแล้ว ในบทความนี้เราจะมาเริ่มทำความรู้จักกับ Location-Based Technology โดยใช้เจ้าตัวเล็กๆ สิ่งนึงที่เรียกว่า Beacon กันค่ะ และเราจะมาลองทำ Proximity Detection using Bluetooth Low Energy Beacons กันค่ะ แต่ก่อนอื่นมาทำความรู้จักกับเจ้า Beacon ที่ว่ากันก่อนค่ะWhat is a Beacon?Beacon คืออุปกรณ์ขนาดเล็กชนิดนึงค่ะ (เล็กพอๆกับขนาดของนาฬิกาข้อมือได้เลยค่ะ) ที่สามารถส่งสัญญาณไร้สาย แบบ Bluetooth Low Energy (BLE) ไปยังอุปกรณ์ในระยะใกล้ๆที่เปิดการเชื่อมต่อ Bluetooth ไว้ค่ะ อย่างเช่น Smart Phone ค่ะsourceซึ่งก็มีหลายเจ้าที่พัฒนาตัว Beacon ขึ้นมาหลากหลายรูปทรง หลากหลายขนาดตั้งแต่ขนาดเท่า Coin Cell battery ไปถึงขนาดเท่าบัตรเครดิต เพื่อให้เหมาะสมกับวัตถุประสงค์ในการใช้งานค่ะ ก็จะมีทั้งแบบที่ใช้พลังงานจากแบตเตอรี่ และที่ไม่ต้องใช้แบตเตอรี่ เช่น USB และ Ambient Electromagnetic Waves ที่ดักจับคลื่นวิทยุรอบๆตัวเรามาใช้เป็นพลังงานค่ะ …source : IT Craftแล้ว Bluetooth(Bluetooth Classic) ที่เราคุ้นเคย คุ้นหู รู้จักกันมานาน กับ Bluetooth Low Energy (BLE) ใช่ตัวเดียวกันรึป่าวนะ?ถ้าพิจารณาตาม Standard ที่ถูกกำหนดขึ้นมาโดย Bluetooth Special Interest Group (SIG) แล้ว Bluetooth และ BLE (หรือที่รู้จักกันในชื่อ Bluetooth 4.0) ถือว่าเป็นพี่น้องกันนะค่ะ ใช้คลื่นความถี่เดียวกันที่ 2.4 GHz (ISM Band) และเป็นความถี่เดียวกันกับ Wi-Fi ค่ะ แต่ BLE ถูกออกแบบมาเพื่อให้ประหยัดพลังงานกว่าพี่ Bluetooth เยอะเลยค่ะ เพื่อให้เหมาะสมกับอุปกรณ์ที่เชื่อมต่อใน IoT ค่ะเทคโนโลยี BLE ช่วยให้ประหยัดพลังงานได้ยังไง ?source :plugintoiotง่ายๆเลยค่ะ BLE เป็นพวกขี้เกียจค่ะ จะอยู่ใน Sleep mode เกือบจะตลอดเวลา เพื่อเป็นการประหยัดพลังงานค่ะ จะตื่นขึ้นมาก็ตอนที่จะต้องทำการเชื่อมต่อเพื่อส่งข้อมูล ซึ่งข้อมูลพวกนี้ส่วนใหญ่ก็จะเป็นข้อมูลเกี่ยวกับ State ของตัว Beacon เอง ไม่ได้มีขนาดใหญ่มาก และไม่จำเป็นต้องตื่นเพื่อทำการส่งข้อมูลต่อเนื่องตลอดเวลา .. เห็นมั้ยค่ะว่าเค้าออกแบบมาเพื่องาน IoT จริงๆ….. ไม่เพียงแต่ Beacon เองที่ประหยัดพลังงานนะคะ การเชื่อมต่อของมือถือแบบ BLE ยังช่วยให้มือถือ ประหยัดพลังงานได้มากกว่าการเชื่อมต่อกับ Wifi ด้วยค่ะHow does a beacon work?หน้าที่หลักของ Beacon คือ Broadcast สัญญาณ ที่เรียกว่า Advertisement ซึ่งก็จะเป็นไปตาม Standard ของ Bluetooth protocols ที่กำหนดโดย Bluetooth SIG ลองคิดตามนะคะ….นั่นหมายความว่า Beacon พวกนี้สามารถเชื่อมต่อได้กับ Smart Phone/Device ทั่วโลก เพียงแค่ Smart Phone/Device พวกนี้เปิดการเชื่อมต่อแบบ Bluetooth ไว้BLE Beacon Use Casesเมื่อ Smart Phone รับและอ่าน Advertisement แล้ว จะมีอะไรเกิดขึ้นกับ Smart Phone… ก็จะขึ้นอยู่กับจุดประสงค์ของผู้พัฒนาค่ะ ลองมาดูกันค่ะ ว่าเค้าใช้ Beacon ทำอะไรกันบ้างProximity Beaconการ Beacon มาใช้งานในแบบ Proximity ทั่วไปแล้ว หลังจากได้มือถือเราได้รับ Advertisement จาก Beacon จะมี Notification ขึ้นมาค่ะ เพื่อนำไปสู่หน้าเวปที่ถูกกำหนดไว้ (Physical Web) หรือ เปิดแอป บนมือถือค่ะ ซึ่งได้รับความนิยมในการนำมาทำ Promotion ค่ะ เพียงแค่เดินผ่านหน้าร้านที่ติดตั้ง Beacon ไว้ สมาร์ทโฟน ของเราก็อจะได้รับแจ้งเตือนเกี่ยวกับโปรโมชันของร้านนั้นๆ ผ่าน Notification ค่ะApple ได้เปิดตัว iBeacon ด้วยการนำมาใช้ติดตั้งใน Apple Store ทั่วประเทศในอเมริกา เพื่อให้ลูกค้าสามารถเข้าถึงรายละเอียดของสินค้าที่วางขายได้ง่ายๆ ผ่านมือถือของลูกค้าเองในบ้านเราก็นำมาใช้นะคะ เช่น Tesco Lotus เริ่มติดตั้งเทคโนโลยี Beacon ในห้างสรรพสินค้า เพื่อส่งตรง ข้อมูล ส่วนลด และ สิทธิประโยชน์ต่างๆ เข้าสมาร์ทโฟนของลูกค้าที่เข้ามาจับจ่ายซื้อของ เพียงแค่ดาวน์โหลดแอปและเปิดการเชื่อมต่อ Bluetooth เอาไว้Central และ Robinson ก็ได้นำ LINE Beacon มาใช้เป็นช่องทางนึงของการตลาดเหมือนกันค่ะ ด้วยการเพิ่ม LINE Official Account ของ Central และ Robinson ระหว่างที่เราเดินช้อปปิ้ง เราก็จะได้รับคูปองส่วนลด และโปรโมชั่นส่งเข้ามาให้ถึงมือเลยค่ะนอกจากห้างสรรพสินค้าแล้ว โรงพยาบาลเองยังนำเทคโนโลยี Beacon มาใช้เพื่อเพิ่มประสิทธิภาพด้านดูแลสุขภาพและการบริการให้กับผู้มารับบริการที่โรงพยาบาลค่ะจะเห็นว่า Beacon Technology สามารถนำไปประยุกต์ใช้ได้หลากหลายประเภทธุรกิจมากค่ะIndoor Guidanceจุดเด่นของเทคโนโลยี Beacon อีกอย่างนึงคือ สามารถบอกระยะห่าง ระหว่าง Beacon และตัวรับได้ค่ะ ซึ่งตัวรับ หรือ Smart Phone จะเป็นตัวคำนวณระห่างนี้โดยใช้ ความแรงของสัญญาณ ซึ่งส่วนใหญ่จะถูกนำมาใช้ในงาน Indoor Navigation ค่ะ เพราะระบบสามารถระบุตำแหน่งของเราได้ เหมาะสำหรับการประยุกต์ใช้กับอาคารขนาดใหญ่มีหลายชั้น หลายแผนก เช่น ห้างสรรพสินค้า สนามบิน หรือแม้แต่ในงานนิทรรศการต่างๆ พิพิธภัณฑ์ เราก็สามารถนำมาความ User Experience ให้กับผู้ใช้ได้ค่ะ และยังสามารถนำไปใช้ร่วมกับ Proximity Feature ได้ค่ะAsset/People Trackingsource : Lighthouse.ioเราสามารถนำ Beacon ไปติดไว้กับ Asset หรือ คน ที่เราต้องการจะ Track ได้ค่ะ ซึ่งค่อนข้างจะดีกว่า RFID เพราะไม่จำเป็นต้องมีคนมามาค่อยแสกนอ่าน Tag ระบบสามารถหา Beacon เจอได้เอง ถ้า Beacon เข้ามาอยู่ในระยะที่ตัวรับ รับสัญญาณได้ ซึ่งตัวรับก็จะส่งข้อมูลต่อไป เพื่อนำไปใช้ตามวัตถุประสงค์ที่ต้องการได้ค่ะTelemetry Data for IoT Sensorsนอกเหนือจาก 128-bit ProximityUUID เราสามารถเพิ่มข้อมูลที่เป็น Telemetric Data เข้าไปใน Advertisementได้ค่ะ อย่างเช่น อุณหภูมิ ค่าแบตเตอรี เพื่อส่งข้อมูลให้ตัวรับต่อไปค่ะ ซึ่งก็จะเป็นการเพิ่มขีดความสามารถของ IoT Sensors และ Beacon ค่ะเทคโนโลยี Beacon ยังมีความสามารถอีกเยอะแยะมากมายที่เราสามารถนำไปประยุกต์ใช้ได้อีกค่ะ เช่น ยกระดับงานบริการ นำมาเป็นพนักงานต้อนรับ หรือ พนักงานแนะนำสินค้า/ส่วนลด/คูปอง เพื่อเพิ่มยอดขายได้ การนำ Beacon มาใช้ทำบัตรคิวสำหรับสถานที่ราชการหรือธนาคาร เพียงแค่เข้าไปอยู่ในรัศมีที่รับสัญญาณจาก Beacon ก็สามารถรับบัตรคิวผ่านแอป หรือผ่านมือถือได้ง่ายๆค่ะข้อดีอีกอย่างหนึ่งของ Beacon คือการให้ข้อมูลทางสถิติค่ะ อย่างเช่น ในโรงงานอุตสาหกรรม การเก็บข้อมูลโดยการ Track พนักงานในโรงงาน เราสามารถรู้ได้ว่า พนักงานใช้เวลาส่วนใหญ่ในส่วนไหนของการผลิต ส่วนไหนที่ยังขาดพนักงาน ซึ่งเราสามารถนำข้อมูลทางสถิติตรงมาวิเคระห์ เพื่อจัดสรรทรัพยากรบุคคลให้เหมาะสมกับรูปแบบการทำงานของสถานประกอบการได้ค่ะ … และในบทความถัดไปเราจะมาทำระบบ Tracking โดยใช้ Proximity Beacon และลองนำข้อมูลที่ได้มาแสดงผลกันค่ะ
โดย: Laris
| IoT
รู้จัก Home Assistant (ตอนที่ 4)
สวัสดีค่ะท่านผู้อ่านทุกท่านวันนี้เราจะกลับมาพบกับ Home Assistant กันอีกครั้งนะคะ จากบทความก่อน เราเริ่มติดตั้งและปรับแต่งกันไปบ้างแล้ว อย่างเช่นพวกสวิตซ์ (Switch) เปิดปิดไฟต่างๆ มีใครพอจะนึกออกบ้างไหมคะว่าถ้าเรามีสวิตช์ หลอดไฟ หรือเซ็นเซอร์ จำนวนมากๆ มันจะเป็นเกิดเหตุการณ์ยังไง? ถ้าใครนึกไม่ออกลองดูภาพข้างล่างนี้ค่ะภาพตัวอย่างของ Sensor ที่ไม่มีกลุ่มค่ะเข้าใจเลยใช่ไหมคะว่าถ้าเรามีจำนวนอุปกรณ์มากๆ หรือถ้าเราต้องการจัดหมวดหมู่ของอุปกรณ์ โดยแบ่งกันไปเป็นห้อง หรือชั้นต่างๆ หากอุปกรณ์มีเยอะมากๆ ก็คงจะปวดหัวน่าดูเลยนะคะ Home Assistant Group Componentวันนี้เรามาเรียนรู้วิธีการจัดการเรื่องพวกนี้ด้วย Group กันนะคะ หน้าตาของ Group ก็จะหน้าตาประมาณนี้ค่ะ สวยงามตามท้องเรื่องตัวอย่างของ Home Assistant ที่มีการจัด Groupสำหรับบทความนี้ Group เป็นสิ่งที่จะมาช่วยเราแก้ปัญหาและอัพเกรดเลเวลของเราเพิ่มขึ้นค่ะ แต่เราจะต้องมารู้จัก Home Assistant เพิ่มขึ้นกันอีกนิดนะคะ ซึ่งสิ่งที่เราจะต้องเรียนรู้กันต่อไปก็คือ Entities, Groups และ Viewsค่ะเริ่มต้นสร้าง Groupก่อนที่เราจะสร้าง และเพิ่มอุปกรณ์เข้าไปใน Group นั้น เราต้องเข้าใจ Default groups กันก่อนนะคะ เดี๋ยวจะงงกันไปก่อน ว่าทำไมหลอดไฟ (Light) ของสวิตช์ (Switch) ของเราไปโผล่ใน Group ได้ยังไง?Default groupsใน Home Assistant จะมี Default Group ด้วย ซึ่งบาง Component จะสร้าง Group พิเศษขึ้นมาซึ่งทั้งหมดจะขึ้นต้นด้วยชื่อแบบนี้ group.all_ ซึ่งหน้าตาก็จะประมาณข้างล่างนี้ค่ะgroup.all_switchesgroup.all_lightsgroup.all_devicesgroup.all_scriptsGroup.all_automationsซึ่งเราสามารถดูได้จากกด Developer Tools → Statesแสดงข้อมูล Entity ทั้งหมดจากกลุ่ม Lightเมื่อเราใช้งาน Component ประเภทหลอดไฟ (Light) หรือประเภทสวิตช์ (Switch) มันจะถูกเพิ่มเข้าไปใน Group ประเภทของตัวเองอัตโนมัติ (Lights, Switches) แต่อาจจะเรียงลำดับไม่ถูกใจเรา ถ้าอยากให้จัดเรียงอยู่ตำแหน่งให้ได้ดั่งใจ ให้ใช้ order เข้ามาช่วยตาม Configuration ข้างล่างเลยนะคะhttps://gist.github.com/hassy-bloggy/bbc510167417755ecdd547366c95dc17การแสดงผลจาก Group Switchโดยปกติแล้วทุกๆ Group จะถูกเรียกมาให้แสดงในแท็ป HOME ค่ะ แต่หากว่าเรามีการสร้าง default_view และ view: true ภายใต้ Group จะถือว่าเราต้องการสร้างหน้า Home เองทั้งหมด (Override หน้า Home เดิม)เมื่อได้ข้อมูลดังนี้แล้วเราลองเล่นในแบบต่างๆ ตาม Configuration นี้ดูนะคะhttps://gist.github.com/hassy-bloggy/5beb3c0dd7acdc869728c8840f79a7d8ผลลัพธ์จะออกแบบมาเป็นหน้า Application ที่มี Tab โผล่มาอีก 2 อันคือ Room 1 และ Room 3 ส่วน Room 2 จะไม่แสดงเป็น Tab แต่จะแสดงเป็น Group ในหน้า Default View แทนอย่าเพิ่งงงนะคะ เรามาดูภาพกันดีกว่าค่ะ ซึ่งเราจะได้ผลลัพธ์ออกมาแบบนี้เมื่อเราปรับ Configuration ในส่วนที่เป็น default_view แล้วกำหนด view: truegroup: default_view: view: true icon: mdi:home entities: - group.room_2 - light.mock_laris_light_00a - light.mock_laris_light_00b - switch.laris_plug_00aUI แสดงผลตาม Configuration ของหน้า Homeหลังจากพูดถึงหน้า default_viewไปแล้ว เราก็จะมาดูค่า Configuration ของ แท็บ Room 1 กันบ้างนะคะ แทบจะเหมือนกันเลย เพียงแค่ตั้งค่า view: trueเพื่อให้แสดงเป็น Tab ขึ้นมาอีกหนึ่งอันข้างบนRoom 1: view: true entities: - light.mock_laris_light_00c - light.mock_laris_light_00d - switch.laris_plug_00bUI แสดงผลตาม Configuration ของหน้า Room 1จะเห็นว่าเราสามารถสร้าง Tab ใหม่ได้ง่ายๆ โดยการกำหนด view: trueเราก็จะได้หน้า หรือ Tab ใหม่ขึ้นมาเลยEntity Idแต่ทำมาถึงตรงนี้สงสัยกันมั้ยคะว่าจะเอาชื่อ Entity Id มาใส่ Configuration ได้จากที่ไหน?คำตอบอยู่ที่ไอคอน State <>หลังจากกดเข้ามาหน้า State แล้วเราจะพบกับ Entity Id ของทุกอุปกรณ์ใน Home Assistant ของเราค่ะหน้า Developer Tools → State แสดง Entity Id ของระบบในหน้า Developer Tools จะบอกชื่อ Friendly Name และ Entity Id เราก๊อบส่วนที่เป็น Entity Id มาใช้ได้เลยค่ะ เมื่อเอามาทำ Group เราก็จะได้ Configuration ออกมาประมาณนี้ (แบบข้างบนเลยค่ะ)group: default_view: view: true icon: mdi:home entities: - light.mock_laris_light_00a - light.mock_laris_light_00b - switch.laris_plug_00a - group.room_2 Room 1: view: true # icon: mdi:ninja entities: - switch.laris_plug_00b - light.mock_laris_light_00c - light.mock_laris_light_00d Room 2: view: false entities: - switch.laris_plug_00b - light.mock_laris_light_00c - light.mock_laris_light_00d Room 3: view: true entities: - group.room_2 - light.mock_laris_light_00aเป็นยังไงกันบ้างคะ หลังจากที่เราปรับแต่ง Group กันไปอย่างเข้มข้นแล้ว ตอนนี้ Smart Home App เราคงจะมีสีสัน และน่าสนใจมากขึ้นแล้วใช่ไหมคะคราวหน้าเราจะเริ่มไปลุยกันเรื่องอื่นกันบ้างแล้วนะคะ แล้วพบกันตอนหน้าค่ะ
โดย: Laris
| IoT
รู้จัก Home Assistant (ตอนที่ 3)
สวัสดีค่ะ หลังจากที่คราวที่แล้ว พูดถึง MQTT และ Home Assistant และ MQTT Connector กันไปบ้างแล้ว วันนี้เราจะมาพูดถึงในส่วนของการส่งข้อมูลจากอุปกรณ์ และนำไปแสดงผลใน Home Assistant กันนะคะหลังจากที่ทบทวนการปรับแต่งโค๊ดกันในส่วนข้อมูลของอุปกรณ์ และข้อมูล MQTT กันไปแล้ว คราวนี้เราจะมาเชื่อม Hardware ของเราเข้ากับ Home Assistant กันคะกลับมาที่ฝั่ง Arduino ให้เปิดตัวอย่าง basic_mqtt เพื่อเริ่มต้นทบทวนบทความที่ผ่านมากันนะคะFile → Examples → CMMC MQTT Connector → basic_mqttเริ่มจากทบทวนของเก่ากันก่อนให้เราใช้ Library CMMC MQTT Connector กันเหมือนเดิม แก้ Device Name และ MQTT และ Prefix กันก่อนค่ะ_config.h หน้าจอปรับแต่งข้อมูล MQTTหลังจากนั้นก็เข้า HomeAssistant เพื่อปรับแต่งค่า MQTT ให้เหมือนกันค่ะ เริ่มเข้าผ่านทางหน้า Configuration → Integrationsได้เลยเลือก MQTT และกด Configureปรับแต่งค่า Brokerหลังจากนั้นเราก็ไปปรับแต่งค่าใน configuration.yaml เพื่อให้รองรับการเปิด-ปิดหลอดไฟค่ะ โดยเราจะกำหนดค่าตามข้างล่างนี้คะsource codeหลังจากนั้น ก็เปิด HomeAssistant ขึ้นมาก็จะเจอ UI สำหรับเปิดปิดหลอดไฟโผล่ขึ้นมาค่ะ เท่านี้เราก็จะควบคุมอุปกรณ์ผ่านหน้าเว็ปกันได้แล้วนะคะการแสดงผลของ Home Assistant บน iOSลองสั่ง เปิด — ปิด ไฟกันดูก่อนค่ะ ซึ่งทางผู้เขียน จะใช้ mosquitto-clients เข้ามา monitor ข้อมูลที่วิ่งไปวิ่งมาระหว่าง อุปกรณ์ และ Broker ด้วยคำสั่งmosquitto_sub -t "MYAPP/#" -h broker.hivemq.com -vmosquitto_sub -t "MYAPP/#" -h broker.hivemq.com -vจะเห็นว่าเพียงไม่กี่ขั้นตอน เราก็สามารถเปิดปิดไฟผ่านแอปได้แล้วค่ะ ไม่ยากใช่มั้ยคะ ถ้าใครยังงงๆอยู่ เราค่อยๆไปกันเรื่อยๆนะคะ เดี๋ยวเราจะทำโจทย์ที่เป็นการประยุกต์ที่เห็นภาพขึ้นเรื่อยๆนะคะ คราวหน้าเรามาลองเล่นกับการจัด group และการแสดงผลค่าจาก Sensor กันค่ะ
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 6)
หลังจากที่ได้ทำความรู้จักกับอีกหนึ่ง Feature ใน MQTT — LWT หรือ Last Will Testment กันไปแล้วนะคะ จะเห็นว่า LWT สามารถเข้ามาช่วยเราจัดการกับการปัญหาการเชื่อมต่อขาดๆหายๆได้อย่างไร แล้วถ้าเอามาจับคู่กับ Retained Message ก็จะยิ่งช่วยเพิ่มประสิทธิภาพให้กับ MQTT ขึ้นมาอีกเยอะเลยค่ะ และในบทความที่แล้วเราก็ยังค้างกันอยู่ที่ Keep Alive ค่ะ ว่าคืออะไร เกี่ยวข้องกับ LWT Message ยังไง วันนี้มาทำความรู้จักกันค่ะMQTT Keep Alive เป็นอีก Feature นึง ของ MQTT ค่ะ ซึ่งมีบทบาทสำคัญเลยสำหรับ Mobile Network ค่ะอย่างที่ทราบนะคะว่า MQTT ใช้การเชื่อมแต่แบบ TCP/IP ซึ่งมีความน่าเชื่อถือสูง มีการการันตีว่าการส่งข้อมูลจะถึงมือผู้รับแน่นอน ไม่มีผิดเพี้ยนแต่…..ในระหว่างการเชื่อมต่อนี้(ระหว่าง Broker และ Client) อาจจะมีฝ่ายใดฝ่ายนึงเกิดหลุด sync กันไปค่ะ (out of synchronization) อย่างเช่น ถ้าเกิดฝ่ายใดฝ่ายนึงเกิด crash ขึ้นมา ไม่สามารถทำงานได้ตามปกติค่ะ โดยที่อีกฝ่ายไม่สามารถรับรู้ได้เลยว่า อีกฝั่งนึงนั้นได้ตายไปแล้ว ก็จะยังคงส่งข้อความไปให้เรื่อยๆ และรอรับ ACK Message ซึ่งสภาวะแบบนี้ใน TCP จะเรียกว่า half-open connection ค่ะ ซึ่งถือว่าเป็นปัญหาสำคัญเลยคะดังนั้น MQTT จึงได้นำ Keep Alive เข้ามาช่วยแก้ปัญหา half-open connection ตรงนี้ค่ะ หรืออย่างน้อยก็สามารถบอกได้ว่าเกิดภาวะ half-open connection ขึ้น Keep Alive จะช่วยเชคและการันตีว่าการเชื่อมต่อระหว่าง Broker และ Client นั้นยังเปิดอยู่Client จะเป็นคนกำหนด ค่า Keep Alive ซึ่งจะกำหนดไว้ในช่วงเริ่มแรกที่ทำการขอเชื่อมต่อกับ Broker ค่านี้มีหน่วยเป็นวินาทีค่ะ (สามารถตั้งค่าได้มากสุด 18 ชั่วโม 12 นาที 15 วินาที หรือ 65535 วินาที ค่ะ) ซึ่งการที่ Client เป็นคนกำหนด Keep Alive เองจะช่วยให้ Client สามารถปรับค่า Keep Alive ให้ตรงกับความแรงของสัญญาณเนทเวิคของตัวเองได้หลังจากทำการเชื่อมต่อ ในระหว่างนี้หาก Client ไม่ทำการส่ง Control Message ใดๆ เช่น PUBLISH, PINGREQ, หรือ DISCONNECT ให้กับ Broker ​ไม่เกินระยะเวลาที่กำหนดใน Keep Alive ตัว Broker จะยังไม่ถือว่า Client ได้ตัดขาดการเชื่อมต่อไป ยังถือว่าการเชื่อมต่อกับ Client นี้ยังเปิดอยู่ แต่ Client จะต้องส่ง PINGREQ ไปให้ Broker นะค่ะ (ไม่ใช่หายไปเลยนะ) ซึ่ง Client จะส่ง PINGREQ เมื่อไหร่ก็ได้ค่ะ ซึ่ง Broker เองก็ต้องตอบกลับด้วย PINGRESP นะคะ เพื่อที่จะให้ Client มั่นใจว่า ​Broker เองก็อยังอยู่ดีค่ะ ยังมีการเชื่อมต่อกับ Client อยู่แต่สำหรับ Broker หากว่าไม่มี Message หรือว่า PINGREQ จาก Client ส่งมาภายใน 1.5 * Keep Alive Period แล้วละก็ Broker จะทำการ Disconnect ไปเลยค่ะ และจะส่ง LWT Message ให้ค่ะ(ถ้า Client ได้กำหนด LWT ไว้นะคะ)โดยปกติแล้วใน MQTT ถ้า Broker เจอว่ามี half-open connection ค้างอยู่ Broker จะจัดการด้วยสิ่งที่เรียกว่า Client Take-over ค่ะ นั่นคือ Broker จะทำการ Disconnect การเชื่อมต่อก่อนหน้านี้กับ Cleint ตัวนี้ หลังจากนั้นก็จะทำการเชื่อมต่อให้ Client ตัวนี้ใหม่ค่ะ เพื่อให้มั่นใจว่าปัญหา half-open connection นี้จะไม่เป็นอุปสรรคต่อ Client ที่ถูก Disconnect ไป แล้วต้องการอยากจะกลับมา Connect ใหม่ค่ะอ้างอิงจาก MQTT Essentials Part 10: Keep Alive and Client Take-Over
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 5)
มาต่อกันกับอีก Feature นึง ของ MQTT ค่ะ ซึ่งก็คือ Last Will and Testament ค่ะเนื่องจาก MQTT มักจะถูกนิยมนำมาใช้ในเคสที่ Network ไม่มีความเสถียรสักเท่าไหร่ อย่างเช่น สัญญาณไม่แรงและแกว่งเป็นต้นค่ะ ในเคสที่สัญญาณไม่เสถียรแบบนี้ การเชื่อมต่อระหว่าง Broker และ Client ต้องมีปัญหาแน่นอนค่ะ บางครั้งการเชื่อมต่อก็อาจจะขาดหายไปดื้อๆแบบไม่ตั้งใจ ซึ่งอาจจะเกิดจากปัญหาที่ตัวสัญญาณเอง หรือ แบตเตอรีหมด และเป็นไปได้อีกหลายสาเหตุค่ะ การขาดหายของสัญญาณแบบนี้จะเรียกว่า Ungracefully Disconnect ค่ะ ไม่มีการแจ้งเตือนมาก่อนว่าจะ Disconnect ค่ะ เพราะปกติแล้ว ใน MQTT การจะ Disconnect (แบบมีมารยาท และ ตั้งใจที่จะตัดการเชื่อมต่อ) จะต้องมีการส่ง MQTT Disconnect Message ค่ะ เรียกอีกอย่างก็ Gracefully Disconnect ค่ะ ดังนั้น Broker จึงจำเป็นต้องทราบค่ะ ว่าการขาดหายของการเชื่อมต่อระหว่าง Broker และ Cleint นั้นเป็นการ Disconnect แบบไหน ตั้งใจ (Gracefully) หรือ ไม่ตั้งใจ (Ungracefully) เพื่อที่ Broker จะได้จัดการกับสถานการณ์ได้อย่างถูกต้องค่ะหากมีการเชื่อมต่อของ Client ตัวใดตัวนึงขาดหายไปแบบ Ungracefully ตัว Broker จะใช้ Last Will and Testament (LWT) แจ้งไปยัง Client อื่นๆที่เหลือ เพื่อบอกกล่าวว่า Client ตัวนี้ได้ Offline ไปแล้วค่ะClient แต่ละตัว สามารถฝาก Last Will Message ให้กับ Broker ได้ ในระหว่างที่เริ่มทำการ Connect กับ Broker ซึ่งตัว Last Will Message นี้ก็คือ MQTT Message ธรรมดาทั่วไปนี่แหละค่ะ ข้างในก็จะมี Topic, Retained Message Flag, QoS, และ Payload อย่างเช่นในรูป Fig 1 ข้างล่างค่ะFig 1. MQTT Connect MessageBroker จะรับฝาก Last Will Message ไว้จนกว่าจะมีการ Disconnect จาก Client นั้นๆค่ะ ซึ่งถ้าการ Disconnect เป็นแบบ Ungracefully ตัว Broker ก็จะทำการส่ง Last Will Message นี้ให้กับ Client ที่เหลือที่ได้ทำการ Subscribe ตรงกับ Topic ที่ระบุไว้ใน Last Will Message ค่ะ แล้วเคสไหนที่ Broker ถือว่าเปนการ Ungracefully Disconnect ลองมาดูกันค่ะ ว่ามีเคสไหนบ้างเมื่อ Broker เจอว่ามี Error เกิดขึ้นของ I/O หรือ Network เมื่อไม่มี Message ใดๆ จาก Client ส่งมาในช่วงเวลาที่กำหนด หรือ Keep Alive Period (Keep Alive คืออะไร? ในบทความถัดไป มาทำความรู้จักกันค่ะ….)เมื่อพบว่า Client ไม่มีการส่ง Disconnect Message มาให้ก่อนที่จะมีการปิดการเชื่อมต่อไปเมื่อ Broker เองเป็นคนตัดการปิดการเชื่อมต่อเนื่องจาก Error ของ MQTT Protocol เองแต่ถ้าหากมีการส่ง MQTT Disconnect Message — Gracefully Disconnect (Fig 2) ตัว Broker ก็จะลบ Last Will Message ที่เก็บไว้ให้ทิ้งค่ะFig 2. MQTT Disconnect Messageจะเห็นว่า LWT มีความบทบาทสำคัญในการแจ้งเตือน Client ตัวอื่นๆ โดยเฉพาะ Client ที่ได้ทำการ Subscribe ไว้กับ Client ตัวที่ได้ขาดการติดต่อไปแบบ Ungracefully DisconnectLWT มักจะถูกนำมาใช้คู่กับ Retained Message เพื่อทำการเก็บ State ล่าสุด(ของ Topic ใด Topic นึง) ของ Client ไว้ ถึงตรงนี้อาจจะยังนึกไม่ออกนะคะ ว่าจะเอา LWT และ Retained Message มาใช้เก็บ State ล่าสุดยังไง ลองมาดูตัวอย่างค่ะ…..Client1 เริ่มทำการเชื่อมต่อกับ Broker ด้วยการส่ง Connect Message ให้ Broker และ ใน Connect Message นี้ก็ระบุ payload ของ lastWillMessageไว้ว่า ‘Offline’ และ มีการเซท lastwillRetain ให้เป็น true และ มี lastWillTopic เป็น ‘client1/status’ (เลื่อนขึ้นไปดู ตัวอย่าง Connect Message ได้นะค่ะ — Fig 1)หลังจากทำการเชื่อมต่อเรียบร้อย Client ก็สามารถเริ่ม Publish ข้อความที่มี Payload ว่า ‘Online’ และ retaionFlag เซทเป็น true ไปที่ Topic ที่ตั้งไว้ตอนทำการเชื่อมต่อค่ะ (client1/status) ซึ่งในระหว่างนี้หากไม่มีการ Disconnect เกิดขึ้น Client ที่ได้ทำการเข้ามา Subscribe ใหม่ที่ Topic นี้ (client1/status) จะได้รับ Retained Message ที่มี Payload ว่า ‘Online’แต่หากว่าการเชื่อมต่อ ระหว่าง Client1 และ Broker มีการ Ungracefully Disconnect เกิดขึ้น Broker จะทำการ Publish LWT Message (ซึ่งมี Payload ว่า ‘Offline’) แทน Retained Message เดิม (ซึ่งมี Payload ว่า ‘Online’) นั่นหมายความว่าถ้ามี Client เข้ามา Subscribe หลังจากที่ Client1 ขาดการติดต่อไป จะได้รับ Message ที่มี Payload ว่า Offline ถึงตรงนี้แล้วพอจะนึกภาพออกแล้วใช่มั้ยคะ ว่าคู่บัดดี้ LWT Message และ Retained Message เข้ามาช่วยจัดการเกี่ยวกับ State ล่าสุดของ Topic ได้ยังไงในบทความถัดไป เราจะพูดถึงเรื่อง Keep Alive ค่ะ ซึ่งนี่ก็เป็น Feature เด่นอีกอย่างนึงของ MQTT ที่จะช่วยให้ Broker รู้ถึงสถานะของ Client ได้ค่ะ ว่า Online อยู่ หรือ Offline ไปแล้วอ้างอิงจาก MQTT Essentials Part 9: Last Will and Testament
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 4)
Message ที่ถูก Publish ใน MQTT จะไม่สามารถทราบได้ว่า Client ที่ Subscribe ไว้นั้น จะได้รับ Message หรือไม่ แต่ Client ที่เป็น Publisher นี้ รู้แน่นอนว่า Message ถูกส่งไปให้ Broker ได้ถูกรับเรียบร้อยแล้ว เช่นเดียวกัน Client ที่เป็น Subscriber เอง ก็ไม่สามารถจะรู้ได้ว่า Publisher จะส่ง Message มาให้เมื่อไหร่ (เพราะ Client จะไม่สามารถติดต่อกันได้โดยตรงค่ะ ต้องมี Broker มาคั่นกลาง) ซึ่งอาจจะแค่ไม่กี่วินาที หรือ อาจจะนานหลายชั่วโมง จึงมีการนำ Retained Message เข้ามาช่วยแก้ปัญหานี้ค่ะRetained Message ก็คือ MQTT Message นี่แหละค่ะ แต่ว่าจะถูก Publish มาพร้อมค่า retainFlag ที่ตั้งว่าไว้เป็น True ค่ะ ซึ่ง Broker จะทำการเก็บ payload และ QoS ของ Message สำหรับ Topic นี้ไว้ แล้วถ้ามี Client เข้ามาทำการ Subscribe ตรงกับ Topic ที่มี Retained Message เก็บไว้ Broker ก็จะส่ง Message นี้ ให้ Client โดยทันทีค่ะ ซึ่งในแต่ละ Topic นั้น Broker จะทำการเก็บ Retained Message ไว้แค่ค่าสุดท้ายค่าเดียวนะคะไม่เพียงแต่ Client ที่ทำการ Subscribe ใน Topic ที่ตรงกับ Retained Message ที่ Broker เก็บไว้นะคะ ถ้าหากว่า Client ทำการ Subscribe ใน Topic ที่มีเครื่องหมาย Wildcard (#) ร่วมใน Topic นั้นด้วย Client ก็จะได้รับ Retained Message ของ Topic นั้นเช่นกันค่ะตัวอย่างของการ RetainClient A ได้ทำการ Publish Retained Message ไปที่ Topic myhome/livingroom/temperature หลังจากนั้น Client B ได้เข้ามาทำการ Subscribe ที่ Topic myhome/# ทันทีที่ Subscribe เรียบร้อยแล้ว Client B จะได้รับ Retained Message (จาก Topic myhome/livingroom/temperature) ทันทีค่ะ ซึ่ง Client B สามารถรู้ได้ว่านี่คือ Retained Message โดยดูจาก retainFlag ที่ Broker ส่งมาให้ค่ะจะเห็นว่า ข้อดี ของ Retained Message ก็คือ การที่ Client สามารถรับรู้ได้ทันทีหลังจากที่ได้เข้ามาทำการ Subscribe ว่าตอนนี้ สถานะ ของ Topic นี้เป็นยังไง โดยที่ไม่ต้องรอให้ถึงจนกว่า Pusblisher จะทำการส่ง Message อีกครั้ง ซึ่ง Retained Message นี้ไม่จำเป็นว่าจะเป็น Message ล่าสุดที่ถูกส่งมานะคะ แต่ต้องเป็น Message ล่าสุดที่ถูกส่งมาพร้อมค่า retainFlag เป็น True ค่ะการลบค่าที่ระบบ Retain เอาไว้ถ้าหากว่าเราต้องการที่จะลบ Retained Message นี้ออก ก็ทำได้ง่ายๆเลยค่ะ เราแค่จัดการให้ Publisher ส่ง Message ที่ไม่มี payload (มี payload เป็น 0 Byte) พร้อมกับค่า retainFlag เท่ากับ True ค่ะ แค่นี้ Broker ก็จำทำการลบ Retained Message ของ Topic นั้นๆออกให้ค่ะ หลังจากนี้ Client ที่เข้ามาทำการ Subscribe ก็จะไม่ได้รับ Retained Message ค่ะการประยุกต์ใช้งานฟีเจอร์ RetainRetained Message เหมาะสมจะนำมาใช้เมื่อเราต้องการให้ Client ใหม่ ที่มา Subscribe ได้รับค่าอัพเดทล่าสุด อย่างเช่น เมื่อต้องการรู้ว่าอุปกรณ์นั้น Offline หรือ Online อยู่ค่ะ ถ้าหากไม่นำ Retained Message เข้ามาใช้ Client ก็จะต้องรอจนกว่าจะมีการ Publish อีกครั้งนึงค่ะ
โดย: Laris
| IoT
มารู้จัก MQTT Protocol กันดีกว่า (ตอนที่ 3)
บทความที่แล้วเราได้พูดถึงหนึ่งใน Feature สำคัญของ MQTT กันไปแล้วนะคะ ซึ่งก็คือ QoS หรือ Quality of Service ค่ะ และ ในช่วงท้ายๆของบทความ ได้พูดถึง Persistent Session แต่ยังไม่ได้อธิบายว่าคืออะไร บทความนี้ก็มาพูดถึงกันเลยค่ะถึงแม้ว่า MQTT (ตามคำนิยามแล้ว) ไม่ใช่ Message Queue แต่….. MQTT มีความสามารถที่จะทำ Message Queueing ได้ค่ะ ด้วยการใช้ Persistent Sessionหาก Client ต้องการรับ Message จาก Broker ตัว Client ต้องทำการเชื่อมต่อกับ Broker และ ทำการสร้าง Subscription ของ Topic ที่ตัว Client สนใจขึ้นมา ในระหว่างนี้ หากการเชื่อมต่อระหว่าง Client และ Broker มีปัญหาเกิดขึ้นทำให้การเชื่อมต่อมีข้อผิดพลาด และ ถ้าการเชื่อมต่อนั้นไม่ใช่แบบ Persistent Session จะทำให้ Client ไม่ได้รับ Message จาก Topic นั้นได้ ดังนั้น Client จำเป็นจะต้องทำการ Subscribe ใหม่อีกครั้งเมื่อมีการเชื่อมต่อกับ Broker ​ซึ่งการทำการเชื่อมต่อระหว่าง Broker และ Client ใหม่ซ้ำๆทุกครั้งที่มีปัญหาขาดการเชื่อมต่อย่อมทำให้เกิดปัญหา ยิ่งถ้าเรามีข้อจำกัดเรื่องอินเตอร์เนทอยู่ด้วยแล้วละก็ ปัญหาใหญ่แน่นอนค่ะ ดังนั้นเพื่อที่จะหลีกเลี่ยงปัญหานี้ ตัว Client จะต้องทำการเชื่อมต่อกับ Broker แบบ Persistent Session ค่ะการเชื่อมต่อแบบ Persistent Session นี้ จะช่วยเราเก็บข้อมูลทุกอย่างที่เกี่ยวข้องไว้บน Broker ค่ะ โดยจะใช้ ClientId เป็นตัวบ่งบอกว่า Session ไหนเป็นของ Client ตัวไหนข้อมูลต่างๆที่ Broker จะเก็บไว้ให้ Client ก็จะมีตามนี้เลยค่ะ (ถึงแม้ว่า Client จะ Offline ไป แต่เมื่อไหร่ที่ Client กลับมา Online ข้อมูลเหล่านี้ก็จะถูกจัดเตรียมให้ Client ทันทีเลยคะ)สถานะของ Session (ถึงแม้ว่าจะไม่มีการ Subscription)ข้อมูล Subscription ทุกอย่างของ ClientMessage (ที่ได้กำหนด QoS 1 หรือ 2) ต่างๆที่เกิดขึ้น และ Client ยังไม่ได้ทำการยืนยันMessage (ที่ได้กำหนด QoS 1 หรือ 2) ที่เกิดขึ้นใหม่ระหว่างที่ Client ได้ Offline ไปMessage (ที่ได้กำหนด QoS 2) ที่ได้รับจาก Client ที่ยังไม่ได้รับการตอบรับหาก Client ต้องการจะเชื่อมต่อแบบ Persistent Session กับ Broker ตัว Client สามารถทำได้โดยการกำหนดค่าของ cleanSession เพื่อบอกให้ Broker รู้ว่า Client ต้องการที่จะทำการเชื่อมต่อแบบไหน (Persistent Session หรือ Clean Session)ถ้าต้องการให้มีการเชื่อมต่อแบบ Clean Session ค่าของ cleanSession จะเป็น True ค่ะ ถ้าเกิดมีปัญหากับการเชื่อมต่อเกิดขึ้น ข้อมูลทุกอย่างก็จะหายไปค่ะ รวมไปถึง Message ที่ถูก Queue ไว้จาก Persistent Session ก่อนหน้านี้ก็จะหายไปด้วยค่ะตรงกันข้ามค่ะ ถ้าต้องการให้มีการเชื่อมต่อแบบ Persistent Session ค่าของ cleanSession จะถูกตั้งค่าให้เป็น False ตัว Broker ก็จะทำการสร้าง Persistent Session ให้ค่ะ ข้อมูลต่างๆ และ Message จะถูกเก็บไว้ให้โดย Broker จนกว่า Client จะขอทำการเชื่อมต่อแบบ Clean Session (ตั้งค่า cleanSession เป็น True) ค่ะ ถ้าเกิดว่ามีการขอเชื่อมต่อแบบ Persistent Session แต่ว่า ณ เวลานั้น Broker ได้ทำการเชื่อมต่อกับ Client เรียบร้อยแล้ว ในเคสนี้ Broker จะใช้ Session ที่เชื่อมต่ออยู่ และจะทำการส่ง Message ทั้งหมดที่เคย Queue ไว้ให้กับ Client ค่ะหลังจากที่การเชื่อมต่อแล้ว Client จะรู้ได้ยังไงว่า Broker ได้ทำการจัดเก็บข้อมูลต่างๆให้เราแล้ว …..Client สามารถรู้ได้จาก CONNACK Message จาก Broker ค่ะ ใน CONNACK จะมีข้อมูลเกี่ยวกับ sessionPresent ค่ะ ซึ่งก็จะบอกได้ว่า Session ที่ Client ได้ทำการเชื่อมต่อกับ Broker นั้นยังมีการเชื่อมต่ออยู่รึป่าว และยังสามารถใช้ได้อยู่รึป่าวMQTT CONNACK Messageไม่ใช่เฉพาะ Broker นะคะ ที่ต้องเก็บข้อมูลไว้ หากมีการเชื่อมต่อแบบ Persistent Session ตัว Client เองก็ต้องทำการเก็บข้อมูลไว้เหมือนกันค่ะ ซึ่งก็จะเก็บข้อมูลตามนี้ค่ะMessage (ที่ได้กำหนด QoS 1 หรือ 2) ต่างๆที่เกิดขึ้น และ Broker ยังไม่ได้ทำการยืนยันMessage (ที่ได้กำหนด QoS 2) ที่ได้รับจาก Broker ที่ยังไม่ได้รับการตอบรับการเลือกเชื่อมต่อกับ MQTT Brokerวิธีเลือกว่าจะทำการเชื่อมต่อ Client กับ Broker แบบไหนดี ระหว่าง Persistent Session กับ Clean Session ให้ลองพิจารณาตามนี้ค่ะจะเลือกใช้ Persistent Session เมื่อไหร่?เมื่อ Client ต้องการได้รับ Message ทั้งหมด จาก Topic ที่ได้ทำการ Subscribe ไว้ ไม่ว่า Client จะ Offline ไป Broker จะทำการ Queue ข้อความไว้ให้ และจะส่งให้ Client ทันทีที่กลับมา Onlineเมื่อ Client มีข้อจำกัดทางทรัพยากรที่มีผลกระทบต่อการเชื่อมต่อ แต่ต้องการให้ Broker เก็บ ข้อมูลการ Subscription ไว้ให้ และต้องการให้มีการกู้คืนเมื่อการเชื่อมต่อถูกรบกวนเมื่อ Client ต้องการที่จะ Publish ข้อความ (Qos 1 และ 2) หลังจากมีการกลับมาเชื่อมต่ออีกครั้งจะเลือกใช้ Clean Session เมื่อไหร่?ถ้าหาก Client (ที่เป็น Publisher) ต้องการแค่ Publish ข้อความClient (ที่เป็น Subscriber) ไม่ได้ต้องการที่จะ Subscribe และไม่ได้สนใจที่จะรับ Message ถ้าหากว่า Client เกิด Offline ไปBroker ไม่จำเป็นต้อทำการเก็บข้อมูลเกี่ยวกับ SessionBroker ไม่จำเป็นต้องพยายามส่ง Message (Qos 1 และ 2) อีกครั้ง เมื่อไม่สามารถส่ง Message ได้สำเร็จแล้ว Broker จะเก็บข้อมูลไว้ให้เรานานแค่ไหน?Broker จะทำการเก็บข้อมูลไว้จนกว่า Client จะกลับมา Online อีกครั้งและได้รับ Message ที่ไม่ได้รับในระหว่างที่ Offline ไปค่ะ ละถ้าเกิด Offline ไปเป็นเวลานานมากๆละ.. คำตอบก็คือ แล้วแต่เคสค่ะ โดยปกติแล้ว Memory ก็จะเต็มซะก่อน Message ที่ถูก Queue ไว้ก็จะถูกลบไปโดยปริยายค่ะหนักหัวต่ออีกนิดนะคะ แต่ก็ใกล้จะจบแล้วค่ะ ไว้คราวหน้าเราจะพูดถึงการเก็บข้อมูล หรือการ Retain ในระบบของ MQTT กันค่ะ แล้วพบกันนะคะ สวัสดีค่ะ

พบบทสัมภาษณ์ได้ที่นี่เร็ว ๆ นี้

พบDigital Skill บนสื่อ ได้ที่นี่เร็ว ๆ นี้