[ตอนที่ 3] ใช้ AT Commands ควบคุมบอร์ด AIS DEVIO NB-DEVKIT I รับส่ง Payload ด้วย HTTP

ลงไม้ลงมือ : “ใช้ AT Commands รับส่ง Payload ด้วย HTTP”
บทความ โดย… วิสิทธิ์ เวียงนาค
วันที่ 29 มกราคม 2563

The Hypertext Transfer Protocol (HTTP) เป็นโปรโตคอลที่ออกแบบมาสำหรับการสื่อสารข้อมูลแบบ Client และ Server เป็นการคุยกันสองทาง มีทั้งการร้องขอและการตอบกลับ การเปิดดู Website ต่างๆ การใช้ Webhook การส่งการแจ้งเตือน LINE Notify การรับส่งอีเมล์ ก็ถือว่าเป็นการสื่อสารแบบ Client และ Server

SIM7020E ก็สามารถรองรับการสื่อสารข้อมูลผ่านโปรโตคอล HTTP ไปภายนอกได้เช่นเดียวกัน ซึ่งมันจะทำให้ท่านสามารถเชื่อมต่อใช้งาน Service ต่างๆ ในโลกของ Internet ได้อย่างมากมาย ในบทความนี้จะสาธิตการใช้ SIM7020E สื่อสารรับส่ง Paylaod ด้วย Method แบบ GET (การร้องขอข้อมูล) และ POST (การส่งกลับข้อมูล) เพื่อเป็นแนวทางให้ท่านนำไปประยุกต์ใช้ต่อไป

สำหรับผู้ที่ต้องศึกษาเพิ่มเติม ดูรายละเอียดได้ที่ลิงค์ข้างล่างนี้
SIM7020 Series_HTTP_Application Note

ตัวอย่างการส่ง Payload ด้วย HTTP แบบ POST

ผู้เขียนจะใช้โปรแกรม Node-RED เป็นเครื่องมือสำหรับการทดสอบในครั้งนี้ โดยการสร้างโหนด Http In ขึ้นมาเพื่อรอรับ Payload ที่ส่งมาจากเครือข่าย NB-IoT จากนั้นตั้งค่า Method เป็นแบบ POST กำหนด URL เป็น “/setBikeData” มีรายละเอียดการคอนฟิกตามรูปด้านล่าง

รูปแสดง โฟลว์และการตั้งค่าโหนด Http input ใน Node-RED แบบ POST

ตัวอย่างที่ 9.ใช้ AT Commands ส่ง Payload ด้วย Http แบบ POST

AT+CHTTPCREATE="http://159.89.197.xxx:1880/"+CHTTPCREAT: 0
OK
AT+CHTTPCON=0
OK
AT+CHTTPSEND=0,1,"/setBikeData",4163636570743a202a2f2a0d0a436f6e6e656374696f6e3a204b6565702d416c6976650d0a557365722d4167656e743a2053494d434f4d5f4d4f44554c450d0a,"application/json",7b22646576534e223a223131313132323232222c227370656564223a2232352e36222c226c6f6e676974756465223a2233362e32222c226c61746974756465223a2239382e36222c22616c746974756465223a2231302e38222c22646972656374696f6e223a2231352e38222c22736174656c6c697465223a2235222c22766f6c74616765223a22342e32227d
OK
+CHTTPNMIH: 0,0,227,X-Powered-By: Express
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Content-Length: 141
ETag: W/"8d-SNoje5ecx4IgcCTXT7Z4CjxFpS4"
Date: Sun, 20 Oct 2019 09:00:25 GMT
Connection: keep-alive
+CHTTPNMIC: 0,0,141,282,7b22646576534e223a223131313132323232222c227370656564223a2232352e36222c226c6f6e676974756465223a2233362e32222c226c61746974756465223a2239382e36222c22616c746974756465223a2231302e38222c22646972656374696f6e223a2231352e38222c22736174656c6c697465223a2235222c22766f6c74616765223a22342e32227dAT+CHTTPCREATE?+CHTTPCREATE: 0,1,http://159.89.197.xxx:1880/
+CHTTPCREATE: 1,0,(null)
+CHTTPCREATE: 2,0,(null)
+CHTTPCREATE: 3,0,(null)
+CHTTPCREATE: 4,0,(null)
OK
AT+CHTTPDISCON=0
OK
AT+CHTTPDESTROY=0
OK

อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 9 ดังนี้

1) สร้างการเชื่อมต่อไปยัง HTTP server ระบุ IP Address เป็น “159.89.197.xxx” กำหนดใช้งานพอร์ต “1880

AT+CHTTPCREATE="http://159.89.197.xxx:1880/"

ถ้าสร้างการเชื่อมต่อสำเร็จจะมีข้อความตอบกลับมา พร้อมกับแสดงหมายเลข HTTP Client id ที่สร้างขึ้นใหม่ จากตัวอย่างที่ 9 จะได้ Client id เท่ากับ 0 (+CHTTPCREAT: 0)

2) เชื่อมต่อ HTTP server

AT+CHTTPCON=0

3) ส่ง payload ไปยัง HTTP server ด้วย method แบบ POST

AT+CHTTPSEND=0,1,"/setBikeData",4163636570743a202a2f2a0d0a436f6e6e656374696f6e3a204b6565702d416c6976650d0a557365722d4167656e743a2053494d434f4d5f4d4f44554c450d0a,"application/json",7b22646576534e223a223131313132323232222c227370656564223a2232352e36222c226c6f6e676974756465223a2233362e32222c226c61746974756465223a2239382e36222c22616c746974756465223a2231302e38222c22646972656374696f6e223a2231352e38222c22736174656c6c697465223a2235222c22766f6c74616765223a22342e32227d

คำอธิบายเพิ่มเติม
0 = HTTP Client id
1 = Method มีสถานะตามข้างล่างนี้

  • 0 HTTPCLIENT_GET
  • 1 HTTPCLIENT_POST
  • 2 HTTPCLIENT_PUT
  • 3 HTTPCLIENT_DELETE

“/setBikeData” = URL

4163636570743a202a2f2a0d0a436f6e6e656374696f6e3a204b6565702d416c6976650d0a557365722d4167656e743a2053494d434f4d5f4d4f44554c450d0a = header

หลังจากแปลง Header ที่อยู่ในรูป HEX String เป็นสตริงแล้ว จะพบกับข้อความตามข้างล่าง

