เครื่องมือการจัดสรร OpenWeave จากโรงงาน

ดูซอร์สโค้ดใน GitHub

เครื่องมือจัดสรรของ OpenWeave Factory เป็นวิธีการที่สะดวกในการจัดสรรข้อมูลการกำหนดค่าแบบถาวรต่ออุปกรณ์ให้กับอุปกรณ์ที่เปิดใช้ Weave เครื่องมือการจัดสรรอุปกรณ์จากโรงงานมีไว้เพื่อใช้ในกระบวนการสายการผลิตซึ่งประทับอุปกรณ์แต่ละเครื่องด้วยข้อมูลประจำตัวและข้อมูลเข้าสู่ระบบที่ไม่ซ้ำกันก่อนจัดส่งไปยังลูกค้า นอกจากนี้ นักพัฒนาซอฟต์แวร์ยังใช้เพื่อปรับเปลี่ยนฮาร์ดแวร์รุ่นก่อนผลิตจริงซึ่งใช้ระหว่างขั้นตอนการพัฒนาได้ด้วย

ทฤษฎีการดําเนินงาน

เป้าหมายของเครื่องมือการจัดสรรอุปกรณ์จากโรงงานของ OpenWeave คือเพื่อแทรกข้อมูลการกําหนดค่าที่เลือกลงในที่เก็บข้อมูลการกําหนดค่าถาวรของอุปกรณ์ ซึ่งเฟิร์มแวร์ของอุปกรณ์จะดึงข้อมูลดังกล่าวมาใช้ได้เมื่อรันไทม์ โดยปกติแล้วการกําหนดค่าอุปกรณ์แบบถาวรจะจัดเก็บไว้ในแฟลชภายในของอุปกรณ์ แม้ว่ารายละเอียดของวิธีจัดเก็บข้อมูลและรูปแบบการจัดเก็บจะแตกต่างกันไปในแต่ละแพลตฟอร์ม เครื่องมือการจัดสรรอุปกรณ์จากโรงงานจะแยกจากรูปแบบพื้นที่เก็บข้อมูลขั้นสุดท้าย และอาศัยโค้ดในเฟิร์มแวร์ของอุปกรณ์เพื่อเขียนข้อมูลอย่างถูกต้อง อินเทอร์เฟซผู้ใช้ของเครื่องมือนี้ยังแยกจากประเภทฮาร์ดแวร์ที่กําหนดค่าได้ส่วนใหญ่ด้วย ซึ่งหมายความว่าสามารถใช้กระบวนการผลิตที่คล้ายกันในสายผลิตภัณฑ์ต่างๆ ที่ใช้แพลตฟอร์มฮาร์ดแวร์ที่แตกต่างกัน

เครื่องมือการจัดสรรอุปกรณ์จากโรงงานออกแบบมาเพื่อทำงานบนเครื่องโฮสต์ที่เชื่อมต่อกับอุปกรณ์เป้าหมายผ่านอินเทอร์เฟซการแก้ไขข้อบกพร่องหรือการควบคุมรูปแบบต่างๆ เช่น พอร์ต JTAG หรือ SWD เครื่องมือนี้ทำงานโดยการแทรกข้อมูลการจัดสรรลงใน RAM ของอุปกรณ์ในรูปแบบที่เข้ารหัสเป็นพิเศษ จากนั้นระบบจะสั่งให้อุปกรณ์รีสตาร์ท เมื่อถึงจุดนี้ โค้ดที่ฝังอยู่ในเฟิร์มแวร์ของอุปกรณ์จะค้นหาข้อมูลที่เข้ารหัส ตรวจสอบความสมบูรณ์ และเขียนค่าที่มีอยู่ในที่จัดเก็บถาวรในรูปแบบที่เหมาะสมกับแพลตฟอร์ม

