โปรเจกต์นี้จะโชว์ให้เห็นโซลูชันความปลอดภัย IoT ของ Pod นั่นคือ SAFE2 applet ที่เอาไว้ใช้ดึงข้อมูลการตั้งค่า (Configuration) จากเซิร์ฟเวอร์บน Cloud อย่างปลอดภัยและผ่านการยืนยันตัวตน
SAFE2 applet นี้พัฒนาต่อยอดมาจากแนวคิด GSMA IoT SAFE อีกที ตัว applet ออกแบบมาให้ใช้กับอุปกรณ์ IoT ธรรมดาๆ หรือแบบที่ทรัพยากรจำกัด เพื่อสร้างการแลกเปลี่ยนข้อมูลสองทางกับเซิร์ฟเวอร์อย่างปลอดภัย
โซลูชันนี้เหมาะมากสำหรับการอัพเกรดระดับความปลอดภัยของโปรเจกต์ที่ติดตั้งไปแล้ว ซึ่งอาจไม่มีทรัพยากรฮาร์ดแวร์เหลือเฟือพอจะมาทำโปรโตคอลเข้ารหัสเอง
SAFE2
SAFE2 applet ที่อยู่ใน SIM นี่มันมีโปรโตคอล TLS 1.3 แบบ Pre Shared Key (PSK) ติดตั้งอยู่ข้างในเลย สิ่งที่เจ๋งคือ SIM ไม่ได้แค่เก็บตรรกะของโปรโตคอลเท่านั้น แต่ยังเก็บ Pre Shared Key (PSK) ที่เป็นรหัสเฉพาะของมันเองด้วย และสามารถอัพเดต PSK นี้ได้อย่างปลอดภัยผ่านคำสั่ง OTA อีกต่างหาก

SIM ยังเก็บข้อมูลเชื่อมต่ออย่าง URL, endpoint และหมายเลขพอร์ตของเซิร์ฟเวอร์ (IoT platform) เอาไว้ด้วย
SIM จะเป็นคนจัดการทุกขั้นตอนของโปรโตคอลเองหมด ตั้งแต่การแปลงชื่อโดเมน (DNS resolving) ไปจนถึงการลองส่งคำขอซ้ำๆ จนกว่าจะถึงเซิร์ฟเวอร์
ถ้าอยากได้ข้อมูลการตั้งค่าจากเซิร์ฟเวอร์ผ่าน SAFE2 applet น้องๆ ต้องให้ Device Application ส่งคำสั่งเฉพาะไปที่ SIM ผ่าน Modem Middleware ซึ่งก็คือการใช้คำสั่ง AT พื้นฐานสำหรับเข้าถึง SIM นั่นเอง โดยคำสั่งที่ใช้คือ AT+CSIM
ขั้นแรกต้องเปิดช่องทางการสื่อสารเสริม (supplementary logical channel) ก่อนนะ จะได้ไม่ไปรบกวน session GSM ระหว่างโมเด็มกับ SIM ในช่องทางหลัก (base channel) จากนั้นก็เลือก applet ในช่องทางใหม่ แล้วส่งคำสั่งเฉพาะไปที่ applet เพื่อเริ่มต้นคำขอ HTTP GET ไปยังเซิร์ฟเวอร์
แต่ละคำขอ GET จะมี ICCID ของ SIM (รหัสประจำตัวการ์ด) และ DeviceID ที่ Device Application ต้องเตรียมส่งไปล่วงหน้าด้วย SIM จะสร้าง session TLS 1.3 ขึ้นมา แล้วส่งคำขอไปยังพร็อกซี่ในรูปแบบที่เข้ารหัสและยืนยันตัวตนแล้ว พร็อกซี่จะส่งต่อคำขอจาก SIM ไปยังเซิร์ฟเวอร์ และส่งคำตอบจากเซิร์ฟเวอร์กลับมาที่ SIM
Device Application ต้องคอยตรวจสอบสถานะของคำขอ (polling) และมารับข้อมูลเมื่อมันพร้อมใช้งาน สุดท้ายอย่าลืมปิดช่องทางการสื่อสารเสริมเพื่อนำกลับมาใช้ใหม่ด้วยล่ะ
Configuration data
ข้อมูลการตั้งค่าต้องถูกตั้งค่าผ่าน Luner IoT Suite ก่อน
ในการสร้าง configuration น้องต้องขอ access token โดยใช้ข้อมูลประจำตัว (credentials) ที่ได้มา
Device ID คือรหัสประจำตัวเฉพาะของบอร์ด Arduino MKR GSM 1400 ที่ใช้ โค้ดในสเก็ตช์จะมีส่วนสำหรับดึง Device ID นี้และส่งให้ SAFE2 applet
ICCID คือรหัสประจำตัวเฉพาะของ SIM การ์ดที่ใช้
ส่วน "Body" นี่คือข้อมูล configuration ที่จะถูกส่งจาก SIM ไปยังอุปกรณ์ในรูปแบบที่อ่านได้ (clear text) ความยาวต้องไม่เกิน 255 ตัวอักษร
Device Application ที่น้องเขียนต้องสามารถแยกวิเคราะห์ (parse) ข้อมูล configuration ที่ได้รับมาได้

