คู่มือการใช้งาน netpie an official guide to...
TRANSCRIPT
คมอการใชงาน NETPIE
An Official Guide to NETPIE
คมอการใชงาน NETPIE - 2
เอกสารฉบบนเปนลขสทธของศนยเทคโนโลยอเลกทรอนกสและคอมพวเตอรแหงชาต
เอกสารฉบบนเผยแพรภายใตสญญาอนญาตแบบ
Creative Commons Attribution 4.0 International License
อนญาตใหน าผลงานไปใชได แกไขได ดดแปลงเนอหาได ใชในเชงพาณชยได โดยอางองทมา
ดรายละเอยดสญญาอนญาตท https://creativecommons.org/licenses/by/4.0/
เอกสารเวอรชน 2017-02-02
สามารถดาวนโหลดไฟลเอกสารนไดท https://netpie.io/tutorials
คมอการใชงาน NETPIE - 3
สารบญ
บทน า ...................................................................................................................................... 6
1. แนะน า NETPIE ............................................................................................................ 7
1.1. รจก NETPIE .......................................................................................................... 7
1.2. Microgear ............................................................................................................... 8
1.3. MQTT (MQ Telemetry Transport) ....................................................................... 11
แบบฝกหด: Local MQTT Chat บน Raspberry Pi .......................................................... 19
1.4. Authorization และ Authentication ใน NETPIE ................................................... 21
2. Getting Started ............................................................................................................ 25
2.1 การสมครสมาชก ................................................................................................. 25
2.2 การสรางแอปพลเคชน ........................................................................................ 26
2.3 การตดตงเครองมอพฒนา .................................................................................. 30
3. HTML 5 Microgear ...................................................................................................... 36
Lab 3.1: Hello NETPIE ................................................................................................... 36
Lab 3.2: HTMLChat ........................................................................................................ 38
Lab 3.3: Room Chat ....................................................................................................... 40
4. ESP8266 Microgrear .................................................................................................. 46
4.1 รจก ESP8266/NodeMCU ................................................................................... 46
Lab 4.1: NETPIE Blink ................................................................................................... 48
Lab 4.2: IoT Switch ........................................................................................................ 52
5. Freeboard .................................................................................................................... 57
Lab 5.1: การแสดงผลขอมลจากอปกรณเซนเซอรบน NETPIE Freeboard .................. 62
Lab 5.2: การควบคมอปกรณดวย NETPIE Freeboard .................................................. 68
6. NETPIE FEED ............................................................................................................ 74
6.1 การสราง FEED ................................................................................................... 74
คมอการใชงาน NETPIE - 4
6.2 การก าหนดสทธในการเขาถง feed ..................................................................... 76
6.3 การเขยนขอมลลงใน Feed ................................................................................. 78
6.4 การดงขอมลจาก feed มาใชงาน ........................................................................ 80
6.5 ขอจ ากดการใชงาน.............................................................................................. 89
Lab 6.1: การแสดงผลขอมลเซนเซอรดวย NETPIE Feed ............................................. 89
7. NETPIE REST API ..................................................................................................... 94
7.1 REST API ............................................................................................................ 94
7.2 NETPIE REST API .............................................................................................. 94
Lab 7.1: HTML HTML .............................................................................................. 97
Lab 7.2: HTML NodeMCU ..................................................................................... 101
Lab 7.3: KKMC IoT ...................................................................................................... 105
8. NETPIE Secure Connection ..................................................................................... 109
Lab 8.1: สราง Secure Connection ระหวาง NodeMCU และ HTML5 ......................... 111
ภาคผนวก NETPIE Microgear Reference Guide .............................................................. 118
1. ESP8266-Arduino Microgear .................................................................................... 118
1.1 ความเขากนได ................................................................................................... 118
1.2 พอรตสอสาร ..................................................................................................... 118
1.3 การตดตง ........................................................................................................... 118
1.4 ขอจ ากดทพบ .................................................................................................... 119
1.5 ตวอยางการเรยกใช ........................................................................................... 119
1.6 การใชงาน library............................................................................................... 122
2. Arduino-Ethernet Microgear ..................................................................................... 126
2.1 ความเขากนได ................................................................................................... 126
2.2 ตวอยางการเรยกใช ........................................................................................... 126
2.3 การใชงาน library............................................................................................... 128
3. Node.js Microgear ..................................................................................................... 132
คมอการใชงาน NETPIE - 5
3.1 พอรตสอสาร ..................................................................................................... 132
3.2 การตดตง ........................................................................................................... 132
3.3 ตวอยางการเรยกใช ........................................................................................... 132
3.4 การใชงาน library............................................................................................... 133
4. HTML5 Microgear ..................................................................................................... 138
4.1 การรองรบ ......................................................................................................... 138
4.2 พอรตสอสาร ..................................................................................................... 139
4.3 การตดตง ........................................................................................................... 139
4.4 ตวอยางการเรยกใช ........................................................................................... 139
4.5 การใชงาน library............................................................................................... 140
5. Python Microgear ...................................................................................................... 144
5.1 การตดตง ........................................................................................................... 145
5.2 ตวอยางการเรยกใชงาน .................................................................................... 145
5.3 ตวอยางเพมเตม ................................................................................................ 145
5.4 การใชงาน library............................................................................................... 145
6. REST API .................................................................................................................. 152
6.1 API Endpoint ..................................................................................................... 152
6.2 Authentication .................................................................................................... 152
6.3 Resource Types ................................................................................................ 153
ผเขยน ................................................................................................................................ 156
คมอการใชงาน NETPIE - 6
บทน า
ในปจจบนเทคโนโลย Internet of Things หรอ IoT เรมเขามามบทบาทส าคญในชวตประจ าวน IoT คอ สภาพแวดลอมอนประกอบดวยสรรพสง (Things) ทสามารถสอสารและเชอมตอกนไดผานโพรโทคอลการสอสารทงแบบใชสายและไรสาย โดยสรรพสงตางๆ มวธการระบตวตนได รบรบรบทของสภาพแวดลอมไดและมปฏสมพนธโตตอบและท างานรวมกนได
ปจจบนเราสามารถน าเทคโนโลย IoT มาประยกตในดานตางๆ โดยเพมขดความสามารถของอปกรณเครองใชหรอบรการ ใหสามารถรบร แลกเปลยนขอมล แสดงผล ควบคมหรอท างานรวมกนได โดยกาวขามขดจ ากดในเรองของเวลาและสถานท เปนการบรณาการเทคโนโลยตางๆ เชน การสอสาร เครอขายคอมพวเตอร อปกรณไมโครคอนโทรลเลอร อปกรณระบบสมองกลฝงตว อปกรณเซนเซอร และขอมล เขาดวยกน และดวยราคาของอปกรณตางๆ ทถกลงสวนทางกบสมรรถนะทดขน ท าใหการพฒนาตอยอดผลตภณฑหรอบรการทเปน IoT เปนไปไดโดยงาย
NETPIE เปนแพลตฟอรมใหบรการส าหรบ IoT เปนระบบพนฐานทอ านวยความสะดวกใหกบนกพฒนา นกพฒนาฮารดแวรสามารถพฒนาอปกรณ โดยไมตองกงวลเรองการตดตงดแลระบบสอสาร ระบบเซรฟเวอร หรอฐานขอมลใดๆ ในขณะเดยวกนแพลตฟอรมนยงชวยใหนกพฒนาซอฟตแวรเขาถงอปกรณอเลกทรอนกสตางๆ ไดงายขน ผานไลบรารส าเรจรปทแพลตฟอรมเตรยมไวให ดงนนบรการแพลตฟอรม NETPIE จงเปนเสมอนสะพานเชอมระหวางนกพฒนาฮารดแวรและนกพฒนาซอฟตแวร
เอกสารนอธบายการประยกตใช IoT เบองตนดวย NETPIE คณะผจดท าหวงวาผอานจะไดรบความรความเขาใจเกยวกบเทคโนโลย IoT เขาใจกระบวนการพฒนาผลตภณฑ บรการ และแอปพลเคชนเบองตนโดยใชแพลตฟอรมสอสาร NETPIE ในการเชอมตออปกรณและแลกเปลยนขอมลกนไดในรปแบบของ IoT เพอใหเทคโนโลยทเกยวของกบ Internet of Things ไดรบการพฒนาและตอยอดเปนนวตกรรม เกดการสรางสรรคพฒนาผลตภณฑ บรการ และแอปพลเคชนดาน IoT โดยผประกอบการไทย และเพมขดความสามารถในการแขงขนกบนานาประเทศ
คมอการใชงาน NETPIE - 7
1. แนะน า NETPIE
1.1. รจก NETPIE
NETPIE เปน IoT (Internet of Things) Cloud Platform ทพฒนาขนโดยทมงานวจยและเปดใหบคคลทวไปใชงานโดยม Web Portal ทใหสามารถลงทะเบยนและจดการตวตนและสทธของแอปพลเคชนและอปกรณไดทเวบไซต https://netpie.io ตงแตเดอนกนยายน 2558 เปนตนมา NETPIE เปน Middleware ทมหวใจหลก (นอกเหนอจากสวนอนๆ) เปน Distributed MQTT Brokers ซงเปนเสมอนจดนดพบใหสงตางๆ (Things) มาตดตอสอสารและท างานรวมกนผานวธการสงขอความแบบ Publish/Subscribe NETPIE มโครงสรางสถาปตยกรรมเปนคลาวดอยางแทจรงในทกองคประกอบ ท าใหสามารถขยายตวไดอยางอตโนมต (Auto-scale) สามารถดแลและซอมแซมตวเองไดอตโนมตเมอสวนหนงสวนใดในระบบมปญหา (Self-healing, Self-recovery) โดยไมตองพงผดแลระบบ การบรหารจดการระบบเปนแบบ Plug-and-Play ไมตอง Configure หรอปรบแตง ในฝงอปกรณ NETPIE ม Client Library หรอทเรยกวา Microgear ซงท าหนาทสรางและดแลชองทางสอสารระหวางอปกรณกบ NETPIE รวมไปถงรกษาความปลอดภยในการสงขอมล Microgear เปน Open Source และสามารถดาวนโหลดไดจาก https://github.com/netpieio โดย ณ ปจจบนม Microgear ส าหรบ OS และ Embedded Board หลกๆ ทเปนทนยมในหมนกพฒนาเกอบทกชนด โมเดลการสอสารของ NETPIE แสดงไวในรปท 1.1
รปท 1.1 วธการสอสารของสงตางๆ ผาน NETPIE
คมอการใชงาน NETPIE - 8
ประโยชนของ NETPIE
1. ชวยลดการใชทรพยากรของการเชอมตอ
NETPIE ชวยใหอปกรณสามารถสอสารกนไดโดยผใชไมตองกงวลวา อปกรณนนจะอยทใด เพยงแคน า Microgear Library ไปตดตงในอปกรณ NETPIE จะรบหนาทดแลเชอมตอใหทงหมด ไมวาอปกรณนนจะอยในเครอขายชนดใด ลกษณะใด หรอแมกระทงเคลอนยายไปอยทใด ผใชสามารถตดปญหาในการเขาถงอปกรณจากระยะไกล (Remote Access) ดวยวธการแบบเดมๆ เชน การใช Fixed Public IP Address หรอการตง Port Forwarding ในเราทเตอรและการตองไปลงทะเบยนกบผใหบรการ Dynamic DNS ซงทงหมดลวนมความยงยาก ลดความยดหยนของระบบ ไมเพยงเทานน NETPIE ยงชวยใหการเรมตนใชงานเปนไปโดยงาย โดยออกแบบใหอปกรณถกคนพบและเขาสบรการโดยอตโนมต (Automatic Discovery, Plug-and-Play)
2. ชวยลดภาระดานความปลอดภยของขอมล
NETPIE ถกออกแบบใหมระดบและสทธในการเขาถงในระดบ Fine Grain กลาวคอผใชสามารถออกแบบไดเองทงหมดวา สงใดมสทธคยกบสงใด สงใดมสทธหรอไม - เพยงใดในการอานหรอเขยนขอมล และสทธเหลานจะมอายการใชงานนานเทาใด หรอจะถกเพกถอนภายใตเงอนไขใด เปนตน
3. ยดหยนตอการขยายระบบ
NETPIE มสถาปตยกรรมเปนคลาวดเซรฟเวอรอยางแทจรงในทกองคประกอบของระบบ ท าใหเกดความยดหยนและคลองตวสงในการขยายตว นอกจากนโมดลตางๆ ยงถกออกแบบใหท างานแยกจากกน เพอใหเกดสภาวะ Loose Coupling และสอสารกนดวยวธ Asynchronous Messaging ชวยใหแพลตฟอรมมความนาเชอถอไดสง น าไปใชซ าและพฒนาตอไดงาย ดงนนผพฒนาไมจ าเปนตองกงวลกบการขยายตวเพอรบโหลดทเพมขนในระบบอกตอไป
1.2. MICROGEAR
Microgear คอซอฟตแวรไลบรารของ NETPIE ทตดตงอยบนอปกรณทตองการเชอมตอสอสารผานคลาวดของ NETPIE Microgear เปรยบเสมอนตวกลางและผชวยในการสรางและดแลการเชอมตอ ใหมความเสถยร ปลอดภย ใหการสอสารแลกเปลยนขอมลระหวางอปกรณเปนไปอยางราบรน บทบาทหนาทของ Microgear สามารถแบงออกเปน 4 ดานคอ
1. ดานการสอสาร (Communication) Microgear จะเปนผชวยในการสรางการเชอมตอ (Connection) ไปยงคลาวดของ NETPIE และคอยตรวจสอบสถานะของการเชอมตอ หากการเชอมตอมปญหา Microgear สามารถชวยเชอมตอใหใหมเพอใหการสอสารเปนไปไดอยาง
คมอการใชงาน NETPIE - 9
ราบรน นอกจากน Microgear ยงชวยอ านวยความสะดวก ในการสรางชองทางการสอสารแบบเขารหสในกรณทผใชตองการ สวนการแลกเปลยนขอมลระหวาง Microgear และคลาวดของ NETPIE จะใชโพรโทคอล MQTT ในการสอสาร
2. ดานการยนยนตวตน (Authentication) ในขนตอนการสรางการเชอมตอ Microgear จะชวยยนยนตวตนของอปกรณกบคลาวดของ NETPIE โดยการพสจนตวตน (Identity) ของอปกรณจะใชขอมลประกอบกนสามสวนคอ AppID, App Key และ Token
3. ดานการขออนญาตสทธ (Authorization) การขออนญาตสทธในการสอสารจะเกดขนในขนตอนการสรางการเชอมตอ ควบคกบการยนยนตวตน คลาวดของ NETPIE จะเปนผออกใบอนญาต (Token) ทระบวาอปกรณตวน สามารถสอสารไดกบอปกรณตวใดบาง ในกรณปกตอปกรณทอยภายใตกลม AppID เดยวกนเทานน จงจะมสทธสอสารกนได (ยกเวนในกรณการใช Freeboard Microgear ทอนญาตใหสอสารขาม AppID ได ซงจะอธบายในบทท 5)
4. ดานการประสานงาน (Coordination) Microgear มฟงกชนทชวยใหอปกรณตางๆ ภายในกลม AppID เดยวกนทราบสถานะของกนและกน เชน ทราบวามอปกรณใดออนไลนเขามาใหมในกลม หรอมอปกรณใดออกไปจากกลม รวมถงทราบการเปลยนแปลงสถานะของอปกรณทสนใจตดตาม จากขอมลดงกลาวผ ใชสามารถก าหนดบทบาทหนาทใหอปกรณในกลมตามสถานะของอปกรณอนๆ ในกลม เชน หากเปนอปกรณตวแรกในกลมใหท าหนาทเปนหวหนากลม เปนตน
Microgear ถกพฒนาขนเพอใหท างานไดกบอปกรณทหลากหลาย ในสวนของซอฟตแวรม Microgear ใหเลอกใชกบ Programming Language ไดแก Node.js Python HTML5 Java Android C# ส าหรบอปกรณฮารดแวรประเภทไมโครคอนโทรลเลอร Microgear เปรยบเสมอน Firmware ซงม Microgear ทรองรบ Arduino with Ethernet Shield (ใชไดกบ Arduino Mega) และ Microgear ส าหรบ WiFi ไมโครคอนโทรลเลอร ESP8266 Microgear ทพฒนาขนทงหมดถกรวบรวมไวท https://github.com/netpieio โดยมสญญาอนญาตใหใชสทธแบบเปดประเภท ISC License ซงอนญาตใหท าซ า ดดแปลง และ/หรอสงตอไลบรารนได ทงในการใชงานเชงสาธารณประโยชนและเชงพาณชย รายละเอยดของสญญาอนญาตใหใชสทธแบบ ISC License มดงน
คมอการใชงาน NETPIE - 10
ISC License
Copyright (c) 2015, NECTEC < @nectec.or.th>
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
ฟงกชนหลกของ Microgear
Microgear แตละชนดอาจมชอและชนดของฟงกชนแตกตางกนตามลกษณะของการเขยนโปรแกรมในภาษานนๆ ในทนขอยกตวอยางฟงกชนทมเหมอนกนอยในหลาย Microgear โดยขออางองชอฟงกชนจาก HTML5 Microgear ส าหรบรายละเอยดฟงกชนของแตละชนด Microgear สามารถดไดจากภาคผนวก หรอเอกสาร Readme ใน https://github.com/netpie.io
create สราง Microgear เพอเรมตนใชงาน
connect เชอมตอ Microgear เขากบคลาวดของ NETPIE
setAlias ก าหนดชอเลนของอปกรณเพอใชระบตวตนของอปกรณภายใน NETPIE
chat สงขอความแบบเจาะจงผ รบ
publish สงขอความแบบไมเจาะจงผ รบไปยงหวขอสนทนาทก าหนด
subscribe ระบความสนใจในหวขอสนทนา บอกรบขอความทเกดขนบนหวขอนนๆ
unsubscribe ยกเลกการบอกรบขอความในหวขอสนทนาทเคย subscribe ไว
resetToken ยกเลกใบอนญาต (Token) และลบใบอนญาตออกจาก cache บนอปกรณ
useTLS ระบวาตองการสรางการเชอมตอแบบเขารหสระหวาง Microgear กบคลาวดของ NETPIE
on ตอบสนองตอเหตการณทสนใจผานการเรยก Callback Function
ล าดบในการเรยกฟงกชนพนฐานเพอเรมสงขอมลเปนไปตามแผนภาพในรปท 1.2
คมอการใชงาน NETPIE - 11
รปท 1.2 ล าดบการเรยกฟงกชนพนฐานของ Microgear
Events ของ Microgear
การท างานของ Microgear เปนแบบ Event-driven จงตองตอบสนองตอเหตการณตางๆ ดวยการเขยน Callback Function ซงชนดของเหตการณทสามารถเกดขน มดงน
connected เกดขนเมอ Microgear เชอมตอกบ NETPIE ส าเรจ
closed เกดขนเมอ Microgear ปดการเชอมตอกบ NETPIE
error เกดขนเมอมความผดพลาดเกดขนกบ Microgear
message เกดขนเมอมขอความเขามาทอปกรณ
present เกดขนเมอมอปกรณใน AppID เดยวกนเชอมตอเขามาบน NETPIE
absent เกดขนเมอมอปกรณใน AppID เดยวกนหายไปจากการเชอมตอกบ NETPIE
1.3. MQTT (MQ TELEMETRY TRANSPORT)
MQTT เปนโพรโทคอลสอสารชนแอปพลเคชนทรนบน TCP/IP ถกพฒนาขนในป 1999 โดย IBM และ Eurotech ส าหรบการมอนเตอรสถานะทอสงน ามนสวนทวางผานเขตทะเลทราย ดวยการออกแบบใหเปนการรบสงขอความทมน าหนกเบามากและเปนโพรโทคอลเปด ท าใหในปจจบน MQTT ถกน ามาใชแพรหลายในการสอสารแบบ M2M หรอ IoT เพราะเหมาะสมกบอปกรณปลายทางทมขนาดเลก/พลงงานจ ากด หรอในการสอสารระยะไกลทตองการการใชงานแบนดวดธอยางมประสทธภาพ
createuseTLS
(optional)connect setAlias publish
chat
คมอการใชงาน NETPIE - 12
โมเดลการสอสารของโพรโทคอลแสดงดงรปท 1.3 ประกอบดวย 2 สวนคอไคลเอนต และโบรกเกอร
รปท 1.3 โมเดลการสอสารของโพรโทคอล MQTT
โบรกเกอร เปนจดศนยกลางในการรบสงขอความระหวางไคลเอนต วธการก าหนดเสนทาง (Routing) กระท าผานหวขอ (Topic) โดยไคลเอนต Subscribe ในหวขอทตนตองการ จากนนโบรกเกอรจะสงขอความทงหมดทถก Publish ในหวขอนนๆ ไปให ดงนนไคลเอนตจงสอสารกนไดโดยไมจ าเปนตองรจกกน ชวยลดความเกยวพนระหวางผสรางขอมลและผใชขอมล สงผลใหการขยายตวของเครอขายท าไดงาย นอกจากนหนาททส าคญอกประการของโบรกเกอรคอการรกษาความปลอดภยของไคลเอนต (Authorization, Authentication) ซงในสวนนสามารถขยายเพมเตม หรอน าไปเชอมกบกลไกความปลอดภยของระบบหลงบานทมอยแลวได ชวยใหน าโบรกเกอรเขาไปใชงานเปนสวนหนงของระบบอนๆ ได สวน Authorization ของ NETPIE ซงจะไดกลาวถงในหวขอตอไป กถอเปนตวอยางหนงของการขยายเพมเตมการรกษาความปลอดภยของโบรกเกอรใน MQTT ปจจบนมโบรกเกอร MQTT ทเปดใหดาวนโหลดไปใชหรอดดแปลงอยหลายราย ไดแก Mosquitto, RabbitMQ, Erlang, VerneMQ ฯลฯ
ไคลเอนต จะเปนไดทง Publisher หรอ Subscriber หรอ Publisher/Subscriber พรอมๆ กน และจะเปนอปกรณใดๆ กไดทสามารถรน MQTT Client Library บน TCP/IP Stack การท MQTT ใชโมเดล Publish/Subscribe ตรรกะสวนใหญจงไปตกอยในฝงโบรกเกอร ท าให Library มขนาดเลก ตดตงไดงาย ใชงานไดกบอปกรณทมทรพยากรจ ากด ไคลเอนตจ าเปนตองเปดการเชอมตอ TCP ไวตลอดเพอทโบรกเกอรจะสามารถผลกขอความไปใหได หากการเชอมตอถกตดขาด โบรกเกอรจะเกบขอความทงหมดทเขามาไวจนกวาไคลเอนตจะกลบมาออนไลนอกครง
เมอเปรยบเทยบ MQTT กบ HTTP (REST) ทมสถาปตยกรรมแบบ Request/Response จะพบวา MQTT มความไดเปรยบทโบรกเกอรสามารถผลก (Push) ขอความไปยงไคลเอนตไดตามเหตการณ
คมอการใชงาน NETPIE - 13
(Event-driven) ในขณะทเมอใช HTTP ฝงไคลเอนตตองคอยสมถาม (Poll) ขอมลเปนระยะๆ และตองตงคาคาบเวลาการสมถามไวกอนลวงหนา โดยแตละครงตองมการสรางการเชอมตอขนใหมและอาจจะไมมขอมลใหมใดๆ ใหอพเดท ดงนนหากตองการใหระบบท างานแบบ Real Time หรอใกลเคยง ยอมหมายถงตองตงคาบเวลาการมถามใหสน และเกดความสนเปลองของการใชชองสญญาณทไมจ าเปนทตามมา นจงเปนอกเหตผลส าคญทท าให MQTT ไดรบความนยมเหนอ REST ส าหรบการใชงานแบบ M2M นอกเหนอจากการมน าหนกเบา
MQTT Topics
MQTT Topic เปน UTF-8 String ในลกษณะเดยวกบ File Path คอสามารถจดเปนล าดบชนไดดวยการขนดวย “/” ตวอยางเชน myhome/floor-one/room-c/temperature ไคลเอนตสามารถเลอก Publish หรอ Subscribe เฉพาะ Topic หรอ Subscribe หลาย Topic พรอมๆ กนโดยใช Single-Level Wildcard (+) เชน myhome/floor-one/+/temperature หมายถงการขอเขยนหรอรบขอความ temperature จากทกๆ หองของ myhome/floor-one หรอ Multi-Level Wildcard (#) เชน myhome/floor-one/# หมายถงการขอเขยนหรอรบขอความทงหมดทม Topic ขนตนดวย myhome/floor-one เปนตน
เราสามารถก าหนด Topic อยางไรกได โดยมขอยกเวนการขนตน Topic ดวยเครองหมาย “$” ซงจะจ ากดไวส าหรบการเกบสถตภายในของตวโบรกเกอรเทานน ดงนนไคลเอนตจะไมสามารถ Publish หรอ Subscribe ไปยง Topic เหลานได โดยทวไป Topic เหลานจะขนตนดวย $SYS
MQTT vs Message Queues เรามกพบการสบสนระหวาง MQTT กบ Message Queues โดยคนจ านวนไมนอยเชอวา MQ
ใน MQTT มาจากค าวา Message Queueในความเปนจรงแลว MQ ในทนมาจากชอรนผลตภณฑทรองรบโพรโทคอล MQTT ของ IBM ทเรยกวา MQ Series และ MQTT ไมไดท างานในลกษณะ Message Queue กลาวคอ ขอความใน MQTTจะถกสงใหกบไคลเอนตทงหมดท Subscribe ใน Topic ในขณะทขอความใน Message Queue สามารถถกดงออกไปใชงานโดยผใชเพยงรายเดยวเทานน
MQTT Connections
แพกเกตควบคม (Control Packets) ทงหมดทใชในการสอสารระหวางโบรกเกอรกบไคลเอนตใน MQTT มทงสน 14 ชนด แสดงไวดงตารางท 1.1
คมอการใชงาน NETPIE - 14
ตารางท 1.1 ชนดของแพกเกตควบคมในโพรโทคอล MQTT
แพกเกตควบคม ผสง ค าอธบาย
โบรกเกอร ไคลเอนต
CONNECT X ขอเชอมตอ
CONNACK X รบทราบการขอเชอมตอ
PUBLISH X X ขอความทจะขอ Publish
PUBACK X X แจงวาได Publish แลว (QoS Level 1)
PUBREC X X แจงวาได Publish แลว (QoS Level 2)
PUBREL X X รบทราบวาขอความถก Publish แลวและแจงใหอกผ รบลบคาสถานะได (QoS Level 2)
PUBCOM X X แจงวา Publish เสรจสนและสถานะถกลบ (QoS Level 2)
SUBSCRIBE X ขอ Subscribe
SUBACK X รบทราบการขอ Subscribe
UNSUBSCRIBE X ขอยกเลก Subscribe
UNSUBACK X รบทราบการขอยกเลก Subscribe
PINGREQ X PING Request
PINGRESP X PING Response
DISCONNECT X ขอยกเลกการเชอมตอ
คมอการใชงาน NETPIE - 15
การเชอมตอ MQTT จะเรมตนจากฝงไคลเอนตสงแพกเกตควบคม CONNECT ไปยงโบรกเกอร โบรกเกอรจะตอบรบดวยแพกเกตควบคม CONNACK วธนชวยแกปญหาไคลเอนตทตดตงอยหลงเราทเตอรหรอไมมเลขไอพสาธารณะ เพราะโบรกเกอรมเลขไอพสาธารณะและจะรกษาการเชอมตอสองทางไวตลอดหลงจากไดรบแพกเกตควบคม CONNECT หากโบรกเกอรพบวาแพกเกต CONNECT ทไดรบไมถกตอง หรอไคลเอนตใชเวลานานเกนไปนบตงแตเปดซอกเกตจนกระทงเรมสงแพกเกต โบรกเกอรจะปดการเชอมตอ เพอปองกนไคลเอนตไมประสงคดทตองการถวงการท างานของโบรกเกอร
ไคลเอนตจะเปนผระบคาการเชอมตอในแพกเกตควบคม CONNECT คาเหลานไดแก
Client ID เพอใหโบรกเกอรใชระบตวตนของไคลเอนตและเกบคาสถานะเซสชนไวให ซงไดแก Subscriptions และขอความทงหมดทไคลเอนตยงไมไดรบ (สวนนเกยวของกบการตงคาระดบ QoS ซงจะกลาวถงตอไป) ดงนน Client ID จงจ าเปนทจะตองไมซ ากน แตหากไมตองการใหโบรกเกอรเกบคาสถานะ ไคลเอนตสามารถเวนสวนนวางไวได
Clean Session มคา True หรอ False เพอระบวาไคลเอนตตองการใหโบรกเกอรรกษาคาสถานะของเซสชนไวใหหรอไม หากตองการ ใหระบคาเปน False หากไม ใหระบคาเปน True ดงนนหากไคลเอนตไมระบคา Client ID ในแพกเกต CONNECT จะตองระบ Clean Session เปน True ดวย มฉะนนโบรกเกอรจะไมรบการเชอมตอ
Username และ Password เพอใหโบรกเกอรใชในการ Authentication และ Authorization ซงตามมาตรฐานปจจบน (MQTT 3.1.1) โพรโทคอล MQTT เองไมมการเขารหสหรอแฮชในสวนน กลาวคอ Username/Password จะถกสงเปน Plaintext ดงนนจงมขอควรระวงในการใช MQTT หากไมมชนความปลอดภยเพมเตมเชน TLS ในชนทรานสปอรต
Last Will Topic, Last Will QoS และ Last Will Message มไวใหโบรกเกอร Publish ขอความสงเสยสดทาย (Last Will Message) ไปยง Topic ทระบ (Last Will Topic) เพอใหไคลเอนตอนรบรในกรณการเชอมตอของไคลเอนตรายนขาดลงแบบไมเจตนา
Keep Alive เปนคาตวเลขคาบเวลาทไคลเอนตตกลงกบโบรกเกอรวาจะสงแพกเกตควบคม PINGREQ มาเปนระยะๆ ซงโบรกเกอรจะตอบดวยแพกเกต PINGRESP เพอใหทงสองฝายรบรวาการเชอมตอยงคงอย
คมอการใชงาน NETPIE - 16
รปท 1.4 ผงการรบสงขอความสงเสยสดทาย (Last Will Message)1
ไคลเอนต Publish ขอความ โดยบรรจลงในสวน Payload ของแพกเกตควบคม PUBLISH ซงจะตองระบ Packet ID, ชอ Topic, ระดบของ QoS, Duplicate Flag และ Retain Flag โบรกเกอรจะตอบกลบดวยแพกเกต PUBACK หรอ PUBREC ขนอยกบระดบ QoS ทระบในแพกเกต PUBLISH ในทางกลบกนเมอตองการรบขอมล ไคลเอนตสงแพกเกตควบคม SUBSCRIBE ไปยงโบรกเกอร โดยระบรายชอ Topic ทตองการ ซงอาจมไดมากกวาหนง และสามารถเลอกตงคาระดบ QoS ทแตกตางกนส าหรบแตละ Topic และโบรกเกอรจะตอบดวยแพกเกต SUBACK โดยยนยนคาระดบ QoS ของแตละ Topic ทไคลเอนตขอ Subscribe กลบมาอกครง หาก Topic ใดทไมอนญาตหรอไมปรากฏบนโบรกเกอร โบรกเกอรจะตอบกลบดวยคา 128 แทนทคาระดบ QoS
เมอไคลเอนตตองการยกเลกการรบขอมล ท าไดโดยการสงแพกเกตควบคม UNSUBSCRIBE ไปยงโบรกเกอร โดยระบรายชอ Topic ทตองการบอกเลกในคราวเดยวกนไดมากกวาหนง โบรกเกอรจะยนยนการยกเลกดวยแพกเกต UNSUBACK
เมอไคลเอนตตองการเลกการเชอมตอ ท าไดโดยการสงแพกเกตควบคม DISCONNECT ไปยงโบรกเกอร หากไคลเอนต CONNECT โดยตงคา Clean Session เปน True โบรกเกอรจะยกเลก Subscription ทงหมดของไคลเอนตใหเองโดยอตโนมต ในทางกลบกนหาก Clean Session เปน False โบรกเกอรจะยงคงเกบคาตางๆ ของเซสชนไว เมอไคลเอนตเชอมตอเขามาใหมดวย Client ID เดม จงไมจ าเปนตองเรม Subscribe ใหมอกครง
1http//:www.embedded101.com
คมอการใชงาน NETPIE - 17
MQTT Quality of Service (QoS)
ไคลเอนตจะเปนผก าหนดระดบของบรการสงและรบขอความหรอ QoS ทตนตองการในแตละ Topic ในแพกเกต PUBLISH หรอ SUBSCRIBE และโบรกเกอรจะตอบสนองดวย QoS ระดบเดยวกนส าหรบ Topic นนๆ
QoS ใน MQTT แบงไดเปน 3 ระดบ คอ
1. อยางมากหนงครง (At Most Once) แทนดวยโคด 0
QoS 0 เปนระดบบรการทต าทสด กลาวคอไมรบประกนวาขอความจะถกสงถงผ รบใดๆ เลยหรอไม หากไคลเอนต Publish ขอความดวย QoS 0 โบรกเกอรจะไมมการตอบรบใดๆ วาได Publish ตอไปใหผ รบรายอนหรอไม หากไมมผ รบขอความ โบรกเกอรอาจเกบขอความไวหรอลบทงกได ขนอยกบนโยบายของผใหบรการเซรฟเวอร ในทางกลบกนหากไคลเอนตทเปนผ รบ Subscribe ไวดวย QoS 0 เมอไดรบขอความจากโบรกเกอร กไมตองสงขอความตอบรบใดๆ กลบ ท าใหการสงขอความแบบนรวดเรวทสด เพราะไมมโอเวอรเฮดในการตอบรบ ขณะเดยวกนหากขอความถกสงไมถง กไมมทางทราบไดเชนกน
2. อยางนอยหนงครง (At Least Once) แทนดวยโคด 1
QoS 1 รบประกนวาขอความจะถกสงถงผ รบอยางนอยหนงครง การสงลกษณะน ผสงจะเกบขอความเอาไว จนกวาจะไดรบแพกเกต PUBACK จากผ รบ ในกรณไคลเอนตขอ Publish ผ รบขอความซงเปนโบรกเกอรจะตอง Publish ตอไปยงไคลเอนตท Subscribe ไวอยางนอยหนงครง จงจะสามารถสงแพกเกตตอบรบไปกลบยงผสง ในกรณ Subscribe ผสงซงกคอโบรกเกอรจะตองเกบขอความไวจนกวาไคลเอนตทตนสงขอความไปใหจะยนยนตอบรบ ดงนนแพกเกต PUBACK จงตองมหมายเลขไอดเดยวกบแพกเกต PUBLISH เพอใหผสงทราบวาขอความใดถกสงถงแลวและสามารถลบออกได
3. หนงครงเทานน (Exactly Once) แทนดวยโคด 2
QoS 2 รบประกนวาแตละขอความจะถกสงถงผ รบเพยงหนงครงเทานน เปนบรการทปลอดภยทสดและชาทสดของโพรโทคอล MQTT เนองจากผ รบและผสงตองสงแพกเกตควบคมไปกลบถงสองรอบ เรมตนดวยผสงสงขอความไปในแพกเกต PUBLISH เมอผ รบไดรบขอความจะเกบแพกเกตไวและยนยนกลบไปยงผสงดวยแพกเกต PUBREC ผสงจงสามารถลบขอความนนออกจากหนวยเกบขอมลของตนได และสงแพกเกต PUBREL ไปยงผ รบเพอใหผ รบสามารถลบสถานะการสงขอความนออกได หากผ รบเปนไคลเอนตปลายทางท Subscribe ขอความเอาไว ผ รบจะสงแพกเกต PUBCOM เพอยนยนวาขอความถกสงถงแลวเรยบรอยหนงครง หากผ รบเปนโบรกเกอร ทนททได Publish ขอความตอไปยงไคลเอนตปลายทางหนงครง จงจะลบขอความนนออก และปดเซสชนดวยการสงแพกเกต PUBCOM กลบไปยงผสง
คมอการใชงาน NETPIE - 18
รปท 1.5 ผงการสอสารเพอ Publish ขอความดวย QoS 02
รปท 1.6 ผงการสอสารเพอ Publish ขอความดวย QoS 13
2http//:www.embedded101.com 3http//:www.embedded101.com
คมอการใชงาน NETPIE - 19
รปท 1.7 ผงการสอสารเพอ Publish ขอความดวย QoS4
Retained Messages
เมอไคลเอนต Publish ขอความแบบ Retained Message โดยการตง Retain Flag เปน True จะท าใหโบรกเกอรเกบขอความนนไวใน Topic ทระบอยางถาวร จนกวาจะม Retained Message อนทถก Publish ภายหลงมาเกบแทนท โดยโบรกเกอรจะเกบ Retained Message ไวใหเพยง Topic ละหนงขอความ ดงนนทกครงทมไคลเอนต Subscribe เขามาใหม กจะไดรบ Retained Message ทนท ไมตองรอจนกวาจะม Publication ใหมเกดขน จงมองไดวา Retained Message คอขอมลลาสดท Subscriber ทกรายควรตองทราบ ดงนน Retained Message จงเปนประโยชนอยางยงกบแอปพลเคชนทเกยวของกบการอพเดทสถานะ หากไคลเอนตตองการลบ Retained Message ใน Topic ใดๆ กสามารถท าไดไมยาก ดวยการสงแพกเกต PUBLISH ทมไมม Payload และตง Retain Flag เปน True ไปยง Topic นนๆ หรอหากมขอมลจะอพเดท กไมมความจ าเปนตองลบ Retained Message เกาออกกอน แตสามารถสง Retained Message เขาไปเขยนทบไดเลย
แบบฝกหด: Local MQTT Chat บน Raspberry Pi
1. ตดตงโบรกเกอร Mosquitto ลงบน Raspberry Pi โดยพมพชดค าสงขางลาง และแทนท xxxx ดวยชอรนระบบปฏบตการเชน wheezy หรอ jessie
4 http//:www.embedded101.com
คมอการใชงาน NETPIE - 20
curl -0 http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
rm mosquito-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo curl -0 http://repo .mosquitto.org/debian/mosquitto-xxxx.list
sudo apt-get update
2. ตดตงไคลเอนต
sudo apt-get install mosquitto mosquitto-clients
3. ทดลองแชทโดยเปดหนาตาง สรางหวขอ “chat/test1 ”รบนเครองและลงบนโบรกเกอ Subscribe โดยพมพ
mosquitto_sub –h localhost –t “chat/test1”
4. เปดหนาตางใหมโดยยงไมปดหนาตางแรก พมพค าสงขางลางเพอ Publish ขอความ “hello” ไปยงหวขอ “chat/test1”
mosquitto_pub –h localhost –t “chat/test1” –m “hello”
ในหนาตางแรกทได Subscribe เอาไว จะปรากฏขอความ hello
5. สงเกตผลของการตงระดบบรการรบสงขอมล (QoS) ทแตกตางกน พมพค าสงขางลางในหนาตางแรก เพอ Subscribe ในหวขอ “chat/test2” ดวย QoS 1
mosquitto_sub –h localhost –v –t “chat/#” –c –q 1 –i “Client ID”
6. ในหนาตางทสอง พมพค าสงขางลางเพอ Publish ขอความ “You might get this message.” และ “You will get this message.” ดวย QoS 0 และ QoS 1 ตามล าดบ
mosquitto_pub –h localhost –t “chat/test2” –m “You might get this message.”
mosquitto_pub –h localhost –t “chat/test2” –m “You will get this message.”
–q 1
7. สงเกตผลลพธในหนาตางแรก 8. หยดการท างานของหนาตางแรกชวคราวโดยกด ctrl-c 9. ท าซ าขอ 6 10. ท าซ าขอ 5 และสงเกตผลลพธ
คมอการใชงาน NETPIE - 21
1.4. AUTHORIZATION และ AUTHENTICATION ใน NETPIE
เนองจาก NETPIE มศนยกลางการสอสารเปน Distributed MQTT Broker ความปลอดภยจงขนตรงกบการเขาถงโบรกเกอรของอปกรณ ดงทไดกลาวไปแลวในหวขอท1.3 วามาตรฐาน MQTT ระบใหใชเพยง Username และ Password ในการพสจนตวตน (Authentication) ของไคลเอนท โดยสามารถก าหนดสทธการเขาถงโบรกเกอรของไคลเอนตแตละรายดวยการผกเปนรายการ (List) เขากบ Username บนโบรกเกอร ในขณะท NETPIE นน มขอมลประจ าตว (Credentials) ของอปกรณทจะมาขอเชอมตอถงสองชน คอ Key และ Token ซงจะชวยเพมความยดหยนในการบรหารจดการการเขาถงโบรกเกอรของอปกรณใหมความละเอยด ยดหยนและมประสทธภาพมากขน ดงนน
อปกรณจะไดมาซงขอมลประจ าตวจากการขออนญาตสทธ (Authorization) ซงประกอบดวยผ เกยวของ 3 ฝายคอ
1) อปกรณ (Device) ทจะมาเชอมตอสอสารกนใหเกดแอปพลเคชน ในทนรวมถงทงอปกรณกายภาพและอปกรณเสมอน (Object)
2) ผใช (User) ซงเปนเจาของแอปพลเคชน และเปนผก าหนดวาอปกรณใดมสทธหรอไม มากนอยเพยงใดในแอปพลเคชนของตน
3) NETPIE ท าหนาทเปนตวกลางในการขออนญาตสทธระหวางผใชและอปกรณ
กระบวนการทงหมดมขนตอนคอ
1) ผใชลงทะเบยนกบ NETPIE Web Portal และสรางแอปพลเคชน
2) ผใชเพมอปกรณภายใตแอปพลเคชนนนๆ และไดรบ Key และ Key Secret เพอน ามาใสลงในโคดของ Microgear ในอปกรณ
3) เมออปกรณถกเปดใชงาน Microgear จะเชอมตอเขามายง NETPIE โดยอตโนมต และพสจนตวตนดวย Key และ Key Secret ทไดรบในการขอ Token เพอเชอมตอและสอสารผาน NETPIE
4) ในขนตอนน NETPIE มทางเลอกสองทางเพอความสะดวกของผใช
ทางเลอกท 1: Pre-approved Key กลาวคอผใชสามารถก าหนดไวกอนลวงหนาวา Key ใดบางจะไดรบการอนญาตสทธแบบอตโนมต ดงนนทนททอปกรณตอเขามา จะไดรบ Token ทนท นอกจากนผ ใชยงสามารถก าหนดระดบของสทธไวกอนไดเชนกน เชน ใหสทธอปกรณของผใชเองแบบเตม ใหสทธอปกรณของคนอนบางสวน เปนตน
คมอการใชงาน NETPIE - 22
ทางเลอกท 2: Third-Party Key ซงเหมาะกบกรณทผใชใหสทธอปกรณของบคคลอนเขามารวมใชแอปพลเคชน เมออปกรณรองขอ Token เขามา NETPIE AUTH Server จะตดตอไปยงผใช ใหเขามาอนญาตสทธ โดยสามารถก าหนดระดบของสทธ และ NETPIE จะท าการออก Token ใหกบอปกรณและบนทกระดบของสทธทไดรบอนญาตเอาไว
รปท 1.8 NETPIE Authorization ในกรณ Pre-approved Key
รปท 1.9 NETPIE Authorization ในกรณ Third-party Key
คมอการใชงาน NETPIE - 23
เมออปกรณไดชดขอมลสวนตวครบแลว จะน าทงหมด (Key, Key Secret, Token, Token Secret) ไปสราง Client ID, Username และ Password ในการพสจนตวตนเขาใช NETPIE ตามโพรโทคอล MQTT โดยวธการสรางจะท าให Username กบ Password มการเปลยนแปลงทกครงในแตละเซสชน และมการแฮชและเขารหส ชวยปองกนการดกฟงและการท าซ า
NETPIE รองรบการเชอมตอ MQTT แบบ Persistent Connection เทานน ดงนนจะมการตง
คา Client ID ไวเสมอ หากมการเพกถอนสทธของอปกรณ Client ID จะถกลบ อปกรณจะตองตอไปยง NETPIE เพอขอ Token ใหม โดยไมตองไปเรมตนกระบวนการขอ Key ใหมตงแตตน โมเดลของ NETPIE นเปนการน าแนวคดทใชในสงคมมนษยมาปรบใชในสงคมของสงของ เชน เมอคนท าผดกฎจราจร ถกยดใบขบข ท าใหไมมสทธในการขบขยานพาหนะ แตสามารถไปขอท าใบขบขใหมไดภายหลง เปนตน
ชนดของ Key
NETPIE รองรบอปกรณทหลากหลาย นอกจากอปกรณกายภาพเชน บอรดไมโครคอนโทรลเลอรตางๆ แลว ยงรองรบอปกรณเสมอนเชน แอปพลเคชนตางๆ ซงรวมไปถงแอปพลเคชนทเขยนดวย HTML5 ทสามารถรนไดบนเบราวเซอร ในกรณเชนน การเชอมตอไมสามารถเปนแบบ Persistent ได เนองจากตองมการปดเปดเบราวเซอรตลอดเวลา ดงนนเพอใหการจดการ Key และ Token มประสทธภาพ หลกเลยงการสราง Token ทงไวโดยไมไดใชงาน NETPIE จงออกแบบใหม Key อย 2 ชนด คอ
1. Device Key
เมออปกรณไดรบการตดตง Device Key และรองขอ Token มายง NETPIE หากไดรบการอนญาตสทธ อปกรณจะไดรบ Token ทใชไดตลอดไป ไมมการหมดอาย ดงนนตราบใดทไมมการเพกถอนสทธ อปกรณสามารถใช Token เดมไปไดตลอดโดยไมตองเขาสกระบวนการ Authorization ใหม Device Key จงเหมาะกบอปกรณกายภาพทสามารถรกษาชองการเชอมตอกบ NETPIE ไวไดโดยตลอด
2. Session Key
อปกรณทไดรบการตดตง Session Key จะไดรบ Token ทใชไดเพยงครงเดยว (One-time Token) หากอปกรณยกเลกการเชอมตอไป และตอกลบมาใหม จะตองมการน า Session Key ไปขอ Token ใหมทกครง Session Key จงเหมาะกบการใชงานแอปพลเคชนทรนบนเบราวเซอรทตองมการปดเปดอยเรอยๆ เพราะหากใช Device Key ทกครงทเบราวเซอรถกเปดขนจะมการรองขอ Token ใหม และเมอเบราวเซอรถกปดไป Token ทไดจะคางอยเชนนนโดยไมไดใชงานอก สงผลใหภายใต Key เดยวกน ม Token ทงทใช
คมอการใชงาน NETPIE - 24
งานและไมไดใชงานแลวผกอยเปนจ านวนมาก สรางความสบสนซบซอนทไมจ าเปนใหกบผใช จงขอเนนย าเปนอยางยงวาไมควรใช Device Key กบแอปพลเคชนทรนบนเบราวเซอร (HTML5) โดยเดดขาด
ขอบเขตของสทธ (Scope) ในการเขาถง NETPIE MQTT Brokers
เมอผใชอนญาตสทธใหกบอปกรณ จะสามารถระบขอบเขตของสทธ หรอทเราเรยกวา Scope ไดวามากนอยเพยงใด โดย Scope นจะผกอยกบ Token ทอปกรณจะไดรบ และถกเกบไวท NETPIE รปแบบของ Scope Identifier เกยวพนโดยตรงกบโครงสรางการสอสารแบบ Publish/Subscribe ไปยง Topic บนโบรกเกอร MQTT มได 3 ลกษณะคอ
1. rw:/topic เชน rw:/home/bedroom/temperature หมายถง มสทธอาน (Subscribe) และเขยน (Publish) ใน home/bedroom/temperature
2. r:/topic เชน r:/home/# หมายถง มสทธอาน (Subscribe) ทก Topic ทขนตนดวย home 3. w:/topic เชน w:/home/+/temperature หมายถง มสทธเขยน (Publish) ไปยง Topic ชอ
temperature ของทกๆ หองใน home
การก าหนด Scope ทเกยวของกบหลาย Topic นอกจากใช Wildcard ดงทไดแสดงไปแลว สามารถท าไดโดยการเรยง Scope Identifier เขาดวยกนแลวคนดวยเครองหมาย Bar "|" ตวอยางเชนrw:/home/bedroom/temperature|r:/home/#|w:/home/+/temperature
คมอการใชงาน NETPIE - 25
2. GETTING STARTED
2.1 การสมครสมาชก
ขนตอนการสมครสมาชกเพอใชงาน NETPIE มดงน
1. ไปทเวบไซต https//:netpie.io/sign_up จะปรากฏหนาเวบดงรป กรอกขอมลใหเรยบรอยจากนนคลกทป ม SIGN UP เพอยนยนการลงทะเบยน
รปท 2.1 หนาลงทะเบยนผใชงาน NETPIE
2. รอรบ SMS จากทาง NETPIE ซงสงไปยงหมายเลขโทรศพทเคลอนททลงทะเบยนไว
ตวอยาง SMS:
Your one-time password for NETPIE is 255906201550
3. คลกทเมน LOG IN เพอเขาสระบบน าอเมลทลงทะเบยนไวใสในชอง USERNAME OR EMAIL ADDRESS และน ารหสผานทไดรบจาก SMS ใสในชอง PASSWORD แลวคลกป มLOG IN
4. ตงรหสผานใหมโดยใสรหสผานใหมในชอง NEW PASSWORD และ CONFIRM PASSWORD
คมอการใชงาน NETPIE - 26
รปท 2.2 หนาตงรหสผานใหมส าหรบผใช NETPIE
5. สามารถเปลยนรหสผานไดทเมน CHANGE PASSWORD
รปท 2.3 เมนในการเปลยนรหสผใชงาน NETPIE
2.2 การสรางแอปพลเคชน
หลงจากสมครสมาชก และลอกอนไดเรยบรอยแลว ผใชสามารถสรางแอปพลเคชนไดโดยท าตามขนตอนดงตอไปน
1. เลอกทเมน APPLICATIONS เพอเขาไปทหนา APPLICATION MANAGEMENT ซงแสดง
แอปพลเคชนทงหมดทผใชงานมอย การสรางแอปพลเคชนใหมท าไดโดยการคลกทป ม + ดงแสดงในรป
คมอการใชงาน NETPIE - 27
รปท 2.4 หนาจดการแอปพลเคชนส าหรบผใชงาน NETPIE
2. ในหนาตาง Pop-up ใหก าหนดชอแอปพลเคชน (Application ID หรอ AppID) ทตองการ ในตวอยางนใชชอวา PaulSmartHome จากนนคลกป ม CREATE การตงชอ AppID จะตองไมซ ากบผ อน ดงนนควรเลอกชอทมความเฉพาะตวเพอใหจ าได เนองจาก AppID นจะถกน าไปใชในการพฒนาโปรแกรมตอไป
รปท 2.5 กลองใหผใชตงชอ AppID
3. หากสรางแอปพลเคชนใหมไดส าเรจทหนาตาง APPLICATION ในหนา APPLICATION MANAGEMENT จะปรากฏชองของชอ AppID ทเราก าหนดไว หากชอซ าหรอมขอผดพลาดจะมขอความแจงเตอนขนมาดงน
หลงจากสรางส าเรจจะเปลยนไปทหนาของแอปพลเคชนทสรางขนใหมนโดยอตโนมต
คมอการใชงาน NETPIE - 28
รปท 2.6 ตวอยางหนาแอปพลเคชนหนงของ NETPIE
4. สราง Application Key โดยคลกทป ม +
5. ก าหนดชอของ Application Key ตามตองการ ในตวอยางใชขอความวา Key Television1
และเลอกชนดของ Key ใน Drop-down box ใหเปน Device Key
รปท 2.7 การตงชอและเลอกชนด Application Key
Application Key ม 2 ประเภท คอ
1. Device Key คอ Key ทใชกบอปกรณประเภทกายภาพ โดย Device Key ของอปกรณนนจะถกจดจ าไปตลอดถงแมอปกรณจะไมไดเชอมตอกบ NETPIE แลว แตเมอมการเชอมตอ
ชอ AppID ท
ก าหนดไว
คมอการใชงาน NETPIE - 29
ใหม จะถกมองวาเปนอปกรณตวเดม ประโยชนคอเราจะสามารถจดจ าอางองถงอปกรณตวนนได
2. Session Key คอ Key ทใชกบอปกรณทมการใชงานไมถาวรเชน เบราวเซอร เมอยกเลกการเชอมตอหรอปดเบราวเซอรไปตวตนของอปกรณนนจะถกลบทง เมอเชอมตอมาอกครงระบบจะสรางบตรผานใหมจาก Key ตวเดมให โดย NETPIE จะไมถอวาอปกรณท Online แตละครงมตวตนเดยวกน แตกตางจากกรณ Device Key
แนะน าใหใช Device Key กบ Hardware และใช Session Key กบ Browser, HTML5 โดย
ความแตกตางของ Key ทงสองประเภทจะแสดงในหนาของ Application ดวยรปกญแจสตางกน
เมอสรางส าเรจ จะมชอ Key Television1 ปรากฏในหนาตาง APPLICATION KEY
6. ตรวจสอบขอมลหรอดรายละเอยด Key ดวยการคลกท Key Television1 จะปรากฏขอมล
ของApplication Key ซงประกอบดวย
Application Key Name สามารถเปลยนแปลงชอไดตามทตองการ มไวใหผใชสามารถระบอปกรณของตนภายใต AppID หนงเทานน จงสามารถตงซ ากบชอผ อนได
รปท 2.8 การเปลยนชอ Application Key
Key เปนกญแจทอปกรณใชส าหรบเชอมตอ NETPIE
ชอเรยก ApplicationKey สามารถพมพแกไข
ได
คมอการใชงาน NETPIE - 30
Secret เปนรหสลบหรอรหสผานทอปกรณตองใชคกบ Key ส าหรบใหอปกรณเชอมตอ NETPIE
REST API auth เปนกญแจทเรยงตอกบรหสลบเพอใชส าหรบการใชงานดวย REST API
2.3 การตดตงเครองมอพฒนา
เครองมอส าหรบการพฒนา ประกอบไปดวย
Arduino IDE และ SDK ส าหรบ ESP8266
NETPIE Microgear ส าหรบ ESP8266
CP2012 USB to UART driver
เวบเบราวเซอร Chrome และ Firefox
Arduino IDE
ดาวนโหลด Arduino IDE ไดจาก https://www.arduino.cc/en/Main/Software ซงสามารถเลอกไฟลเพอตดตงในแพลตฟอรมตางๆ อาท Windows, Mac OS X, Linux หาก Arduino IDE ทตองการตดตงไมไดเปนเวอรชนลาสด ทานสามารถไปดาวนโหลดเวอรชนกอนๆ ไดทhttps://www.arduino.cc/en/Main/OldSoftwareReleases
เวอรชนของ Arduino IDE ทใชทดสอบกบ code ในเอกสารนคอเวอรชน1.6.12
คมอการใชงาน NETPIE - 31
หลงจากตดตงเสรจ ไปทเมน File --> Preferences
รปท 2.9 การเลอกเมน Preferences ใน Arduino IDE
ใสขอความตอไปน ลงในชอง Additional Board Manager URLs
http://arduino.esp8266.com/stable/package_esp8266com_index.json
รปท 2.10 การใสลงคเพอตดตง ESP8266 Arduino Core
คมอการใชงาน NETPIE - 32
คลกทเมน Tools --> Board: ??????? --> Board Manager…
รปท 2.11 การเลอกเวอรชนของ ESP8266 ส าหรบตดตง
คนหาค าวา ESP8266 เมอปรากฏผลลพธ ใหเลอกเวอรชน 2.2.0 ใน Drop-down Optionและคลก Install
รปท 2.12 การตดตง ESP8266
ในเมน Tools จะมบอรด ESP8266 ชนดตางๆ เพมขนมา เลอกใหตรงกบชนดของบอรดทใช ในทน ใหเลอก NodeMCU 1.0 (ESP-12E Models)
คมอการใชงาน NETPIE - 33
รปท 2.13 การเลอกชนดของบอรด ESP8266
NETPIE Microgear Library ส าหรบ ESP8266
ดาวนโหลด Microgear ส าหรบ ESP8266 จาก GitHub ของ NETPIE หรอ Manage Libraries
กรณท 1 ถาดาวนโหลด Microgear จาก GitHub (https://github.com/netpieio/microgear-esp8266-arduino) ใหคลกเมน Sketch --> Include Library --> Add .ZIP Library… เลอก Zip File ทดาวนโหลดมา คลก Choose ถาตดตงส าเรจ เขาไปทเมน Sketch --> Include Library จะเหนชอ ESP Microgear
กรณท 2 ถาดาวนโหลด Microgear จากเมน Manage Libraries… ใหคลกเมน Sketch --> Include Library --> Manage Libraries…
รปท 2.14 การตดตง Microgear Library จาก Arduino IDE
คนหาค าวา Microgear ทดาวนโหลดมา คลก Choose
คมอการใชงาน NETPIE - 34
ถาตดตงส าเรจ เมอเขาไปทเมน Sketch --> Include Library--> Manage Libraries… จะเหนชอ ESP8266 Microgear ถาลงเสรจเรยบรอยแลวจะปรากฏขอความวา Installed แตถายงไมส าเรจใหคลกป ม Install เพอตดตง
รปท 2.15 การตดตง Microgear Library ลงบนบอรด
USB Driver
ใน Workshop เราจะใชบอรด NodeMCU ซงม USB Port ทใชชป CP2102 ดงนนเราจ าเปนทจะตองตดตง Driver ใหระบบปฏบตการรจก USB Device ชนดน โดยดาวนโหลด USB Driver ไดท
https://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
Web Browser
ขอแนะน าใหใช Chrome หรอ Firefox หากยงไมไดตดตง สามารถดาวนโหลดไดจาก
Chrome https://www.google.com/chrome/browser/index.html
Firefox https://www.mozilla.org/en-US/firefox/new/
คมอการใชงาน NETPIE - 35
การใชงาน NETPIE กบอปกรณชนดอนๆ
นอกจาก ESP8266 แลว NETPIE ยงม Microgear ส าหรบภาษาตางๆ เชน HTML5, Node.js, Python, Java, Android, C# และฮารดแวรอนๆ โดยสามารถดาวนโหลดพรอมคมอการใชงานไดใน GitHub (https://github.com/netpieio/)
รปท 2.16 หนา GitHub ของ NETPIE
คมอการใชงาน NETPIE - 36
3. HTML 5 MICROGEAR
การใช NETPIE Client Library ในอกรปแบบหนงทถกน าไปประยกตใชอยางแพรหลายคอ HTML5 Microgear Library ซงสามารถเปลยน Web Browser ใหเปน Thing (หรอ NETPIE device) เพอสอสารกบ Thing หรออปกรณอนๆทเชอมตอกนภายใตแพลตฟอรม NETPIE ได HTML5 Microgear Library น เขยนดวยภาษา JavaScript นกพฒนาสามารถน าไปตอยอดเปน Web Application อนๆ โดยทไมตองตดตงโปรแกรมใดเพมเตมอก และสามารถใชไดกบอปกรณทวไป เชน คอมพวเตอรหรอสมารทโฟนทใช Browser ตางๆไดในปจจบน
Lab 3.1: Hello NETPIE
Lab นเปนการทดลองใช HTML5 Microgear ดวยวธงายๆ โดยการเขยนไฟล HTML ดวย Javascript เพยงไฟลเดยวเพอสราง Microgear ในการสงขอความผาน NETPIE กลบมายง Browser ของตนเองเปนระยะๆ Browser ซงกถอวาเปน Thing ชนดหนงสามารถเชอมตอกบ NETPIE ผานทาง Microgrear Library ขนตอนการทดลอง มดงน
1. พมพโคดขางลางลงใน Text Editor โดยแกไข APPID, KEY, SECRET ตามทไดสรางไวบนเวบ NETPIE โดยใหเลอกชนด Application Key เปน Session Key รวมทงตงชออปกรณ (ALIAS) เพอใชอางองในการสอสาร จะเหนไดวาการเรยกใช Microgear Library ถก Define ไวในบรรทดแรกทอางถง Source https://cdn.netpie.io/microgear.js
<script src="https://cdn.netpie.io/microgear.js"></script>
<script>
const APPID = "YOUR_APPID"; // แทนทดวย AppID
const KEY = "YOUR_KEY"; // แทนทดวย Key
const SECRET = "YOUR_SECRET"; // แทนทดวย Secret
const ALIAS = "myhtml"; // ตงชอเรยกอปกรณ (อยางไรกไดไมจ ากด)
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
คมอการใชงาน NETPIE - 37
alias : ALIAS
});
// สรางฟงกชนทจะตอบสนองตอขอความทเขามา
microgear.on('message', function(topic,msg) {
//ในทนเราจะเอาขอความไปแทนขอความของ HTML element ชอ data
document.getElementById("data").innerHTML = msg;
});
// สรางฟงกชนทจะถกเรยกเมอเชอมตอ NETPIE ส าเรจ
microgear.on('connected', function() {
microgear.setAlias(ALIAS); // ตงชอเรยกใหกบอปกรณตามตวแปรทตงไวสวนตนของไฟล
// แสดงขอความใหทราบวาเชอมตอส าเรจ
document.getElementById("data").innerHTML = "Now I am connected
with netpie...";
// ตงคา timer ใหท างานทก 1 วนาท (ตวเลข 1000 มหนวยเปน ms หมายถง 1000 ms)
setInterval(function() {
// สงขอความไปยงอปกรณทมชอตามตวแปร ALIAS ซงกคอตวเอง
microgear.chat(ALIAS,"Hello from myself at "+Date.now());
},1000);
});
microgear.connect(APPID); // สรางการเชอมตอไปยง NETPIE
</script>
<div id="data">_____</div>
Microgear ในตวอยางนคอ microgear-html5 ใน GitHub ซงเปน Client Library ของ NETPIE ทจะเปลยน Web Browser ใหเปน Microgear เพอสอสารกบ Microgear อนๆ
2. Save เปนไฟลชอ hellonetpie.html จากนนดบเบลคลกหรอคลกขวาเพอเปดไฟลดวย Browser 3. บนหนา Browser ทเปดขนมา จะปรากฏขอความ
Hello from myself at xxxxxxxxxx
โดย xxxxxxxxx เปน Unix Time ทจะเพมขนเรอยๆ ทกๆ 1000 ms หรอ 1 วนาท
คมอการใชงาน NETPIE - 38
Lab 3.2: HTMLChat
ในการทดลองน จะแสดงตวอยางการสอสารกนระหวาง Web Browser 2 ตว ผาน NETPIE โดยดดแปลงมาจาก Lab 3.1 ดงน
1. สราง Application Key ใหม 2 คา ภายใตแอปพลเคชน AppID เดยวกน
2. สรางไฟล HTML ขนมาใหม 2 ไฟล (alice.html และ bob.html) โดยใชโคดทแสดงขางลาง สงเกตวาความแตกตางของทงสองไฟลอยทเพยงตวแปร MYNAME และ YOURNAME เทานนทสลบทกน
alice.html
<script src="https://cdn.netpie.io/microgear.js"></script>
<script>
const APPID = “YOUR_APPID”;
const KEY = “KEY_1”;
const SECRET = “SECRET_1”;
const MYNAME = "alice"; // ชอของตวเอง
const YOURNAME = "bob"; // ชอของเพอนทจะคยดวย
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
});
microgear.on('message',function(topic,msg) {
document.getElementById("data").innerHTML = msg;
});
microgear.on('connected', function() {
microgear.setAlias(MYNAME); // ตงชอตวเอง
document.getElementById("data").innerHTML = "Now I am connected
with netpie...";
setInterval(function() {
// ใชฟงกชน chat ในการสงขอความหาเพอน
คมอการใชงาน NETPIE - 39
microgear.chat(YOURNAME,"Hello from "+MYNAME+" at
"+Date.now());
},1000);
});
microgear.on('disconnected', function() {
document.getElementById("data").innerHTML = "Now I am
disconnected with netpie...";
});
microgear.connect(APPID);
</script>
<div id="data">_____</div>
bob.html
<script src="https://cdn.netpie.io/microgear.js"></script>
<script>
const APPID = “YOUR_APPID”;
const KEY = “KEY_2”;
const SECRET = “SECRET_2”;
const MYNAME = "bob"; // ตงชอของตวเอง
const YOURNAME = "alice"; // ตงชอของเพอนทจะคยดวย
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
});
microgear.on('message',function(topic,msg) {
document.getElementById("data").innerHTML = msg;
});
microgear.on('connected', function() {
microgear.setAlias(MYNAME); // ตงชอตวเอง
document.getElementById("data").innerHTML = "Now I am connected
with netpie...";
setInterval(function() {
คมอการใชงาน NETPIE - 40
// chat หาเพอน
microgear.chat(YOURNAME,"Hello from "+MYNAME+" at
"+Date.now());
},1000);
});
microgear.on('disconnected', function() {
document.getElementById("data").innerHTML = "Now I am
disconnected with netpie...";
});
microgear.connect(APPID);
</script>
<div id="data">_____</div>
3. ใส APPID (เหมอนกนในทงสองไฟล) และ แตละค KEY กบ SECRET ลงในแตละไฟล 4. Save ไฟลทงสองไฟล แลวดบเบลคลกหรอคลกขวาเพอเปดไฟลทงสองดวย Browser 5. ผลลพธทไดในหนาตางทเปดขนมาจาก alice.html จะเปนดงน
Hello from bob at xxxxxxxxxx
และขอความในหนาตางทเปดขนมาจาก bob.html จะเปนดงน
Hello from alice at yyyyyyyyyyy
โดย xxxxxxxxx และ yyyyyyyyy เปน Unix Time ทจะเพมขนเรอยๆ ทก 1000 ms
Lab 3.3: Room Chat
ในการทดลองนแสดงตวอยางการสอสารกนระหวาง Web Browsers ผาน NETPIE ทมการใชงานทซบซอนกวาเดม เปนการทบทวนการใช Function Call ตางๆ ใน HTML5 Microgear Library (https://github.com/netpieio/microgear-html5/blob/master/README.th.md) เพอเปลยน Web Browser ใหเปน Microgear และท าการสอสารอพเดทขอมลกน มขนตอนดงน
1. ศกษาจากไฟล room_client.html และ room_server.html เพอทบทวน Function Call ตางๆทระบไวใน HTML5 Microgear Library
2. เปดไฟล room_client.html ดวย Text Editor และแกไขทบรรทด var slot = your_number; โดยใหเปลยนเปนหมายเลขทแตละทานไดรบ แลวท าการ Save File
คมอการใชงาน NETPIE - 41
3. คลกเพอเปดไฟล room_client.html และ room_server.html ดวย Browser ศกษาการสอสารกนระหวาง Browser ทงฝง Client และ ฝง Server และดการแสดงผลดงแสดงในรปท 3.1
room_client.html
<script src="https://cdn.netpie.io/microgear.js"></script><!-- Microgear
library -->
<script>
const APPID = "demobillboard" //Application ID ของอปกรณทเชอมตอ NETPIE
const KEY = "M0mqAyedJm1ywVD"; // Key ของอปกรณทเชอมตอ NETPIE
const SECRET = "moHzrlTv1Xu0k286LzxkoTiRn";//Secret ของอปกรณทเชอมตอ NETPIE
const ALIAS = "htmlgear"; // ชออปกรณทเชอมตอ NETPIE
var slot = 30; // slot number
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
alias : ALIAS
});
function getColor(){
return '#' + Math.random().toString(16).slice(2, 8).toUpperCase();
}
microgear.on('message',function(topic,msg) { //ตรวจพบขอความทสงมายงอปกรณ
//ก าหนดขอความใหแสดงผลใน tag id ชอ data
document.getElementById("data").innerHTML = msg;
});
microgear.on('connected', function() { //ตรวจสอบเมอเชอมตออปกรณกบ NETPIE
microgear.setAlias(ALIAS); //ก าหนดชออปกรณทเชอมตอกบ NETPIE
document.getElementById("data").innerHTML = "Now I am connected with
netpie..."; // แสดงขอความเมอเชอมตออปกรณกบ NETPIE
setInterval(function() { // ก าหนดใหท างานตลอดเวลาทกๆ 5000 ms
var color = getColor();
คมอการใชงาน NETPIE - 42
// สงขอความไปยงอปกรณชอ htmlgear ดวย NETPIE
microgear.publish("/billboard/slot/"+slot,color);
document.getElementById("data").innerHTML = "Publish color :
"+color;
document.body.style.backgroundColor=color;
},5000);
});
microgear.on('disconnected', function() { //ตรวจสอบเมอตดการเชอมตออปกรณกบNETPIE
document.getElementById("data").innerHTML = "Now I am disconnected
with netpie..."; // แสดงขอความเมอตดการเชอมตออปกรณกบ NETPIE
});
// ตรวจพบอปกรณทเชอมตอ NETPIE ดวย APPID เดยวกน
microgear.on('present', function(event) {
console.log(event);
});
//ตรวจพบเหตการณทอปกรณเคยเชอมตอ NETPIE ดวย APPID เดยวกนหายไป
microgear.on('absent', function(event) {
console.log(event);
});
microgear.connect(APPID); // เชอมอปกรณกบ NETPIE
</script>
<div id="data">_____</div>
room_server.html
<script src="https://cdn.netpie.io/microgear.js"></script><!-- Microgear
library -->
<style>
#rgb {
width:100%;
font-size: 50px;
vertical-align: middle;
}
.box {
คมอการใชงาน NETPIE - 43
float: left;
border: 1px solid black;
margin-right: 50px;
margin-bottom: 20px;
}
.boxcolor{
width: 250px;
padding: 10px;
display: inline-block;
color: #FFF;
background-color: #FFF;
}
.right {
text-align: center;
width: 150px;
padding: 10px;
display: inline-block;
color: #FFF;
background-color: #000;
}
</style>
<div id="data">_____</div>
<p/>
<div id="rgb"></div>
<script>
var numberbox = 30;
var htmlbox = "";
for(var i=0; i<numberbox; i++){
htmlbox+='<div class="box"><div
class="right">'+(i+1)+'</div><div class="boxcolor"
id="'+(i+1)+'">'+i+'</div></div>';
}
document.getElementById("rgb").innerHTML = htmlbox;
const APPID = "demobillboard"; // Application ID ของอปกรณทเชอมตอ NETPIE
const KEY = "M0mqAyedJm1ywVD"; // Key ของอปกรณทเชอมตอ NETPIE
const SECRET = "moHzrlTv1Xu0k286LzxkoTiRn";//Secret ของอปกรณทเชอมตอ NETPIE
คมอการใชงาน NETPIE - 44
const ALIAS = "billboard"; // ชออปกรณทเชอมตอ NETPIE
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
alias : ALIAS
});
microgear.on('message',function(topic,msg) { // ตรวจพบขอความทสงมายงอปกรณ
console.log(topic+" : "+msg);
if(topic.indexOf("/demobillboard/billboard/slot")!=-1){
if(msg.startsWith('#') || msg.startsWith('rgb(')){
var m = topic.split("/demobillboard/billboard/slot/");
document.getElementById(m[1]).style.color = msg;
document.getElementById(m[1]).style.backgroundColor =msg;
}
}
});
microgear.on('connected', function() { // ตรวจสอบเมอเชอมตออปกรณกบ NETPIE
microgear.setAlias(ALIAS); // ก าหนดชออปกรณทเชอมตอกบ NETPIE
// แสดงขอความเมอเชอมตออปกรณกบ NETPIE
document.getElementById("data").innerHTML = "Now I am connected
with netpie...";
microgear.subscribe("/billboard/slot/+");
});
microgear.on('disconnected', function() { // ตรวจสอบเมอตดการเชอมตออปกรณกบ NETPIE
// แสดงขอความเมอตดการเชอมตออปกรณกบ NETPIE
document.getElementById("data").innerHTML = "Now I am disconnected
with netpie...";
});
//ตรวจพบอปกรณทเชอมตอกบ NETPIE ดวย APPID เดยวกน
microgear.on('present', function(event) {
console.log(event);
});
// ตรวจพบวาอปกรณทเคยเชอมตอกบ NETPIE ดวย APPID เดยวกนหายไป
คมอการใชงาน NETPIE - 45
microgear.on('absent', function(event) {
console.log(event);
});
microgear.connect(APPID); // เชอมอปกรณกบ NETPIE
</script>
รปท 3.1 การแสดงผลท Web Browser ทเปดไฟล room_server.html
แบบฝกหด
1. ในไฟล room_client.html อธบายความหมายของ Function Call น microgear.publish("/billboard/slot/"+slot,color);
2. ในไฟล room_server.html อธบายความหมายของ Function Call น
microgear.subscribe("/billboard/slot/+");
คมอการใชงาน NETPIE - 46
4. ESP8266 MICROGREAR
4.1 รจก ESP8266/NODEMCU
บทนจะเกยวของกบ Thing ประเภท Embedded Board เพอใหเหนภาพวาสามารถสรางอปกรณฮารดแวรใหมาเชอมตอกบ NETPIE ไดอยางไร โดยในการทดลองศกษา เราจะใช NodeMCU รน 12E หรอ NodeMCU V2 หรอ NodeMCU Dev kit v1.0 (https://github.com/nodemcu/nodemcu-devkit-v1.0) ซงใชโมดล ESP8266-SoC (ESP-12E) ซงเปน 32-bit Microcontroller และม Built-in WiFi
Node MCU-12E รวมทงผงค าอธบายขาตอแสดงไวดงรปท 4.1
รปท 4.1 Node MCU-12E และผงค าอธบายขาตอ
คมอการใชงาน NETPIE - 47
ในการเขยนโปรแกรมลงบน NodeMCU เราจะใช Arduino IDE ในการ Compile และ Flash โปรแกรมลงไปผานทางสาย microB-USB ในสวนของโครงสรางโคด จะเหมอนกบการเขยนโปรแกรมบนบอรด Arduino โดยมฟงกชนสองสวนคอ สวนตงคาและสวนท างานหลก ดงแสดงขางลาง
void setup(){
//สวนนท าครงเดยวตอนเรมตนการท างาน
}
void loop(){
//สวนนเปนสวนหลก ท างานวนซ าตลอดไมรจบ
}
ทานสามารถทดสอบการท างานของบอรดเบองตนดงน
1.เชอมตอบอรดกบคอมพมเตอรดวยสาย microB-USB
2. ตรวจสอบ COM Port ทใชงานใหถกตอง
2.1 ส าหรบ Windows ไปท Control panel --> System -->Device Manager และดท Ports (COM & LPT) จะเหนบรรทด Silicon Labs CP210x USB to UART Bridge (COMx) เชน เปน COM3 เปนตน
2.2 เปดโปรแกรม Arduino IDE และไปทเมน Tools -->Board --> NodeMCU 1.0 (ESP-12E Module) จากนนไปทเมน Tools > Port ถามหลาย Port แสดงอย ใหตรวจสอบวาตรงกบ Port ใน 2.1
3. ใน Arduino IDE ไปท File --> New เพอเขยนโปรแกรมดงน
void setup() {
// put your setup code here, to run once:
pinMode(D0, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(D0,1);
delay(500);
digitalWrite(D0,0);
delay(500);
}
คมอการใชงาน NETPIE - 48
เมอเขยนโคดเรยบรอยแลว ใหกดป มลกศรเพอ Compile และ Upload หากไมมขอผดพลาด โปรแกรมท Compile จะถก Flash ลงไปบน NodeMCU และเรมตนการท างานอตโนมต ตวอยางขางลางเปนโปรแกรมทจะสงใหไฟ LED บนบอรด กระพรบดวยคาบเวลาปดเปด 0.5 วนาท
รปท 4.2 ตวอยางการเขยนโปรแกรมลงใน NodeMCU
Lab 4.1: NETPIE Blink
Lab 4.1 เปนการโปรแกรม NodeMCU ใหตอบสนองตอขอความ (Message) “1” และ “0” โดยถาไดรบขอความ “1” NodeMCU จะเปด LED แตถาเปน “0” จะปด LED
1. เปดไฟล netpie_blink.ino ใน Folder เพอแกไข หรอสรางไฟลขนใหมตามโคดดานลาง
2. สราง AppID และสราง Application Key โดยเลอกชนด Device Key
3. ใส APPID, KEY, และ SECRET ลงในไฟล
4. Save และ Upload ไฟลเขา NodeMCU
5. เปด Console โดยไปท Tools --> Serial Monitor หากโปรแกรมถกตองจะเหนตามแสดงในหนาตาง Console ดงแสดงในรปท 4.3 สงเกตจงหวะการเปดและปดไฟเทยบกบบรรทด Incoming message 0 หรอ 1
ขาพอรต D0 เปนขา Output
คาของเวลา Delay ม
หนวยเปนมลลวนาท
คมอการใชงาน NETPIE - 49
netpie_blink.ino
// #include สองบรรทดดานลางนตองมเสมอ
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "SSID"; // ใสชอ WiFi SSID แทน SSID
const char* password = "PASSWORD"; // ใสรหสผาน WiFi แทน PASSWORD
#define APPID "YOUR_APPID" // ให YOUR_APPID แทนทดวย AppID
#define KEY "YOUR_KEY" // ให YOUR_KEY แทนทดวย Key
#define SECRET "YOUR_SECRET" // ให YOUR_SECRET แทนทดวย Secret
#define ALIAS "pieblink" // ตงชอเลนให device น เปน pieblink
WiFiClient client;
int timer = 0;
char state = 0;
MicroGear microgear(client); // ประกาศตวแปร microgear
// สรางฟงกชนทจะถกเรยกเมอมขอความเขามา
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message -->");
msg[msglen] = '\0';
Serial.println((char *)msg);
// ถาขอความทเขามาเปน 1 ใหเปด LED ถาเปน 0 ใหปด LED
if(*(char *)msg == '1'){
digitalWrite(LED_BUILTIN, LOW); // LED on
}else{
digitalWrite(LED_BUILTIN, HIGH); // LED off
}
}
// สรางฟงกชนทจะถกเรยกเมอ Microgear เชอมตอกบ NETPIE ส าเรจ
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
คมอการใชงาน NETPIE - 50
// เราอาจจะใชโอกาสนตงชอหรอเปลยนชอหรออาจจะท าอะไรบางอยางเชน subscribe
microgear.setAlias(ALIAS);
}
void setup() {
// ประกาศใหเวลามขอความเขามาใหไปท าฟงกชน onMsghandler()
microgear.on(MESSAGE,onMsghandler);
// ประกาศใหเมอเชอมตอส าเรจใหไปท าฟงกชน onConnected()
microgear.on(CONNECTED,onConnected);
Serial.begin(115200);
Serial.println("Starting...");
pinMode(LED_BUILTIN, OUTPUT);
// initiate Wifi
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// initialize ตวแปร microgear
microgear.init(KEY,SECRET,ALIAS);
// เชอมตอไป NETPIE ไปยง AppID ทก าหนด
microgear.connect(APPID); // ฟงกชนเชอมตอ NETPIE
}
void loop() {
// เชควา Microgear ยงเชอมตออยหรอไม
if (microgear.connected()) { // ตรวจสอบการเชอมตอ NETPIE
Serial.println("connected"); // พมพแจงการเชอมตอ NETPIE ส าเรจ
คมอการใชงาน NETPIE - 51
// เราตองเรยก microgear.loop() เปนระยะ เพอรกษาการเชอตอ
microgear.loop();
if (timer >= 1000) {
Serial.println("Publish..."); // พมพแจงการสงขอมล NETPIE
// chat หาตวเองดวย state ทตรงขามกน
if(state==0){
microgear.chat(ALIAS,state);
state=1;
}else{
microgear.chat(ALIAS,state);
state=0;
}
timer = 0;
}
else timer += 100;
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
คมอการใชงาน NETPIE - 52
รปท 4.3 Console ของโปรแกรม netpie_blink
กลาวโดยสรปคอ โปรแกรมนสงให NodeMCU ท าการ Chat หาตวเองทกๆ 1 วนาท ดวยคาทตรงขามกบสถานะปจจบน (ถาเปดอย จะสง “0” แตถาปดอยจะสง “1”) สลบกนไปเรอยๆ ผลทเกดขนคอ LED จะกระพรบทก 1 วนาท เปนตวอยางของการเรยกใช Microgear Function เพอท าอะไรบางอยางเมอมขอความเขามา
Lab 4.2: IoT Switch
Lab 4.2 จะแสดงการสอสารแบบสองทางระหวาง Thing 2 ชนดคอทงฮารดแวรและซอฟตแวร โดยจะให HTML5 สงคา 0 และ 1 ไปยง NodeMCU เมอ NodeMCU ไดรบขอความจะกระท าตามเงอนไขทก าหนด และตอบกลบมายง HTML5 ขนตอนคอ
คมอการใชงาน NETPIE - 53
1.ฝง NodeMCU เขยนไฟล pieled.ino ซงดดแปลงมาจากโคด netpie_blink.ino ใน Lab 4.1 (เพยงแตตดสวนตงเวลาและ Chat หาตวเองออก) และสามารถใช AppID, Key และ Secret เดมทใชใน Lab 4.1 ได
2.ฝง HTML5 Switch ใหเขยนโคด switch.html โดยใช AppID เดยวกบฝง NodeMCU แตใหไปสราง Application Key ใหมชนด Session Key
3. ใส APPID, KEY, และ SECRET ลงในไฟลทงสอง
4. Save และ Upload ไฟล pieled.ino เขาไปยง NodeMCU
5. เปด Console โดยไปท Tools Serial Monitor และใช Browser เปดไฟล switch.html
6. กดป ม Switch บน Browser เพอท าการเปดปดไฟ
pieled.ino
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "YOUR_SSID";
const char* password = "YOUR_PASSWORD";
#define APPID "YOUR_APPID"
#define KEY "YOUR_KEY"
#define SECRET "YOUR_SECRET"
#define ALIAS "pieled"
WiFiClient client;
int timer = 0;
MicroGear microgear(client);
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message -->");
msg[msglen] = '\0';
Serial.println((char *)msg);
if(*(char *)msg == '1'){
digitalWrite(LED_BUILTIN, LOW); // turn on the LED
microgear.chat("switch","1");
คมอการใชงาน NETPIE - 54
}else{
digitalWrite(LED_BUILTIN, HIGH); //turn off the LED
microgear.chat("switch","0");
}
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
microgear.setName(ALIAS);
}
void setup() {
microgear.on(MESSAGE,onMsghandler);
microgear.on(CONNECTED,onConnected);
Serial.begin(115200);
Serial.println("Starting...");
pinMode(LED_BUILTIN, OUTPUT);
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
}
void loop() {
if (microgear.connected()) {
Serial.println("...");
microgear.loop();
คมอการใชงาน NETPIE - 55
timer = 0;
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
switch.html
<script src="https://cdn.netpie.io/microgear.js"></script>
<script>
const APPID = “YOUR_APPID”;
const KEY = “YOUR_KEY”;
const SECRET = “YOUR_SECRET”;
const ALIAS = "switch";
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
alias : ALIAS
});
function toggle() {
if(document.getElementById("button").innerText=="off"){
microgear.chat('pieled','1');
}
else{
microgear.chat('pieled','0');
}
}
microgear.on('message',function(topic,msg) {
คมอการใชงาน NETPIE - 56
document.getElementById("data").innerHTML = msg;
if(msg=="1"){
document.getElementById("button").innerText="on";
}else if(msg=="0"){
document.getElementById("button").innerText="off";
}
});
microgear.on('connected', function() {
microgear.setAlias(ALIAS);
document.getElementById("data").innerHTML = "Now I am connected with
netpie...";
});
microgear.connect(APPID);
</script>
<div id="data">_____</div>
<center>
<button onclick="toggle()" id="button">off</button>
</center>
คมอการใชงาน NETPIE - 57
5. FREEBOARD
Freeboard เปน Web Application ทสามารถสราง Dashboard เพอแสดงผลส าหรบ IoT แอปพลเคชนโดยสามารถใชเปนกระดานสวนตว สามารถวางป มกดสวตชไวใชส าหรบควบคมอปกรณ หรอวางหนาปดเพอแสดงผลขอมลตางๆ ทไดจากอปกรณ เชน เซนเซอรในระบบ IoT นอกจากนยงสามารถแสดงผลเปนกราฟได สวนหนากระดานหรอ Dashboard นน สามารถปรบแตงไดโดยงาย เพยงแคปอนขอมลเขาหรอก าหนดค าสงกสามารถท างานไดแลว โดยทผใชไมจ าเปนตองเขยน HTML Web Page เองและทส าคญคอขอมลนนมการอพเดทแบบ Real-time มความเสถยรและเชอถอได และเปน Open-Source ซงท าใหนกพฒนาสามารถตอยอดใหดยงขนไดอกดวย
NETPIE Freeboard คอ Freeboard ส าหรบการควบคมและการแสดงผล (Visualization) ขอมลทดงมาจากอปกรณทตอกบ NETPIE ทมงานไดพฒนา Widget Plugins ขนมาใหผใชงานสามารถท าตามความตองการไดหลากหลาย เชน สามารถสรางป มควบคมและใสค าสง Javascript ส าหรบ Action ตางๆ ได การใชงาน NETPIE Freeboard นนสามารถใช Browser เปดไฟล index.html ทไดจากการตดตง NETPIE Freeboard หรอสามารถใช Freeboard ผานทางหนาเวบของ NETPIE
รปท 5.1 Dashboard ของ NETPIE Freeboard
คมอการใชงาน NETPIE - 58
วธท 1 การใช NETPIE Freeboard ทตดตงในเครองแบบ Local
1. ดาวนโหลดและตดตง NETPIE Freeboard จาก Github (https://github.com/netpieio/netpie-freeboard) กดทป ม Clone or download เพอเรมท าการดาวนโหลดไฟลแบบ Download ZIP
2. แตกไฟลใน ZIP Folder แลวใช Browser เปดไฟลทชอ index.html จะปรากฏหนาส าหรบใหใสขอมล
3. ปรบแตงคาใน NETPIE Freeboard ตามรายละเอยดทจะอธบายในล าดบถดไป
วธท 2 การใช NETPIE Freeboard ผานทางหนาเวบ NETPIE
1. เขาสระบบ NETPIE Account แลวไปทเมน RESOURCES FREEBOARDS
2. คลกเครองหมาย + เพอสราง Freeboard ขนมาใหม
3. ตงชอ Freeboard แลวกดป ม CREATE
4. ปรบแตงคาใน NETPIE Freeboard ตามรายละเอยดทอธบายในล าดบถดไป
ตวอยางการปรบแตงเบองตน
Main Menu
IMPORT เปนเมนส าหรบอพโหลดไฟล Configuration ของหนา Freeboard ทบนทกเกบไว
EXPORT เปนเมนส าหรบน าไฟล Configuration ออก (Export)
RESET เปนเมนส าหรบลาง Datasource และ Widget ทสรางไว
ADD PANE เปนเมนส าหรบเพม Panel ในการจดวาง Widget
Datasources Menu
คมอการใชงาน NETPIE - 59
ADD เปนเมนส าหรบเพม Datasource ทเปนแหลงขอมลทจะเชอมตอเพอดงออกมาแสดง
รปท 5.2 การเพม Datasource
1. ดานลาง DATASOURCES คลกท ADD จะปรากฏ Datasource Type ชนดตางๆ ใหเลอกเปน NETPIE Microgear
รปท 5.3 การเลอกประเภทของ Datasource
2. ใสขอมลส าหรบ Datasource ซงประกอบดวย
NAME คอ ชอเรยก Datasource ทใชอางอง (ไมเกน 16 ตวอกษร) ในตวอยางในภาพดานลางคอ dashboardMonitor
APP ID คอ App ID ทไดสรางผานหนาเวบ https://netpie.io/app ในตวอยางในภาพดานลางคอ PieSmartHome
KEY คอ Key ทไดจากการสราง App Key บนเวบ NETPIE
SECRET คอ Secret ของ Key บนเวบ NETPIE
คมอการใชงาน NETPIE - 60
SUBSCRIBED TOPIC คอ Topic ทใชส าหรบการรบสงขอมลทอยภายใน APPID นนๆ กรณนใชเปน /# มความหมายวา รบขอความจากทก Topic
เมอกรอกขอมลเสรจกด SAVE
รปท 5.4 การระบขอมลของ Datasource
3. เพม Panel ส าหรบสราง Widget ดวยการคลกท ADD PANE จะปรากฏ Panel เพมขนมาดานลาง
คมอการใชงาน NETPIE - 61
รปท 5.5 การเพม Panel ส าหรบสราง Widget
4. เพม Widget บน Panel ทสรางขนใหมโดย คลกทเครองหมาย + และเลอกชนดของ Widget เชน Gauge ตามตวอยางในรป
รปท 5.6 การเลอกประเภทของ Widget
5. กรอกขอความลงไปดงน แลวกด Save
TITLE ตงชอให Widget น
VALUE ใหคลกท + DATASOURCE จะขนรายชอของ Datasource ทไดสรางไว และสามารถเลอกชอทมอย และพมพเพมเตมตาม Format เบองตนดงน
datasources["YourDatasourceName"]["/YourAppID/YourSubscribeTopic"]
UNITS สามารถใสหนวยวดทตองการ หรอเวนวางไวกได
คมอการใชงาน NETPIE - 62
ขนตอนทงหมดคอ การสรางโครงของมาตรวดหรอ Gauge เบองตน ทยงไมไดแสดงผล เนองจากยงไมมการระบใหเชอมตอกบอปกรณหรอเซนเซอรเพอรบขอมลเขามาเปน Datasource ซงจะเราจะแสดงรายละเอยดใน Lab 5.1 ตอไป
Lab 5.1: การแสดงผลขอมลจากอปกรณเซนเซอรบน NETPIE Freeboard
Lab 5.1 เปนการสรางแอปพลเคชนเซนเซอรวดอณหภมและความชนดวย NodeMCU และเซนเซอรโมดล DHT11 (อปกรณ ZX-DHT11 ใน IoT Kit) ในขนแรกผใชตองตดตง Library ทเกยวของกบเซนเซอรกอน ซงในทนคอ DHT.h ซงสามารถดาวนโหลดไดท https://github.com/adafruit/DHT-sensor-library ใหผใชงานคดลอกไปวางไวใน Folder Arduino\libraries
ในภาพดานลางแสดงการเชอมตอ เซนเซอร DHT11 กบ NodeMCU
รปท 5.7 วธการเชอมตอ DHT-11 เขากบ NodeMCU
หลงจากเชอมตอเสรจ ใหท าตามขนตอนดงน
คมอการใชงาน NETPIE - 63
1. ฝง NodeMCU สามารถเขยนโคดสรางไฟล piedht.ino ตามขางลางและ Upload ไฟลเขา NodeMCU
piedht.ino
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "SSID";
const char* password = "PASSWORD";
#define APPID "YOUR_APPID"
#define KEY "YOUR_KEY"
#define SECRET "YOUR_SECRET"
#define ALIAS "piedht"
WiFiClient client;
int timer = 0;
char str[32];
#define DHTTYPE DHT11 // Define sensor type
#define DHTPIN D4 // Define sensor pin
DHT dht(DHTPIN, DHTTYPE, 15); //Initialize DHT sensor
int humid;
int temp;
MicroGear microgear(client);
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message -->");
msg[msglen] = '\0';
Serial.println((char *)msg);
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
คมอการใชงาน NETPIE - 64
microgear.setAlias(ALIAS);
}
void setup(){
dht.begin();
microgear.on(MESSAGE,onMsghandler);
microgear.on(CONNECTED,onConnected);
Serial.begin(115200);
Serial.println("Starting...");
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
}
void loop(){
if (microgear.connected()) {
Serial.println("connected");
microgear.loop();
if (timer >= 1000) {
humid = dht.readHumidity();
temp = dht.readTemperature();
sprintf(str,"%d,%d",humid,temp);
Serial.println(str);
Serial.print("Sending -->");
microgear.publish("/dht",str);
คมอการใชงาน NETPIE - 65
timer = 0;
}
else timer += 100;
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
ในตวอยางน ค าสง microgear.publish(“/dht”,str) คอการ Publish ขอความ (ในทนเปน Message String str) ไปยง Topic ทระบคอ /dht ซงขอความคอคาของอณหภมและความชนทวดไดจากเซนเซอร DHT
2. เปด Console โดยไปท Tools ->Serial Monitor เพอตรวจสอบวาเซนเซอรท างานไดปกตหรอไม
รปท 5.8 คอนโซลตรวจสอบการท างานของเซนเซอร
3. ฝง NETPIE Freeboard คลกท Datasource ทสรางขนกอนหนาน และแกไขในชอง SUBSCRIBED TOPICS ใหเปน /dht
คมอการใชงาน NETPIE - 66
4. กด + (ADD PANE) เพอสราง Widget ชนด Gauge ใหม 2 Widget เพอแยกแสดงอณหภมและความชน โดยกรอกตงคาแตละ Widget ดงน
Widget 1:
TITLE : Humidity
VALUE : datasources["YourDatasourceName"]["/YourAppID/dht"].split(",")[0]
UNIT : %
MINIMUM : 0
MAXIMUM : 100
Widget 2:
TITLE : Temperature
VALUE : datasources["YourDatasourceName"]["/YourAppID/dht"].split(",")[1]
UNIT : C
MINIMUM : 0
MAXIMUM : 50
ภาพดานลางแสดงตวอยางการกรอกขอมลเพอสราง Widget แสดงคาความชน (Humidity)
คมอการใชงาน NETPIE - 67
รปท 5.9 ตวอยางหนาจอตงคา Widget แสดงคาความชน
Widget แสดงผลอณหภมและความชนทสรางขนจะมลกษณะตามแสดงในรป
รปท 5.10 Widget แสดงคาอณหภมและความชนทวดไดจากเซนเซอร
คมอการใชงาน NETPIE - 68
ค าอธบายเพมเตม
เนองจาก DHT สงคามาในรปแบบ "Humidity,Temperature" เชน "40,24" เวลาเรารบคาเขามา จงตองท าการแยกออกเปน Array โดยใชเครองหมาย Comma “,” เปนตวแบง จากนนกอางองถงชองใน Array ของ Message String ท Publish ใน Topic /dht เชน Index [0] หมายถงคาแรก และ Index [1] หมายถงคาถดมา
Lab 5.2: การควบคมอปกรณดวย NETPIE Freeboard
Lab 5.2 แสดงการประยกต NETPIE Freeboard ในการควบคมอปกรณ โดยในเบองตนน เราจะควบคมไฟ LED บนบอรด NodeMCU ซงใชหลกการท างานบนพนฐานของการ Subscribe ขอความจาก Topic หรอหวขอทระบ และการก าหนดตรรกะของการควบคมทงในสวนของ Datasource และสวนของ Widget ทใชควบคม โดยมขนตอนดงตอไปน
1. แกไขไฟล pieled2.ino โดยระบขอมลการเขาถงเครอขาย Wifi ขอมล APPID, KEY และ SECRET ตามโคดขางลาง และท าการ Upload ไฟลเขา NodeMCUใหเชอมตอกบ NETPIE
pieled2.ino
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "SSID";
const char* password = "PASSWORD";
#define APPID "YOUR_APPID"
#define KEY "YOUR_KEY"
#define SECRET "YOUR_SECRET"
#define ALIAS "pieled"
WiFiClient client;
char state = 0;
char stateOutdated = 0;
คมอการใชงาน NETPIE - 69
char buff[16];
MicroGear microgear(client);
void sendState(){
if (state==0)
microgear.publish("/pieled/state","0");
else
microgear.publish("/pieled/state","1");
Serial.println("send state..");
stateOutdated = 0;
}
void updateIO(){
if (state >= 1) {
digitalWrite(LED_BUILTIN, LOW);
}
else {
state = 0;
digitalWrite(LED_BUILTIN, HIGH);
}
}
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
char m = *(char *)msg;
Serial.print("Incoming message -->");
msg[msglen] = '\0';
Serial.println((char *)msg);
if (m == '0' || m == '1') {
state = m=='0'?0:1;
updateIO();
}
if (m == '0' || m == '1' || m == '?') stateOutdated = 1;
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
Microgear.setAlias(ALIAS);
คมอการใชงาน NETPIE - 70
stateOutdated = 1;
}
void setup(){
Serial.begin(115200);
Serial.println("Starting...");
pinMode(LED_BUILTIN, OUTPUT);
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
microgear.on(MESSAGE,onMsghandler);
microgear.on(CONNECTED,onConnected);
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
}
void loop(){
if (microgear.connected()) {
if (stateOutdated) sendState();
microgear.loop();
}
else {
Serial.println("connection lost, reconnect...");
microgear.connect(APPID);
}
}
2. ในหนา NETPIE Freeboard คลกเพม Datasource ทสรางขนกอนหนานเพอแกไข ตงชอ Datasource ใสคา KEY และ SECRET และในชอง SUBSCRIBED TOPICS ใหใส /pieled/state หรอ Topic ททานระบไวส าหรบการ publish ในไฟล pieled2.ino ดงแสดงในภาพดานลาง และกด Save
คมอการใชงาน NETPIE - 71
รปท 5.11 หนาตางตงคา Datasource ใน NETPIE Freeboard ส าหรบควบคม LED
3. สราง Widget ขนมาใหมโดยกด + (ADD PANE) และเลอกชนดใน Drop Down Box เปนแบบ Toggle
รปท 5.12 หนาจอเลอกชนด Widget ใหเปนแบบ Toggle
จากนนตงคา Widget ดงนโดยหนาจอการตงคาแสดงดงรป
TOGGLE CAPTION : ตงชอป ม Toggle (ในตวอยางตงเปน PIE_LED)
คมอการใชงาน NETPIE - 72
TOGGLE STATE : ใสขอมลตามชอของ Datasource และ Topic เชน datasources["netpie_control"]["/PieSmartHome/pieled/state"]==1
ON TEXT : ON
OFF TEXT : OFF
ONTOGGLEON ACTION : microgear['netpie_control'].chat('pieled','1')
ONTOGGLEOFF ACTION : microgear['netpie_control'].chat('pieled','0')
รปท 5.13 หนาจอการตงคา Widget ชนด Toggle
แลวกด Save จะได Widget ทมป มควบคมดงแสดงในภาพ เพอทดสอบเปดปด LED บน NodeMCU
รปท 5.14 Widget ใชเปดปด LED บน NodeMCU
คมอการใชงาน NETPIE - 73
ค าอธบายเพมเตม
TOGGLE STATE เปนสถานะ On/Off ซงสามารถผกกบตรรกะของ Datasource ในทนเราตงคาให Toggle เปลยนสถานะตามคาทสงมาใน Topic ชอ /pieled/state
ONTOGGLEON และ ONTOGGLEOFF เปนค าสงทจะถกเรยก เมอ Toggle เปลยนสถานะไปเปน ON และ OFF ตามล าดบ
ในหนา Datasources ตรงชอง SUBSCRIBED TOPICS นน นอกจากจะสามารถระบคาแบบเจาะจงเปน topic /pieled/state แลว ยงสามารถระบคาเปน /pieled/+ กได โดยใชเครองหมาย (+) ซงเปน Single-Level Wildcard เพอรบคาของ State
เราสามารถใช Wildcard เพอชวยในการ Subscribe Topic ตางๆ เชน หากตองการ
Subscribe Topic ตามทระบแบบเจาะจงดงน: "/home/kitchen/temp", "/home/bedroom/temp", และ "/home/livingroom/temp" กสามารถยบเหลอ 1 Topic คอ "/home/+/temp"
นอกจาก + แลวยงใชเครองหมาย # ไดดวย โดยทเครองหมาย + จะแทนค าอะไรกไดระดบชนเดยว สวน # จะแทนค าอะไรกไดในระดบชนยาวตอไปเทาไหรกได เชนจะให match 3 Topic ขางตน กอาจจะเขยนระบเปน Topic คอ "/home/#"
คมอการใชงาน NETPIE - 74
6. NETPIE FEED
ขอมลทเกดจากการอานคาของอปกรณเซนเซอรในบททแลว สามารถน ามาใชใหเกดประโยชนไดอยางหลากหลาย เชน ใชส าหรบการตรวจสอบ (Monitoring) หรอการแสดงผลของขอมล (Data Visualization) โดยเฉพาะอยางยงขอมลแบบทนเวลา (Real-time Data) ซงจะตองเกบรวบรวมดวยอตราความถทเหมาะสมเพอใหการตรวจสอบหรอการแสดงผลตรงตามความตองการ ในปจจบนแพลตฟอรม NETPIE มบรการทสามารถเกบขอมลและแสดงผลทเรยกวา Feed ซงท าหนาทเสมอนถงเกบขอมล ประเภท Time-Series กลาวคอ เปนชดขอมลหรอคาตวแปร ณ เวลาตางๆ เชนอณหภมอากาศในชวงเวลาตางๆ ของวน เปนตน ขอมลเหลานจะถกเกบแบบตอเนองสะสมกนไปตลอด และสามารถเรยกออกมาดในชวงเวลาใดกได ในบทนจะอธบายรายละเอยดการใชงาน NETPIE Feed ตงแตการตงคาการเกบขอมลจาก Datasource ไปจนถงการแสดงผล
6.1 การสราง FEED
1. เลอก FEEDS จากเมน RESOURCES
รปท 6.1 การเขาใชงาน Feed จากเมน Resources
2. สราง Feed ใหม หรอเพม Feed ดวยการคลกทเครองหมาย + ทมมบนของ Feed
รปท 6.2 การสรางหรอเพม Feed ใหม
คมอการใชงาน NETPIE - 75
3. ตงชอ Feed โดยทชอนจะตองไมซ ากบทเคยมมากอน และหามซ ากบของผใชอน เมอตงชอแลวให
คลก CREATE เพอสราง Feed
รปท 6.3 การตงชอ Feed
4. เมอสราง Feed ส าเรจ จะเขาสหนาตงคา Feed ตามภาพขางลาง ในตวอยางน ไดสรางสราง
Feed ทมชอวา “mysensor” ซงจะไปปรากฏในหนารวม Feed เมอเราเขามาในครงตอไปเราสามารถกลบมาทหนาตงคานไดอกจากหนารวมของ Feed โดยคลกทเครองหมายรปประแจดานขวามอหลงชอ Feed ทตองการ
รปท 6.4 หนาตงคา Feed
5. เนองจาก Feed ทสรางขนใหมนยงไมสามารถรบคาใดๆ เขามาได จงตองสราง Field ขนมารบ
ขอมล ใหกดป ม + ADD จะปรากฏหนาตางใหตงคาตางๆ ในตวอยางน เปนการสราง Field จ านวน 2 Field ทมชอวา temp และ humid (หรอจะตงเปนชออะไรกได) หากมหนวยกระบไวเพอการแสดงผลตอไป โดย ณ ขณะนยงรองรบเฉพาะขอมลชนดตวเลข (Number) เทานน โดยในอนาคตมอาจมการพฒนาเพมเตมใหรองรบขอมลชนดอนๆ
คมอการใชงาน NETPIE - 76
รปท 6.5 การสราง Field เพอรบขอมล Feed
6. คลก SAVE จะได Feed ทพรอมรบคารายละเอยดการปรบแตงอยในล าดบถดไป
รปท 6.6 ตวอยาง Feed ทสรางขนดวย 2 Field
6.2 การก าหนดสทธในการเขาถง FEED
เนองจาก Feed แตละอนทสรางขนมานน เปน Resource อสระทไมขนกบ AppID ดงนนในการน าไปใชงานจ าเปนตองมเรองของการก าหนดสทธ การใหสทธกบอปกรณทจะเขามาอานหรอเขยน Feed มดวยกน 2 วธ ไดแก
1. การใช API Key ทปรากฎอยในแทบ Permission วธนจะอนญาตให Client ทม API key
สามารถอานเขยน Feed นได วธการน า API key ไปใชจะกลาวถงในตอไป
คมอการใชงาน NETPIE - 77
2. การใหสทธกบ AppID ใชไดกบเฉพาะ AppID ของเจาของ Feed เทานนวธนมไวเพออ านวย
ความสะดวกในขนตอนการพฒนาเนองจากเปนการใหสทธกนผานเวบ จงไมตองเขาไปแกโคด
โปรแกรมการใหสทธกบ AppID จะท าใหทกอปกรณใน AppID นนมสทธอานหรอเขยน Feed น
เหมอนกนหมด การตงคาท าไดโดยคลกทแทบ Permission และคลกท EDIT ตามภาพ
รปท 6.7 การตงคาสทธในการเขาถง
จากนนพมพ AppID ทตองการใหสทธ หรอเลอกจากเมน Drop-Down และคลก SAVE ในตวอยาง
ขางลาง เปนการใหสทธกบ AppID ทชอ “iotdemo” ดงนนทกอปกรณภายใต AppID น จะสามารถอาน
เขยน Feed ไดโดยอตโนมต การอนญาตแบบนจะเปนการแจกสทธในรปแบบเดยวกบการน า Default API
key ของ Feed ไปใช
เราสามารถใหสทธกบ AppID ทเราเปนเจาของเทานน
คมอการใชงาน NETPIE - 78
รปท 6.8 การใหสทธการเขาถง Feed กบ AppID
6.3 การเขยนขอมลลงใน FEED
การเขยนขอมลเพอเกบใน Feed ม 2 วธ ดงน
วธท 1 ใช REST API (ขอมลและการใชงานโดยละเอยดของ REST API อยในบทท 7)
REST API สามารถเรยกผาน Command Line ไดโดยใชโปรแกรม curl ซงเปน HTTP Client แบบ Command Line ทนกพฒนานยมใชกนมาก ในระบบปฏบตการ Mac OSX และ Linux โปรแกรมนจะถกตดตงมาแบบพรอมใชงานอยแลว เพยงแคเปด Terminal กสามารถพมพค าสงไดเลย แตส าหรบ Windows อาจตองตดตงโปรแกรมเพม โดยสามารถดาวนโหลดไดจาก https://curl.haxx.se/download.html
การเขยน Feed ผาน REST API จะตองกระท าโดยใช API Key ควบคกนไปดวยเสมอ และมรปแบบค าสงทเรยกผาน curl บน Terminal ดงน (เครองหมาย$ ไมตองพมพลงไป ใสไวเพอสอวาเปน Command Line)
$ curl -X PUT
"https://api.netpie.io/feed/<FEEDID>?apikey=<APIKEY>&data=<DATA>"
ตวอยางการสงคา temp = 25.2 และ humid = 62.5 ไปเขยนท Feed ชอ mysensor จะใชค าสงดงน
$ curl -X PUT
"https://api.netpie.io/feed/mysensor?apikey=5DunZ38nKP5dGC0h4Bj7mXyeMURdoXO
o&data=temp:25.2,humid:62.5"
เมอพมพเสรจใหกด Enter หากไมมขอผดพลาด จะมขอความขนมาดงน {“code”:200,”message”:”Update OK”}
คมอการใชงาน NETPIE - 79
เมอกลบไปดทหนา Feed เราจะเหนจดขอมลปรากฏขนมาแบบนขอทควรระวงคอ ชอ Field ขอมลในค าสง (temp และ humid) จะตองตรงกบชอ Field ทไดสรางรอเอาไวบน Feed เพอใหขอมลถกจดเกบส าเรจ
รปท 6.9 การสรางขอมลไปเกบใน Feed ดวย command curl
วธท 2 ใช Microgear Function
ส าหรบอปกรณทตอ NETPIE ผาน Microgear Library อยแลว สามารถสงคาเขาไปใน Feed ผาน Real-time Message ไดเลยโดยใชฟงกชน microgear.writeFeed() ซงจะมใน Library ปจจบนทกภาษาของ NETPIE อยแลว (หากไมมโปรดอพเดทใหเปนเวอรชนลาสด) การเขยน Feed ดวย Microgear น ในกรณทเราไดใหสทธกบ AppID ไวแลว กไมจ าเปนตองใส API Key ลงไปรปแบบการใชฟงกชนมดงน
microgear.writeFeed("<FEEDID>","<DATA>")
โดยท DATA เปน String ทมลกษณะเดยวกบ REST API ดงตวอยางน
microgear.writeFeed("mysensor","temp:25.2,humid:62.5")
สวนของ DATA นอกจากรองรบ String รปแบบดงกลาวแลว เรายงสามารถสง String ทแปลงมาจาก json ไดดวย เชน “{\”temp\”:25.2,\”humid\”:62.5}” หรอหากเปน Node.js หรอ Javascript เรายงสามารถสงตวแปรทม Type เปน Object ไดเลยโดยไมตองแปลงเปน String กอน
คมอการใชงาน NETPIE - 80
ในกรณทเรายงไมไดใหสทธกบ AppID ฟงกชนขางตนจะไดรบขอความ Error วาไมมสทธเขยน Feed จงตองใส API Key ลงไปในฟงกชนดวยซงจะเหมาะกบกรณทตองการใหมเฉพาะอปกรณเพยงบางตวเทานนทสามารถเขยน Feed ได รปแบบการเรยกจะเปนตามน
microgear.writeFeed("<FEEDID>","<DATA>","<APIKEY>")
ซงตวอยางการใชจรงจะอยในรปแบบดงน
microgear.writeFeed("mysensor","temp:25.2,humid:62.5","5DunZ38nKP5dGC0h4Bj7
mXyeMURdoXOo")
และทกครงทเราสงคาเขาไปท Feed ไมวาส าเรจหรอไม จะม Message ตอบกลบมาทาง Event Info หรอ Error เสมอ เราสามารถเชคสถานะการเขยน Feed ไดจากการรบ Event info และ Error ซงลกษณะการเรยกใชจะแตกตางกนเลกนอยตามรปแบบภาษาของ Library ทใชงาน รายละเอยดเพมเตมสามารถศกษาไดในสวนอธบาย Events ของเอกสาร readme ใน Microgear Library แตละภาษา
6.4 การดงขอมลจาก FEED มาใชงาน
NETPIE มวธใชงานขอมลจาก Feed อย 3 แบบดงน
วธท 1 การแสดงผลผานหนาการจดการของ Feed
เราสามารถใชหนา Feed ของ NETPIE.io ในการดคายอนหลงไดในลกษณะเสนกราฟและสามารถตงคาการแสดงผลไดจากแทบ Data Display ดงน
GRANULARITY คอความละเอยดของจดขอมล ตวอยางนตงไวท 12 นาท หมายความวาจดขอมลตางๆ ทเกบมาในชวงเวลาหนาตางละ 12 นาทจะถกน ามาเฉลยเปนจดเดยว
SINCE เปนเวลาตงตนยอนหลงทจะเรยกดขอมล BEGIN AT 0 ตงเปน TRUE จะเปนการตงคาแกน Y เรมตนท 0 MARKER แสดงวงกลมทจด AUTO GAP แทรกชองวางอตโนมต (ในกรณไมมขอมลในชวงเวลาทตงไว)
คมอการใชงาน NETPIE - 81
รปท 6.10 หนาจอแสดงผลเสนกราฟของ Feed
วธท 2 การแสดงผลผานหนา Freeboard
นอกจากดคาผานหนาการจดการ Feed แลวเรายงสามารถดงคาของ Feed ไปแสดงผลบน NETPIE Freeboard รวมกบ Widget ตางๆ ไดอกดวย วธการใชงาน Freeboard สามารถดรายละเอยดไดจากบททแลว โดยในบทน เพอให Freeboard แสดง Feed ใหเลอกชนด Datasource ของ Freeboard เปน NETPIE Feed
รปท 6.11 การเลอกชนดของDatasource เพอใชงาน Feed
คมอการใชงาน NETPIE - 82
เมอเสรจแลวจะเขาสหนาตงคา Datasource ใหกรอกขอมลดงน
NAME ตงชอเปนอะไรกได ในตวอยางน ตงชอวา “sensor feed” FEED ID ใส Feed ID ใหตรงกบชอ Feed ทสรางไวตามตวอยางในบทท 5 คอ “mysensor” AKI KEY ใส Default API key ทไดจากหนาตอนทสราง Feed
สวนตวเลอกทเหลอสามารถตงไดตามความเหมาะสม เมอเสรจแลวกดป ม SAVE
รปท 6.12 การตงคา Feed ใน Datasource
เมอตงคา Datasource บน Freeboard ส าเรจ Datasource จะเรมท างาน ขนตอไปคอการสราง
Widget ทดงขอมลจาก Datasource ของ Feed มาแสดงผล ซง NETPIE ม Widget ชอวา Feed View ไวส าหรบใชงานคกบ Feed Datasource การเพม Widget ใหมใหเลอกเพมหนาตางกอนดวยการกดป ม ADD PANE และใหกดป ม + ทหนาตางเพอเพม Widget และเลอกชนด Feed View ดงแสดงในภาพ
คมอการใชงาน NETPIE - 83
รปท 6.13 การสราง Widget เพอดคาของ Feed
รปท 6.14 การเลอกชนดของ Widget เปน FeedView
ในการตงคา FeedView ตามภาพดานลาง ชองทส าคญทสดคอชอง DATASOURCE เราจะตอง
เลอก Datasource ทมชนดเปน NETPIE Feed โดยอางถง Field ทมชอวา data ของ Datasource นน สรปคอใหใสคาในลกษณะน
datasources[“<Feed Datasource Name>“][“data”]
คมอการใชงาน NETPIE - 84
โดยท Feed Datasource Name ใหแทนทดวยชอของ Datasource ของ Feed ทเราตงไวกอนหนาน (ในตวอยางใชชอ “sensor feed”) หากไมสะดวกจะพมพ เราสามารถคลกตรงป ม +DATASOURCE ขางหลงชองจะมตวชวยเลอกในการกรอกคา ดงนนในตวอยางนตองใสวา
datasources[“sensor feed“][“data”]
รปท 6.15 การตงคา Widget ส าหรบ Feed
ตวเลอกทอนๆ สามารถปรบเปลยนไดตามความเหมาะสม
TITLE ขอความทจะขนบนกราฟ DATA SOURCE แหลงขอมลทจะดงมาแสดงผล FILTER เปนตวกรอง สมมตวาขอมลจาก data source ม 3 เสน ไดแก temp, humid และ light
หากเราอยากใหกราฟแสดงเฉพาะ temp และ humid กใสเฉพาะค าวา temp,humid ลงในชอง filter
TYPE OF CHART มสองตวเลอก ไดแก LINE กบ STEP X AXIS TITLE ขอความก ากบบนแกน X
คมอการใชงาน NETPIE - 85
Y AXIS TITLE ขอความก ากบบนแกน Y BEGIN AT 0 ตงใหคา Y เรมตนท 0 หรอไม LINE COLORS หากตองการ สามารถเลอกสเสนกราฟได เคยใสเปนคาส HTML ตวอยางเชน
#ff0000,#00ff00,#0000ff หมายถง ก าหนดใหเสนแรกเปนสแดง เสนทสองเปนสเขยวและเสนทสามเปนสน าเงน กราฟมากกวาสามเสนน จะวนกลบไปเรมใชสแดงใหมในเสนถดไป
MARKER แสดงวงกลมทต าแหนงจดขอมล MULTIPLE AXIS แสดงแกน Y แยกส าหรบแตละคาควแปร ซงอาจจ าเปนตองใช ในกรณทคา
ขอมลแตละชดมสเกลทแตกตางกนมาก ถาจบมาพลอตบนแกนเดยวกน จะแสดงรายละเอยดไดไมดนก
AUTO GAP ตงใหตรวจสอบและแทรกชองวางอตโนมต หากขอมลหายไปนานผดปกต เสนกราฟจะปรากฎการขาดชวงใหเหน
คลก Save กจะได Widget ส าหรบแสดงผลกราฟทดงขอมลจาก Feed เราสามารถขยายขนาดความกวางของ Widget ได โดยการคลกไอคอนเครองมอดงแสดงในรปภาพ
รปท 6.16 การปรบแตงกราฟของ Feed
คมอการใชงาน NETPIE - 86
รปท 6.17 การปรบแตงขยายความกวางของกราฟของ Feed
วธท 3 การแสดงผลผานหนา REST API
ส าหรบนกพฒนาทตองการน าคาจาก Feed ไปใชแบบอนๆ เชน แสดงผลใน Visualization Tool ของตนเอง หรอน าไปค านวณตอ กยงสามารถดงคาของ Feed จาก API ผาน Method GET ได ในรปแบบดงน
https://api.netpie.io/feed/<FEEDID>?apikey=<APIKEY>&granularity=<GRANULARIT
Y>&since=<SINCE>&filter=<FILTER>
FEEDID คอ Feed ID APIKEY คอ API Key GRANULARITY คอ ระดบความละเอยดของจดขอมล หนวยทสามารถเปนได ไดแก second,
minute, hour, day, month, year และใสตวเลขระบปรมาณน าหนาไดสวนหนวยเวลาจะเตม s หรอไมกได ไมมความแตกตาง เชน 15seconds หรอ 15second, 10minutes, 3hour ฯลฯ การตง Granularity เปน 5 minutes จะท าใหทกจดขอมลทเกบไดในชวง 5 นาท จะถกน ามาเฉลยเปนจดจดเดยวทใชเปนตวแทนของชวงดงกลาว
SINCE คอ ระยะเวลายอนหลงทจะดงขอมลออกมา รปแบบการเขยนเหมอนกบ Granularity ทกอยาง
คมอการใชงาน NETPIE - 87
FILTER คอ ตวกรอง จะใสหรอไมใสกได ถาไมใสแปลวาไมมตวกรอง คอดงมาทกคา ถาใสใหใสเปนชอ Field ของขอมลทจะดงออกมาแสดง หากมหลาย Field ใหคนดวยเครองหมายคอมมา (,) เชน
https://api.netpie.io/feed/mysensor?apikey=5DunZ38nKP5dGC0h4Bj7mXyeMURdoXOo
&granularity=10minutes&since=24hours&filter=temp,humid
ผลลพธทไดจะเปน JSON ลกษณะตามดานลางน สวนของ Timestamp จะเปน Unix Timestamp แบบ Millisecond ของโซนเวลา GMT ดงนนหากจะน ามาใช ตองบวกเพม 7 ชวโมงใหเปนเวลาประเทศไทยดวย
{
"feedid": "mysensor",
"description": "",
"from": null,
"to": null,
"since": [
24,
"hours"
],
"granularity": [
1,
"minutes"
],
"data": [
{
"attr": "humid",
"unit": "%",
"values": [
[
1484031488709,
62.5
],
[
1484031500861,
62.6
]
]
},
{
"attr": "temp",
คมอการใชงาน NETPIE - 88
"unit": "C",
"values": [
[
1484031488709,
25.2
],
[
1484031500861,
25.1
]
]
}
],
"lastest_data": [
{
"attr": "humid",
"values": [
[
1484031500861,
62.6
]
]
},
{
"attr": "temp",
"values": [
[
1484031500861,
25.1
]
]
}
]
}
คมอการใชงาน NETPIE - 89
6.5 ขอจ ากดการใชงาน
บรการ NETPIE Feed เปดใหใชฟรส าหรบผใชทวไป ดงนนเพอแบงปนทรพยากรกนอยางเหมาะสม จะจ ากดอตราการเขยน Feed ตอ API Key ไวท 4 ครงในเวลาประมาณ 60 วนาท หรอเฉลยใหเขยนได 15 วนาท ตอ 1 จด และในเบองตนจะใหระยะเวลาเกบขอมลหนงป การเขยนขอมลลงใน Feed อาจจะเขยนผานทาง Microgear หรอ Client หลายตวเพยงแต Quota ของการเขยนกจะแบงกนไประหวาง Client ทใช API key เดยวกน ในสวนของการอานคานน จะจ ากดการเรยก API ไวท 5 ครงใน 5 วนาท การเรยก API แตละครง ถาอานหรอเขยนส าเรจจะมสถานะตอบกลบ ตามตวอยางน
{“code”:200,”message”:”Update OK”} หมายความวา ท างานส าเรจ
{“code”:401,”message”:”Unauthorized”} หมายความวา API Key ทใชไมมสทธเขาถง Feed
ดงกลาว
{“code”:429,”message”:”Rate limit exceeded, wait 2.286758 seconds”} หมายความวา ม
การเรยกใชงานเกนอตราทก าหนด
นอกจากสถานะตอบกลบแลว ในกรณของการเรยกผาน REST API สวนของ Reply กจะม HTTP Header แนบกลบมาดวยเพอบอกสถานะเกยวกบ Rate Limit และ Quota ทยงเหลออย ซงอาจเปนประโยชนตอนกพฒนา ตวอยางเชน หากเรยก API ส าหรบอานขอมลจาก Feed จ านวน 5 ครงตดกน ครงสดทายจะเหน Header ดงน
X-RateLimit-Interval: 5
X-RateLimit-Quota: 5
X-RateLimit-Minimum-Wait: 0
X-RateLimit-ToWait: 1.570335
เปนการบอกวาตองรออกประมาณ 1.57 วนาท จงจะสามารถ เรยก API เดมซ าอกครงได ซงหากผใชไมรอและเรยก API ตอทนท คาท Reply ครงถดไปจะมสถานะเปน 429 Rate limit exceeded
Lab 6.1: การแสดงผลขอมลเซนเซอรดวย NETPIE Feed
Lab นเปนการทบทวนการประยกตใช NETPIE Feed ในการดขอมลอณหภมและความชนทไดรบจากเซนเซอรโมดล DHT11 ผอบรมสามารถฝกการน าขอมลทเกบจาก Feed มาใชแสดงผลในรปแบบตางๆ พรอมทงเขาใจขดจ ากดการใชงานของระบบและบรการ
คมอการใชงาน NETPIE - 90
1. สรางไฟล feed_dht.ino ตามโคดดานลาง โดยระบขอมลการเขาถงเครอขาย Wifi ขอมล APPID, KEY และ SECRET และท าการ Upload ไฟลเขา NodeMCU ใหเชอมตอกบ NETPIE
2. สราง Feed เพอรองรบคาของขอมลอณหภมและความชนทเซนเซอรสงมา ปรบแตงการแสดงผลตามความเหมาะสม (ใน Data Display)
3. เพม Datasource ส าหรบ Feed ในหนา Freeboard 4. เพม Widget เพอแสดงผล Feed ในหนา Freeboard 5. ทดลองเปลยนอตราการสงขอมลของ Feed จาก NodeMCU ใหเรวกวาคาของ INTERVAL ท
ระบ (หรอเรวกวาอตราเฉลยทเขยนไดคอ 15 วนาท ตอ 1 จด) สงเกตการเปลยนแปลงในการแสดงผลของขอมลวาเปนอยางไร มผลตอ Rate Limit หรอไม ในการดระยะหางระหวางจดของขอมลในระดบวนาท ควรปรบแตงชวงเวลาในการแสดงผลใหสนลง เชน อยในระดบ 1 นาท เปนตน
feed_dht.ino
#include <DHT.h>
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "SSID";
const char* password = "PASSWORD";
#define APPID "YOUR_APPID"
#define KEY "YOUR_KEY"
#define SECRET "YOUR_SECRET"
#define ALIAS "YOUR_MICROGEAR_NAME"
#define FEEDID "YOUR_FEED_ID"
#define INTERVAL 15000
#define T_INCREMENT 200
#define T_RECONNECT 5000
#define BAUD_RATE 115200
#define MAX_TEMP 100
#define MAX_HUMID 100
WiFiClient client;
คมอการใชงาน NETPIE - 91
int timer = 0;
char str[32];
#define DHTTYPE DHT11 //Define sensor type
#define DHTPIN D4 // Define sensor pin
DHT dht(DHTPIN, DHTTYPE); //Initialize DHT sensor
float humid;
float temp;
MicroGear microgear(client);
// when the other thing send a msg to this board
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message --> ");
msg[msglen] = '\0';
Serial.println((char *)msg);
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
microgear.setAlias(ALIAS);
}
void setup() {
dht.begin();
microgear.on(MESSAGE,onMsghandler);
microgear.on(CONNECTED,onConnected);
Serial.begin(BAUD_RATE);
Serial.println("Starting...");
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
คมอการใชงาน NETPIE - 92
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
}
void loop() {
if (microgear.connected()) {
Serial.print("*");
microgear.loop();
if (timer >= INTERVAL) {
humid = dht.readHumidity();
temp = dht.readTemperature();
Serial.print("\nHumidity: ");
Serial.print(humid);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temp);
Serial.print(" C%\n");
String data = "{\"humid\":";
data += humid ;
data += ", \"temp\":";
data += temp ;
data += "}";
if (isnan(humid) || isnan(temp) || humid >= MAX_HUMID || temp>=
MAX_TEMP) {
Serial.println("Failed to read from DHT sensor!");
}else{
Serial.print("Sending -->");
Serial.println((char*) data.c_str());
microgear.writeFeed(FEEDID,data); //YOUR FEED ID, API KEY
}
timer = 0;
}
else timer += T_INCREMENT;
คมอการใชงาน NETPIE - 93
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= T_RECONNECT) {
microgear.connect(APPID);
timer = 0;
}
else timer += T_INCREMENT;
}
delay(200);
}
หมายเหต: ไฟล feed_dht.ino ไดรบการทดสอบดวยการ compile กบ ESP8266 Microgear Version
1.2.2 และ DHT Sensor Library by Adafruit Version 1.2.3
คมอการใชงาน NETPIE - 94
7. NETPIE REST API
7.1 REST API
REST API (Representational State Transfer Application Programming Interface) หรอบางครงเรยกวา RESTful API หรอ REST Web API หมายถงการสอสารแลกเปลยนขอมลในแบบ Web Service ดวยการใช HTTP Method เชน GET POST PUT DELETE ขอมลทแลกเปลยนกนมกอยในรปแบบ JSON (JavaScript Object Notation) หรอ XML (eXtensible Markup Language) เดมทการสอสารแบบ Web Service จะใชโพรโทคอล SOAP เพอแลกเปลยนขอมล XML ผานทาง HTTP หรอเวบโพรโทคอล แตการสอสารดวย SOAP (Simple Object Access Protocol) นนม Overhead คอนขางสง ในขณะท REST นนเบากวา ขอมลมขนาดเลกกวา ใชแบนดวดทนอยกวา การแลกเปลยนขอมลแบบ REST จงเปนทนยม ปจจบนบรการ API ของ Facebook, Twitter, Google กเลอกใช REST API
คณสมบตของ Web Service ทใช REST API จะใช URI (Universal Resource Identifier) ในการเรยกขอมล เชน http://api.example.com/resources และใช HTTP Method ในการระบการกระท าตอขอมล เชน GET http://api.example.com/resources หมายถงเรยกดขอมล หรอ POST http://api.example.com/resources หมายถงการเขยนขอมล เปนตน
ตวอยางเชน หองสมดอาจจะท า API ใหผดแลระบบดงขอมลของหนงสอ ISBN 0596801688 โดยมรปแบบค ารองขอดงน
GET https://api.example.com/books/0596801688
และในขณะเดยวกน การลบ Record ของหนงสอ กอาจจะท าเปน API งายๆ แบบน
DELETE https://api.example.com/books/0596801688
สวน Operation อนๆ เชน POST กอาจจะเอาไวใชสรางขอมลใหม และ PUT ส าหรบการอพเดตขอมล ฯลฯ การใชงานแบบน ท าให API ดเปนธรรมชาต อธบายกงาย และดวยความท HTTP เปนโพรโทคอลมาตรฐานทมใชกนมานานแลว เราจงพบเจอ HTTP Client อยทกหนทกแหง บนทกภาษาโปรแกรม และในหลากหลายรปแบบการใชงาน แมแตบน Command Line กยงเรยกใชงานได
7.2 NETPIE REST API
NETPIE มบรการ REST API เตรยมไวให ส าหรบอปกรณทไมสามารถใช Microgear ผานโพรโทคอล MQTT ในการสอสารได หรอยงไมม Microgear ในภาษาทตองการใช (เชน IPhone ทใช Objective
คมอการใชงาน NETPIE - 95
C หรอ เวบเซรฟเวอรทใช PHP) ขอเพยงแคอปกรณรองรบโพรโทคอล HTTP ทพอรต 80 กสามารถเรยกใช NETPIE REST API ได อปกรณทใช REST API สามารถแลกเปลยนขอมลกบอปกรณอนทใช REST API หรอกบอปกรณทใช Microgear กได ขอดของการใช NETPIE REST API คอไมยดตดกบ Programming Language ฮารดแวรและระบบปฏบตการ สามารถน าไปประยกตใชกบอปกรณแบบดงเดม (Legacy Device) ได ใชงานผาน TCP พอรต 80 ซงเปนพอรตทเครอขายทวไปอนญาตใหใช (ถาใช Microgear ซงเปนโพรโทคอล MQTT ตองใช TCP พอรต 1883, 8083, และ 8080)
การพฒนา Microgear Library ออกมาใหครอบคลมทก Hardware Platform นนเปนเรองทเปนไปไดยากมาก และเปนงานทใชเวลา NETPIE จงพฒนา REST API ขนมาเปนอกหนงทางเลอก ส าหรบ Hardware Platform ท NETPIE ยงไมม Library ไปรองรบ และรวมไปถงระบบหรอบรการทมมาอยกอนแลว กสามารถเรยก API มาเชอมตอ NETPIE ไดเชนกน
API Endpoint
REST API ของ NETPIE ใหบรการอยท https//:api.netpie.io/
Authentication
ในการเชอมตอ API Client จะตองท าการยนยนตวตน โดยใชหนงในสองวธน
1. สงผาน HTTP Header แบบ Basic Auth โดยใช
Username: KEY
Password: SECRET
ตวอยางการใช Basic Auth ดวย Command Line ค าสง cURL
$ curl -X GET "http//:www.domainname.com/resource" -u key:secret
2. สงผานทาง URL Parameter ในรปแบบ
?auth=KEY:SECRET
ตวอยางการใช URL Parameter ดวย Command Line ค าสง cURL
$ curl- X GET "http//:www.domainname.com/resources?auth=key:secret"
Resource
การใช REST API ของ NETPIE จะเปนการกระท าการบางอยางกบ Resource ซง Resource ทเขาถงไดของ NETPIE มอย 3 แบบดวยกน ไดแก
คมอการใชงาน NETPIE - 96
1. Microgear หมายถงตว อปกรณเอง เราสามารถ Chat ตรงไปหามนได โดยอางองชอ Alias 2. Topic เปนสงเดยวกบ Topic เวลา Publish/Subscribe เราสามารถ Publish ขอความไปท Topic
โดยใช REST API ไดเชนกน โดยอปกรณท Subscribe อยกจะไดรบขอความ Topic นน 3. Postbox คอถงเกบขอมลชวคราว สามารถสงขอความเขาไป หรออานขอความออกมาได
HTTP Method
HTTP Method ท NETPIE REST API รองรบคอ GET (เพอเรยกดขอมล) และ PUT (เพอเขยนขอมล) วธการเรยกใชงาน
PUT
PUT /microgear/{appid}/{alias}
PUT /topic/{appid}/{topicname}
PUT /postbox/{appid}/{postboxname}
Parameter Method PUT รบ Parameter ชอ retain ซงหากก าหนด retain จะมความหมายวาให NETPIE เกบคานไว ซงแพลตฟอรมจะเกบเฉพาะคาลาสดเพยงคาเดยว
Body ในเนอหา (Payload) ของ HTTP PUT จะเปนขอความทตองการสงไปยง topic/microgear/postbox
ตวอยางการเรยกใชงาน PUT ในการสงขอความ ON แบบ retain ไปยง Topic ชอ mytopic ใน AppID ชอ myappid แบบสง Authentication ไปใน URL
$ curl -X PUT
"https//:api.netpie.io/topic/myappid/mytopic?retain&auth=MyKey:MySecret"-d
"ON"
ตวอยางการเรยกใชงาน PUT ในการสงขอความ ON แบบ retain ไปยง Topic ชอ mytopic ใน AppID ชอ myappid แบบสง Authentication ไปใน HTTP Header แบบ Basic Auth
$ curl -X PUT "https//:api.netpie.io/topic/myappid/mytopic?retain" -d "ON"
-u MyKey:MySecret
GET
GET /microgear/{appid}/{alias}
GET /topic/{appid}/{topicname}
คมอการใชงาน NETPIE - 97
GET /postbox/{appid}/{postboxname}
Parameter ไมม
Body ไมม
ตวอยางการเรยกใชงาน GET ในการอานขอความใน Topic หรอ mytopic ใน AppID ชอ myappid แบบสง Authentication ไปใน URL
$ curl -X GET
"https//:api.netpie.io/topic/myappid/mytopic?auth=MyKey:MySecret"
ตวอยางการเรยกใชงาน GET ในการอานขอความใน Topic หรอ mytopic ใน AppID ชอ myappid แบบสง Authentication ไปใน HTTP Header แบบ Basic Auth
$ curl -X GET" https//:api.netpie.io/topic/myappid/mytopic"-u
MyKey:MySecret
เราสามารถทดสอบการเรยก Method Get โดยน า URL ไปใสใน Browser โดยตรงไดเชน
ถาท างานไดถกตองจะไดรบคาทเคย PUT และ retain ไปยง topic/microgear/postbox น ในรปแบบ JSON เชน
[{"topic":"/myappid/mytopic","payload":"ON","lastUpdated":1471760882,"retai
n":true}]
การพมพ URL ลงไปใน Address Bar ของเวบเบราวเซอร จะเปนการเรยก HTTP GET
Method เทานน ไมสามารถใชกบ Method อนๆ ได
Lab 7.1: HTML HTML
ในการทดลองนจะใหเบราวเซอรสองตว (บนเครองเดยวกนหรอตางเครองกได) สอสารกนผาน NETPIE REST API โดยเปนการเขยนโปรแกรมดวย HTML และ Javascript โดยเบราวเซอรตวแรกสงค าสง PUT และเบราวเซอรตวทสองสงค าสง GET
สรางไฟล SetLampStatus.html ดงน
คมอการใชงาน NETPIE - 98
SetLampStatus.html
<html>
<body>
<script>
var APPID= "YOURAPPID"; //enter your appid
var KEY = "YOURKEY"; //enter your key
var SECRET = "YOURSECRET"; //enter your secret
var Topic = "/LampStatus"; //choose any topic name
function PressButtonOn(){
var url =
'https://api.netpie.io/topic/'+APPID+Topic+'?retain&auth=' +KEY+':'+SECRET;
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('PUT',url,true);
xmlHttp.send('ON');
window.alert(url);//for debugging purpose
}
function PressButtonOff(){
var url =
'https://api.netpie.io/topic/'+APPID+Topic+'?retain&auth=' +KEY+':'+SECRET;
var xmlHttp = new XMLHttpRequest();
xmlHttp.open('PUT',url,true);
xmlHttp.send('OFF');
window.alert(url); //for debugging purpose
}
</script>
<center>
<button onclick="PressButtonOn()" id = "ButtonOn">ON</button>
<button onclick="PressButtonOff()" id = "ButtonOff">OFF</button>
</center>
</body>
</html>
Double click ทไฟลSetLampStatus.html เลอกเปดบนเวบเบราวเซอร เชน IE จะเหนหนาตางแบบน
คมอการใชงาน NETPIE - 99
สรางไฟล GetLampStatus.html ดงน
GetLampStatus.html
<html>
<body>
<script>
var APPID= "YOURAPPID"; //enter your appid
var KEY = "YOURKEY"; //enter your key
var SECRET = "YOURSECRET"; //enter your secret
var Topic = "/LampStatus";
function GetButtonStatus(){
var url = 'https://api.netpie.io/topic/'+APPID+Topic+'?auth='
+KEY+':'+SECRET;
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function() {
if (xmlHttp.status == 200 && xmlHttp.readyState==4){
document.body.className = 'ok';
var result = xmlHttp.responseText;
window.alert(result);
} else {
document.body.className = 'error';
}
}
xmlHttp.open('GET',url,true);
xmlHttp.send(null);
}
</script>
<center>
<button onclick="GetButtonStatus()" id = "Button">Check Lamp
Status</button>
</center>
</body>
</html>
คมอการใชงาน NETPIE - 100
เปดไฟล GetLampStatus.html บนเวบเบราวเซอรอกตว เชน Google Chrome หรอ Firefox หรอ เปดเวบเบราวเซอรบนเครองของเพอน จะเหนหนาตางแบบน
กดป ม Check Lamp Status สงเกตผลลพธทได จะอยในรปแบบ JSON Array ซงประกอบดวย
[ ชอ Resource, ขอความ Payload, Last Update, retain ] เชน
[{"topic":"/YOURAPPID/LampStatus","payload":"ON","lastUpdated":1471760882,"
retain":true}]
KEY ทใสในไฟล SetLampStatus.html และ GetLampStatus.html ควรสรางเปน Session Key
สามารถใช KEY เดยวกนทงสองไฟลหรอจะใช KEY ทแตกตางกนกได
ทดลองเพมเตม
1. พมพ URL ลงใน Address Bar โดยตรง https://api.netpie.io/topic/YOURAPPID/LampStatus?auth=YOURKEY:YOURSECRET สงเกตผลลพธทได
2. แกไขไฟล SetLampStatus.html โดย retain parameter ออกสงเกตผลลพธทไดจากค าสง GET 3. แกไขไฟล SetLampStatus.html และ GetLampStatus.html โดยเปลยนชอ Topic เปน
/LampStatus/bedroom สงเกตผลลพธทไดจากค าสง GET 4. แกไขไฟล SetLampStatus.html และ GetLampStatus.html เปลยนจากการใช Topic เปน
Postbox
Topicname และ Postboxname สามารถตงเปนชอใดๆ ทตองการ สามารถเรยกใชไดภายใน
AppID ทก าหนดเทานน
คมอการใชงาน NETPIE - 101
Lab 7.2: HTML NodeMCU
ในการทดลองนจะใหเบราวเซอรสอสารกบ Microgear บน NodeMCU ผาน REST API
1. ใชไฟล SetLampStatus.html จาก Lab 7.1 แกไข URL ส าหรบ PUT ใหอยในรปแบบ
https://api.netpie.io/microgear/appid/alias?retain&auth=KEY:SECRET
โดย alias คอชอทเราตงใหกบ NodeMCU Microgear ใหใชตามทเราเคยตงให Node MCU ใน Lab 4.2 ในไฟล pieled.ino ใช alias วา pieled
2. เนองจากเราจะใชไฟล pieled.ino จาก Lab 4.2 แตเราตงเงอนไขไวให NodeMCU รอรบขอความ 1 หรอ 0 จงตองแกฟงกชน PressButtonOn และ PressButtonOff ในไฟล SetLampStatus.html ใหสงคา 1 และ 0 แทน ON และ OFF ตามล าดบ
SetLampStatus.html
<html>
<body>
<script>
var APPID= “YOURAPPID.”;// enter your appid
var KEY =“YOURKEY”;// enter your key
var SECRET =“YOURSECRET”;// enter your secret
var ALIAS = “pieled”;// same alias you set on NodeCMU
function PressButtonOn(){
var url =
'https//:api.netpie.io/microgear/'+APPID+ALIAS+'?retain&auth='
+KEY+':'+SECRET;
var xmlHttp =new XMLHttpRequest();
xmlHttp.open('PUT',url,true);
xmlHttp.send('1');
window.alert(url);//for debugging purpose
}
function PressButtonOff(){
var url =
'https//:api.netpie.io/microgear/'+APPID+ALIAS+'?retain&auth='
+KEY+':'+SECRET;
var xmlHttp =new XMLHttpRequest();
xmlHttp.open('PUT',url,true);
xmlHttp.send('0');
window.alert(url);// for debugging purpose
คมอการใชงาน NETPIE - 102
}
</script>
<center>
<button onclick= “PressButtonOn()” id = “ButtonOn”>ON</button>
<button onclick= “PressButtonOff()” id = “ButtonOff”>OFF</button>
</center>
</body>
</html>
3. อพโหลดโคด pieled.ino (เหมอนใน Lab 4.2) ลงใน NodeMCU
pieled.ino
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "SSID"; //change this to your SSID
const char* password = "PASSWORD"; //change this to your PASSWORD
#define APPID "APPID" //change this to your APPID
#define KEY "KEY" //change this to your KEY
#define SECRET "SECRET" //change this to your SECRET
#define ALIAS "pieled"
WiFiClient client;
int timer = 0;
MicroGear microgear(client);
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) { //
Serial.print("Incoming message -->");
msg[msglen] = '\0';
Serial.println((char *)msg);
if(*(char *)msg == '1'){
digitalWrite(LED_BUILTIN, LOW); // LED on
microgear.chat("switch","1");
}else{
คมอการใชงาน NETPIE - 103
digitalWrite(LED_BUILTIN, HIGH); // LED off
microgear.chat("switch","0");
}
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
microgear.setName(ALIAS);
}
void setup() {
microgear.on(MESSAGE,onMsghandler);
microgear.on(CONNECTED,onConnected);
Serial.begin(115200);
Serial.println("Starting...");
pinMode(LED_BUILTIN, OUTPUT);
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
}
void loop() {
if (microgear.connected()) {
Serial.println("...");
microgear.loop();
timer = 0;
คมอการใชงาน NETPIE - 104
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
4. สงเกตผลทไดเมอกดป ม ON OFF ทเวบเบราวเซอร จะสามารถควบคมไฟทบอรด NodeMCU เชนเดยวกบการใช Microgear บน HTML5
คมอการใชงาน NETPIE - 105
Lab 7.3: KKMC IoT
แอปพลเคชน KKMC-IoT พฒนาโดยคณคมเดช เผอดผด จากมหาวทยาลยขอนแกนและชมรมขอนแกนเมกเกอรคลบ (KKMC) เปน Android Application ส าหรบสอสารไปยง Microgear หรออปกรณอนๆ ทเชอมตอกบ NETPIE การสอสารท าไดทงการรายงานผลสถานะ และการสงค าสงควบคม รวมถงการตงเวลาเพอสงค าสงควบคม เบองหลงการสอสารของแอปพลเคชนนคอการเรยกใชงาน NETPIE REST API เพอเชอมตอกบอปกรณตางๆ (เนองจาก ณ เวลาทพฒนาแอปพลเคชนน ยงไมม Microgear ส าหรบสราง Native Android Application)
ขอมลรายละเอยดแอปพลเคชนจาก Google Play (https://play.google.com/store/apps/details?id=com.numberx.kkmctimer)
“KKMC IoT สรางขนมาเพอใหผใชงานทตองการจะควบคมอปกรณ IoT กบ NETPIE หรอมอปกรณอยแลว แตยงขาด App ดๆ ซงผใชบางคนจะตองสรางสวนเชอมตอขนมา เชน เวบ หรอ application ตางๆ เพอควบคมโดยเฉพาะ หลายๆทานอาจจะยงไมมความรทางดานโปรแกรมมง จงอาจจะมองวาเปนอะไรทยงยาก KKMC IoT จงไดถอก าเนดขนมาโดยม Concept ทวา "แอพเดยว ท าไดทกอยาง" โดยตวแอพนนเขยนไวใหผใชสามารถกดสราง Widget การควบคมอปกรณไวทงหมดแลวเพยงเขาไปตงคา Topic ส าหรบการเชอมตอ จากนนกสามารถใชงานไดเลย มทงการแสดงผล และควบคมอปกรณอกทงยงเพม Timer ใหอปกรณท างานไดตามเวลาทก าหนดอกดวย
หากใครสนใจรายละเอยดเพมเตม สามารถเขาไปรวมกลมกบ Khon Kaen Maker Club ไดเลยครบ”
Fanpage: https://www.facebook.com/KhonKaenMakerClub/ Group: https://www.facebook.com/groups/KhonKaenMakerClub/ *** Distributed from: https://github.com/carlosperate/LightUpDroid-Alarm
1. ทดลองตดตงแอปพลเคชน KKMC-IoT จาก Google Play Store
คมอการใชงาน NETPIE - 106
รปท 7.1 แอปพลเคชน KMMC IoT ใน Google Play Store
ตงคาขนตอนท 1 ตงคาขนตอนท 2-3 ตงคาขนตอนท 4 ตงคาขนตอนท 5
รปท 7.2 ขนตอนตงคาแอปพลเคชน KMMC IoT
2. เลอกเมน Settings ทมมขวาลาง 3. ใสขอมล NETPIE AppID
คมอการใชงาน NETPIE - 107
4. ใสขอมล NETPIE REST Key ซงอยในรปแบบ KEY: SECRET หรอสามารถกอปป โดยตรงจากหนา Application Management ของ netpie.io ตามภาพ
รปท 7.3 ขอมล REST Key ในหนา Application Management ของเวบไซต netpie.io
5. ตงคา Topic โดยกดทรปโลกในหนาแรกของแอปพลเคชน แลวกดเพม Topic ตามชอ Topic ทเคยตงไวเชน /LampStatus เลอก Widget Type เปน On/Off Switch (เพอสรางป มควบคมไฟ)
6. กลบมาทหนาแรกของแอปพลเคชนจะเหนป มใหทดลองกด เปด/ปด ถาสงค าสงไปส าเรจจะเหนขอความวา “Publish to topic success” ตรวจสอบสถานะทเปลยนไปโดยเปดไฟล GetLampStatus.html (จาก Lab 7.1) หรอแกไขโคด pieled.ino (จาก Lab 7.2) ท NodeMCU โดยเพมค าสง microgear.subscribe(“/LampStatus”); ในฟงกชน onConnected ดงแสดงดานลาง จากนนทดลองกดเปด/ปด เพอควบคม LED บน NodeMCU
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
microgear.setName(ALIAS);
microgear.subscribe("/LampStatus");
}
เนองจากแอปพลเคชน KKMC-IoT นรองรบเฉพาะการเรยก REST API บน Topic (ยงไมรองรบ Resource ประเภท Microgear และ Postbox) จงตองสงให Microgear (NodeMCU) รอรบขอความ (Subscribe) ท Topic/LampStatus กอน ซงตางจากใน Lab 7.2 ทใช REST API สงค าสงเปดปดไปยง Resource ประเภท Microgear จงสามารถสงค าสงไปทชอของ Microgear ไดโดยตรงในรปแบบ /microgear/appid/alias
คมอการใชงาน NETPIE - 108
ทดลองเพมเตม
1. เพม Widget ชนด Push Button (ป มแบบกดตดปลอยดบ) ท Topic /LampStatus สงเกตไฟ LED บน NodeMCU เมอกดป ม
2. เพม Widget ชนด Text เพอแสดงผลขอมลอณหภมทตรวจวดจากเซนเซอร DHT11
รายละเอยดเพมเตมเกยวกบ KKMC-IoT
Source Code https://github.com/KhonKaenMakerClub/KKMC-IoT
บทความ http://www.kkmakerclub.com/2016/05/26/
วดโอสอนวธใช https://www.youtube.com/watch?v=VWKrjvDCQQs
Disclaimer NECTEC/NETPIE ไมไดมสวนรวมในการพฒนาแอปพลเคชน KKMC-IoT น ขอผดพลาดใดๆ ทเกดจากการใชแอปพลเคชนน ขอใหแจงไปยงผพฒนาโดยตรง
คมอการใชงาน NETPIE - 109
8. NETPIE SECURE CONNECTION
ในกรณทตองการใหอปกรณสอสารกนอยางปลอดภยไมใหใครดกฟงขอความทแลกเปลยนกนได และไมใหใครมาเปลยนขอความกลางทาง เราจ าเปนตองเขารหสใหชองทางสอสาร โพรโทคอลทนยมใชในการรกษาความปลอดภยใหชองทางสอสารไดแก TLS (Transport Layer Security) และ SSL (Secure Socket Layer) ซงมกจะเรยกรวมๆ กนวา SSL/TLS แอปพลเคชนทนยมใชบน SSL/TLS ไดแกเวบ อเมลโปรแกรมสนทนา ฯลฯ ทตองการความปลอดภยในการสงขอมล ตวอยางเชน โพรโทคอล HTTPS หรอHTTP Secure จะเปนการสงขอมลเวบทเขารหสบน SSL หรอ TLS
การสงขอมลบน SSL/TLS มขอด 3 ดานคอ
1. Privacy ขอมลทรบสงจะถกเขารหส ท าใหมความเปนสวนตวและปลอดภยจากการดกฟงโดยบคคลทสาม
2. Authentication คสนทนาทงสองฝงจะไดรบการยนยนตวตนโดยการใช Public/Private Key ทออกใหโดย Certificate Authority ทไดรบการยอมรบ ท าใหมนใจไดวาคสนทนาเปนคนหรออปกรณทตองการสอสารดวยจรงๆ ไมใชตวปลอมทมาสวมสทธ
3. Reliability ขอมลทรบสงไมสามารถถกเปลยนแปลงกลางทาง เพราะมกลไกการตรวจสอบความถกตองของขอมลโดยใช Message Authentication Code
TLS vs SSL บอยครงทเกดความสบสนระหวาง TLS กบ SSL ทงสองโพรโทคอลท าหนาทเหมอนกนคอ
สรางชองทางการสอสารทปลอดภยดวยการเขารหสขอมล ยนยนความถกตองของขอมล และยนยนตวตนของคสนทนา โพรโทคอล SSL ก าเนดมากอน TLS และไดรบความนยมสงโดยเฉพาะกบการใชงานเวบ (HTTPover SSL) แตในป ค.ศ.2014 มการพบชองโหวทรายแรงทเรยกวา POODLE Attack บน SSL เวอรชน 3.0 ตงแตนนมา SSL จงกลายเปนโพรโทคอลทไมปลอดภยและไมควรใช
โพรโทคอล TLS ถกออกแบบมาทหลงและออกแบบใหรองรบกลไกสมยใหมทเกยวกบการสราง Key การแลกเปลยน Key การเขารหส จงท าให TLS มความปลอดภยมากกวา SSL
การใช TLS กบ NETPIE
NETPIE เลอกใชโพรโทคอล TLS เวอรชน 1.2 ในการสรางความปลอดภยใหกบการสอสารระหวาง Microgear กบ NETPIE
คมอการใชงาน NETPIE - 110
NETPIE Microgear ทรองรบการสอสารบน TLS ไดแก Node.js, HTML5, ESP8266
TCP พอรตทใชสอสาร
HTML5 Microgear ESP8266 และ Node.js Microgear
TLS: 8081 and 8084 (default)
Non-TLS: 8080 and 8083
Non-TLS: 8080 and 1883 (default)
TLS: 8081 and 8883
ฟงกชนเพอเรยกใช TLS
บน Node.js และ ESP8266 Microgear จะมฟงกชน useTLS(tlsmode) เพอระบวาจะเลอกใชหรอไมใชการเขารหสแบบ TLS สวน argument tlsmode เปน Boolean ถาตงคา TRUE แปลวาใช TLS ถาตงคา FALSE แปลวาไมใช TLS หากไมไดเรยกใชฟงกชนน คา default ของ Microgear จะไมใช TLS
บน HTML5 Microgear กมฟงกชน useTLS(tlsmode) เชนกน แตคา default คอใช TLS ดงนนการสอสารกบ HTML5 จะเปนการสอสารแบบปลอดภยเสมอ นอกจากนกพฒนาจะปดการใช TLS ดวยค าสง useTLS (false)
วธสราง Secure Connection บน ESP8266 Microgear แตกตางจากการสราง Connection ปกตสองจด
1. ประกาศตวแปร Client เปนชนด WiFiClientSecure แทน WiFiClient
WiFiClientSecure client;
MicroGear microgear(client);
2. ภายในฟงกชน setup() เรยกใช useTLS(true) กอนการเรยกฟงกชน init(KEY, SECRET, ALIAS)
microgear.useTLS(true);
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
วธสราง Secure Connection บน Node.js Microgear แตกตางจากการสราง Connection ปกตจดเดยว คอตองเรยกใช useTLS(true) กอนการเรยกฟงกชน connect(APPID)
คมอการใชงาน NETPIE - 111
microgear.useTLS(true);
microgear.connect(APPID);
ส าหรบการใช TLS บน ESP8266 จะใชไดกบ ESP8266 SDK 2.1.0 แตมปญหากบ SDK
2.2.0 และกลบมาใชไดกบ SDK 2.3.0-rc1
Lab 8.1: สราง Secure Connection ระหวาง NodeMCU และ HTML5
แกไขไฟล pieled.ino จาก Lab 4.2 สองจดคอ
1. ประกาศตวแปร Client เปนชนด WiFiClientSecure แทน WiFiClient กอนสราง Microgear
WiFiClientSecure client;
MicroGear microgear(client);
2. ภายในฟงกชน setup() เรยกใช useTLS(true) กอนการเรยกฟงกชน init(KEY, SECRET, ALIAS)
microgear.useTLS(true);
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
บนทกเปนไฟลใหมชอ SecureConnect.ino แลวอพโหลดไฟล SecureConnect.ino ลงบน NodeMCU
SecureConnect.ino
/* NETPIE ESP8266 secure microgear connection sample */
/* It differs from the normal connection by 2 stpes */
/* 1. Declare a client as WiFiClientSecure instead of WiFiClient. */
/* 2. Call microgear.useTLS(true) before initial */
/* More information visit : https://netpie.io */
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "WIFI_SSID"; //change this to your SSID
คมอการใชงาน NETPIE - 112
const char* password = "WIFI_KEY"; //change this to your WIFI
password
#define APPID "YOURAPPID" //change this to your appid
#define KEY "YOURKEY" //change this to your key
#define SECRET "YOURSECRET" //change this to your secret
#define ALIAS "esp8266tls"
/* 1. Declare a client as WiFiClientSecure instead of WiFiClient. */
WiFiClientSecure client;
int timer = 0;
MicroGear microgear(client);
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message -->");
msg[msglen] = '\0';
Serial.println((char *)msg);
}
void onFoundgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Found new member -->");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
void onLostgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Lost member -->");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Securely connected to NETPIE...");
microgear.setAlias(ALIAS);
}
void setup() {
คมอการใชงาน NETPIE - 113
/* Event listener */
microgear.on(MESSAGE,onMsghandler);
microgear.on(PRESENT,onFoundgear);
microgear.on(ABSENT,onLostgear);
microgear.on(CONNECTED,onConnected);
Serial.begin(115200);
Serial.println("Starting...");
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
/* 2. Call microgear.useTLS(true) before initial */
microgear.useTLS(true);
microgear.init(KEY,SECRET,ALIAS);
microgear.connect(APPID);
}
void loop() {
if (microgear.connected()) {
Serial.println("connected");
microgear.loop();
if (timer >= 1000) {
Serial.println("Publish...");
microgear.chat(ALIAS,"Hello");
timer = 0;
}
else timer += 100;
}
else {
Serial.println("connection lost, reconnect...");
คมอการใชงาน NETPIE - 114
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
เปดไฟล switch.html จาก Lab 4.2 เนองจาก HTML5 Microgear จะใช TLS เปนคา default อยแลวดงนนหากเราไมแกไขอะไร HTML5 จะสงคาเปดปดไฟ ผานการเชอมตอแบบเขารหส หากตองการยกเลกการใช TLS สามารถเรยกฟงกชน microgear.useTLS(false) กอนการเรยก microgear.connect(APPID) และบนทกไฟลใหมชอ UnsecureSwitch.html ดงตวอยางดานลาง
UnsecureSwitch.html
<script src="https://cdn.netpie.io/microgear.js"></script>
<script>
const APPID = "YOURAPPID";
const KEY = "YOURKEY";
const SECRET = "YOURSECRET";
const ALIAS = "switch";
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
alias : ALIAS
});
function toggle() {
if(document.getElementById("button").innerText=="off"){
microgear.chat('pieled','1');
}
else{
microgear.chat('pieled','0');
}
}
microgear.on('message',function(topic,msg) {
document.getElementById("data").innerHTML = msg;
คมอการใชงาน NETPIE - 115
if(msg=="1"){
document.getElementById("button").innerText="on";
}else if(msg=="0"){
document.getElementById("button").innerText="off";
}
});
microgear.on('connected', function() {
microgear.setAlias(ALIAS);
document.getElementById("data").innerHTML = "Now I am connected with
netpie...";
});
//add this line if you don’t want a secure connection
microgear.useTLS(false);
microgear.connect(APPID);
</script>
<div id="data">_____</div>
<center>
<button onclick="toggle()" id="button">off</button>
</center>
ตดตงและใชงานโปรแกรม Wireshark (https//:www.wireshark.org/download.html) ซงเปนโปรแกรมดกจบแพกเกตในเครอขาย (ในขนตอนการตดตง Wizard จะถามวาใหตดตงไลบราร libpcap ดวยหรอไม ใหตอบตกลง) เมอเรมใชงานโปรแกรมจะเหนหนาตางในภาพ ใหคลกเลอกท Network Interface ทตองการดกจบขอมล (กรณในภาพคอ Wi-Fi) แลวคลกทไอคอนรปครบฉลาม เพอเรมดกจบขอมล วธสงเกตวาควรเลอก Network Interface ใดใหเลอก Interface ทมเสนกราฟขยบ (หมายถงมขอมลวงเขาออก)
คมอการใชงาน NETPIE - 116
รปท 8.1 หนาจอโปรแกรม Wireshark
เนองจากเราสามารถดกจบไดเฉพาะขอมลทวงเขาออกคอมพวเตอรของเรา ดงนนเราจะทดลองดกจบขอมลทเกดจาก HTML5 Microgear โดยเปดไฟล switch.html ทดลองกดป ม ON OFF จากนนหยดการดกจบขอมลท Wireshark โดยกดทไอคอนสเหลยมจตรสสแดง แลวลองไลด Packet ทเกดจากไฟล switch.html วงผานคอมพวเตอรของเรา
เนองจากม Packet ทเกดจากหลายแอปพลเคชนบนคอมพวเตอร วธเลอกด Packet อาจสงเกตจาก Destination Port ในกรณทใช TLS HTML5 Microgear จะสอสารกบ NETPIE โดยใช Destination Port 8081 และ 8084
วธเลอกดเฉพาะแพกเกตทสนใจ คอการก าหนดตวกรอง ใสลงในชองดานบนทเขยนวา
“Apply a display filter … <Ctrl-/>” ตวอยางเชน tcp.dstport == 8084 || tcp.dstport == 8081 Filter โดยระบ Destination Port ip.src_host==192.168.1.137 Filter โดยระบ Source IP address ip.addr==192.168.1.137 Filter โดยระบ IP address ของคสนทนา
จากภาพจะพบวาเราไมสามารถอานขอมลทวงเขาและออกจาก HTML5 Microgear
คมอการใชงาน NETPIE - 117
รปท 8.2 หนาจอ Wireshark หลงเรยกใช TLS
ทดลองเพมเตม
ใชไฟล UnsecureSwitch.html แลวทดสอบดวาสามารถเหนขอความท Chat ระหวาง Switch และ NodeMCU หรอไม
การใช TLS ในกรณนเปนการเขารหสการสอสารระหวางอปกรณใดๆ ทม Microgear กบ
แพลตฟอรม NETPIE เทานนไมใชการเขารหสแบบ End-to-end โดยตรงระหวางอปกรณสองตว
คมอการใชงาน NETPIE - 118
ภาคผนวก NETPIE MICROGEAR REFERENCE GUIDE
ส าหรบรายละเอยดลาสดของ Microgear ทกตวทานสามารถดไดจากเวบไซต
https://github.com/netpieio
1. ESP8266-ARDUINO MICROGEAR
ESP8266 Arduino Microgear คอ Client Library ทท าหนาทเปนตวกลางในการเชอมตอ ESP8266 เขากบบรการของ NETPIE
1.1 ความเขากนได
ทางทมพฒนาไดท าการทดสอบพบวา Library สามารถใชไดกบอปกรณตอไปน (อาจมมากกวาน)
ESP8266-01, 07, 12E, 12F
NodeMCU v1, v2, V3
Espresso Lite v2.0
1.2 พอรตสอสาร
ESP8266 ใชพอรตสอสารตอไปน หากพบปญหาการใชงาน กรณาตรวจสอบวา Port ตอไปนไดรบอนญาตใหเขาถง NETPIE.
Non-TLS mode : 8080 and 1883 (คา default )
TLS mode : 8081 and 8883 (อยระหวางทดสอบ)
1.3 การตดตง
ดาวนโหลด Arduino IDE 1.6.9 หรอใหมกวา จาก https://www.arduino.cc/en/Main/Software
หลงจากตดตงเสรจ เปด Preferences
คมอการใชงาน NETPIE - 119
ใสขอความ http://arduino.esp8266.com/stable/package_esp8266com_index.json ลงในชอง Additional Board Manager URLs
เปด Boards Manager เมน Tools คนหาค าวา esp8266 และคลก Install
ในเมน Tools จะมบอรด ESP8266 ชนดตางๆเพมขนมา เลอกใหตรงกบชนดของบอรดทใช
ดาวนโหลด Microgear Library จาก https://github.com/netpieio/microgear-esp8266-arduino/archive/master.zip
Unzip ไปวางใน Folder ชอ Libraries ของ Arduino IDE
รายละเอยดเพมเตมเกยวกบ ESP8266 Arduino IDE ศกษาไดจาก https://github.com/esp8266/Arduino
1.4 ขอจ ากดทพบ
ฟเจอร TLS ท างานไดบน ESP8266 SDK 2.1.0 และ 2.3.0-rc1 แตไมท างานบนเวอรชน 2.2.0
1.5 ตวอยางการเรยกใช
/* NETPIE ESP8266 basic sample */
/* More information visit : https://netpie.io */
#include <ESP8266WiFi.h>
#include <MicroGear.h>
const char* ssid = "WIFI_SSID";
const char* password = "WIFI_KEY";
#define APPID "YOUR_APPID"
#define KEY "YOUR_KEY"
#define SECRET "YOUR_SECRET"
#define ALIAS "esp8266"
WiFiClient client;
int timer = 0;
MicroGear microgear(client);
/* If a new message arrives, do this */
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
คมอการใชงาน NETPIE - 120
Serial.print("Incoming message --> ");
msg[msglen] = '\0';
Serial.println((char *)msg);
}
void onFoundgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Found new member --> ");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
void onLostgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Lost member --> ");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
/* When a microgear is connected, do this */
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
/* Set the alias of this microgear ALIAS */
microgear.setAlias(ALIAS);
}
void setup() {
/* Add Event listeners */
/* Call onMsghandler() when new message arraives */
microgear.on(MESSAGE,onMsghandler);
/* Call onFoundgear() when new gear appear */
microgear.on(PRESENT,onFoundgear);
/* Call onLostgear() when some gear goes offline */
microgear.on(ABSENT,onLostgear);
/* Call onConnected() when NETPIE connection is established */
microgear.on(CONNECTED,onConnected);
คมอการใชงาน NETPIE - 121
Serial.begin(115200);
Serial.println("Starting...");
/* Initial WIFI, this is just a basic method to configure WIFI on
ESP8266. */
/* You may want to use other method that is more complicated, but
provide better user experience */
if (WiFi.begin(ssid, password)) {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
}
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
/* Initial with KEY, SECRET and also set the ALIAS here */
microgear.init(KEY,SECRET,ALIAS);
/* connect to NETPIE to a specific APPID */
microgear.connect(APPID);
}
void loop() {
/* To check if the microgear is still connected */
if (microgear.connected()) {
Serial.println("connected");
/* Call this method regularly otherwise the connection may be lost
*/
microgear.loop();
if (timer >= 1000) {
Serial.println("Publish...");
/* Chat with the microgear named ALIAS which is myself */
microgear.chat(ALIAS,"Hello");
timer = 0;
คมอการใชงาน NETPIE - 122
}
else timer += 100;
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
1.6 การใชงาน LIBRARY
Initial library ดวยค าสง
int MicroGear::init(char* key, char* secret [,char* alias])
arguments
key (string) - ใชในการอางองตวตนของ Microgear secret (string) - เปน Secret ของ Key ซงจะใชประกอบในกระบวนการยนยนตวตน alias (string)– เปนการระบชอเลน (ตามขางหนา) ของอปกรณ
microgear.init("sXfqDcXHzbFXiLk", "DNonzg2ivwS8ceksykGntrfQjxbL98",
"myplant");
void MicroGear::on(unsigned char event, void (* callback)(char, uint8_t,unsigned int))
เพมฟงกชนทตอบสนองตอ Event
arguments
event - ชอ Event ไดแก MESSAGE, CONNECTED, PRESENT, ABSENT
คมอการใชงาน NETPIE - 123
callback - ฟงกชน Callback เมอเกด Event
bool MicroGear::connect(char* appid)
เชอมตอกบ NETPIE Platform ถาเชอมตอส าเรจ จะม Event ชอ CONNECTED เกดขน คาทสงคนมาจากฟงกชน มดงน
NETPIECLIENT_CONNECTED - การเชอมตอส าเรจ
NETPIECLIENT_NOTCONNECTED - การเชอมตอลมเหลว เชนมปญหาเรองเครอขาย
NETPIECLIENT_TOKENERROR - ไมไดรบ Access Token อาจเปนเพราะ Appid, Key หรอ Secret ไมถกตอง
arguments
Appid - AppID
bool MicroGear::connected()
สงคาสถานะการเชอมตอ เปน TRUE หากก าลงเชอมตออย
void MicroGear::useTLS(bool* enabled)
ระบรปแบบของชองทางการสอสารวาตองการสอสารแบบเขารหสโดยใช TLS หรอไม (คา default คอไมใช TLS) เรยกใชฟงกชนนกอนสรางการเชอมตอดวยฟงกชน connect
arguments
Enabled – ตงคา TRUE เพอใช TLS
คมอการใชงาน NETPIE - 124
void MicroGear::setAlias(char* alias)
Microgear สามารถตงนามแฝงของตวเองได ซงสามารถใชเปนชอใหคนอนเรยกในการใชฟงกชน chat() และชอทตงในโคด จะไปปรากฏบนหนาจดการ Key บนเวบ netpie.io อยางอตโนมต
arguments
alias - ชอเลนของ Microgear น
bool MicroGear::chat(char* target, char* message) bool MicroGear::chat(char* target, int message) bool MicroGear::chat(char* target, double message) bool MicroGear::chat(char* target, double, int decimal) bool MicroGear::chat(char* target, String message)
arguments
target - ชอของ Microgear ทตองการจะสงขอความไปถง
decimal - จ านวนต าแหนงหลงจดทศนยม
message - ขอความ
bool MicroGear::publish(char* topic, char* message [, bool retained]) bool MicroGear::publish(char* topic, double message [, bool retained]) bool MicroGear::publish(char* topic, double message, int decimal [, bool retained]) bool MicroGear::publish(char* topic, int message [, bool retained]) bool MicroGear::publish(char* topic, String message [, bool retained])
ในกรณทตองการสงขอความแบบไมเจาะจงผ รบ สามารถใชฟงชน Publish ไปยง Topic ทก าหนดได ซงจะมแต Microgear ท Subscribe Topic นเทานน ทจะไดรบขอความ
arguments
topic - ชอของ Topic ทตองการจะสงขอความไปถง
คมอการใชงาน NETPIE - 125
message - ขอความ
decimal - จ านวนต าแหนงหลงจดทศนยม
retained - ให Retain ขอความไวหรอไมคา Default เปน false (optional)
void MicroGear::subscribe(char* topic)
Microgear อาจจะมความสนใจใน topic ใดเปนการเฉพาะ เราสามารถใชฟงกชน subscribe() ในการบอกรบ Message ของ Topic นนได และหาก Topic นนเคยมการ Retain ขอความไว Microgear จะไดรบขอความนนทกครงท Subscribe
arguments
topic - ชอของ Topic ทตองการจะบอกรบขอความ
void MicroGear::unsubscribe(char* topic)
ยกเลกการ Subscribe
arguments
topic - ชอของ Topic ทตองการจะยกเลก
void microgear.writeFeed(feedid, datajson [, apikey])
เขยนขอมลลง Feed Storage
arguments
feed (string) - ชอของ feed ทตองการจะเขยนขอมล datajson (string) - ขอมลทจะบนทก ในรปแบบ JSON
คมอการใชงาน NETPIE - 126
apikey (string) – API Key ส าหรบตรวจสอบสทธ หากไมก าหนด จะใช Default API Key ของ feed ทใหสทธไวกบ AppID
microgear.writeFeed("homesensor",{temp:25.7,humid:62.8,light:8.5});
void MicroGear::resetToken()
สงค าสง Revoke Token ไปยง NETPIE และลบ Token ออกจาก Cache สงผลให Microgear ตองขอ Token ใหมในการเชอมตอครงตอไป
void MicroGear::loop()
Method นควรถกเรยกใน arduino loop() เปนระยะๆ เพอท Microgear Library สามารถ Keep alive connection alive และจดการกบ Message ทเขามา
2. ARDUINO-ETHERNET MICROGEAR
Arduino Ethernet Microgear คอ Client Library ทท าหนาทเปนตวกลางในการเชอมตอ Arduino Board ทใช Ethernet Shield เขากบบรการของ NETPIE
2.1 ความเขากนได
Library สามารถใชไดกบ Arduino Mega 2560 และ Ethernet Shield
2.2 ตวอยางการเรยกใช
#include <AuthClient.h>
#include <MicroGear.h>
#include <MQTTClient.h>
#include <PubSubClient.h>
#include <SHA1.h>
#include <Arduino.h>
#include <SPI.h>
คมอการใชงาน NETPIE - 127
#include <Ethernet.h>
#include <EEPROM.h>
#include <MicroGear.h>
#define APPID "YOUR_APPID"
#define GEARKEY "YOUR_KEY"
#define GEARSECRET "YOUR_SECRET"
#define SCOPE ""
EthernetClient client;
AuthClient *authclient;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
MicroGear microgear(client);
int timer = 0;
void onMsghandler(char *topic, uint8_t* msg, unsigned int msglen) {
Serial.print("Incoming message --> ");
msg[msglen] = '\0';
Serial.println((char *)msg);
}
void onFoundgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Found new member --> ");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
void onLostgear(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.print("Lost member --> ");
for (int i=0; i<msglen; i++)
Serial.print((char)msg[i]);
Serial.println();
}
void onConnected(char *attribute, uint8_t* msg, unsigned int msglen) {
Serial.println("Connected to NETPIE...");
microgear.setAlias("mygear");
}
คมอการใชงาน NETPIE - 128
void setup() {
Serial.begin(9600);
Serial.println("Starting...");
microgear.on(MESSAGE,onMsghandler);
microgear.on(PRESENT,onFoundgear);
microgear.on(ABSENT,onLostgear);
microgear.on(CONNECTED,onConnected);
if (Ethernet.begin(mac)) {
Serial.println(Ethernet.localIP());
microgear.resetToken();
microgear.init(GEARKEY,GEARSECRET,SCOPE);
microgear.connect(APPID);
}
}
void loop() {
if (microgear.connected()) {
Serial.println("connected");
microgear.loop();
if (timer >= 1000) {
microgear.chat("mygear","Hello");
timer = 0;
}
else timer += 100;
}
else {
Serial.println("connection lost, reconnect...");
if (timer >= 5000) {
microgear.connect(APPID);
timer = 0;
}
else timer += 100;
}
delay(100);
}
2.3 การใชงาน LIBRARY
คมอการใชงาน NETPIE - 129
Initial library ดวยค าสง
int MicroGear::init(char* key, char* secret [,char* alias])
arguments
key (string) - ใชในการอางองตวตนของ Microgear
secret (string) - เปน Secret ของ Key ซงจะใชประกอบในกระบวนการยนยนตวตน
alias (string) – เปนการระบชอของอปกรณ
microgear.init("sXfqDcXHzbFXiLk", "DNonzg2ivwS8ceksykGntrfQjxbL98",
"myplant");
void MicroGear::on(unsigned char event, void (* callback)(char, uint8_t,unsigned int))
เพมฟงกชนทตอบสนองตอ Event
arguments
event - ชอ Event ไดแก MESSAGE, CONNECTED, PRESENT, ABSENT
callback - ฟงกชน Callback
bool MicroGear::connect(char* appid)
เชอมตอกบ NETPIE Platform ถาเชอมตอส าเรจ จะม Event ชอ CONNECTED เกดขน
arguments
appid - AppID
bool MicroGear::connected(char* appid)
สงคาสถานะการเชอมตอ เปน true หากก าลงเชอมตออย
arguments
appid - AppID
คมอการใชงาน NETPIE - 130
void MicroGear::setAlias(char* alias)
Microgear สามารถตงนามแฝงของตวเองได ซงสามารถใชเปนชอใหคนอนเรยกในการใชฟงกชน chat() และชอทตงในโคด จะไปปรากฏบนหนาจดการ Key บนเวบ netpie.io อยางอตโนมต
arguments
alias – ชอเลนของ microgear น
bool MicroGear::chat(char* target, char* message) bool MicroGear::chat(char* target, int message) bool MicroGear::chat(char* target, double message) bool MicroGear::chat(char* target, double, int decimal) bool MicroGear::chat(char* target, String message)
arguments
target - ชอของ Microgear ทตองการจะสงขอความไปถง
decimal - จ านวนต าแหนงหลงจดทศนยม
message - ขอความ
bool MicroGear::publish(char* topic, char* message [, bool retained]) bool MicroGear::publish(char* topic, double message [, bool retained]) bool MicroGear::publish(char* topic, double message, int decimal [, bool retained]) bool MicroGear::publish(char* topic, int message [, bool retained]) bool MicroGear::publish(char* topic, String message [, bool retained])
ในกรณทตองการสงขอความแบบไมเจาะจงผ รบ สามารถใชฟงชน Publish ไปยง Topic ทก าหนดได ซงจะมแต Microgear ท Subscribe Topic นเทานน ทจะไดรบขอความ
arguments
topic - ชอของ Topic ทตองการจะสงขอความไปถง
message - ขอความ
decimal - จ านวนต าแหนงหลงจดทศนยม
retained - ให Retain ขอความไวหรอไมคา default เปน false (optional)
คมอการใชงาน NETPIE - 131
void MicroGear::subscribe(char* topic)
microgear อาจจะมความสนใจใน Topic ใดเปนการเฉพาะ เราสามารถใชฟงกชน subscribe() ในการบอกรบ Message ของ Topic นนได และหาก Topic นนเคยมการ Retain ขอความไว Microgear จะไดรบขอความนนทกครงท Subscribe Topic
arguments
topic - ชอของ Topic ทตองการจะบอกรบขอความ
void MicroGear::unsubscribe(char* topic)
ยกเลกการ Subscribe
arguments
topic - ชอของ Topic ทตองการจะยกเลก
void microgear.writeFeed (feedid, datajson [, apikey])
เขยนขอมลลง Feed Storage
arguments
feed (string) - ชอของ feed ทตองการจะเขยนขอมล datajson (string) - ขอมลทจะบนทก ในรปแบบ JSON apikey(string) – API Key ส าหรบตรวจสอบสทธ หากไมก าหนด จะใช Default API Key ของ feed ทใหสทธไวกบ AppID
microgear.writeFeed("homesensor",{temp:25.7,humid:62.8,light:8.5});
void MicroGear::resetToken()
สงค าสง Revoke Token ไปยง NETPIE และลบ Token ออกจาก Cache สงผลให Microgear ตองขอ Token ใหมในการเชอมตอครงตอไป
คมอการใชงาน NETPIE - 132
void MicroGear::loop()
Method นควรถกเรยกใน arduino loop() เปนระยะๆ เพอท Microgear library จะได keep alive connection alive และจดการกบ Message ทเขามา
3. NODE.JS MICROGEAR
microgear-nodejs คอ Client Library ภาษา Node.js ทท าหนาทเปนตวกลางในการเชอมโยง โคดแอปพลเคชนหรอ Hardware เขากบบรการของ NETPIE
3.1 พอรตสอสาร
หากพบปญหาการใชงาน กรณาตรวจสอบวา Port ตอไปนไดรบอนญาตใหเขาถงจาก NETPIE
Non-TLS mode : 8080 and 1883 (คา default )
TLS mode : 8081 and 8883
3.2 การตดตง
npm install microgear
3.3 ตวอยางการเรยกใช
var MicroGear = require('microgear');
const APPID = <APPID>;
const KEY = <KEY>;
const SECRET = <SECRET>;
var microgear = MicroGear.create({
key : KEY,
secret : SECRET
});
คมอการใชงาน NETPIE - 133
microgear.on('connected', function() {
console.log('Connected...');
microgear.setAlias("mygear");
setInterval(function() {
microgear.chat('mygear', 'Hello world.');
},1000);
});
microgear.on('message', function(topic,body) {
console.log('incoming : '+topic+' : '+body);
});
microgear.on('closed', function() {
console.log('Closed...');
});
microgear.connect(APPID);
3.4 การใชงาน LIBRARY
microgear create (config)
arguments
config เปน JSON Object ททม Attribute ดงน o key (string)- ใชในการอางองตวตนของ Microgear o secret (string) - เปน Secret ของ Key ซงจะใชประกอบในกระบวนการยนยนตวตน o alias (string) – เปนการตงชอเลน จะใสทนหรอเรยกฟงกชน setAlias() ทหลงกได
var microgear = MicroGear.create({
gearkey : "sXfqDcXHzbFXiLk",
gearsecret : "DNonzg2ivwS8ceksykGntrfQjxbL98",
alias : "mygear"
});
3.4.1 Microgear
void microgear.connect (appid, callback)
คมอการใชงาน NETPIE - 134
arguments
Appid (string) – คอกลมของแอปพลเคชน Microgear จะท าการเชอมตอ
microgear.connect("happyfarm");
void microgear.setAlias (gearalias)
Microgear สามารถตงนามแฝงของตวเองได ซงสามารถใชเปนชอใหคนอนเรยกในการใชฟงกชน chat() และชอทตงในโคด จะไปปรากฏบนหนาจดการ Key บนเวบ netpie.io อยางอตโนมต
arguments
gearalias (string) - ชอของ Microgear น
microgear.setAlias("plant");
void microgear.chat (gearname, message)
arguments
gearname (string) - ชอของ Microgear ทตองการจะสงขอความไปถง message (string) - ขอความ
microgear.chat("valve","I need water");
void microgear.publish (topic, message, [retained]) ในกรณทตองการสงขอความแบบไมเจาะจงผ รบ สามารถใชฟงชน Publish ไปยง Topic ทก าหนดได ซงจะมแต Microgear ท Subscribe Topoic นเทานน ทจะไดรบขอความ
arguments
topic (string) - ชอของ Topic ทตองการจะสงขอความไปถง message (string) - ขอความ retained (boolean) - ให Retain ขอความไวหรอไม คา Default เปน False
คมอการใชงาน NETPIE - 135
microgear.publish("/outdoor/temp","28.5");
microgear.publish("/outdoor/humid","56",true);
void microgear.subscribe (topic)
Microgear อาจจะมความสนใจใน Topic ใดเปนการเฉพาะ เราสามารถใชฟงกชน Subscribe() ในการบอกรบ Message ของ Topic นนได และหาก Topic นนเคยมการ Retain ขอความไว Microgear จะไดรบขอความนนทกครงท Subscribe Topic
arguments
topic (string) - ชอของ Topic ทตองการจะบอกรบขอความ
microgear.subscribe("/outdoor/temp");
void microgear.unsubscribe (topic) ยกเลกการ Subscribe
arguments
topic (string) - ชอของ Topic ทตองการจะยกเลก
microgear.unsubscribe("/outdoor/temp");
void microgear.setCachePath (path) โดยปกตแลว microgear จะเกบไฟล token cache ใน directory เดยวกบ application โดยตงชอไฟลชอไฟลในรปแบบ microgear-.cache เราสามารถก าหนด path ของ token cache file ใหมดวยฟงกชน setCachePath() ซงอาจจ าเปฯตองใช หากในไฟล Node.js application เดยวกน มการสราง microgear มากกวาหนงตว
arguments
path (string) - path ของไฟล cache
microgear.setCachePath('microgear-g1.cache');
คมอการใชงาน NETPIE - 136
void microgear.writeFeed (feedid, datajson [, apikey])
เขยนขอมลลง Feed Storage
arguments
feed (string) - ชอของ feed ทตองการจะเขยนขอมล datajson (string) - ขอมลทจะบนทก ในรปแบบ JSON apikey (string) – API Key ส าหรบตรวจสอบสทธ หากไมก าหนด จะใช Default API Key ของ feed ทใหสทธไวกบ AppID
microgear.writeFeed("homesensor",{temp:25.7,humid:62.8,light:8.5});
void microgear.resetToken (callback)
สงค าสง Revoke Token ไปยง NETPIE และลบ Token ออกจาก Cache สงผลให Microgear ตองขอ Token ใหมในการเชอมตอครงตอไป
arguments
callback (function) – ฟงกชนทจะถกเรยกเมอการรเซต Token เสรจสน
microgear.resetToken(function(result){
});
เนองจาก resettoken() เปน Asynchronous Function หากตองการ Connect หลงจาก resettoken ตองเขยนโคดในลกษณะน
microgear.resetToken(function(result){
microgear.connect(APPID);
});
void microgear.useTLS (tlsmode)
เลอกใชหรอไมใชการเขารหสแบบ TLS. โดยคาเรมตน microgear-nodejs จะไมใช TLS
arguments
tlsmode (boolean) - true เมอตองการใช TLS
คมอการใชงาน NETPIE - 137
microgear.useTLS(false);
3.4.2 Events
แอปพลเคชนทรนบน Microgear จะมการท างานในแบบ Event Driven คอเปนการท างานตอบสนองตอ Event ตางๆ ดวยการเขยน Callback Function ขนมารองรบในลกษณะน
void microgear.on (event, callback)
arguments
event (string) - ชอ Event
callback (function) - Callback Function
NETPIE Platform เวอรชนปจจบน ม Event ดงตอไปน
Event: 'connected' เกดขนเมอ Microgear Library เชอมตอกบ Platform ส าเรจ
microgear.on("connected", function() {
console.log("connected");
});
Event: 'closed' เกดขนเมอ Microgear Library ตดการเชอมตอกบ Platform
microgear.on("closed", function() {
console.log("closed");
});
Event: 'error' เปน Event ทเกดม Error ขนภายใน Microgear
microgear.on("error", function(err) {
console.log("Error: "+err);
});
Event: 'warning' เปน Event ทเกดมเหตการณบางอยางเกดขน และมการเตอนใหทราบ
microgear.on("warning", function(msg) {
console.log("Connection rejected: "+msg);
});
Event: 'info' เปน Event ทเกดมเหตการณบางอยางเกดขนภายใน Microgear
microgear.on("info", function(msg) {
console.log("Connection rejected: "+msg);
});
คมอการใชงาน NETPIE - 138
Event: 'message' เมอม Message เขามา จะเกด Event นขน พรอมกบสงผานขอมลเกยวกบ Message นนมาทาง Argument ของ Callback Function
microgear.on("message", function(topic,msg) {
console.log("Incoming message: "+mesage);
});
Event: 'present' Event นจะเกดขนเมอม Microgear ใน Appid เดยวกน Online เขามาเชอมตอ NETPIE
microgear.on("present", function(event) {
console.log("New friend found: "+event.gearkey);
});
Event: 'absent' Event นจะเกดขนเมอม Microgear ใน Appid เดยวกน Offline หายไป
microgear.on("absent", function(event) {
console.log("Friend lost: "+event.gearkey);
});
4. HTML5 MICROGEAR
microgear-html5 คอ Client Library ของ NETPIE ทจะเปลยน Web Browser ใหเปน Microgear เพอสอสารกบ Microgear ใน Platform อนๆ เชน Arduino, Raspberry Pi Library นสามารถน าไปพฒนา IoT Console หรอ Mobile Application ไดโดยการเขยนโปรแกรมภาษา HTML/JavaScript
4.1 การรองรบ
Chrome
Firefox
Opera
Safari
Internet Explorer
Edge
คมอการใชงาน NETPIE - 139
4.2 พอรตสอสาร
หากพบปญหาการใชงาน กรณาตรวจสอบวา Port ตอไปนไดรบอนญาตใหเขาถงจาก Network ของคณ
TLS mode : 8081 and 8084 (คา default )
Non-TLS mode : 8080 and 8083
4.3 การตดตง
ดาวนโหลด microgear.js จาก https://raw.githubusercontent.com/netpieio/microgear-html5/master/microgear.js
หรอเรยกใชเวอรชนลาสดจาก cdn โดยใช Tag
<script src="https://cdn.netpie.io/microgear.js"></script>
4.4 ตวอยางการเรยกใช
<script src="https://cdn.netpie.io/microgear.js"></script>
<script>
const APPID = "YOUR_APPID";
const KEY = "YOUR_KEY";
const SECRET = "YOUR_SECRET";
var microgear = Microgear.create({
key: KEY,
secret: SECRET,
alias : "myhtml" /* optional */
});
microgear.on('message',function(topic,msg) {
document.getElementById("data").innerHTML = msg;
});
microgear.on('connected', function() {
microgear.setAlias('htmlgear'); /* alias can be renamed anytime
with this function */
document.getElementById("data").innerHTML = "Now I am connected
with netpie...";
คมอการใชงาน NETPIE - 140
setInterval(function() {
microgear.chat("htmlgear","Hello from myself at "+Date.now());
},5000);
});
microgear.on('present', function(event) {
console.log(event);
});
microgear.on('absent', function(event) {
console.log(event);
});
microgear.connect(APPID);
</script>
<div id="data">_____</div>
4.5 การใชงาน LIBRARY
microgear create (config)
arguments
config เปน JON Obect ทม Attribute ดงน o key (string) - เปน key ส าหรบ device o secret (string) - เปน Secret ของ Key ซงจะใชประกอบในกระบวนการยนยนตวตน o alias (string) – เปนการตงชอเลน จะใสทนหรอเรยกฟงกชน setAlias() ภายหลงกได
var microgear = MicroGear.create({
key : "sXfqDcXHzbFXiLk",
secret : "DNonzg2ivwS8ceksykGntrfQjxbL98",
alias : "myhtml"
});
4.5.1 Microgear
void microgear.connect (appid, callback)
คมอการใชงาน NETPIE - 141
เชอมตอไปท NETPIE โดยระบ Appid เปาหมาย
arguments
appid (string) - คอ Application ท Microgear จะท าการเชอมตอ
microgear.connect("happyfarm");
void microgear.setAlias(gearalias)
Microgear สามารถตงชอตวเองได ซงสามารถใชเปนชอเลนในการใชฟงกชน chat()
arguments
gearalias (string) - ชอของ Microgear น
microgear.setAlias("plant");
void microgear.chat (gearalias, message)
arguments
gearalias(string)- ชอของ Microgear ทตองการจะสงขอความไปถง message(string)- ขอความ
microgear.chat("valve","I need water");
void microgear.publish (topic, message)
ในกรณทตองการสงขอความแบบไมเจาะจงผ รบ สามารถใชฟงชน Publish ไปยง Topic ทก าหนดได ซงจะมแต Microgear ท Subscribe ใน Topic นเทานน ทจะไดรบขอความ
arguments
topic (string) - ชอของ topic ทตองการจะสงขอความไปถง message (string) - ขอความ
microgear.publish("/outdoor/temp","28.5");
คมอการใชงาน NETPIE - 142
void microgear.subscribe (topic)
Microgear อาจจะมความสนใจใน Topic ใดเปนการเฉพาะ เราสามารถใชฟงกชน subscribe() ในการบอกรบ Message ของ Topic นนได
arguments
topic (string) - ชอของ topic ทตองการจะบอกรบขอความ
microgear.subscribe("/outdoor/temp");
void microgear.unsubscribe (topic)
ยกเลกการ Subscribe
arguments
topic (string) - ชอของ Topic ทตองการจะยกเลก
microgear.unsubscribe("/outdoor/temp");
void microgear.writeFeed (feedid, datajson [, apikey])
เขยนขอมลลง Feed Storage
arguments
feed (string) - ชอของ feed ทตองการจะเขยนขอมล datajson (string) - ขอมลทจะบนทก ในรปแบบ JSON apikey (string) – API Key ส าหรบตรวจสอบสทธ หากไมก าหนด จะใช Default API Key ของ feed ทใหสทธไวกบ AppID
microgear.writeFeed("homesensor",{temp:25.7,humid:62.8,light:8.5});
คมอการใชงาน NETPIE - 143
void microgear.resetToken (callback)
ออนไลนสงค าสง Revoke Token และลบ Token ออกจาก Cache สงผลให Microgear ตองขอ Token ใหมในการเชอมตอครงตอไป
arguments
callback (function) – Callback Function ทจะถกเรยกเมอการ Reset Token เสรจสน
microgear.resetToken(function(result){
});
เนองจาก resetToken() เปน Asynchronous Function หากตองการ Connect หลงจาก resetToken ตองเขยนโคดในลกษณะน
microgear.resetToken(function(result){
microgear.connect(APPID);
});
void microgear.useTLS (tlsmode)
Enable หรอ disable TLS โดยใน HTML5 Microgear จะใช TLS เปนคา Default
arguments
tlsmode (boolean) - เปน true หมายถงใช TLS (เปนคา Default), false หมายถงไมใช TLS
microgear.useTLS(false);
4.5.2 Events
Application ทรนบน Microgear จะมการท างานในแบบ Event Driven คอเปนการท างานตอบสนองตอ Event ตางๆ ดวยการเขยน Callback Function ขนมารองรบในลกษณะน
void microgear.on (event, callback)
arguments
event (string) - ชอ Event
คมอการใชงาน NETPIE - 144
callback (function) - Callback Function
NETPIE Platform เวอรชนปจจบน ม Event ดงตอไปน
Event: 'connected' เกดขนเมอ Microgear Library เชอมตอกบ NETPIE ส าเรจ
microgear.on("connected", function() {
console.log("connected");
});
Event: 'closed' เกดขนเมอ Microgear Library เชอมตอกบ NETPIE ส าเรจ
microgear.on("closed", function() {
console.log("closed");
});
Event: 'error' เปน Event ทเกดม Error ขนภายใน Microgear
microgear.on("error", function(err) {
console.log("Error: "+err);
});
Event: 'message' เมอม Message เขามา จะเกด Event นขน พรอมกบสงผานขอมลเกยวกบ Message นนมาทาง Argument ของ Callback Function
microgear.on("message", function(topic,msg) {
console.log("Incoming message: "+msg);
});
Event: 'present' Event นจะเกดขนเมอม Microgear ใน Appid เดยวกน Online เขามาเชอมตอ NETPIE
microgear.on("present", function(event) {
console.log("New friend found: "+event.gearkey);
});
Event: 'absent' Event นจะเกดขนเมอม Microgear ใน Appid เดยวกน Offline หายไป
microgear.on("absent", function(event) {
console.log("Friend lost: "+event.gearkey);
});
คมอการใชงาน NETPIE - 145
5. PYTHON MICROGEAR
microgear - python คอ Client Library ภาษา Python ทท าหนาทเปนตวกลางในการเชอมโยง Application Code หรอ Hardware เขากบบรการของ NETPIE Platform เพอการพฒนา IoT application
5.1 การตดตง
$ pip install microgear
5.2 ตวอยางการเรยกใชงาน
import microgear.client as microgear
import time
appid = <appid>
gearkey = <key>
gearsecret = <secret>
microgear.create(gearkey,gearsecret,appid,{'debugmode': True})
def connection():
print "Now I am connected with netpie"
def subscription(topic,message):
print topic+" "+message
def disconnect():
print "disconnect is work"
microgear.setalias("doraemon")
microgear.on_connect = connection
microgear.on_message = subscription
microgear.on_disconnect = disconnect
microgear.subscribe("/mails")
microgear.connect(True)
5.3 ตวอยางเพมเตม
คมอการใชงาน NETPIE - 146
https://github.com/netpieio/microgear-python/wiki
5.4 การใชงาน LIBRARY
5.4.1 Microgear
client.create(gearkey,gearsecret,appid,args):
arguments
gearkey (string) - ใชในการอางองตวตนของ Microgear gearkey (string) - เปน Secret ของ Key ซงจะใชประกอบในกระบวนการยนยนตวตน appid (string) - กลมของ Application ท Microgear จะท าการเชอมตอ args (dictionary) - เปนการตงคาเพมเตม ส าหรบ Microgear ไดแก
o debugmode (boolean) - แสดงขอความในโหมด ฏebug o scope (string) - ก าหนด Scope ใหกบ Microgear เพอให /จ ากด สทธ บางอยาง โดยมรปแบบดงน
[r][w]:</topic/path> - r และ w คอสทธในการ Publish ละ Subscribe topic ดงทระบตามล าดบ เชน rw:/outdoor/temp
name:<gearname> - คอสทธในการตงชอตวเองวา <gearname>
chat:<gearname> - คอสทธในการ chat กบ <gearname> o alias (string) – ก าหนดชอเลนส าหรบ Microgear น โดยจะปรากฏทหนา Key Management และสามารถเปนชอท Microgear ตวอนใชส าหรบ chat() ได
ในขนตอนของการสราง Key บนเวบ netpie.io นกพฒนาสามารถก าหนดสทธขนพนฐานใหแตละ Key ไดอยแลว หากการสราง Microgear อยภายใตขอบเขตของสทธทม Token จะถกจายอตโนมต และ Microgear จะสามารถเชอมตอ NETPIE Platform ไดทนท แตหาก Scope ทรองขอนนมากเกนกวาสทธทก าหนดไว นกพฒนาจะไดรบ Notification ใหพจารณาอนมต Microgear ทเขามาขอเชอมตอ ขอควรระวงคอ หาก Microgear มการกระท าการเกนกวาสทธทไดรบไป เชน พยายามจะ Publish ไปยง Topic ทตวเองไมมสทธ NETPIE จะตดการเชอมตอของ Microgear โดยอตโนมต
คมอการใชงาน NETPIE - 147
gearkey = <gearkey>
gearsecret = <gearsecret>
appid = <appid>
client.create(gearkey,gearsecret,appid, {'debugmode': True, 'scope':
"r:/outdoor/temp,w:/outdoor/valve,name:logger,chat:plant", 'alias':
"logger"})
client.connect(will_block): การเชอมตอ Microgear
argument
will_block (boolean) - (optional) ระบรปแบบการเชอมตอ วาใหมการ Block หลงจากเรยกฟงกชนหรอไม ซงจะมคา Default เปน False โดยโปรแกรมจะท างานในบรรทดถดไปหลงจากทท าการ Connect แลว ซงจะท าใหผพฒนาสามารถเขยนโปรแกรมในการตดตอกบ NETPIE ตอไปได โดยการเชอมตอจะคงอยตราบเทาการท างานของโปรแกรม เชน
client.connect()
while True:
client.chat("doraemon","Hello world. "+str(int(time.time())))
time.sleep(2)
หากตองการให Library ท าการ Block หลงจาก Connect แลว ท าใหหลงจาก Connect แลวโปรแกรมหยดอยทการท างานรวมกบ Platform โดยจะท างานตามทมเหตการณ callback (on_*) ทถก
พารามเตอรเปนหนา โดยสามารถระบก าหนดไวกอน True ได เชน
client.connect(True)
client.setalias(alias): ก าหนดชอเรยกส าหรบ Microgear น โดยจะปรากฏทหนา Key Management และสามารถเปนชอท Microgear ตวอนใชส าหรบ chat() ได argument
alias (string) - ชอของ Microgear น
client.setalias("python");
คมอการใชงาน NETPIE - 148
client.chat(gearname, message):
การสงขอความโดยระบ gearname และขอความทตองการสง
arguments
gearname (string) - ชอของ Microgear น message (string) – ขอความ
client.chat("html","hello from python");
client.publish(topic, message, retain):
ในกรณทตองการสงขอความแบบไมเจาะจงผ รบ สามารถใชฟงชน Publish ไปยง Topic ทก าหนดได ซงจะมแต Microgear ท Subscribe ใน Topic นเทานน ทจะไดรบขอความ
arguments
topic (string) - ชอของ topic ทตองการจะสงขอความไปถง message (string) – ขอความ retain (boolean) – ระบคา True ถาตองการเกบขอความไว หากมการ Subscribe Topic นกจะไดรบขอความนอก คา Default เปน False หากไมระบ และถาตองการลบขอความทบนทกไวใหสงขอความ ""ซงมความยาวเปน 0 เพอลางคาขอความทไวทกไว
client.publish("/outdoor/temp","28.5");
client.subscribe(topic)
Microgear อาจจะมความสนใจใน Topic ใดเปนการเฉพาะ เราสามารถใชฟงกชน Subscribe() ในการบอกรบ Message ของ Topic นนได
argument
topic (string) - ชอของ Topic ทตองการบอกรบ โดยตองขนตนดวยเครองหมาย "/"
client.subscribe("/temp");
คมอการใชงาน NETPIE - 149
void microgear.writeFeed (feedid, datajson [, apikey])
เขยนขอมลลง Feed Storage
arguments
feed (string) - ชอของ feed ทตองการจะเขยนขอมล datajson (string) - ขอมลทจะบนทก ในรปแบบ JSON apikey (string) – API key ส าหรบตรวจสอบสทธ หากไมก าหนด จะใช Default API Key ของ feed ทใหสทธไวกบ AppID
microgear.writeFeed("homesensor",{temp:25.7,humid:62.8,light:8.5});
client.resettoken()
ใชในการการลบ Token ทมอย จาก Cache และบน Platform เมอลบแลว จ าเปนจะตองขอ Token ใหมทกครง
client.resettoken();
5.4.2 Event
Application ทรนบน Microgear จะมการท างานในแบบ Event Driven คอเปนการท างานตอบสนองตอ Event ตางๆ ดวยการเขยน Callback Function ขนมารองรบในลกษณะๆ ดงตอไปน
client.on_connect เกดขนเมอ Microgear Library เชอมตอกบ Platform ส าเรจ
คาทตง
Callback (function) - ฟงกชนทจะท างาน เมอมการ Connect เกดขน
def callback_connect() :
print "Now I am connected with netpie"
client.on_ connect = callback_connect
คมอการใชงาน NETPIE - 150
client.on_disconnect เกดขนเมอ Microgear Library ตดการเชอมตอกบ Platform
คาทตง
Callback (function) – Callback Function
def callback_disconnect() :
print "Disconnected”
client.on_disconnect = callback_disconnect
client.on_message เกดขนเมอไดรบขอความจากการ Chat หรอ หวขอท Subscribe
คาทตง
Callback (function) - ฟงกชนทจะท างานเมอไดรบขอความ โดยฟงกชนนจะรบพารามเตอร 2 ตวคอ
o topic - ชอ Topic ทไดรบขอความน
o message - ขอความทไดรบ
def callback_message(topic, message) :
print "I got message from ", topic, ": ", message
client.on_message= callback_message
client.on_present Event นจะเกดขนเมอม Microgear ใน Appid เดยวกน Online เขามาเชอมตอ NETPIE
คาทตง
callback (function) - จะท างานเมอเกดเหตการณน โดยจะรบคาพารามเตอร คอ o gearkey - ระบคาของ gearkey ทเกยวของกบเหตการณน
def callback_present(gearkey) :
print gearkey+" become online."
client.on_present = callback_present
คมอการใชงาน NETPIE - 151
client.on_present Event นจะเกดขนเมอม Microgear ใน Appid เดยวกน Offline หายไป
คาทตง
callback (function) - จะท างานเมอเกดเหตการณน โดยจะรบคาพารามเตอร คอ o gearkey - ระบคาของ gearkey ทเกยวของกบเหตการณน
def callback_absent(gearkey) :
print gearkey+" become offline."
client.on_absent = callback_absent
client.on_warning เปน Event ทเกดเมอมเหตการณบางอยางเกดขน และมการเตอนใหทราบ
คาทตง
callback (function) - จะท างานเมอเกดเหตการณน โดยจะรบคาพารามเตอร คอ o msg - ระบขอความทเกยวของกบเหตการณน
def callback_warning(msg) :
print msg
client.on_warning = callback_warning
client.on_info เปน Event ทเกดมเหตการณบางอยางเกดขนขนภายใน Microgear
คาทตง
callback (function) - จะท างานเมอเกดเหตการณน โดยจะรบคาพารามเตอร คอ o msg - ระบขอความทเกยวของกบเหตการณน
def callback_info(msg) :
print msg
client.on_info = callback_info
client.on_error Event นจะเกดขนเมอม Error
คาทตง
คมอการใชงาน NETPIE - 152
callback (function) - จะท างานเมอเกดเหตการณน โดยจะรบคาพารามเตอร คอ o msg - ระบ Error ทเกยวของกบเหตการณน
def callback_error(msg) :
print msg
client.on_error = callback_error
6. REST API
NETPIE Platform ไดจดเตรยม REST API ส าหรบการตดตอสอสารกบ Microgear ชนดอนๆ ผานทาง HTTP Protocol ทเขาถงไดงาย โดยไมยดตดกบ programming Language หรอ Hardware สามารถน าไปประยกตใชกบ Web Server แบบดงเดม หรอเรยกผาน Command Line รวมไปถงการเชอมตอกบ Web Server ตางๆ
6.1 API ENDPOINT
REST API ของ NETPIE ใหบรการอยท https//:api.netpie.io/
6.2 AUTHENTICATION
ในการเชอมตอ API Client จะตองท าการยนยนตวตน โดยใชหนงในสองวธน
1. สงผาน HTTP Header แบบ Basic Auth โดยใช
Username : KEY
Password : SECRET
ตวอยางการใช Basic Auth ดวย cURL
$ curl -X GET "http://www.domainname.com/resources" -u key:secret
2. สงผานทาง URL Parameter ในรปแบบ
?auth=KEY:SECRET
ตวอยางการใช URL Parameter ดวย cURL
$ curl -X GET "http://www.domainname.com/resources?auth=key:secret"
คมอการใชงาน NETPIE - 153
6.3 RESOURCE TYPES
Topic
Topic เปนจดแลกเปลยน Message ระหวาง Microgear ลกษณะการเขยนจะอยในรปของ Path เชน /home/bedroom/temp โดย Microgear สามารถ PUT/publish, GET/subscribe ไปท Topic นได
Microgear
Microgear คอ อปกรณทเชอมตอกบ NETPIE เราสามารถสอสารตรงไปท Microgear โดยอางองชอ alias ทตงใหอปรณนน
Postbox
Postbox เปนพนทส าหรบเกบขอมลแบบ Queue โดย Message ทถกสงเขาไปใน Postbox จะถกเกบสะสมไว จนกวาจะมการอานออกไป Message ทถกอานแลวจะหายไปจาก Postbox ทนทจงเหมาะทจะใชเปนเครองมอสอสารกบ Microgear ทไมสามารถ Online ไดตลอดเวลา เชน PHP Script
6.3.1 Topic
PUT /topic/{appid}/{topic}
เขยนขอความไปยง Topic ของ Appid ตามทระบ
URL parameter
retain สงใหเกบคานไว (เฉพาะคาลาสดเพยงคาเดยว)
Body
เปน Message ทจะสง หากตองการลบคาท Retain ไว ใหสงแบบ Retain และใช Body เปน String เปลา
ตวอยางการเรยก REST API ดวย cURL สมมตวาเราไดสราง App บน NETPIE ชอ myappid และม Key และ Secret ดงน
คมอการใชงาน NETPIE - 154
เราจะใช REST API ในการสง Message แบบ Retain วา ON ไปยง microgear ทบอกรบ Topic
/home/bedroom/light ไดดวย cURL command line น
$ curl -X PUT
"https://api.netpie.io/topic/myappid/home/bedroom/light?retain" -d "ON" -u
jVjzJXaJwdJKHhF:StOAKIZhXB5CaqnIHeb7s1DfiW7mQj
GET /topic/{appid}/{topic}
อาน Message จาก Appid ท Topic ตามทระบโดย Client จะไดรบเฉพาะ Message ลาสดทถก Retain ไวกอนหนาน
URL parameter
ไมม
Body
ไมม
ตวอยาง
$ curl -X GET "https://api.netpie.io/topic/myappid/home/bedroom/light" -u
jVjzJXaJwdJKHhF:StOAKIZhXB5CaqnIHeb7s1DfiW7mQj
6.3.2 Microgear
PUT /microgear/{appid}/{gearalias}
สง Message ไปยง Microgear ทตงชอวา gearalias ของ Appid ชอ appid
Body
Message ทจะสง เปน Plain Text String หากมการเขารหสดวยรปแบบ JSON ทางปลายทางจะตองน า String ไป Parse เอง
คมอการใชงาน NETPIE - 155
6.3.3 Postbox
PUT /postbox/{appid}/{postboxname}
สง Message ไปยง Postbox ชอ postboxname ของ Appid ชอ appid
URL parameter
tag ผสงสามารถตด Tag ให Message ได เพอความสะดวกในการเลอกอานเฉพาะ Message ทสนใจ
Body
message ทจะสง เปน Plain Text String หากมการเขารหสดวยรปแบบ JSON ทางปลายทางจะตองน า String ไป Parse เอง
$ curl -X PUT "https://api.netpie.io/postbox/myappid/webbox?tag=error" -d
"ON" -u jVjzJXaJwdJKHhF:StOAKIZhXB5CaqnIHeb7s1DfiW7mQj
GET /postbox/{appid}/{postboxname}
อาน Message ครงละหนงขอความจาก Postbox ชอ postboxname ของ Appid ชอ appid โดยจะเรยงตามล าดบเวลา Message ทเขามากอน จะถกอานกอน
URL parameter
tag ไมจ าเปนตองระบ แตjหากมการระบ Tag จะเปนการเจาะจงอานเฉพาะ Message ทตด Tag นเทานน
Body
ไมม
$ curl -X GET "https://api.netpie.io/postbox/myappid/webbox?tag=error" -u
jVjzJXaJwdJKHhF:StOAKIZhXB5CaqnIHeb7s1DfiW7mQj
คมอการใชงาน NETPIE - 156
ผเขยน
1. พนตา พงษไพบลย 2. ชาวร อสรยภทร 3. กลชาต มทรพยหลาก 4. เอมอชนา นรนตสขรตน 5. เปรมฤด เอยมสภคกล 6. อนนท ปญญา 7. ชยวทย แสนทวสข
ศนยเทคโนโลยอเลกทรอนกสและคอมพวเตอรแหงชาต
ส านกงานพฒนาวทยาศาสตรและเทคโนโลยแหงชาต
112 อทยานวทยาศาสตประเทศไทย ถนนพหลโยธน
ต าบลคลองหนง อ าเภอคลองหลวง จงหวดปทมธาน 12120
โทร 02-564-6900
อเมล [email protected]
Website https://netpie.io
Facebook Group “NETPIE” https://www.facebook.com/groups/netpie/
Github “netpieio” https://github.com/netpieio