โค้ดในอุปกรณ์ที่ตรวจหาและประมวลผลข้อมูลการจัดสรรที่แทรกไว้จะติดตั้งมาในตัว OpenWeave Device Layer และเปิดใช้ได้ในแพลตฟอร์มที่รองรับ เมื่อเปิดใช้แล้ว รหัสจะทำงานโดยอัตโนมัติทุกครั้งที่อุปกรณ์บูตในตอนต้นของกระบวนการเริ่มต้นอุปกรณ์ โค้ดจะทำงานโดยการสแกนพื้นที่ของ RAM ที่เจาะจงตามแพลตฟอร์ม ในแพลตฟอร์มที่มีหน่วยความจําไม่มากนัก (เช่น <1 ล้าน) การสแกนจะครอบคลุม RAM ทั้งหมดที่มี

เมื่อวางไว้ใน RAM ระบบจะเข้ารหัสข้อมูลการจัดสรรด้วยคำนำหน้าซึ่งระบุได้ง่าย ซึ่งช่วยให้ค้นหาได้อย่างรวดเร็วในระหว่างกระบวนการสแกน ค่าการตรวจสอบความสมบูรณ์ที่อิงตามแฮชแบบเข้ารหัสจะใช้เพื่อยืนยันความถูกต้องของข้อมูลก่อนประมวลผล

โดยค่าเริ่มต้น เครื่องมือการจัดสรรจะเลือกตำแหน่ง RAM ที่จะแทรกข้อมูลการจัดสรรตามแพลตฟอร์มอุปกรณ์เป้าหมาย ตัวเลือกนี้สามารถลบล้างได้ผ่านอาร์กิวเมนต์ของเครื่องมือ โดยทั่วไปแล้ว เฟิร์มแวร์ของอุปกรณ์ไม่จำเป็นต้องจองพื้นที่ RAM โดยเฉพาะสำหรับการรับข้อมูลการจัดสรร โดยทั่วไปแล้ว ข้อมูลการจัดสรรจะเขียนลงในตำแหน่งของ RAM ที่จัดสรรไว้เพื่อวัตถุประสงค์อื่นๆ แต่มักจะไม่ได้ใช้ในช่วงแรกของขั้นตอนการเปิดเครื่องอุปกรณ์ ตัวเลือกที่พบบ่อยคือด้านบนของกองซ้อนระบบเริ่มต้น หรือส่วนท้ายสุดของพื้นที่เก็บข้อมูลกอง

เครื่องมือการจัดสรรอุปกรณ์จากโรงงานใช้ชุดเครื่องมือการพัฒนาภายนอกเพื่อเชื่อมต่อกับอุปกรณ์เป้าหมาย เครื่องมือที่ใช้งานจะขึ้นอยู่กับประเภทของอุปกรณ์เป้าหมาย ปัจจุบันระบบรองรับอินเทอร์เฟซอุปกรณ์ 2 แบบ ได้แก่

  • การตรวจสอบการแก้ไขข้อบกพร่อง SEGGER J-Link ที่เชื่อมต่อกับพอร์ต JTAG หรือ SWD ของอุปกรณ์
  • พอร์ตอนุกรม USB ที่เชื่อมต่อกับ Espressif ESP32

อินเทอร์เฟซ J-Link ต้องใช้เครื่องมือ SEGGER J-Link Commander (JLinkExe) ซึ่งต้องติดตั้งแยกต่างหากในเครื่องโฮสต์

อินเทอร์เฟซ ESP32 ต้องใช้คำสั่ง Espressif esptool.py ซึ่งเป็นส่วนหนึ่งของ ESP-IDF SDK ของ Espressif

ประเภทข้อมูลที่จัดสรรได้

เครื่องมือการจัดสรร OpenWeave Factory สามารถจัดสรรข้อมูลประเภทต่อไปนี้

  • หมายเลขซีเรียลของอุปกรณ์
  • รหัสอุปกรณ์ Weave ที่ผู้ผลิตกำหนด
  • ใบรับรอง Weave และคีย์ส่วนตัวที่ผู้ผลิตกำหนด
  • รหัสการจับคู่ Weave
  • หมายเลขการแก้ไขผลิตภัณฑ์
  • วันที่ผลิต

