RESTful API¶
เป็นช่องทางสำหรับให้ Device เรียกใช้บริการ Platform ผ่าน RESTful API ซึ่งใช้ HTTP Protocal เหมาะสำหรับใช้เป็นช่องทางในการผสานรวม (Integration) ระบบต่างๆ ทั้งที่มีอยู่แล้วหรือกำลังจะพัฒนาขึ้นมาใหม่ โดยไม่จำกัดว่าจะต้องพัฒนาจากภาษาโปรแกรมใด (ทดสอบการทำงานของ API ได้ที่ https://beta-api.nexiiot.io) สำหรับ API ที่มีให้บริการในปัจจุบันแยกเป็น 2 กลุ่ม ดังนี้
Device API¶
เป็น API ที่เกี่ยวข้องกับ Device โดย Domain name ของ API คือ https://api.nexiiot.io มีรายละเอียดดังนี้
1. การขอสถานะเชื่อมต่อ Platform ของ Device (Device Status)
EndPoint |
https://api.nexiiot.io/status |
Method |
GET |
Request Header |
Authorization : Device ClientID:Token |
Return |
|
ตัวอย่าง
GET /device/status HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
2. การ Publish ข้อความ ไปที่ Topic ต่างๆ สามารถใช้งานได้ 2 แบบ
แบบที่ 1 เป็นการระบุ Topic ในรูปแบบ URL Path
EndPoint |
https://api.nexiiot.io/message/{any}/{topic} |
Method |
PUT |
Request Header |
Authorization : Device ClientID:Token |
Request Body |
Content-type : text/plain
| ข้อความที่ต้องการ Publish ไปที่ Topic
|
Return |
|
ตัวอย่าง
PUT /device/message/mythings/bedroom/light HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
ON
แบบที่ 2 เป็นการระบุ Topic ผ่าน Parameter (Query String)
EndPoint |
https://api.nexiiot.io/message |
Method |
PUT |
Request Header |
Authorization : Device ClientID:Token |
Parameter |
|
Return |
|
ตัวอย่าง
PUT /device/message?topic=mything/bedroom/light HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
OFF
3. การ Publish ข้อความส่วนตัว (Private Message) ไปยัง Device แบบเจาะจง Device สามารถใช้งานได้ 2 แบบ
แบบที่ 1 เป็นการระบุ Topic ในรูปแบบ URL Path
EndPoint |
https://api.nexiiot.io/private/{any}/{topic} |
Method |
PUT |
Request Header |
Authorization : Device ClientID ของ Device ที่ต้องการส่งข้อความไปหา:Token ของ Device ที่ต้องการส่งข้อความไปหา |
Request Body |
|
Return |
|
ตัวอย่าง
PUT /device/private/topic/for/me HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
Hello Device
แบบที่ 2 เป็นการระบุ Topic ผ่าน Parameter (Query String)
EndPoint |
https://api.nexiiot.io/private |
Method |
PUT |
Request Header |
Authorization : Device ClientID ของ Device ที่ต้องการส่งข้อความไปหา:Token ของ Device ที่ต้องการส่งข้อความไปหา |
Parameter |
|
Return |
|
ตัวอย่าง
PUT /device/private?topic=topic/for/me HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
Hello Device
Caution
การส่ง Message ผ่านทาง REST API ลักษณะ Topic จะแตกต่างจากการส่งผ่าน MQTT Prototol เล็กน้อย คือ ถ้าส่งผ่าน REST API การตั้งค่า Topic ไม่ต้องใส่ "@msg" นำหน้า แต่ระบบจะทำการเติมให้อัตโนมัติ ซึ่งถ้าส่งผ่าน MQTT Prototol จะต้องใส่ "@msg" นำหน้า Topic ที่จะส่งเอง
การส่งข้อความส่วนตัว (Private Message) ฝั่ง Device ที่ถูกส่ง Message ไปหาต้องทำการ Subcribe Topic โดยมี Prefix เป็น @private นำหน้า Topic ที่ต้องการ Subcribe เช่น @private/topic/for/me หรือจะใช้ @private/# ก็จะทำให้ได้รับ Private Message ในทุก Topic
4. การอ่านข้อมูล Shadow Data ของ Device (ต้องเป็น Device ที่อยู่ใน Group เดียวกัน)
EndPoint |
https://api.nexiiot.io/shadow/data |
Method |
GET |
Request Header |
Authorization : Device ClientID:Token |
Parameter |
|
Return |
|
ตัวอย่าง
GET /device/shadow/data?alias=sensor HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
5. การเขียนข้อมูลลง Shadow Data แบบเขียนผสาน (Merge)
EndPoint |
https://api.nexiiot.io/shadow/data |
Method |
PUT |
Request Header |
Authorization : Device ClientID:Token |
Parameter |
|
Request Body |
ข้อมูลที่ต้องการเขียนลง Shadow Data อยู่ในรูปแบบ JSON ดังนี้
|
Return |
|
ตัวอย่าง
PUT /device/shadow/data?alias=test HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
{
"data": {
"temperature": 33.7,
"config": {"item1": "a", "item2": "b"},
"note": "test case"
}
}
6. การเขียนข้อมูลลง Shadow Data แบบเขียนทับ (Overwrite)
EndPoint |
https://api.nexiiot.io/shadow/data |
Method |
POST |
Request Header |
Authorization : Device ClientID:Token |
Parameter |
|
Request Body |
ข้อมูลที่ต้องการเขียนลง Shadow Data อยู่ในรูปแบบ JSON ดังนี้
|
Return |
|
ตัวอย่าง
POST /device/shadow/data?alias=test HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
{
"data": {
"temperature": 33.7,
"config": {"item1": "a", "item2": "b"},
"note": "test case"
}
}
Shadow Batch Update¶
จะใช้ในกรณีที่ IoT Device ไม่สามารถส่งข้อมูลขึ้น Cloud Platform ได้ตามเวลาที่กำหนด เช่น อาจจะเกิดจากปัญหาการเชื่อมต่ออินเตอร์เน็ต เป็นต้น ทำให้ IoT Device จำเป็นต้องเก็บข้อมูลไว้ที่หน่วยความจำของ Device เองก่อน เช่น เก็บลง SD Card เป็นต้น และเมื่อสามารถเชื่อมต่อ Cloud Platform ได้ จึงทำการส่งข้อมูลที่เก็บไว้ทั้งหมดขึ้น Cloud Platform อีกที โดยสามารถส่งค่าขึ้น Platform ครั้งละหลาย ๆ จุดพร้อมกันได้
การเขียน Shadow แบบ Batch ทำได้ 3 ช่องทาง ได้แก่
REST API คือ การเขียนข้อมูลเป็น Batch โดยดำเนินการผ่าน REST API ซึ่งสามารถเขียนได้ทั้งแบบผสาน (Merge) หรือเขียนทับ (Overwrite) มีรายละเอียดดังนี้
EndPoint |
https://api.nexiiot.io/shadow/batch |
Method |
PUT (กรณี Merge) หรือ POST (กรณี Overwrite) |
Request Header |
Authorization : Device ClientID:Token |
Request Body |
ชุดข้อมูลที่ต้องการเขียนลง Shadow อยู่ในรูปแบบ JSON ดังนี้
|
Return |
|
ตัวอย่าง
POST /device/shadow/batch HTTP/1.1
Host: api.nexiiot.io
Authorization: Device 777d5c96-4c83-4aa6-a273-5ee7c5f453b1:abcduKh8r2tP1zVc1W1nG8YWZeu21234
{
"batch" : [
{"data":{"temp":25.9, "humid":9.6}, "ts":-90000},
{"data":{"temp":25.3, "humid":9.8}, "ts":-60000},
{"data":{"temp":24.5, "humid":9.1}, "ts":-30000},
{"data":{"temp":26.8, "humid":8.2}, "ts":0 }
]
}
Note
เวลาที่กำกับของแต่ละชุดข้อมูลมีหน่อยเป็น Millisecond สามารถใช้คำว่า ts หรือ timestamp เป็นชื่อฟิลด์ก็ได้ หากมีค่าต่ำกว่า 1000 * 2^23 = 8388608000 จะถือว่าเป็นค่า Relative Time กับเวลาปัจจุบัน ถ้ามีค่ามากกว่า จะถือเป็น timestamp แบบ Absolute Time สามารถใช้ค่าลบแทนเวลาในอดีตได้ ซึ่งจะเหมาะสำหรับการอัพเดตข้อมูลจุดย้อนหลัง ยกตัวอย่างเช่น ถ้ากำหนด ts หรือ timestamp เป็น -90000 และ timestamp ปัจจุบัน คือ 1619075885 เวลาที่เกิดจุดข้อมูลนั้นจะเป็น 1619075885 - 90000 = 1618985885 (เวลาย้อนหลังไปจากปัจจุบัน 90 วินาที)
ในส่วนของฟิลด์ merged
ที่ระบุอยู่ใน Request Body เพื่อส่งไปเขียนลง Shadow เป็นการกำหนดรูปแบบการเขียนข้อมูลว่าจะเขียนแบบผสาน (Merge) หรือแบบเขียนทับ (Overwrite) ถ้าเซ็ต merged : true
จะเป็นการเขียนแบบผสาน (Merge) และถ้าเซ็ต merged : false
จะเป็นการเขียนแบบเขียนทับ (Overwrite) แต่ถ้าไม่มีการระบุค่านี้ลงใน Request Body ระบบจะดูจาก Method ที่เลือกใช้ในการ Request ครั้งนั้น ๆ ว่าเป็น PUT (เขียนแบบ Merge) หรือ POST (เขียนแบบ Overwrite) กรณีที่มีการใช้ Method ขัดแย้งกับฟิลด์ merged
ระบบจะให้ความสำคัญสูงสุดกับฟิลด์ merged
โดยไม่สนใจ Method ของ Request
การทำงานของ Expression ที่กำหนดไว้ใน Schema และ Trigger กรณีเขียน Shadow แบบ Batch
Expression ยังคงถูกคำนวณตามสูตรที่กำหนดไว้ทุกชุดข้อมูล เหมือนการ For Loop เขียน Shadow เอง แต่การเขียน Shadow แบบ Batch จะถูกหักโควต้า Shadow read/write เพยีง 1 Operation เท่านั้น แต่โควต้า Shadow Expression จะถูกหักตามจำนวนชุดข้อมูลเช่นเดิม ยกตัวอย่างเช่น ชุดข้อมูลที่ส่งค่ามาบันทึก 100 จุด และมีฟิลด์ข้อมูลที่เซ็ต Expression ไว้ 1 ฟิลด์ จำนวน Shadow Expression ที่ถูกหักจะเท่ากับ 1 x 100 = 100 Operations เป็นต้น
สำหรับ Trigger จะทำงานเฉพาะชุดข้อมูลที่เป็นค่าล่าสุด (Timestamp มีค่าสูงสุด) เท่านั้น และจะถูกหักโควต้าการใช้งานเหมือนการเขียนข้อมูลแค่ชุดเดียว
MQTT คือ การเขียนข้อมูลเป็น Batch จะใช้ Topic และ Payload ดูรายละเอียดได้ที่ Shadow Batch Update
CoAP API คือ การเขียนข้อมูลเป็น Batch โดยดำเนินการผ่าน CoAP Protocol ซึ่งสามารถเขียนได้ทั้งแบบผสาน (Merge) หรือเขียนทับ (Overwrite) เช่นกัน ดูรายละเอียดได้ที่ Shadow Batch Update
Caution
ข้อจำกัดของการเขียน Shadow แบบ Batch คือ จำนวนชุดข้อมูลที่ส่งไปเขียนได้ต่อครั้งต้องไม่เกิน 100 ชุดข้อมูล (JSON Array ของฟลิด์ batch
) เช่น กำหนด Request Body ที่ส่งไปเขียนข้อมูลเป็น
{ "batch" : [ {"data":{"temp":25.9, "humid":9.6}, "ts":-90000}, {"data":{"temp":25.3, "humid":9.8}, "ts":-60000}, {"data":{"temp":24.5, "humid":9.1}, "ts":-30000}, {"data":{"temp":26.8, "humid":8.2}, "ts":0}], "merged": true }
แสดงว่ามีจำนวนชุดข้อมูลเท่ากับ 4 ชุดข้อมูล เป็นต้น หากมีส่งชุดข้อมูลไปเกินกว่าที่กำหนด ข้อมูลทั้งหมดจะไม่ถูกบันทึก และจะมีข้อความแจ้งเตือนกลับมา
Data Store API¶
เป็น API ที่เกี่ยวข้องกับการดึงข้อมูลที่เก็บอยู่ใน Timeseries Data โดย Domain name ของ API คือ https://ds.nexiiot.io/feed ฐานข้อมูลที่ใช้เก็บ คือ ซึ่งใช้ KairosDB ลักษณะการ Query ข้อมูล Parameter ต่างๆ ที่ส่งไปจะเป็นรูปแบบเดียวกับ KairosDB มีรายละเอียดดังนี้
EndPoint |
https://ds.nexiiot.io/feed/api/v1/datapoints/query |
Method |
POST |
Request Header |
Authorization : Bearer UserToken หรือ Device ClientID:DeviceToken, Content-Type : |
Request Body |
เงื่อนไขที่ใช้ในการ Query อยู่ในรูปแบบ JSON สามารถแยกได้เป็น 2 ประเภท คือ
|
Return |
|