ดูซอร์สโค้ดใน 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