แม้ว่าโดยทั่วไปอุปกรณ์จะต้องมีข้อมูลข้างต้นทั้งหมดจึงจะทำงานได้อย่างถูกต้อง แต่คุณไม่จำเป็นต้องจัดสรรข้อมูลทั้งหมดพร้อมกัน ดังนั้น การจัดสรรข้อมูลประเภทต่างๆ อาจเกิดขึ้นได้จากจุดที่แตกต่างกันในกระบวนการผลิต นอกจากนี้ คุณยังแทนที่ค่าที่เตรียมไว้ก่อนหน้านี้ด้วยค่าใหม่ในขั้นตอนการเตรียมความพร้อมในลำดับถัดไปได้ด้วย

แหล่งที่มาของข้อมูลการจัดสรร

คุณสามารถส่งข้อมูลการจัดสรรอุปกรณ์ไปยังเครื่องมือการจัดสรรอุปกรณ์จากโรงงานได้ดังนี้

  • อาร์กิวเมนต์บรรทัดคำสั่ง
  • การใช้ไฟล์ CSV การจัดสรร
  • โดยการดึงค่าจากเซิร์ฟเวอร์การจัดสรรของ Nest

บรรทัดคำสั่ง

ในรูปแบบที่ง่ายที่สุด จะมีการระบุข้อมูลการจัดสรรอุปกรณ์โดยตรงในบรรทัดคำสั่งไปยังเครื่องมือการจัดเตรียมอุปกรณ์ OpenWeave จากโรงงาน เช่น

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --pairing-code NESTUS --mfg-date 2019/04/01

ค่าข้อมูลไบนารี เช่น ใบรับรอง Weave และคีย์ส่วนตัว สามารถระบุเป็นสตริงฐาน 64 หรือเป็นชื่อไฟล์ที่มีข้อมูลที่ต้องการให้อยู่ในรูปแบบไฟล์ดิบ (ไบนารี)

ดูรายการอาร์กิวเมนต์บรรทัดคำสั่งทั้งหมดได้ที่ด้านล่าง

การจัดสรรไฟล์ CSV

เครื่องมือการจัดสรรอุปกรณ์จากโรงงานยังอ่านข้อมูลการจัดสรรจากไฟล์ข้อมูลการจัดสรรในรูปแบบ CSV ได้ด้วย เพื่อรองรับการจัดสรรอุปกรณ์หลายเครื่องพร้อมกัน คอลัมน์ของไฟล์นี้จะสอดคล้องกับประเภทข้อมูลการจัดสรรที่เจาะจง เช่น Serial_Num, Certificate, Private_Key เป็นต้น แถวในไฟล์จะให้ค่าแต่ละค่าสำหรับอุปกรณ์ที่เฉพาะเจาะจง ซึ่งจัดทำดัชนีโดย Weave device id (Device_Id) ต้องระบุ ID ของอุปกรณ์เฉพาะเจาะจงที่จะจัดสรรในบรรทัดคำสั่ง เช่น

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-csv-file ./dev-provisioning-data.csv

ระบบรองรับคอลัมน์ CSV ต่อไปนี้

ชื่อ รูปแบบ คำอธิบาย
Device_Id เลขฐานสิบหก 16 หลัก รหัสอุปกรณ์ Weave ต้องระบุ
Serial_Num สตริง หมายเลขซีเรียลของอุปกรณ์
Certificate สตริง base64 ใบรับรองอุปกรณ์ Weave ที่ผู้ผลิตกำหนด
Private_Key สตริงฐาน 64 คีย์ส่วนตัว Weave ที่ผู้ผลิตกำหนด
Pairing_Code สตริง รหัสการจับคู่ของ Weave
Product_Rev จำนวนเต็ม หมายเลขการแก้ไขผลิตภัณฑ์
Mfg_Date ปปปป/วว/ดด วันที่ผลิตอุปกรณ์

