[ตอนที่ 2] ใช้ AT Commands ควบคุมบอร์ด AIS DEVIO NB-DEVKIT I รับส่ง Payload ด้วย TCP/UDP และ MQTT
ลงไม้ลงมือ : “ใช้ AT Commands รับส่ง Payload ด้วย TCP/UDP และ MQTT”
บทความ โดย… วิสิทธิ์ เวียงนาค
วันที่ 18 มกราคม 2563
การรับส่ง Payload ของ NB-IoT Shield ในเวอร์ชันแรกน้ัน ทาง AIS ได้จัดเตรียมไลบรารี่ทางเลือกมาให้สำหรับนักพัฒนา เป็นตัวอย่างการรับส่ง Payload โดยโปรโตคอล UDP ไปยัง UDP Server ซึ่งในขณะนั้นยังไม่รองการรับส่ง Payload ด้วยโปรโตคอล MQTT เนื่องจากข้อจำกัดของโมดูล Quectel BC-95-B8 ที่ไม่รองรับโปรโตคอลดังกล่าว จึงทำให้เกิดข้อจำกัดในการนำ NB-IoT Shield ไปใช้งานจริงร่วมกับ Paltform IoT ต่างๆ
ปัญหาดังกล่าว วันนี้ได้ถูกแก้ไขแล้ว บอร์ดใหม่ DEVIO NB-DEVKIT I มาพร้อมกับโมดูล SIM7020E ที่รองรับโปรโตคอลสื่อสารหลายแบบ อาทิเช่น TCP UDP MQTT CoAP ในบทความนี้จะสาธิตถึงวิธีการรับส่ง Payload ด้วยโปรโตรคอลต่างๆ โดยใช้ AT Commands ซึ่งจะช่วยให้นักพัฒนาเข้าใจและเห็นภาพการทำงานของ SIM7020E มากขึ้น
ใช้ AT Commands ส่ง Payload ด้วย TCP/IP
SIM7020E ไม่รองรับโหมด Transparent หรือโหมดทำ Server มันรองรับ TCP/IP เฉพาะในโหมด Client เท่านั้น สามารถสร้างการเชื่อมต่อโปรโตคอลต่างๆ อาทิเช่น LWM2M/MQTT/TCP/UDP/HTTP หรือ CoAP ได้ โดยการสร้าง Socket ขึ้นมา มีหมายเลข id กำกับแต่ละ Socket ทั้งนี้การสื่อสารรับส่ง Payload สามารถรองรับ 5 Sockets ในเวลาเดียวกัน
NOTE
ทุกครั้งที่มีการสร้าง Socket ขึ้นมาใหม่ จะได้รับหมายเลข id เอาไว้อ้างอิงใช้งาน สามารถสร้างสูงสุดได้ 5 sockets พร้อมกัน
ผู้เขียนจะใช้โปรแกรม Node-RED ที่ติดตั้งบน Cloud โดยใช้ระบบปฏิบัติการ Linux มี IP Address เป็น 159.89.197.xxx เป็นเครื่องมือสำหรับการทดสอบในครั้งนี้ สำหรับท่านใดที่ต้องการติดตั้งโปรแกรม Node-RED ไว้ใช้งานเอง สามารถดูขั้นตอนการติดตั้งได้จากบทความด้านล่างนี้
“ติดตั้ง Node-RED บน DigitalOcean และตั้งค่าให้ล๊อกอินก่อนเข้าระบบ”
ที่โปรแกรม Node-RED ให้สร้างโฟล์ใหม่ เร่ิมจากสร้างโหนด TCP Inputs ขึ้นมา เพื่อรอรับ Payload ที่ส่งมาจากเครือข่าย NB-IoT โดยการคลิ๊กที่โหนด “tcp in” แล้วลากไปวางที่ work space จากนั้นสร้างโหนดสำหรับแสดงข้อความ debug โดยการคลิ๊กที่โหนด “debug” แล้วลากไปวางที่ work space เสร็จแล้วสร้างเส้นเชื่อมระหว่างโหนด “tcp in” กับ “debug” แล้วคลิ๊กที่ปุ่ม “deploy” เพื่อเริ่มการทำงานของโฟล์
การตั้งค่าโหนด “tcp in” ทำได้ด้วยการดับเบิ้บคลิ๊กที่โหนด “tcp in” โปรแกรม Node-RED จะแสดงหน้าต่างการตั้งค่าขึ้นมา ให้กำหนดค่า “port” เป็น 2327 (สามารถเปลี่ยนและกำหนดเองได้) จากนั้นกำหนดให้ Output เป็นแบบ String ตามรูปด้านล่าง
ตัวอย่างที่ 5. ใช้ AT Commands ส่ง Payload ด้วย TCP/IP
AT+CSOC=1,1,1
+CSOC: 0
OKAT+CSOCON=0,2327,"159.89.197.xxx"
OKAT+CSOSEND=0,0,"Hello - TCP"
OKAT+CSOCL=0
OK
อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 5 ดังนี้
คำสั่ง AT+CSOC
เป็นคำสั่งสร้าง Socket การเชื่อมต่อขึ้นมาใหม่
มีรูปแบบคำสั่งดังนี้ AT+CSOC=(A), (B), (C)
(A) ตัวแรกหมายถึง domain มีให้เลือกอยู่สองค่าคือ 1: IPv4 , 2: IPv6
(B) ตัวที่สองหมายถึง type มีให้เลือกอยู่สามค่าคือ 1: TCP , 2: UDP , 3: RAW
(C) ตัวที่สามหมายถึง protocal มีให้เลือกอยู่สามค่าคือ 1: IP , 2: ICMP , 3: UDP_LITE
จากตัวอย่างที่ 5 คำสั่ง AT+CSOC=1,1,1 จะหมายถึง การสร้าง Socket การเชื่อมขึ้นมาใหม่ กำหนด domain แบบ IPv4 มี type เป็น TCP และใช้โปรโตลคอล IP
หลังจากใช้คำสั่ง AT+CSOC=1,1,1 แล้ว จะมีข้อความตอบกลับจากโมดูล SIM7020E คือ +CSOC: 0 หมายความว่า ได้สร้าง Socket id#0 เสร็จเรียบร้อยแล้ว
คำสั่ง AT+CSOCON
เป็นคำสั่งเชื่อมต่อ Server ปลายทางด้วย Socket id, IP Address และพอร์ตที่กำหนด
มีรูปแบบคำสั่งดังนี้ AT+CSOCON= (A), (B), (C)
(A) ตัวแรกหมายถึง หมายเลข Socket id ที่ได้จากคำสั่ง AT+CSOC
(B) ตัวที่สองหมายถึง หมายเลขพอร์ตปลายทาง (1–65535)
(C) ตัวที่สามหมายถึง IP Address ของ Server ปลายทาง
จากตัวอย่างที่ 5 คำสั่ง AT+CSOCON=0, 2327, “159.89.197.xxx” จะหมายถึง สร้างการเชื่อมต่อ Socket id#0 พอร์ต 2327 ไปยัง Server ปลายทาง IP Address 159.89.197.xxx
คำสั่ง AT+CSOSEND
เป็นคำสั่งส่ง Payload ไปยัง Server ปลายทาง
มีรูปแบบคำสั่งดังนี้ AT+CSOSEND= (A), (B), (C)
(A) ตัวแรกหมายถึง หมายเลข Socket id ที่ได้จากคำสั่ง AT+CSOC
(B) ตัวที่สองหมายถึง ความยาวของข้อมูล (length of data) ถ้ากำหนดเป็น 0 จะหมายถึงให้ส่งข้อความแบบสตริง
(C) ตัวที่สามหมายถึง Payload ถ้าส่งแบบสตริงต้องมีเครื่องหมาย “” นำหน้า Payload ด้วย ไม่เช่นนั้น SIM7020E จะเข้าใจว่าเป็น HEX String ซึ่งจำเป็นต้องกำหนดความยาวของข้อมูล (length of data) ให้ถูกต้องด้วย
จากตัวอย่างที่ 5 คำสั่ง AT+CSOSEND=0, 0, “Hello-TCP” จะหมายถึงส่งข้อความ “Hello-TCP” ด้วย Socket id#0 แบบสตริง
หลังจากใช้คำสั่ง AT+CSOSEND ถ้ามีข้อความตอบกลับมา “OK” แสดงว่าการส่ง Payload สำเร็จเรียบร้อยแล้ว
คำสั่ง AT+CSOCL
เป็นคำสั่งปิดการเชื่อมต่อ Socket
จากตัวอย่างที่ 5 คำสั่ง AT+CSOCL=0 จะหมายถึงปิดการเชื่อมต่อ Socket id#0
Node-RED
ไปที่โปรแกรม Node-RED ที่หน้าต่าง debug message จะยังไม่แสดงข้อความอะไรออกมา มีเพียงแต่การแจ้งเตือนว่ามี “1 connectios” ที่ใต้โหนด TCP input ซึ่งโดยปกติแล้วจะแสดง “0 connections”
แต่หลังจากใช้คำสั่งปิดการเชื่อมต่อ Socket id#0 ด้วยคำสั่ง “AT+CSOCL=0” ที่หน้าต่าง debug message จะมีข้อความ “Hello -TCP” แสดงออกมา
ใช้ AT Commands ส่ง Payload ด้วย UDP
ผู้เขียนใช้ Node-RED สร้างโหนด UDP inputs ขึ้นมาเพื่อรอรับ Payload ที่ส่งมาจากเครือข่าย NB-IoT จากนั้นตั้งค่าพอร์ตเป็น 42555 แล้วกำหนดให้ Output เป็นแบบ String
ตัวอย่างที่ 6.ใช้ AT Commands ส่ง Payload ด้วย UDP
AT+CSOC=1,2,1
+CSOC: 1
OKAT+CSOCON=1,42555,"159.89.197.xxx"
OKAT+CSOSEND=1,0,"Hello - UDP"
OKAT+CSOCL=1
OK
อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 6 ดังนี้
เริ่มจากสร้างการเชื่อมต่อด้วยคำสั่ง “AT+CSOC=1,2,1” โดย 1,2,1 จะหมายถึง domain=IPv4, type=UDP, protocal=IP จากนั้นจะมีข้อความตอบกลับมา +CSOC: 1 หมายความว่าได้สร้าง socket id#1 สำเร็จเรียบร้อยแล้ว
ทำการเชื่อมต่อ Server ปลายทางโดย Socket id#1 ระบุ IP Address และพอร์ตที่กำหนด ใช้คำสั่ง AT+CSOCON=1,42555,”159.89.197.xxx"
ส่ง Payload โดย Socket id#1 ใช้คำสั่ง AT+CSOSEND=1,0,”Hello-UDP” ถ้ามีข้อความตอบกลับมาว่า “OK” แสดงว่าการส่ง Payload สำเร็จแล้ว และที่โปรแกรม Node-RED หน้าต่าง debug message จะมีข้อความ “Hello -TCP” แสดงออกมาทันที ไม่เหมือนกับการส่ง Payload ด้วย TCP ที่ต้องปิดการเชื่อมต่อก่อนถึงจะแสดงข้อความออกมา
ใช้คำสั่ง “AT+CSOCL=1” ปิดการเชื่อมต่อ socket id#1
ใช้ AT Commands ส่ง Payload ด้วย MQTT แบบไม่ล๊อคอิน
Message Queuing Telemetry Transport (MQTT) เป็น Protocol สำหรับการเชื่อมต่อแบบ M2M (machine-to-machine) นิยมนำมาใช้ในงานกับ Internet of Things สามารถนำมาใชัรับและส่งข้อมูลได้
MQTT Broker หรือบางท่านเรียกว่า MQTT Server มีทั้งเป็นเวอร์ชันฟรีและเสียตังค์ โปรแกรมที่เป็น Open-Source และเป็นที่นิยมใช้กันทั่วไป คือโปรแกรม Mosquitto ที่รองรับทั้งระบบปฏิบัติการ Linux, Windows และ MAC สำหรับผู้ที่สนใจดูรายละเอียดเพิ่มเติม คลิ๊กได้ที่ลิงค์นี้
ที่โปรแกรม Node-RED ผู้เขียนจะใช้ Mosca ที่พัฒนาโดย NodeJS เป็น MQTT broker สำหรับการทดสอบในครั้งนี้ จุดเด่นของ Mosca คือ มีความเร็วในการทำงานใช้งานง่ายและสามารถติดตั้งบนโปรแกรม Node-RED ได้เลย
ให้ลากโหนด mosca in ออกมาวางที่ work space แล้วตั้งค่า MQTT พอร์ตเป็น 1884 กำหนด Topic เป็น “/mytopic” ที่แท็ป Security ไม่ต้องกำหนด Username และ Password มีรายละเอียดการคอนฟิกตามรูปด้านล่าง
ตัวอย่างที่ 7. ใช้ AT Commands ส่ง Payload ด้วย MQTT
AT+CMQNEW="159.89.197.xxx","1884",12000,100
+CMQNEW: 0
OKAT+CMQCON=0,3,"myclient",600,0,0
OKAT+CMQSUB=0,"/mytopic",1
OKAT+CMQPUB=0,"/mytopic",1,0,0,24,"48656c6c6f202d204d515454"+CMQPUB: 0, "/mytopic", 1, 0, 0, 24, "48656C6C6F202D204D515454"OKAT+CMQUNSUB=0,"/mytopic"
OKAT+CMQDISCON=0
OK
อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 7 ดังนี้
1) สร้างการเชื่อมต่อไปยัง MQTT broker ด้วยคำสั่ง
AT+CMQNEW=“159.89.197.xxx”,“1884”,12000,100
คำอธิบายเพิ่มเติม
“159.89.197.107” = MQTT Broker IP Address
“1884” = MQTT Broker Port
12000 = Command Timeout(ms)
100 = Buffer Size
ถ้าสามารถสร้างการเชื่อมต่อไปยัง MQTT broker สำเร็จ จะมีข้อความแสดง MQTT id ตอบกลับมา +CMQNEW: 0
2) เชื่อมต่อกับ MQTT broker โดยกำหนดให้ Client id เป็น “myclient”
AT+CMQCON=0,3,“myclient”,600,0,0
คำอธิบายเพิ่มเติม
0 = MQTT id
3 = Version
“myclient” = Client id
600 = Keep Alive Interval
0 = Clean Session
0 = Will Flag
3) สร้าง MQTT Subscribe กำหนดให้ topic เป็น “/mytopic” และกำหนด QOS=1 ถ้ามีการสั่ง Publish หรือการส่ง Payload เข้ามา จะแสดงข้อความใน Serial Monitor การทำ Subscribe มันก็คือการรอรับ downlink นั่นเองครับ
AT+CMQSUB=0,“/mytopic”,1
คำอธิบายเพิ่มเติม
0 = MQTT id
“/mytopic” = Topic of Subscribe Message
1 = Message QOS
4) ส่งข้อความ “Hello-MQTT” ไปยัง MQTT broker
AT+CMQPUB=0,“/mytopic”,1,0,0,24,“48656c6c6f202d204d515454”
คำอธิบายเพิ่มเติม
0 = MQTT id
“/mytopic” = Topic of Publish Message
1 = Message QOS
0 = Retained Flag
0 = Duplicate Flag
24 = Length of Publish Message
“48656c6c6f202d204d515454” = HEX String = Hello-MQTT
ถ้าการส่งข้อความสำเร็จจะมีข้อความจาก Subscribe ที่ทำไว้ในขั้นตอนที่ 3 แสดงออกมาใน Serial Monitor
+CMQPUB: 0, “/mytopic”, 1, 0, 0, 24, “48656C6C6F202D204D515454”
5) ยกเลิกการทำ Subscribe ที่ทำไว้ในขั้นตอนที่ 3
AT+CMQUNSUB=0,"/mytopic"
คำอธิบายเพิ่มเติม
0 = MQTT id
“/mytopic” = Topic of Subscribe Message
6) ปิดการเชื่อมต่อ MQTT broker
AT+CMQDISCON=0
คำอธิบายเพิ่มเติม
0 = MQTT id
ที่โปรแกรม Node-RED หน้าต่าง debug message ของ Node-RED จะแสดงข้อความ “Hello-MQTT” ที่ได้รับมาออกมา
ทดสอบ MQTT broker ด้วยโปรแกรม MQTT.fx
ผู้เขียนยังได้ใช้โปรแกรม MQTT.fx ซึ่งเป็นโปรแกรมประเภท MQTT Client มาร่วมทดสอบในครั้งนี้ด้วย โดยตั้งค่าให้เชื่อมต่อกับ MQTT broker ที่ IP Address 159.89.197.xxx พอร์ต 1884
ที่โปรแกรม MQTT.fx ทำการ Subscribe “/mytopic” และตั้ง QoS=1 ถ้า SIM7020E ส่ง public payload เข้ามาแล้ว ที่หน้าต่าง Message จะแสดงข้อความ “Hello-MQTT” เหมือนกับที่แสดงบน debug message ของ Node-RED ด้วย
ส่ง Downlink ไปยัง SIM7020E
ผู้เขียนจะทดสอบการส่ง Downlink โดยการทำ Publish ส่งข้อความไปยัง SIM7020E ให้ไปที่เมนู Publish ที่ topic ให้ระบุ “/mytopic” จากนั้นให้สร้าง Payload ให้อยู่ในรูปแบบของสตริงคือ “00112233” แล้วคลิ๊กที่ปุ่ม “Publish” เพื่อส่งข้อความ
ที่หน้าต่าง Message ของโปรแกรม MQTT.fx จะแสดงข้อความ “00112233” เหมือนกับที่แสดงบน debug message ของ Node-RED
ที่หน้าต่าง Serial Monitor ของโมดูล SIM7020E จะพบกับรายละเอียดและข้อความ “3030313132323333” ซึ่งเป็น HEX String หลังจากที่แปลงเป็นสตริงแล้ว จะพบกับข้อความ “00112233” ซึ่งก็คือ Payload ที่ส่งมานั่นเอง
+CMQPUB: 0, "/mytopic", 1, 0, 0, 16, "3030313132323333"
การส่ง Download ไปยังโมดูล SIM7020E ด้วยโปรโตคอล MQTT ทำงานได้อย่างรวดเร็วและแม่นยำ ไม่ซับซ้อน ถ้าเทียบกับการส่ง Downlink ด้วยโปรโตคอล UDP แล้ว มันคนละเรื่องกันเลย ไม่ต้องมารอลุ้นว่า IP Addres ปลายทางจะเปลี่ยนไปหรือยัง หรือ Payload จะส่งไปถึงจริงหรือไม่
NOTE
Hex String: 3030313132323333 = String 00112233
ตัวอย่างการส่ง Payload ด้วย MQTT แบบล๊อคอิน
ให้ลากโหนด mosca in ออกมาวางที่ work space แล้วตั้งค่า MQTT พอร์ตเป็น 1883 แล้วกำหนด Topic เป็น “/mytopic” ที่แท็ป Security ต้องระบุ Username และ Password ด้วย ถึงจะเชื่อมต่อ MQTT broker ได้ เป็นการเพิ่มความปลอดภัยของข้อมูลให้มากขึ้น มีรายละเอียดการคอนฟิกตามรูปด้านล่าง
ตัวอย่างที่ 8. ใช้ AT Commands ส่ง Payload ด้วย MQTT
AT+CMQNEW="159.89.197.107","1883",12000,100
+CMQNEW: 1
OKAT+CMQCON=1,3,"myclient",600,1,0,"mqtt","1234"
OKAT+CMQSUB=1,"/mytopic",1
OKAT+CMQPUB=1,"/mytopic",1,0,0,24,"48656c6c6f202d204d515454"+CMQPUB: 1, "/mytopic", 1, 0, 0, 24, "48656C6C6F202D204D515454"OKAT+CMQUNSUB=1,"/mytopic"
OKAT+CMQDISCON=1
OK
รูปแบบและวิธีการจะคล้ายกับตัวอย่างที่ 7 ความแตกต่างจะอยู่ที่การเชื่อมต่อกับ MQTT broker ต้องระบุ username และ password ให้ถูกต้อง
อธิบายขั้นตอนการใช้คำสั่ง AT Commands ตามตัวอย่างที่ 8 ดังนี้
1) สร้างการเชื่อมต่อไปยัง MQTT broker ด้วยคำสั่ง
AT+CMQNEW="159.89.197.107","1883",12000,100
ถ้าสร้างการเชื่อมต่อสำเร็จจะมีข้อความ MQTT id ตอบกลับมา +CMQNEW: 1
2) ขอการเชื่อมต่อกับ MQTT broker แบบล๊อคอิน กำหนดให้ Client id เป็น “myclient” และ username คือ “mqtt” ส่วนรหัสผ่านคือ “1234”
AT+CMQCON=1,3,"myclient",600,1,0,"mqtt","1234"
3) สร้าง MQTT Subscribe กำหนดให้ topic เป็น “/mytopic” และกำหนด QOS=1 ถ้ามีการสั่ง Publish หรือการส่ง Payload เข้ามา จะแสดงข้อความใน Serial Monitor การทำ Subscribe มันก็คือการรอรับ Downlink นั่นเอง
AT+CMQSUB=1,"/mytopic",1
4) ส่งข้อความ “Hello-MQTT” ไปยัง MQTT broker
AT+CMQPUB=1,"/mytopic",1,0,0,24,"48656c6c6f202d204d515454"
คำอธิบายเพิ่มเติม
“48656c6c6f202d204d515454” = สตริง “Hello-MQTT”
ถ้าการส่งข้อความสำเร็จจะมี Message จาก Subscribe ที่ทำไว้ในขั้นตอนที่ 3 แสดงออกมา
+CMQPUB: 1, “/mytopic”, 1, 0, 0, 24, “48656C6C6F202D204D515454”
5) ยกเลิกการทำ Subscribe ที่ทำไว้ในขั้นตอนที่ 3
AT+CMQUNSUB=1,"/mytopic"
6.) ปิดการเชื่อมต่อ MQTT broker
AT+CMQDISCON=1
ที่หน้าต่าง debug message ในโปรแกรม Node-RED จะแสดงข้อความ “Hello-MQTT” ออกมา
ถึงแม้ว่าการใช้ไลบรารี่สำหรับพัฒนา NB-IoT จะมีความง่าย เพราะได้สร้างชุดคำสั่งรอไว้ให้ใช้ แต่ผู้เขียนมองว่ามันเหมาะสำหรับผู้เริ่มต้น สำหรับผู้ที่เคยใช้งาน NB-IoT มาซักระยะหนึ่งแล้ว จะพบว่ามีหลายอย่างมากๆ ที่ไลบรารี่ไม่รองรับ ดังนั้นการใช้ AT Commands ควบคุม SIM7020E รับส่งข้อมูลโดยตรง จะช่วยให้ท่านใช้งานโมดูล SIM7020E ได้อย่างเต็มประสิทธิภาพ เพราะมันมี option ต่างๆ ให้เลือกใช้อย่างมากมาย ในบทความถัดๆ ไป ผู้เขียนจะสาธิตการสร้างฟังก์ชันขึ้นมาใช้งาน AT Commands ใน Arduino IDE คอยติดตามกันนะครับ
ในบทความหน้า [ตอนที่ 3] ใช้ AT Commands ควบคุมบอร์ด AIS DEVIO NB-DEVKIT I รับส่ง Payload ด้วย HTTP
ผู้เขียนมีความตั้งใจที่จะนำเสนอการใช้ IoT-LoRaWAN-NBIOT สำหรับพัฒนา SMART CITY เพื่อให้ผู้ที่สนใจนำไปพัฒนาต่อยอดสร้างนวตกรรมใหม่ๆ ขอเป็นส่วนหนึ่งเล็กๆ น้อยๆ ช่วยผลักดันประเทศของเราให้เข้าสู่ยุคดิจิตอล Thailand 4.0 อย่างแท้จริง
ติดตามข่าวสารทาง facebook ได้ที่ลิงค์นี้
Facebook กลุ่ม IoT-SmartCity