Execution Log
ล็อกด้านล่างนี้แสดงให้เห็นเหตุการณ์การรับ configuration 2 ครั้ง หลังจากอุปกรณ์เริ่มทำงาน (23:36:58.376) โมเด็มรายงานสถานะการลงทะเบียนว่า "Registered in roaming" (23:37:05.412-23:37:14.656)
23:36:55.420 -> MKR AT
23:36:55.420 -> B58D51C5504D5257352E3120FF0D1338
23:36:55.420 -> at
23:36:55.818 -> at
23:36:56.216 -> at
23:36:56.615 -> at
23:36:57.015 -> at
23:36:57.413 -> at
23:36:57.811 -> at
23:36:58.210 -> at
23:36:58.309 -> AT
23:36:58.376 -> OK
23:36:59.205 -> at+creg?
23:36:59.238 -> 0:0
23:36:59.238 -> cntr: 0
23:37:00.766 -> at+creg?
23:37:00.799 -> 0:0
23:37:00.799 -> cntr: 0
23:37:02.292 -> at+creg?
23:37:02.325 -> 0:0
23:37:02.325 -> cntr: 0
23:37:03.818 -> at+creg?
23:37:03.885 -> 0:0
23:37:03.885 -> cntr: 0
23:37:05.379 -> at+creg?
23:37:05.412 -> 0:5
23:37:05.412 -> cntr: 1
23:37:06.915 -> at+creg?
23:37:06.948 -> 0:5
23:37:06.948 -> cntr: 2
23:37:08.443 -> at+creg?
23:37:08.510 -> 0:5
23:37:08.510 -> cntr: 3
23:37:10.004 -> at+creg?
23:37:10.038 -> 0:5
23:37:10.038 -> cntr: 4
23:37:11.532 -> at+creg?
23:37:11.566 -> 0:5
23:37:11.566 -> cntr: 5
23:37:13.094 -> at+creg?
23:37:13.127 -> 0:5
23:37:13.127 -> cntr: 6
23:37:14.622 -> at+creg?
23:37:14.656 -> 0:5
23:37:14.656 -> cntr: 7
23:37:15.651 -> setup finished
Device ID B58D51C5504D5257352E3120FF0D1338 ถูกส่งไปยัง SIM (23:37:16.017) และ Device Application ส่งคำขอข้อมูล configuration (23:37:17.346)
23:37:15.751 -> at+csim=10,"0070000001"
23:37:15.751 -> +CSIM: 6,"019000"
23:37:15.751 ->
23:37:15.751 -> OK
23:37:15.884 -> at+csim=34,"01A4040C0CF0706F646773616665320101"
23:37:15.884 -> +CSIM: 4,"9000"
23:37:15.884 ->
23:37:15.884 -> OK
23:37:16.017 -> at+csim=42,"01DA02C010B58D51C5504D5257352E3120FF0D1338"
23:37:16.017 -> +CSIM: 4,"9000"
23:37:16.017 ->
23:37:16.017 -> OK
23:37:16.083 -> at+csim=10,"0070800100"
23:37:16.083 -> +CSIM: 4,"9000"
23:37:16.083 ->
23:37:16.083 -> OK
23:37:16.083 -> Set Device ID: OK
23:37:16.183 -> at+csim=10,"0070000001"
23:37:16.183 -> +CSIM: 6,"019000"
23:37:16.183 ->
23:37:16.183 -> OK
23:37:16.316 -> at+csim=34,"01A4040C0CF0706F646773616665320101"
23:37:16.316 -> +CSIM: 4,"9000"
23:37:16.316 ->
23:37:16.316 -> OK
23:37:17.346 -> at+csim=10,"01CA000000"
23:37:17.346 -> +CSIM: 516,"6467736166653
จากนั้น Device Application ก็คอยตรวจสอบสถานะของ SAFE2 applet ทุก 15 วินาที (23:37:32.429, 23:37:47.512, 23:38:17.672)
23:37:32.429 -> at+csim=10,"01CC020000"
23:37:32.429 -> +CSIM: 12,"000100009000"
23:37:32.429 ->
23:37:32.429 -> OK
23:37:32.429 -> receiving state: 1
23:37:47.512 -> at+csim=10,"01CC020000"
23:37:47.512 -> +CSIM: 12,"000100009000"
23:37:47.512 ->
23:37:47.512 -> OK
23:37:47.512 -> receiving state: 1
23:38:02.594 -> at+csim=10,"01CC020000"
23:38:02.594 -> +CSIM: 12,"000100009000"
23:38:02.594 ->
23:38:02.594 -> OK
23:38:02.594 -> receiving state: 1
23:38:17.672 -> at+csim=10,"01CC020000"
23:38:17.672 -> +CSIM: 12,"000700009000"
23:38:17.672 ->
23:38:17.672 -> OK
23:38:17.672 -> receiving state: 7
ทันทีที่สถานะกลายเป็น "Data Available" Device Application ก็ส่งคำขอรับข้อมูล (23:38:17.938), ได้ข้อมูลกลับมา (23:38:17.938) และถอดรหัสข้อมูล JSON ที่ได้ จากนั้นก็นำ configuration ไปใช้ ซึ่งในที่นี้คือสั่งให้ LED ติด
23:38:17.938 -> at+csim=10,"01CA010000"
23:38:17.938 -> +CSIM: 184,"7B22636F6E66696775726174696F6E223A7B2276657273696F6E223A22323032312D30352D3035222C22636F6E666967223A5B7B22616374696F6E223A22696F743A416C61726D222C22656666656374223A224F6E227D5D7D7D9000"
23:38:17.938 ->
23:38:17.938 -> OK
23:38:17.938 -> received:90
23:38:17.938 -> {"configuration":{"version":"2021-05-05","config":[{"action":"iot:Alarm","effect":"On"}]}}
23:38:17.938 -> configuration version: 2021-05-05
23:38:17.938 -> iot:Alarm configured as ON
หลังจากปิดช่องทางการสื่อสารเสริม (23:38:18.004) Device Application ก็เริ่มรอ และในอีก 5 นาทีต่อมา (23:43:17.836) ก็เริ่มลูปถัดไป ในระหว่างที่รออยู่นั้น configuration บนเซิร์ฟเวอร์ถูกอัพเดตให้ปิดการแจ้งเตือน (LED) แล้ว
23:38:18.004 -> at+csim=10,"0070800100"
23:38:18.004 -> +CSIM: 4,"9000"
23:38:18.004 ->
23:38:18.004 -> OK
23:38:18.004 -> waiting.....
23:43:17.836 -> at+csim=10,"0070000001"
23:43:17.836 -> +CSIM: 6,"019000"
23:43:17.836 ->
23:43:17.836 -> OK
23:43:17.970 -> at+csim=34,"01A4040C0CF0706F646773616665320101"
23:43:17.970 -> +CSIM: 4,"9000"
23:43:17.970 ->
23:43:17.970 -> OK
Device Application ส่งคำขอข้อมูล configuration อีกครั้ง (23:43:19.034) และหลังจากตรวจสอบสถานะครั้งแรก (23:43:34.102) ก็ได้รับคำตอบว่า "Data available" การประมวลผลในลูปที่สองนี้เร็วกว่า เพราะ URL ถูกแปลงชื่อโดเมนและเก็บไว้ในแคชของ SAFE2 applet แล้ว
Device Application ได้รับข้อมูล configuration ที่ 23:43:34.368
คราวนี้ configuration มีค่า "effect":"Off" ทำให้ LED ถูกปิด
หลังจากได้รับข้อมูล configuration แล้ว ช่องทางการสื่อสารเสริมก็ถูกปิด และเริ่มการรอรอบถัดไปที่ 23:43:34.435
23:43:19.034 -> at+csim=10,"01CA000000"
23:43:19.034 -> +CSIM: 516,"6467736166653
23:43:34.102 -> at+cs