คอลัมน์อาจปรากฏในไฟล์ CSV ในลำดับใดก็ได้ คอลัมน์ทั้งหมดเป็นค่าที่ไม่บังคับ ยกเว้น Device_Id ค่าใดๆ ที่ไม่อยู่ในไฟล์ CSV จะไม่มีการจัดสรรในอุปกรณ์

ผู้ใช้อาจระบุค่าการจัดสรรแต่ละรายการในบรรทัดคำสั่งนอกเหนือจากไฟล์ CSV ในกรณีนี้ ค่าในบรรทัดคำสั่งจะมีความสําคัญเหนือกว่าค่าในไฟล์

การรองรับรูปแบบไฟล์ CSV ของเครื่องมือการจัดสรรจากโรงงานจะเข้ากันได้กับเอาต์พุตของคำสั่ง gen-provisioning-data ของเครื่องมือ weave

เซิร์ฟเวอร์การจัดสรรของ Nest

เครื่องมือจัดสรรจากโรงงานรองรับการดึงข้อมูลการจัดสรรบางรายการจากเซิร์ฟเวอร์การจัดสรรของ Nest โดยใช้โปรโตคอลที่ใช้ HTTPS โปรโตคอลเซิร์ฟเวอร์การจัดสรรสามารถใช้เพื่อดึงข้อมูลใบรับรองอุปกรณ์ Weave ที่ผู้ผลิตกำหนด คีย์ส่วนตัวที่เกี่ยวข้อง และรหัสการจับคู่ Weave จากเซิร์ฟเวอร์การจัดสรรได้

ตำแหน่งเครือข่ายของเซิร์ฟเวอร์การจัดสรรจะระบุโดยการระบุ URL หลักในบรรทัดคำสั่งของเครื่องมือการจัดสรร เลือกข้อมูลการจัดสรรที่ต้องการโดยระบุรหัสอุปกรณ์ Weave ในบรรทัดคำสั่ง เช่น

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-server https://192.168.172.2:8000/

ผู้ใช้อาจระบุค่าการจัดสรรแต่ละรายการในบรรทัดคำสั่งนอกเหนือจาก URL ของเซิร์ฟเวอร์การจัดสรร ในกรณีนี้ ค่าที่ระบุในบรรทัดคำสั่งจะมีความสําคัญเหนือกว่าค่าที่เซิร์ฟเวอร์แสดง

การเปิด / ปิดใช้การสนับสนุนการจัดสรรอุปกรณ์จากโรงงาน

การรองรับการจัดสรรจากโรงงานของ OpenWeave ในเฟิร์มแวร์ของอุปกรณ์จะควบคุมโดยตัวเลือกการกำหนดค่าเวลาคอมไพล์ WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น คุณปิดฟีเจอร์นี้ได้โดยการลบล้างตัวเลือกในไฟล์ WeaveProjectConfig.h ของแอปพลิเคชัน เช่น

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

โดยทั่วไปแล้วการเปิดใช้การจัดสรรอุปกรณ์จากโรงงานในเฟิร์มแวร์ของอุปกรณ์เวอร์ชันที่ใช้งานจริงนั้นปลอดภัย โดยให้ปิดใช้อินเทอร์เฟซแก้ไขข้อบกพร่องของอุปกรณ์อย่างเหมาะสมในอุปกรณ์เวอร์ชันที่ใช้งานจริง ซึ่งทำได้ผ่านฮาร์ดแวร์ (เช่น โดยการทำให้ฟิวส์ใน SoC ขาด) หรือในซอฟต์แวร์ (เช่น ผ่านโปรแกรมบูตที่ปลอดภัยซึ่งบล็อกการเข้าถึงการแก้ไขข้อบกพร่องในกระบวนการบูต)