Accept: */*
Connection: Keep-Alive
User-Agent: SIMCOM_MODULE

รูปแสดง การแปลงจาก HEX String เป็นสตริง

ที่มา https://codebeautify.org/hex-string-converter

“application/json” = กำหนดรูปแบบข้อมูลเป็นแบบ JSON สตริง

7b22646576534e223a223131313132323232222c227370656564223a2232352e36222c226c6f6e676974756465223a2233362e32222c226c61746974756465223a2239382e36222c22616c746974756465223a2231302e38222c22646972656374696f6e223a2231352e38222c22736174656c6c697465223a2235222c22766f6c74616765223a22342e32227d = ข้อความ หรือ payload ที่อยู่ในรูป HEX String

หลังจากแปลง payload ที่อยู่ในรูป Hex String เป็นสตริงแล้ว จะพบกับข้อความตามข้างล่าง

{
"devSN":"11112222",
"speed": "25.6",
"longitude": "36.2",
"latitude": "98.6",
"altitude": "10.8",
"direction": "15.8",
"satellite": "5",
"voltage": "4.2"
}
รูปแสดง การแปลงจาก HEX String เป็นสตริง

ที่มา https://codebeautify.org/hex-string-converter

3) ตรวจสอบสถานะการเชื่อมต่อ HTTP

AT+CHTTPCREATE?
  • +CHTTPCREATE: 0,1,http://159.89.197.xxx:1880/
  • +CHTTPCREATE: 1,0,(null)
  • +CHTTPCREATE: 2,0,(null)
  • +CHTTPCREATE: 3,0,(null)
  • +CHTTPCREATE: 4,0,(null)

4) ยกเลิกการเชื่อมต่อ HTTP Client

AT+CHTTPDISCON=0

5) ปิดการเชื่อมต่อ HTTP server

AT+CHTTPDESTROY=0

Node-RED

ที่โปรแกรม Node-RED หน้าต่าง debug message จะแสดงข้อความที่ได้รับมาจาก Http แบบ POST ในรูปแบบข้อความ JSON สตริง

รูปแสดง โฟลว์และ Debug Message ใน Node-RED — Http แบบ POST

ตัวอย่างการส่ง Payload ด้วย HTTP แบบ GET

ที่โปรแกรม Node-RED ให้สร้างโหนด Http In ขึ้นมาเพื่อรอรับ Payload ที่ส่งมาจากเครือข่าย NB-IoT จากนั้นตั้งค่า Method ให้เป็นแบบ GET กำหนด URL เป็น “/mysensor” มีรายละเอียดการคอนฟิกตามรูปด้านล่าง

รูปแสดง โฟลว์และ Debug Message ในโปรแกรม Node-RED — Http แบบ GET

ตัวอย่างที่ 10. ใช้ AT Commands ส่ง Payload ด้วย Http แบบ GET

AT+CHTTPCREATE="http://159.89.197.xxx:1880/"+CHTTPCREAT: 1
OK
AT+CHTTPCON=1
OK
AT+CHTTPSEND=1,0,"/mysensor?devname=0098&ph=7.2&ec=2.1&temp=25.6"
OK
+CHTTPNMIH: 1,0,226,X-Powered-By: Express
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Content-Length: 54
ETag: W/"36-pYZfxNLQhnA1OGIbWbN7gvWg+0M"
Date: Sun, 20 Oct 2019 09:57:52 GMT
Connection: keep-alive
+CHTTPNMIC: 0,0,54,108,7b226465766e616d65223a2230303938222c227068223a22372e32222c226563223a22322e31222c2274656d70223a2232352e36227dAT+CHTTPDISCON=1
OK
AT+CHTTPDESTROY=1
OK

อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 10 ดังนี้

1) สร้างการเชื่อมต่อไปยัง HTTP server ระบุ IP Address เป็น “159.89.197.xxx” กำหนดใช้งานพอร์ต “1880

AT+CHTTPCREATE="http://159.89.197.xxx:1880/"

ถ้าสร้างการเชื่อมต่อสำเร็จจะมีข้อความตอบกลับมา พร้อมแสดงหมายเลข HTTP Client id ที่สร้างขึ้นใหม่ จากตัวอย่างที่ 10 จะได้ Client id เท่ากับ 1 (+CHTTPCREAT: 1)

2) เชื่อมต่อ HTTP server

AT+CHTTPCON=1

3) ส่ง payload ไปยัง HTTP server แบบ GET

AT+CHTTPSEND=1,0,"/mysensor?devname=0098&ph=7.2&ec=2.1&temp=25.6"

คำอธิบายเพิ่มเติม
1 = HTTP Client id
0 = Method มีสถานะตามข้างล่างนี้

  • 0 HTTPCLIENT_GET
  • 1 HTTPCLIENT_POST
  • 2 HTTPCLIENT_PUT
  • 3 HTTPCLIENT_DELETE

/mysensor = URL

ข้อมูลที่ต้องการส่งได้แก่
devname=0098
ph=7.2
ec=2.1
temp=25.6

เขียนให้อยู่ในรูปของ payload โดยใช้เครื่องหมาย “&” คั่นระหว่างตัวแปร

?devname=0098&ph=7.2&ec=2.1&temp=25.6

ถ้าการส่ง payload สำเร็จจะมีข้อความตอบกลับมา

CHTTPNMIH: 1,0,226,X-Powered-By: Express
X-Content-Type-Options: nosniff
Content-Type: application/json; charset=utf-8
Content-Length: 54
ETag: W/”36-pYZfxNLQhnA1OGIbWbN7gvWg+0M”
Date: Sun, 20 Oct 2019 09:57:52 GMT
Connection: keep-alive
CHTTPNMIC: 0,0,54,108,7b226465766e616d65223a2230303938222c227068223a22372e32222c226563223a22322e31222c2274656d70223a2232352e36227d

ข้อความที่ตอบกลับมาถ้าแปลงจาก HEX String เป็นสตริงแล้ว จะพบกับข้อความตามรูปด้านล่าง

{
"devname": "0098",
"ph": "7.2",
"ec" "2.1",
"temp": "25.6"
}
รูปแสดง การแปลงจาก HEX String เป็นสตริง

ที่มา https://codebeautify.org/hex-string-converter

4) ยกเลิกการเชื่อมต่อ HTTP Client

AT+CHTTPDISCON=1

5.) ปิดการเชื่อมต่อ HTTP server

AT+CHTTPDESTROY=1

Node-RED

ที่โปรแกรม Node-RED หน้าต่าง debug message จะแสดงข้อความที่ได้รับมาจาก Http แบบ GET ในรูปแบบข้อความ JSON สตริง

รูปแสดง โฟลว์และ Debug Message ใน Node-RED — Http แบบ GET

ตัวอย่างการส่งข้อความไป LineNotify ด้วย HTTP

ก่อนที่จะใช้บริการแจ้งเตือนผ่านทาง Line Notify ท่านจำเป็นต้องสมัครขอใช้บริการจาก LINE ก่อน ซึ่งหลังจากสมัครแล้ว ท่านจะได้ตัวเลขชุดหนึ่งมา

Ynzzovc8dway85pRSJKNvtUIAzlkPnvBPs9xAdaBWRA

ตัวเลขชุดนี้เรียกว่าโทเคน (TOKEN) เอาไว้อ้างอิงตัวตนเพื่อใช้บริการ LINE Notify ท่านสามารถส่งข้อความไปแจ้งเตือนที่ LINE Notify ผ่าน API ได้ มีช่องทางต่างๆ ให้เลือกใช้มากมาย เช่น เขียนโปรแกรมส่งจาก PHP / PYTHON / ARDUINO / Node.JS / C/C++ หรือจาก CURL

มาถึงวันนี้มันมีช่องทางใหม่เกิดขึ้น นั้นก็คือการส่งข้อความไปแจ้งเตือนที่ LINE Notify ผ่านเครือข่าย NB-IoT นั่นเอง “เราสามารถใช้ SIM7020E ส่งข้อความตรงไปยัง LINE Notify ผ่าน HTTP แบบ POST ได้เลย” เพิ่มความสะดวกสบายในการใช้งานอย่างมาก

สำหรับท่านใดที่ยังไม่ได้สมัครใช้บริการ LINE Notify หรือต้องการข้อมูลเพิ่มเติม สามารถดูรายละเอียดได้ที่ลิงค์นี้

ใส่ใจ 6. เตรียมความพร้อมก่อนการใช้ Line Notify

ตัวอย่างที่ 11. ใช้ AT Commands ส่งข้อความไป Line Notify ด้วย HTTP

AT+CHTTPCREATE="https://notify-api.line.me/"+CHTTPCREATE: 0
OK
AT+CHTTPCON=0
OK
AT+CHTTPSEND=0,1,"/api/notify/", 417574686f72697a6174696f6e3a204265617265722077384f4951753743763764317136375a4c506e774c6152714e4f656c547259486a30303030313131323334a436f6e74656e742d547970653a206170706c69636174696f6e2f782d7777772d666f726d2d75726c656e636f6465640d0a,"application/json",6d6573736167653d6e62696f74207669736974207769616e676e616b
OK
+CHTTPNMIH: 0,200,317,Server: nginx
Date: Tue, 28 Jan 2020 15:27:50 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=3
X-RateLimit-Limit: 1000
X-RateLimit-ImageLimit: 50
X-RateLimit-Remaining: 999
X-RateLimit-ImageRemaining: 50
X-RateLimit-Reset: 1580228870
+CHTTPNMIC: 0,0,29,29,7b22737461747573223a3230302c226d657373616765223a226f6b227d+CHTTPERR: 0,-2AT+CHTTPDISCON=0
OK
AT+CHTTPDESTROY=0
OK

อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 11 ดังนี้

1) สร้างการเชื่อมต่อไปยัง LINE server ที่ “https://notify-api.line.me/”

AT+CHTTPCREATE="https://notify-api.line.me/"

ถ้าสร้างการเชื่อมต่อสำเร็จจะมีข้อความตอบกลับมา พร้อมกับแสดงหมายเลข HTTP Client id ที่สร้างขึ้นใหม่ จากตัวอย่างที่ 11 จะได้ Client id เท่ากับ 0 (+CHTTPCREAT: 0)

2) เชื่อมต่อ LINE server

AT+CHTTPCON=0

3) ส่ง payload ไปยัง LINE server ด้วย method แบบ POST

AT+CHTTPSEND=0,1,"/api/notify/", 417574686f72697a6174696f6e3a204265617265722077384f4951753743763764317136375a4c506e774c6152714e4f656c547259486a786634644a4f303030300d0a436f6e74656e742d547970653a206170706c69636174696f6e2f782d7777772d666f726d2d75726c656e636f6465640d0a,"application/json",6d6573736167653d6e62696f74207669736974207769616e676e616b

คำอธิบายเพิ่มเติม
0 = HTTP Client id
1 = Method มีสถานะตามข้างล่างนี้

  • 0 HTTPCLIENT_GET
  • 1 HTTPCLIENT_POST
  • 2 HTTPCLIENT_PUT
  • 3 HTTPCLIENT_DELETE

หลังจากแปลง Header ที่อยู่ในรูป HEX String เป็นสตริงแล้ว จะพบกับข้อความตามข้างล่าง

Authorization: Bearer w8OIQu7Cv7d1q67ZLPnwLaRqNOelTrYHjxf4dJO0000
Content-Type: application/x-www-form-urlencoded
รูปแสดง การแปลงจาก HEX String เป็นสตริง

หลังจากแปลง payload ที่อยู่ในรูป HEX String เป็นสตริงแล้ว จะพบกับข้อความตามข้างล่าง

6d6573736167653d6e62696f74207669736974207769616e676e616b
รูปแสดง การแปลงจาก HEX String เป็นสตริง

ข้อความที่ LINE ตอบกลับมา มีรายละเอียดที่น่าสนใจดังนี้

X-RateLimit-Limit: 1000
X-RateLimit-ImageLimit: 50
X-RateLimit-Remaining: 999
X-RateLimit-ImageRemaining: 50
X-RateLimit-Reset: 1580228870

X-RateLimit-Limit จำนวนสูงสุดที่สามารถส่งข้อความผ่าน LINE Notify ได้ภายในเวลา 1 ชั่วโมง ในที่นี้ได้ 1,000 ข้อความ

X-RateLimit-Image จำนวนสูงสุดที่สามารถส่งข้อความแบบรูป image ผ่าน LINE Notify ได้ภายในเวลา 1 ชั่วโมง ในที่นี้ได้ 50 ข้อความ

X-RateLimit-Remaining จำนวนการส่งข้อความผ่าน LINE Notify ที่เหลือที่สามารถส่งได้อีก ในที่นี้เหลืออีก 999 ข้อความ

X-RateLimit-ImageRemaining จำนวนการส่งข้อความแบบรูป image ผ่าน LINE Notify ที่เหลือที่สามารถส่งได้อีก ในที่นี้เหลืออีก 50 ข้อความ

4) ยกเลิกการเชื่อมต่อ HTTP Client

AT+CHTTPDISCON=0

5.) ปิดการเชื่อมต่อ HTTP server

AT+CHTTPDESTROY=0

ที่โปรแกรม LINE Notify ในมือถือจะมีข้อความแจ้งเตือนส่งมา

รูปแสดง หน้าต่างการแจ้งเตือน LINE Notify

เรามาถึงวันที่สามารถใช้ HTTP สื่อสารรับส่งข้อรูปภายนอกด้วย Method แบบ GET และ POST ผ่านเครือข่าย NB-IoT ได้แล้ว ผู้เขียนมองว่ามันจะเป็นการยกระดับการพัฒนาอุปกรณ์ Internet of Things ขึ้นไปอีกขั้นหนึ่ง คาดว่าในอีกไม่นานเราคงได้เห็นการประยุกต์นำเอาบอร์ด AIS DEVIO NB-DEVKIT I ไปพัฒนาสร้างสรรค์งานต่างๆ จนเกิดเป็นผลงานและ Service ใหม่ๆ อย่างที่คาดไม่ถึงอย่างแน่นอน

ในบทความหน้า [ตอนที่ 4] สร้างฟังก์ชันบนโปรแกรม Arduino IDE ควบคุมบอร์ด AIS DEVIO NB-DEVKIT I

ผู้เขียนมีความตั้งใจที่จะนำเสนอการใช้ IoT-LoRaWAN-NBIOT สำหรับพัฒนา SMART CITY เพื่อให้ผู้ที่สนใจนำไปพัฒนาต่อยอดสร้างนวตกรรมใหม่ๆ ขอเป็นส่วนหนึ่งเล็กๆ น้อยๆ ช่วยผลักดันประเทศของเราให้เข้าสู่ยุคดิจิตอล Thailand 4.0 อย่างแท้จริง

ติดตามข่าวสารทาง facebook ได้ที่ลิงค์นี้
Facebook กลุ่ม IoT-SmartCity

--

--

No responses yet