BLE ที่ปลอดภัย
โมดูลนี้มีฟังก์ชันที่ควบคุมการสื่อสาร BLE Secure (TLS ผ่าน BLE)
สรุป
โมดูลนี้ประกอบด้วยฟังก์ชันที่ใช้การสื่อสาร TCAT
ฟังก์ชันในโมดูลนี้จะพร้อมใช้งานเมื่อเปิดใช้ฟีเจอร์ BLE Secure API (OPENTHREAD_CONFIG_BLE_TCAT_ENABLE
)
ฟังก์ชันในโมดูลนี้จะใช้ได้เมื่อเปิดใช้ฟีเจอร์ TCAT (OPENTHREAD_CONFIG_BLE_TCAT_ENABLE
)
การแจกแจง |
|
---|---|
otTcatApplicationProtocol{
|
enum แสดงโปรโตคอลแอปพลิเคชัน TCAT |
otTcatCommandClass{
|
enum แสดงคลาสคำสั่ง TCAT |
otTcatStatusCode{
|
enum แสดงรหัสสถานะ TCAT |
Typedef |
|
---|---|
otHandleBleSecureConnect)(otInstance *aInstance, bool aConnected, bool aBleConnectionOpen, void *aContext)
|
typedefvoid(*
ตัวชี้สำหรับเรียกเมื่อมีการเปลี่ยนแปลงสถานะการเชื่อมต่อที่ปลอดภัย |
otHandleBleSecureReceive
|
typedef ตัวชี้สำหรับโทรเมื่อได้รับข้อมูลผ่านการเชื่อมต่อ BLE Secure TLS |
otHandleTcatApplicationDataReceive)(otInstance *aInstance, const otMessage *aMessage, int32_t aOffset, otTcatApplicationProtocol aTcatApplicationProtocol, const char *aServiceName, void *aContext)
|
typedefvoid(*
ตัวชี้สำหรับโทรเมื่อได้รับข้อมูลแอปพลิเคชันผ่านการเชื่อมต่อ TLS ของ TCAT |
otHandleTcatJoin)(otError aError, void *aContext)
|
typedefvoid(*
ตัวชี้สำหรับเรียกเพื่อแจ้งว่าการดำเนินการผนวกเสร็จสิ้นแล้ว |
otTcatApplicationProtocol
|
typedef แสดงโปรโตคอลแอปพลิเคชัน TCAT |
otTcatCommandClass
|
typedefenum otTcatCommandClass
แสดงคลาสคำสั่ง TCAT |
otTcatStatusCode
|
typedefenum otTcatStatusCode
แสดงรหัสสถานะ TCAT |
otTcatVendorInfo
|
typedefstruct otTcatVendorInfo
โครงสร้างนี้แสดงข้อมูลผู้ให้บริการ TCAT |
ฟังก์ชัน |
|
---|---|
otBleSecureConnect(otInstance *aInstance)
|
เริ่มต้นเซสชัน TLS ด้วยเพียร์โดยใช้การเชื่อมต่อ BLE ที่เปิดอยู่แล้ว
|
otBleSecureDisconnect(otInstance *aInstance)
|
void
หยุดการเชื่อมต่อ BLE และ TLS
|
otBleSecureFlush(otInstance *aInstance)
|
ล้างบัฟเฟอร์การส่ง
|
otBleSecureGetPeerCertificateBase64(otInstance *aInstance, unsigned char *aPeerCert, size_t *aCertLength)
|
แสดงผลการเข้ารหัสเพียร์ x509 ใบรับรอง base64
|
otBleSecureGetPeerSubjectAttributeByOid(otInstance *aInstance, const char *aOid, size_t aOidLength, uint8_t *aAttributeBuffer, size_t *aAttributeLength, int *aAsn1Type)
|
แสดงผลค่าแอตทริบิวต์ที่ระบุโดย OID จากเรื่องของใบรับรองเพียร์ x509
|
otBleSecureGetThreadAttributeFromOwnCertificate(otInstance *aInstance, int aThreadOidDescriptor, uint8_t *aAttributeBuffer, size_t *aAttributeLength)
|
แสดงค่าแอตทริบิวต์สำหรับ OID 1.3.6.1.4.1.44970.x จากส่วนขยาย v3 ของใบรับรอง x509 ของตัวเอง โดยตัวเลข x สุดท้ายได้รับการตั้งค่าเป็น ThreadOidDescriptor
|
otBleSecureGetThreadAttributeFromPeerCertificate(otInstance *aInstance, int aThreadOidDescriptor, uint8_t *aAttributeBuffer, size_t *aAttributeLength)
|
แสดงค่าแอตทริบิวต์สำหรับ OID 1.3.6.1.4.1.44970.x จากส่วนขยาย v3 ของใบรับรองการเพียร์ x509 ซึ่งตัวเลข x สุดท้ายถูกตั้งค่าเป็น aThreadOidDescriptor
|
otBleSecureIsCommandClassAuthorized(otInstance *aInstance, otTcatCommandClass aCommandClass)
|
bool
ระบุว่าอนุญาตคลาสคำสั่ง TCAT หรือไม่
|
otBleSecureIsConnected(otInstance *aInstance)
|
bool
ระบุว่าเซสชัน TLS เชื่อมต่อหรือไม่
|
otBleSecureIsConnectionActive(otInstance *aInstance)
|
bool
ระบุว่าเซสชัน TLS ทำงานอยู่หรือไม่ (เชื่อมต่อหรือเชื่อมต่อ)
|
otBleSecureIsTcatEnabled(otInstance *aInstance)
|
bool
ระบุว่าเปิดใช้ตัวแทน TCAT หรือไม่
|
otBleSecureSend(otInstance *aInstance, uint8_t *aBuf, uint16_t aLength)
|
ส่งแพ็กเก็ตข้อมูล BLE ที่ปลอดภัย
|
otBleSecureSendApplicationTlv(otInstance *aInstance, uint8_t *aBuf, uint16_t aLength)
|
ส่งแพ็กเก็ตข้อมูล BLE ที่ปลอดภัยซึ่งมี TCAT Send Application Data TLV
|
otBleSecureSendMessage(otInstance *aInstance, otMessage *aMessage)
|
ส่งข้อความ BLE ที่ปลอดภัย
|
otBleSecureSetCaCertificateChain(otInstance *aInstance, const uint8_t *aX509CaCertificateChain, uint32_t aX509CaCertChainLength)
|
void
ตั้งค่า CA ระดับบนสุดที่เชื่อถือได้
|
otBleSecureSetCertificate(otInstance *aInstance, const uint8_t *aX509Cert, uint32_t aX509Length, const uint8_t *aPrivateKey, uint32_t aPrivateKeyLength)
|
void
ตั้งค่าใบรับรอง X509 ของอุปกรณ์ที่มีคีย์ส่วนตัวที่เกี่ยวข้องสำหรับเซสชัน TLS ด้วย TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
|
otBleSecureSetPsk(otInstance *aInstance, const uint8_t *aPsk, uint16_t aPskLength, const uint8_t *aPskIdentity, uint16_t aPskIdLength)
|
void
ตั้งค่าคีย์ที่แชร์ล่วงหน้า (PSK) และชุดการเข้ารหัส TLS_PSK_WITH_AES_128_CCM_8
|
otBleSecureSetSslAuthMode(otInstance *aInstance, bool aVerifyPeerCertificate)
|
void
ตั้งค่าโหมดการตรวจสอบสิทธิ์สำหรับการเชื่อมต่อที่ปลอดภัยของ BLE
|
otBleSecureStart(otInstance *aInstance, otHandleBleSecureConnect aConnectHandler, otHandleBleSecureReceive aReceiveHandler, bool aTlvMode, void *aContext)
|
เริ่มต้นบริการ BLE Secure
|
otBleSecureStop(otInstance *aInstance)
|
void
หยุดเซิร์ฟเวอร์ BLE Secure
|
otBleSecureTcatStart(otInstance *aInstance, const otTcatVendorInfo *aVendorInfo, otHandleTcatJoin aHandler)
|
เปิดใช้โปรโตคอล TCAT ผ่าน BLE Secure
|
โครงสร้าง |
|
---|---|
otTcatVendorInfo |
โครงสร้างนี้แสดงข้อมูลผู้ให้บริการ TCAT |
การแจกแจง
otTcatApplicationProtocol
otTcatApplicationProtocol
แสดงโปรโตคอลแอปพลิเคชัน TCAT
พร็อพเพอร์ตี้ | |
---|---|
OT_TCAT_APPLICATION_PROTOCOL_NONE
|
ข้อความที่ส่งโดยไม่ได้เปิดใช้งานตัวแทน TCAT |
OT_TCAT_APPLICATION_PROTOCOL_STATUS
|
ข้อความที่ส่งไปยังบริการ UDP |
OT_TCAT_APPLICATION_PROTOCOL_TCP
|
ข้อความที่ส่งไปยังบริการ TCP |
otTcatCommandClass
otTcatCommandClass
แสดงคลาสคำสั่ง TCAT
พร็อพเพอร์ตี้ | |
---|---|
OT_TCAT_COMMAND_CLASS_APPLICATION
|
คำสั่ง TCAT ที่เกี่ยวข้องกับเลเยอร์ของแอปพลิเคชัน |
OT_TCAT_COMMAND_CLASS_COMMISSIONING
|
คำสั่ง TCAT ที่เกี่ยวข้องกับการมอบหมายงาน |
OT_TCAT_COMMAND_CLASS_DECOMMISSIONING
|
คำสั่ง TCAT ที่เกี่ยวข้องกับการเลิกใช้งาน |
OT_TCAT_COMMAND_CLASS_EXTRACTION
|
คำสั่ง TCAT ที่เกี่ยวข้องกับการดึงข้อมูลคีย์ |
OT_TCAT_COMMAND_CLASS_GENERAL
|
คำสั่ง TCAT ที่เกี่ยวข้องกับการดำเนินการทั่วไป |
otTcatStatusCode
otTcatStatusCode
แสดงรหัสสถานะ TCAT
พร็อพเพอร์ตี้ | |
---|---|
OT_TCAT_STATUS_BUSY
|
ไม่สามารถเรียกใช้คําสั่งได้เนื่องจากทรัพยากรไม่ว่าง |
OT_TCAT_STATUS_GENERAL_ERROR
|
เกิดข้อผิดพลาดที่ไม่ตรงกับหมวดหมู่อื่นๆ |
OT_TCAT_STATUS_HASH_ERROR
|
ค่าแฮชที่ค่าคอมมิชชันที่แสดงไม่ถูกต้อง |
OT_TCAT_STATUS_PARSE_ERROR
|
ไม่สามารถแยกวิเคราะห์คำขอ / คำสั่งได้อย่างถูกต้อง |
OT_TCAT_STATUS_SUCCESS
|
ประมวลผลคำสั่งหรือคำขอเรียบร้อยแล้ว |
OT_TCAT_STATUS_UNAUTHORIZED
|
ผู้ส่งมีสิทธิ์ไม่เพียงพอสำหรับคำสั่งที่ระบุ |
OT_TCAT_STATUS_UNDEFINED
|
ค่า ข้อมูล หรือบริการที่ขอไม่ได้กำหนดไว้ (ปัจจุบัน) หรือไม่มีอยู่ |
OT_TCAT_STATUS_UNSUPPORTED
|
ไม่รองรับคำสั่งที่ขอหรือ TLV ที่ได้รับ |
OT_TCAT_STATUS_VALUE_ERROR
|
ค่าของ TLV ที่ส่งมีข้อผิดพลาด |
Typedef
otHandleBleSecureConnect
void(* otHandleBleSecureConnect)(otInstance *aInstance, bool aConnected, bool aBleConnectionOpen, void *aContext)
ตัวชี้สำหรับเรียกเมื่อมีการเปลี่ยนแปลงสถานะการเชื่อมต่อที่ปลอดภัย
รายละเอียด | |||||||||
---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
otHandleBleSecureReceive
otHandleTcatApplicationDataReceive otHandleBleSecureReceive
ตัวชี้สำหรับโทรเมื่อได้รับข้อมูลผ่านการเชื่อมต่อ BLE Secure TLS
otHandleTcatApplicationDataReceive
void(* otHandleTcatApplicationDataReceive)(otInstance *aInstance, const otMessage *aMessage, int32_t aOffset, otTcatApplicationProtocol aTcatApplicationProtocol, const char *aServiceName, void *aContext)
ตัวชี้สำหรับโทรเมื่อได้รับข้อมูลแอปพลิเคชันผ่านการเชื่อมต่อ TLS ของ TCAT
รายละเอียด | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
otHandleTcatJoin
void(* otHandleTcatJoin)(otError aError, void *aContext)
ตัวชี้สำหรับเรียกเพื่อแจ้งว่าการดำเนินการผนวกเสร็จสิ้นแล้ว
รายละเอียด | |||||
---|---|---|---|---|---|
พารามิเตอร์ |
|
otTcatApplicationProtocol
enum otTcatApplicationProtocol otTcatApplicationProtocol
แสดงโปรโตคอลแอปพลิเคชัน TCAT
otTcatVendorInfo
struct otTcatVendorInfo otTcatVendorInfo
โครงสร้างนี้แสดงข้อมูลผู้ให้บริการ TCAT
เนื้อหาของโครงสร้างนี้จะต้องยังคงอยู่และไม่มีการเปลี่ยนแปลงขณะที่เซสชัน TCAT ทำงานอยู่
ฟังก์ชัน
otBleSecureConnect
otError otBleSecureConnect( otInstance *aInstance )
เริ่มต้นเซสชัน TLS ด้วยเพียร์โดยใช้การเชื่อมต่อ BLE ที่เปิดอยู่แล้ว
รายละเอียด | |||
---|---|---|---|
พารามิเตอร์ |
|
||
แสดงผลค่า |
|
otBleSecureDisconnect
void otBleSecureDisconnect( otInstance *aInstance )
หยุดการเชื่อมต่อ BLE และ TLS
รายละเอียด | |||
---|---|---|---|
พารามิเตอร์ |
|
otBleSecureFlush
otError otBleSecureFlush( otInstance *aInstance )
ล้างบัฟเฟอร์การส่ง
รายละเอียด | |||||||
---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||
แสดงผลค่า |
|
otBleSecureGetPeerCertificateBase64
otError otBleSecureGetPeerCertificateBase64( otInstance *aInstance, unsigned char *aPeerCert, size_t *aCertLength )
แสดงผลการเข้ารหัสเพียร์ x509 ใบรับรอง base64
รายละเอียด | |||||||||
---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||||
แสดงผลค่า |
|
otBleSecureGetPeerSubjectAttributeByOid
otError otBleSecureGetPeerSubjectAttributeByOid( otInstance *aInstance, const char *aOid, size_t aOidLength, uint8_t *aAttributeBuffer, size_t *aAttributeLength, int *aAsn1Type )
แสดงผลค่าแอตทริบิวต์ที่ระบุโดย OID จากเรื่องของใบรับรองเพียร์ x509
Peer OID มีให้ในรูปแบบไบนารี ระบบจะตั้งค่าความยาวของแอตทริบิวต์ในกรณีที่อ่านแอตทริบิวต์สำเร็จ หรือเป็น 0 หากอ่านไม่สำเร็จ ประเภท ASN.1 ตามที่ตั้งค่าไว้ในมาตรฐาน ITU-T X.690 หากอ่านแอตทริบิวต์สำเร็จ
รายละเอียด | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||||||||
แสดงผลค่า |
|
otBleSecureGetThreadAttributeFromOwnCertificate
otError otBleSecureGetThreadAttributeFromOwnCertificate( otInstance *aInstance, int aThreadOidDescriptor, uint8_t *aAttributeBuffer, size_t *aAttributeLength )
แสดงค่าแอตทริบิวต์สำหรับ OID 1.3.6.1.4.1.44970.x จากส่วนขยาย v3 ของใบรับรอง x509 ของตัวเอง โดยตัวเลข x สุดท้ายได้รับการตั้งค่าเป็น ThreadOidDescriptor
ระบบจะตั้งค่าความยาวของแอตทริบิวต์ในกรณีที่อ่านแอตทริบิวต์สำเร็จ หรือเป็น 0 หากอ่านไม่สำเร็จ ต้องมีการเชื่อมต่อจึงจะใช้งานได้
รายละเอียด | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||||||||||
แสดงผลค่า |
|
otBleSecureGetThreadAttributeFromPeerCertificate
otError otBleSecureGetThreadAttributeFromPeerCertificate( otInstance *aInstance, int aThreadOidDescriptor, uint8_t *aAttributeBuffer, size_t *aAttributeLength )
แสดงค่าแอตทริบิวต์สำหรับ OID 1.3.6.1.4.1.44970.x จากส่วนขยาย v3 ของใบรับรองการเพียร์ x509 ซึ่งตัวเลข x สุดท้ายถูกตั้งค่าเป็น aThreadOidDescriptor
ระบบจะตั้งค่าความยาวของแอตทริบิวต์ในกรณีที่อ่านแอตทริบิวต์สำเร็จ หรือเป็น 0 หากอ่านไม่สำเร็จ ต้องมีการเชื่อมต่อจึงจะใช้งานได้
รายละเอียด | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||||||||||
แสดงผลค่า |
|
otBleSecureIsCommandClassAuthorized
bool otBleSecureIsCommandClassAuthorized( otInstance *aInstance, otTcatCommandClass aCommandClass )
ระบุว่าอนุญาตคลาสคำสั่ง TCAT หรือไม่
รายละเอียด | |||||
---|---|---|---|---|---|
พารามิเตอร์ |
|
||||
แสดงผลค่า |
|
otBleSecureIsConnected
bool otBleSecureIsConnected( otInstance *aInstance )
ระบุว่าเซสชัน TLS เชื่อมต่อหรือไม่
รายละเอียด | |||||
---|---|---|---|---|---|
พารามิเตอร์ |
|
||||
แสดงผลค่า |
|
otBleSecureIsConnectionActive
bool otBleSecureIsConnectionActive( otInstance *aInstance )
ระบุว่าเซสชัน TLS ทำงานอยู่หรือไม่ (เชื่อมต่อหรือเชื่อมต่อ)
รายละเอียด | |||||
---|---|---|---|---|---|
พารามิเตอร์ |
|
||||
แสดงผลค่า |
|
otBleSecureIsTcatEnabled
bool otBleSecureIsTcatEnabled( otInstance *aInstance )
ระบุว่าเปิดใช้ตัวแทน TCAT หรือไม่
รายละเอียด | |||||
---|---|---|---|---|---|
แสดงผลค่า |
|
otBleSecureSend
otError otBleSecureSend( otInstance *aInstance, uint8_t *aBuf, uint16_t aLength )
ส่งแพ็กเก็ตข้อมูล BLE ที่ปลอดภัย
รายละเอียด | |||||||
---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||
แสดงผลค่า |
|
otBleSecureSendApplicationTlv
otError otBleSecureSendApplicationTlv( otInstance *aInstance, uint8_t *aBuf, uint16_t aLength )
ส่งแพ็กเก็ตข้อมูล BLE ที่ปลอดภัยซึ่งมี TCAT Send Application Data TLV
รายละเอียด | |||||||
---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||
แสดงผลค่า |
|
otBleSecureSendMessage
otError otBleSecureSendMessage( otInstance *aInstance, otMessage *aMessage )
ส่งข้อความ BLE ที่ปลอดภัย
หากค่าผลลัพธ์คือ OT_ERROR_NONE, OpenThread จะเป็นเจ้าของ aMessage
และผู้โทรไม่ควรอ้างอิง aMessage
อีกต่อไป หากค่าที่แสดงผลไม่ใช่ OT_ERROR_NONE ผู้โทรจะยังคงเป็นเจ้าของ aMessage
รวมถึงเพิ่มพื้นที่ว่าง aMessage
หากไม่จำเป็นต้องใช้บัฟเฟอร์ข้อความอีก
รายละเอียด | |||||
---|---|---|---|---|---|
พารามิเตอร์ |
|
รายละเอียด | |||||||
---|---|---|---|---|---|---|---|
แสดงผลค่า |
|
otBleSecureSetCaCertificateChain
void otBleSecureSetCaCertificateChain( otInstance *aInstance, const uint8_t *aX509CaCertificateChain, uint32_t aX509CaCertChainLength )
ตั้งค่า CA ระดับบนสุดที่เชื่อถือได้
จำเป็นสำหรับการตรวจสอบความถูกต้องของใบรับรองการเพียร์
โหมด TLS "ECDHE ECDSA พร้อม AES 128 CCM 8" สำหรับ BLE ที่ปลอดภัย
รายละเอียด | |||||||
---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
otBleSecureSetCertificate
void otBleSecureSetCertificate( otInstance *aInstance, const uint8_t *aX509Cert, uint32_t aX509Length, const uint8_t *aPrivateKey, uint32_t aPrivateKeyLength )
ตั้งค่าใบรับรอง X509 ของอุปกรณ์ที่มีคีย์ส่วนตัวที่เกี่ยวข้องสำหรับเซสชัน TLS ด้วย TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8
รายละเอียด | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
otBleSecureSetPsk
void otBleSecureSetPsk( otInstance *aInstance, const uint8_t *aPsk, uint16_t aPskLength, const uint8_t *aPskIdentity, uint16_t aPskIdLength )
ตั้งค่าคีย์ที่แชร์ล่วงหน้า (PSK) และชุดการเข้ารหัส TLS_PSK_WITH_AES_128_CCM_8
รายละเอียด | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
otBleSecureSetSslAuthMode
void otBleSecureSetSslAuthMode( otInstance *aInstance, bool aVerifyPeerCertificate )
ตั้งค่าโหมดการตรวจสอบสิทธิ์สำหรับการเชื่อมต่อที่ปลอดภัยของ BLE
ปิดใช้งานหรือเปิดใช้งานการตรวจสอบใบรับรองเพียร์ ต้องเรียกใช้ก่อนเริ่ม
รายละเอียด | |||||
---|---|---|---|---|---|
พารามิเตอร์ |
|
otBleSecureStart
otError otBleSecureStart( otInstance *aInstance, otHandleBleSecureConnect aConnectHandler, otHandleBleSecureReceive aReceiveHandler, bool aTlvMode, void *aContext )
เริ่มต้นบริการ BLE Secure
เมื่อใช้งานโหมด TLV อยู่ ระบบจะเรียกใช้ฟังก์ชัน aReceiveHandler
เมื่อได้รับ TLV ที่สมบูรณ์และออฟเซ็ตข้อความจะชี้ไปยังค่า TLV
รายละเอียด | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||||||
แสดงผลค่า |
|
otBleSecureStop
void otBleSecureStop( otInstance *aInstance )
หยุดเซิร์ฟเวอร์ BLE Secure
รายละเอียด | |||
---|---|---|---|
พารามิเตอร์ |
|
otBleSecureTcatStart
otError otBleSecureTcatStart( otInstance *aInstance, const otTcatVendorInfo *aVendorInfo, otHandleTcatJoin aHandler )
เปิดใช้โปรโตคอล TCAT ผ่าน BLE Secure
รายละเอียด | |||||||
---|---|---|---|---|---|---|---|
พารามิเตอร์ |
|
||||||
แสดงผลค่า |
|
มาโคร
OT_TCAT_MAX_SERVICE_NAME_LENGTH
OT_TCAT_MAX_SERVICE_NAME_LENGTH 15
ความยาวสูงสุดของสตริงของชื่อบริการ UDP หรือ TCP (ไม่รวมอักขระ Null)
แหล่งข้อมูล
หัวข้ออ้างอิง API ของ OpenThread จะมาจากซอร์สโค้ดซึ่งพร้อมใช้งานใน GitHub ดูข้อมูลเพิ่มเติมหรือมีส่วนร่วมในเอกสารประกอบของเราได้ที่แหล่งข้อมูล