การเรียกใช้เครื่องมือการจัดสรรอุปกรณ์จากโรงงาน

เครื่องมือการจัดสรร OpenWeave Factory รองรับตัวเลือกบรรทัดคำสั่งต่อไปนี้

ตัวเลือก คำอธิบาย
--target <string> ประเภทอุปกรณ์เป้าหมาย ตัวเลือก ได้แก่ nrf52840, esp32
--load-addr <เลขฐานสิบหก> ที่อยู่ในหน่วยความจำของอุปกรณ์ที่จะเขียนข้อมูลการจัดสรร
--verbose, -v ปรับระดับเสียงด้านการพูดออกเสียงเอาต์พุต ใช้อาร์กิวเมนต์หลายรายการเพื่อเพิ่มรายละเอียด
--serial-num <string> ตั้งค่าหมายเลขซีเรียลของอุปกรณ์
--device-id <hex-digits> ตั้งค่ารหัสอุปกรณ์ที่ผู้ผลิตกำหนด
--device-cert <base-64> | <file-name> ตั้งค่าใบรับรองอุปกรณ์ Weave ที่ผู้ผลิตกำหนด
--device-key <base-64> | <file-name> ตั้งค่าคีย์ส่วนตัวของอุปกรณ์ Weave ที่ผู้ผลิตกำหนด
--pairing-code <string> ตั้งรหัสการจับคู่อุปกรณ์
--product-rev <integer> ตั้งค่าการแก้ไขผลิตภัณฑ์สำหรับอุปกรณ์
--mfg-date <YYYY/MM/DD> | today | now ตั้งค่าวันที่ผลิตของอุปกรณ์
--jlink-cmd <path-name> เส้นทางไปยังคําสั่ง JLink ค่าเริ่มต้นคือ "JLinkExe"
--jlink-if SWD | JTAG ประเภทอินเทอร์เฟซ J-Link ค่าเริ่มต้นคือ SWD
--jlink-speed <integer> | adaptive | auto ความเร็วของอินเทอร์เฟซ J-Link
--jlink-sn <string> หมายเลขซีเรียลของหัว J-Link
--esptool-cmd <path-name> เส้นทางไปยังคำสั่ง esptool ค่าเริ่มต้นคือ "esptool.py"
--port <path-name> ชื่ออุปกรณ์พอร์ต COM สำหรับ ESP32 ค่าเริ่มต้นคือ /tty/USB0
--ความเร็ว <integer> อัตรารับส่งข้อมูลสำหรับพอร์ต COM ค่าเริ่มต้นคือ 115200
--prov-csv-file <file-name> อ่านข้อมูลการจัดสรรอุปกรณ์จากไฟล์ CSV การจัดสรร
--prov-server <url> อ่านข้อมูลการจัดสรรอุปกรณ์จากเซิร์ฟเวอร์การจัดสรร
--disable-server-validation เมื่อใช้ HTTPS ให้ปิดใช้การตรวจสอบใบรับรองที่เซิร์ฟเวอร์การจัดสรรแสดง

ตัวอย่าง

คำสั่งต่อไปนี้จะตั้งค่ารหัสอุปกรณ์ หมายเลขซีเรียล การแก้ไขผลิตภัณฑ์ และรหัสการจับคู่เป็นค่าที่เฉพาะเจาะจง วันที่ผลิตตั้งค่าเป็นวันที่ปัจจุบัน และตั้งค่าใบรับรองอุปกรณ์และคีย์ส่วนตัวเพื่อทดสอบค่าที่ระบุไว้ในไฟล์ CSV ที่มาพร้อมกับที่เก็บข้อมูลopenweave-coreต้นทาง

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000042 \
    --serial-num JAYS_DEVICE_42 --product-rev 1 --pairing-code NESTUS --mfg-date today \
    --prov-csv-file ~/projects/openweave-core/certs/development/device/test-dev-provisioning-data.csv