diff --git a/Abstract.typ b/Abstract.typ index 8dd25d3..07dfdd8 100644 --- a/Abstract.typ +++ b/Abstract.typ @@ -5,16 +5,13 @@ columns: 2, column-gutter: 2em, row-gutter: 1em, - stroke: (none, (bottom: (dash: "dotted"))), [หัวข้อโครงงาน], [เครื่องยืนยันตัวตนด้วย NFC], [นักศึกษา], grid.cell( - stroke: none, grid( columns: 2, column-gutter: 1em, row-gutter: 1em, - stroke: ((bottom: (dash: "dotted")), none), [นางสาว ประภากร ศรีวรสาร], [รหัสประจำตัว #underline[67219090006]], [นางสาว พีรดา แสงแป้], [รหัสประจำตัว #underline[67219090007]], [นาย ศตคุณ อุตมะ], [รหัสประจำตัว #underline[67219090014]], @@ -31,7 +28,33 @@ = บทคัดย่อ -#i โครงงานนี้ +#i โครงงานนี้มีวัตถุประสงค์เพื่อศึกษาและประยุกต์ใช้เทคโนโลยี NFC ในการยืนยันตัวตน +ออกแบบและสร้างเครื่องมือที่สามารถตรวจสอบสิทธิ์การเข้าใช้งานได้อย่างมีประสิทธิภาพ +รวมถึงป้องกันการบุกรุกจากบุคคลที่ไม่ได้รับอนุญาต และเพิ่มความสะดวกในการยืนยันตัวตนผ่านโทรศัพท์มือถือ +โดยมุ่งเน้นให้ระบบมีการทำงานที่ง่าย รวดเร็ว และมีความน่าเชื่อถือ เหมาะสมต่อการนำไปใช้งานจริง + +#i การดำเนินงานเริ่มจากการศึกษาหลักการทำงานของเซนเซอร์ NFC +และอุปกรณ์ไมโครคอนโทรลเลอร์ที่เกี่ยวข้อง +จากนั้นทำการออกแบบวงจรและโครงสร้างของอุปกรณ์ให้เหมาะสม +ผู้จัดทำได้พัฒนาระบบให้สามารถอ่านข้อมูลจากโทรศัพท์มือถือหรือการ์ด NFC ที่ได้ลงทะเบียนไว้ +เมื่อมีการนำอุปกรณ์มาสแกนระบบจะทำการตรวจสอบข้อมูลกับฐานข้อมูล +หากข้อมูลถูกต้องจะอนุญาตให้เข้าถึงได้ทันที แต่หากไม่ถูกต้องระบบจะปฏิเสธการเข้าถึง +เพื่อป้องกันการใช้งานจากบุคคลที่ไม่ได้รับสิทธิ์ + +#i นอกจากนี้ยังได้มีการทดสอบประสิทธิภาพของอุปกรณ์ในหลายด้าน เช่น ความสามารถในการอ่านค่า NFC +จากอุปกรณ์หลายรูปแบบ ระยะการทำงานของเซนเซอร์ +ความถูกต้องในการตรวจสอบข้อมูลและความเสถียรของระบบ +ผลการทดสอบแสดงให้เห็นว่าเครื่องมือที่พัฒนาขึ้นสามารถทำงานได้ตามวัตถุประสงค์ +สามารถยืนยันตัวตนได้อย่างถูกต้อง มีความรวดเร็วในการประมวลผล +และช่วยลดโอกาสการบุกรุกจากบุคคลภายนอกได้จริง + +#i จากผลการดำเนินงานสรุปได้ว่า เครื่องมือยืนยันตัวตนด้วย NFC +ที่พัฒนาขึ้นสามารถนำไปประยุกต์ใช้ในด้านการรักษาความปลอดภัยได้หลากหลาย เช่น +การควบคุมการเข้า–ออกห้องเรียน ห้องพัก ที่อยู่อาศัย หรือสถานที่ที่ต้องการจำกัดสิทธิ์การเข้าถึง +โครงงานนี้จึงเป็นแนวทางหนึ่งในการพัฒนาระบบรักษาความปลอดภัยที่มีต้นทุนไม่สูง ใช้งานง่าย +และสามารถต่อยอดพัฒนาเพิ่มเติมในอนาคต เช่นการเชื่อมต่อกับระบบแจ้งเตือนผ่านแอปพลิเคชัน +การบันทึกประวัติผู้เข้าใช้งาน หรือการเพิ่มรูปแบบการยืนยันตัวตนร่วมกับเทคโนโลยีอื่น +เพื่อเพิ่มประสิทธิภาพและความปลอดภัยให้ดียิ่งขึ้น #pagebreak() @@ -65,4 +88,32 @@ = Abstract -#i This project +#i This project aims to study and apply NFC technology for identity +verification, design and create tools for performing authorization, prevent +invasion from an unauthorized personnel, and enhance the convenience of mobile +phone authentication. The focus is on creating a system that is simple, fast, +reliable, and suitable for practical application. + +#i The project began by studying the operating principles of NFC sensors and +related microcontrollers. Then, the circuit and structure of the device were +designed accordingly. The developers developed a system capable of reading data +from registered mobile devices or NFC cards. When a device is scanned, the +system verifies the data against a database. If the data is correct, access is +granted immediately. If incorrect, the system denies access to prevent +unauthorized entry. + +#i Furthermore, the device's performance was tested in several aspects, such as +its ability to read NFC data from various devices, the sensor's operating range, +verification accuracy, and system stability. The test results showed that the +developed tool can function as intended, accurately verifying identities, +processing data quickly and effectively reducing the potential for intrusion by +unauthorized individuals. + +#i From the project's results, it can be concluded that the developed NFC +authentication tool can be applied in various security applications, such as +controlling access to classrooms, dorm rooms, residences, or places requiring +restricted access. This project therefore represents a pathway for developing a +low-cost, easy-to-use security system that can be further improved upon in the +future, such as connecting to an application-based notification system, +recording user history, or adding authentication methods with other technologies +to enhance efficiency and security. diff --git a/Chapter1.typ b/Chapter1.typ index 2f76a14..24bff43 100644 --- a/Chapter1.typ +++ b/Chapter1.typ @@ -1,7 +1,7 @@ #import "PageTemplate.typ": * #show: chapter-page #set enum( - indent: 3em, + indent: 1.7em, numbering: n => context { return counter(heading).display() + "." + str(n) }, @@ -14,19 +14,20 @@ == ที่มาและความสำคัญของปัญหา -#i +#h(1.7em) ความปลอดภัยนั้นเป็นเรื่องสำคัญสำหรับทุกคนแต่องค์กรแต่ละองค์กรและคนแต่ละคนมักมีความต้องการด้านความปลอดภัยไม่เหมือนกัน แต่ในบางครั้ง เมื่อมีบุคคลหรือองค์กรที่ต้องการเทคโนโลยีด้านความปลอดภัยเหล่านี้ เทคโนโลยีความปลอดภัยนั้นอาจมีราคาสูงเกินกว่าจะเอื้อมถึงได้ ส่งผลให้อาจมีการลดระดับความปลอดภัยลงมา เพิ่มความเสี่ยงของชีวิต ทรัพย์สิน เอกสาร และข้อมูลต่าง ๆ ขององค์กรหรือบุคคลนั้น ๆ -#i ในโลกปัจจุบัน อินเทอร์เน็ตนั้นก็เป็นสิ่งที่สำคัญมากเช่นกัน และสถานที่ส่วนใหญ่มักจะมีอินเทอร์เน็ต +#h(1.7em) ในโลกปัจจุบัน อินเทอร์เน็ตนั้นก็เป็นสิ่งที่สำคัญมากเช่นกัน และสถานที่ส่วนใหญ่มักจะมีอินเทอร์เน็ต จึงก่อให้เกิดการที่มีอุปกรณ์อินเทอร์เน็ตรอบตัวเพิ่มขึ้นทุกวัน และได้มีสิ่งที่เรียกว่า Internet of Things (IoT) เกิดขึ้น ซึ่งคืออุปกรณ์ที่ถูกปรับปรุงให้ใช้งานได้ดีขึ้นด้วยเทคโนโลยีไร้สายต่าง ๆ เช่น#jb Wi-Fi, Bluetooth, Zigbee, และ Thread -#i โครงงานนี้จึงมีเป้าหมายที่จะแก้ไขปัญหาที่กล่าวไปข้างต้น พร้อมศึกษาและเรียนรู้เกี่ยวกับเทคโนโลยีไร้สาย -Wi-Fi และ NFC เพื่อสร้างอุปกรณ์ยืนยันตัวตนที่ต้นทุนไม่สูงมากและให้ราคาเข้าถึงได้ง่ายขึ้น +#h(1.7em) โครงงานนี้จึงมีเป้าหมายที่จะแก้ไขปัญหาที่กล่าวไปข้างต้น +พร้อมศึกษาและเรียนรู้เกี่ยวกับเทคโนโลยีไร้สาย Wi-Fi และ NFC +เพื่อสร้างอุปกรณ์ยืนยันตัวตนที่ต้นทุนไม่สูงมากและให้ราคาเข้าถึงได้ง่ายขึ้น == วัตถุประสงค์ของโครงงาน @@ -38,7 +39,7 @@ Wi-Fi และ NFC เพื่อสร้างอุปกรณ์ยืน == ประโยชน์ที่คาดว่าจะได้รับ + สามารถประยุกต์ความรู้ด้านอิเล็กทรอนิกส์และเทคโนโลยีมาใช้ในชีวิตประจำวันได้จริง -+ สามารถตรวจจับผู้บุกรุกได้ ช่่วยเพื่อเพิ่มความไว้วางใจของบุคลากรในองค์กร ++ สามารถตรวจจับผู้บุกรุกได้ ช่วยเพื่อเพิ่มความไว้วางใจของบุคลากรในองค์กร == ขอบเขตของโครงงาน @@ -48,8 +49,8 @@ Wi-Fi และ NFC เพื่อสร้างอุปกรณ์ยืน == นิยามศัพท์เฉพาะ -#i เครื่องยืนยันตัวตนด้วย NFC คืออุปกรณ์ความปลอดภัยที่มีหน้าที่ในการยืนยันตัวตนบุคคลที่เข้าออกพื้นที่ -โดยใช้เทคโนโลยี NFC +#h(1.7em) เครื่องยืนยันตัวตนด้วย NFC +คืออุปกรณ์ความปลอดภัยที่มีหน้าที่ในการยืนยันตัวตนบุคคลที่เข้าออกพื้นที่ โดยใช้เทคโนโลยี NFC เป็นระบบยืนยันตัวตนบุคคลและใช้เซนเซอร์ตรวจจับความเคลื่อนไหวในการตรวจสอบหากมีบุคคลเข้าไปโดยไม่ได้รับอนุญาต #show: page-theme diff --git a/Chapter2/Buzzer.typ b/Chapter2/Buzzer.typ index fae309d..9557c7d 100644 --- a/Chapter2/Buzzer.typ +++ b/Chapter2/Buzzer.typ @@ -2,7 +2,7 @@ = ลำโพงสัญญาณ (Buzzer) -#i Buzzer เป็นอุปกรณ์ส่งสัญญาณเสียงซึ่งอาจเป็น อุปกรณ์ เชิงกลเครื่องกลไฟฟ้าหรือเพียโซอิเล็กทริก +#h(1.70em) Buzzer เป็นอุปกรณ์ส่งสัญญาณเสียงซึ่งอาจเป็น อุปกรณ์ เชิงกลเครื่องกลไฟฟ้าหรือเพียโซอิเล็กทริก (เรียกสั้น ๆ ว่าเพียโซ) การใช้งานทั่วไปของบัซเซอร์และบี๊บเปอร์ ได้แก่อุปกรณ์แจ้งเตือนตัวตั้งเวลาวงจรและการยืนยันการป้อนข้อมูลของผู้ใช้ เช่น การคลิกเมาส์หรือการกดแป้นพิมพ์ diff --git a/Chapter2/CLanguage.typ b/Chapter2/CLanguage.typ index f201c32..07c0c31 100644 --- a/Chapter2/CLanguage.typ +++ b/Chapter2/CLanguage.typ @@ -3,12 +3,12 @@ = ภาษาซี (C Programming Language) -#i ภาษาซีเป็นภาษาโปรแกรมสำหรับวัตถุประสงค์ทั่วไปสร้างขึ้นในช่วงทศวรรษ 1970 +#h(2.25em) ภาษาซีเป็นภาษาโปรแกรมสำหรับวัตถุประสงค์ทั่วไปสร้างขึ้นในช่วงทศวรรษ 1970 โดยเดนนิสริตชีและยังคงได้รับความนิยมและใช้งานอย่างกว้างขวางด้วยการออกแบบภาษาซีทำให้โปรแกรมเมอร์สามารถเข้าถึงคุณลักษณะต่างๆของสถาปัตยกรรมซีพียูทั่วไปได้โดยตรง ซึ่งปรับแต่งให้เหมาะกับชุดคำสั่ง เป้าหมาย ภาษาซี ถูกนำมาใช้และยังคงนำมาใช้ในการพัฒนาระบบปฏิบัติการไดรเวอร์อุปกรณ์และสแต็กโปรโตคอลแต่การใช้งานในซอฟต์แวร์แอปพลิเคชั่นกำลังลดลงภาษาซีถูกนำมาใช้ในคอมพิวเตอร์ตั้งแต่ซูเปอร์คอมพิวเตอร์ขนาดใหญ่ที่สุดไปจนถึงไมโครคอนโทรลเลอร์ขนาดเล็กที่สุดและระบบฝังตัว -#i +#h(2.25em) ภาษาซีเป็นภาษาเชิงกระบวนการที่จำเป็นรองรับการเขียนโปรแกรมแบบมีโครงสร้างขอบเขตตัวแปรเชิงศัพท์และการเรียกซ้ำด้วยระบบชนิดข้อมูลแบบคงที่ภาษาซีถูกออกแบบมาเพื่อการคอมไพล์เพื่อให้สามารถเข้าถึงหน่วยความจำ และโครงสร้างภาษา ในระดับต่ำซึ่งแมปกับคำสั่งเครื่องได้อย่างมีประสิทธิภาพ โดยทั้งหมดนี้รองรับรันไทม์ขั้นต่ำ แม้จะมีความสามารถในระดับต่ำ แต่ภาษาซีก็ถูกออกแบบมาเพื่อสนับสนุนการเขียนโปรแกรมข้ามแพลตฟอร์ม @@ -16,26 +16,27 @@ ที่สอดคล้องกับมาตรฐานที่เขียนขึ้นโดยคำนึงถึงความสามารถในการพกพาสามารถคอมไพล์สำหรับแพลตฟอร์มคอมพิวเตอร์และระบบปฏิบัติการที่หลากหลาย โดยมีการเปลี่ยนแปลงซอร์สโคดเพียงเล็กน้อย -#i แม้ว่าทั้งภาษาซีและไลบรารีมาตรฐานของภาษา ซีจะไม่ได้มีคุณสมบัติยอดนิยมบางอย่างที่พบในภาษาอื่น -แต่ก็มีความยืดหยุ่นเพียงพอที่จะรองรับคุณสมบัติเหล่านั้นได้ +#h(2.25em) แม้ว่าทั้งภาษาซีและไลบรารีมาตรฐานของภาษา +ซีจะไม่ได้มีคุณสมบัติยอดนิยมบางอย่างที่พบในภาษาอื่น แต่ก็มีความยืดหยุ่นเพียงพอที่จะรองรับคุณสมบัติเหล่านั้นได้ ตัวอย่างเช่นการวางแนววัตถุและการเก็บขยะนั้นจัดทำโดยไลบรารีภายนอก GLib Object System และ Boehm garbage collector ตามลำดับ -#i ตั้งแต่ปี 2000 เป็นต้นมาภาษาซี ได้รับการจัดอันดับอย่างต่อเนื่องให้อยู่ในอันดับสี่ภาษาสูงสุดในดัชนี TIOBE +#h(2.25em) ตั้งแต่ปี 2000 เป็นต้นมาภาษาซี +ได้รับการจัดอันดับอย่างต่อเนื่องให้อยู่ในอันดับสี่ภาษาสูงสุดในดัชนี TIOBE ซึ่งเป็นการวัดความนิยมของภาษาการเขียนโปรแกรม == ประวัติ === การพัฒนาช่วงแรก -#h(9.75em) ที่มาของภาษา C มีความเชื่อมโยงอย่างใกล้ชิดกับการพัฒนาระบบปฏิบัติการ#jb Unix +#h(8.85em) ที่มาของภาษา C มีความเชื่อมโยงอย่างใกล้ชิดกับการพัฒนาระบบปฏิบัติการ#jb Unix ซึ่งเดิมทีเขียนด้วยภาษาแอสเซมบลีบน PDP-7 โดย Dennis Ritchie และ Ken Thompson โดยนำแนวคิดหลายอย่างจากเพื่อนร่วมงานมาใช้ ในที่สุดพวกเขาก็ตัดสินใจย้ายระบบปฏิบัติการไปยัง PDP-11 เวอร์ชัน Unix ดั้งเดิมบน PDP-11 ก็ได้รับการพัฒนาด้วยภาษาแอสเซมบลีเช่นกัน === ภาษา B -#h(13.5em) ทอมป์สันต้องการภาษาโปรแกรมสำหรับการพัฒนายูทิลิตี้สำหรับแพลตฟอร์มใหม่ +#h(8.85em) ทอมป์สันต้องการภาษาโปรแกรมสำหรับการพัฒนายูทิลิตี้สำหรับแพลตฟอร์มใหม่ เขาพยายามเขียนคอมไพเลอร์ Fortran ก่อน แต่ในไม่ช้าเขาก็ล้มเลิกความคิดนั้นและสร้างเวอร์ชันย่อของภาษาโปรแกรมระบบ ที่พัฒนาขึ้นใหม่ชื่อ BCPL แทน คำอธิบายอย่างเป็นทางการของ BCPL ยังไม่พร้อมใช้งานในขณะนั้นและทอมป์สันได้แก้ไขไวยากรณ์ให้ @@ -47,7 +48,7 @@ Boehm garbage collector ตามลำดับ === ภาษา B ใหม่และ C รุ่นแรก -#h(13.5em) ในปี พ.ศ. 2514 ริชชีเริ่มปรับปรุง B เพื่อใช้คุณสมบัติของ PDP-11 ที่ทรงพลังยิ่งขึ้น +#h(8.85em) ในปี พ.ศ. 2514 ริชชีเริ่มปรับปรุง B เพื่อใช้คุณสมบัติของ PDP-11 ที่ทรงพลังยิ่งขึ้น การเพิ่มเติมที่สำคัญคือประเภทข้อมูลอักขระ เขาเรียกสิ่งนี้ว่า New B (NB) ทอมป์สันเริ่มใช้ NB เพื่อเขียน เคอร์เนล Unix และข้อกำหนดของเขากำหนดทิศทางการพัฒนาภาษา @@ -57,87 +58,91 @@ char และได้มีการเพิ่มพอยเตอร์ อาร์เรย์ภายในนิพจน์ได้รับการปฏิบัติเสมือนเป็นพอยเตอร์ มีการเขียนคอมไพเลอร์ใหม่ และเปลี่ยนชื่อภาษาเป็น C -คอมไพเลอร์ C และยูทิลิตี้บางส่วนที่สร้างขึ้นด้วยคอมไพเลอร์นี้ถูกรวมอยู่ใน Unix เวอร์ชัน 2 +#h(8.85em) คอมไพเลอร์ C และยูทิลิตี้บางส่วนที่สร้างขึ้นด้วยคอมไพเลอร์นี้ถูกรวมอยู่ใน Unix เวอร์ชัน 2 ซึ่งเรียกอีกอย่างว่า Research Unix === โครงสร้างและการเขียน Unix kernel ใหม่ -#h(13.5em) ใน Unix เวอร์ชัน 4 ซึ่งวางจำหน่ายในเดือนพฤศจิกายน พ.ศ. 2516 เคอร์เนล ของ Unix +#h(8.85em) ใน Unix เวอร์ชัน 4 ซึ่งวางจำหน่ายในเดือนพฤศจิกายน พ.ศ. 2516 เคอร์เนลของ Unix ได้รับการเขียนใหม่อย่างกว้างขวางด้วยภาษา C ในเวลานั้น ภาษา C ได้รับคุณสมบัติที่ทรงพลังบางอย่างเช่นประเภท struct -ตัวประมวลผลล่วงหน้าได้รับการแนะนำประมาณปี 1973 ตามคำแนะนำของ Alan Snyder +#h(8.85em) ตัวประมวลผลล่วงหน้าได้รับการแนะนำประมาณปี 1973 ตามคำแนะนำของ Alan Snyder และยังเป็นการยอมรับถึงประโยชน์ของกลไกการรวมไฟล์ที่มีอยู่ใน BCPL และPL/I เวอร์ชันดั้งเดิมให้เฉพาะไฟล์ที่รวมไว้และการแทนที่สตริงแบบง่ายเท่านั้น `#include` รวม `#define` ถึงมาโครที่ไม่มีพารามิเตอร์ หลังจากนั้นไม่นาน ก็มีการขยายเพิ่มเติม โดยส่วนใหญ่โดย Mike Lesk และต่อมาโดย John Reiser เพื่อรวมมาโครที่มีอาร์กิวเมนต์และการคอมไพล์แบบมีเงื่อนไข -Unix เป็นหนึ่งในเคอร์เนลระบบปฏิบัติการแรกๆ +#h(8.85em) Unix เป็นหนึ่งในเคอร์เนลระบบปฏิบัติการแรกๆ ที่เขียนด้วยภาษาอื่นที่ไม่ใช่ภาษาแอสเซมบลีตัวอย่างก่อนหน้านี้ได้แก่ ระบบ Multics (ซึ่งเขียนด้วยภาษา -PL/I ) และ Master Control Program (MCP) สำหรับ Burroughs B5000 (ซึ่งเขียนด้วยภาษา -ALGOL ) ในปี 1961 ในช่วงปี 1977 Ritchie และ Stephen C. Johnson +PL/I) และ Master Control Program (MCP) สำหรับ Burroughs B5000 (ซึ่งเขียนด้วยภาษา +ALGOL) ในปี 1961 ในช่วงปี 1977 Ritchie และ Stephen C. Johnson ได้ทำการเปลี่ยนแปลงเพิ่มเติมให้กับภาษาเพื่ออำนวยความสะดวกในการพกพาระบบปฏิบัติการUnix คอมไพเลอร์ Portable C ของ Johnson เป็นพื้นฐานสำหรับการใช้งาน C บนแพลตฟอร์มใหม่ๆ หลายแพลตฟอร์ม === K&R C -#h(9.75em) ในปี พ.ศ. 2521 Brian KernighanและDennis Ritchie ได้ตีพิมพ์หนังสือ The C +#h(8.85em) ในปี พ.ศ. 2521 Brian KernighanและDennis Ritchie ได้ตีพิมพ์หนังสือ The C Programming Language ฉบับพิมพ์ครั้งแรกหนังสือเล่มนี้รู้จักกันในชื่อย่อ K&R ตามชื่อย่อของผู้เขียนและทำหน้าที่เป็นข้อกำหนดที่ไม่เป็นทางการ ของภาษาเป็นเวลาหลายปีเวอร์ชันของภาษา C ที่อธิบายไว้ในหนังสือเล่มนี้มักเรียกกันว่า "K&R C" เนื่องจาก หนังสือเล่มนี้ได้รับการเผยแพร่ในปี พ.ศ. 2521 จึงเรียกอีกอย่างว่า C78 หนังสือฉบับพิมพ์ครั้งที่สองครอบคลุมมาตรฐาน ANSI C ในภายหลัง ซึ่งจะกล่าวถึงต่อไป -K&R ได้เพิ่มฟีเจอร์ด้านภาษาหลายอย่าง: +#h(8.85em) K&R ได้เพิ่มฟีเจอร์ด้านภาษาหลายอย่าง -+ ไลบรารีอินพุต/เอาต์พุตมาตรฐาน -+ long int ประเภทข้อมูล -+ unsigned int ประเภทข้อมูล -+ ตัวดำเนินการกำหนดค่าแบบผสมในรูปแบบ =_op_ (เช่น `=-`) ถูกเปลี่ยนเป็นรูปแบบ _op_= (นั่นคือ - `-=`)#jb เพื่อขจัดความกำกวมทางความหมายที่เกิดจากโครงสร้างเช่น `i=-10` ซึ่งถูกตีความว่า - `i =- 10` (ลด `i` ลง 10) แทนที่จะเป็นความหมายที่ตั้งใจไว้ (ให้ `i` เป็น -10) +#[ + #set enum(indent: 8.85em) + 1. ไลบรารีอินพุต/เอาต์พุตมาตรฐาน + 2. long int ประเภทข้อมูล + 3. unsigned int ประเภทข้อมูล + 4. ตัวดำเนินการกำหนดค่าแบบผสมในรูปแบบ =_op_ (เช่น `=-`) ถูกเปลี่ยนเป็นรูปแบบ _op_= (นั่นคือ + `-=`) เพื่อขจัดความกำกวมทางความหมายที่เกิดจากโครงสร้างเช่น `i=-10` ซึ่งถูกตีความว่า + `i =- 10` (ลด `i` ลง 10) แทนที่จะเป็นความหมายที่ตั้งใจไว้ (ให้ `i` เป็น -10) +] -#h(9.75em) แม้หลังจากมีการเผยแพร่มาตรฐาน ANSI ปี 1989 แล้วก็ตาม เป็นเวลาหลายปีที่ K&R C +#h(8.85em) แม้หลังจากมีการเผยแพร่มาตรฐาน ANSI ปี 1989 แล้วก็ตาม เป็นเวลาหลายปีที่ K&R C ยังคงถูกพิจารณาว่าเป็น "ตัวหารร่วมที่ต่ำที่สุด" ที่โปรแกรมเมอร์ภาษา C ยึดถือเมื่อต้องการความสามารถในการพกพาได้สูงสุด เนื่องจากคอมไพเลอร์รุ่นเก่าจำนวนมากยังคงถูกใช้งานอยู่และเนื่องจากโค้ด K&R C ที่เขียนอย่างระมัดระวังก็สามารถเป็นไปตามมาตรฐาน C ได้เช่นกัน -แม้ว่า C เวอร์ชันต่อมาจะกำหนดให้ฟังก์ชันต้องมีการประกาศประเภทอย่างชัดเจนแต่ C เวอร์ชัน K&R -กำหนดให้ฟังก์ชันที่ส่งคืนค่าประเภทอื่นที่ไม่ใช่ประเภท ที่กำหนดไว้เท่านั้น int ที่จะต้องประกาศก่อนใช้งาน -ฟังก์ชันที่ใช้โดยไม่มีการประกาศล่วงหน้าจะถือว่าส่งคืนค่าประเภทที่กำหนด int ไว้ +#h(8.85em) แม้ว่า C เวอร์ชันต่อมาจะกำหนดให้ฟังก์ชันต้องมีการประกาศประเภทอย่างชัดเจนแต่ C +เวอร์ชัน K&R กำหนดให้ฟังก์ชันที่ส่งคืนค่าประเภทอื่นที่ไม่ใช่ประเภท ที่กำหนดไว้เท่านั้น int +ที่จะต้องประกาศก่อนใช้งาน ฟังก์ชันที่ใช้โดยไม่มีการประกาศล่วงหน้าจะถือว่าส่งคืนค่าประเภทที่กำหนด int +ไว้ === ANSI C และ ISO C -#h(9.75em) ในช่วงปลายทศวรรษ 1970 และ 1980 ภาษา C เวอร์ชันต่างๆ ถูกนำไปใช้งานใน +#h(8.85em) ในช่วงปลายทศวรรษ 1970 และ 1980 ภาษา C เวอร์ชันต่างๆ ถูกนำไปใช้งานใน คอมพิวเตอร์เมนเฟรมมินิคอมพิวเตอร์และไมโครคอมพิวเตอร์หลากหลายรุ่นรวมถึง IBM PC ด้วย เนื่องจากความนิยมของคอมพิวเตอร์ประเภทนี้เพิ่มขึ้นอย่างมาก -#h(9.75em) ในปี 1983 สถาบันมาตรฐานแห่งชาติอเมริกัน (ANSI) ได้จัดตั้งคณะกรรมการ#jb X3J11 +#h(8.85em) ในปี 1983 สถาบันมาตรฐานแห่งชาติอเมริกัน (ANSI) ได้จัดตั้งคณะกรรมการ#jb X3J11 เพื่อกำหนดมาตรฐานของภาษา C X3J11 ใช้มาตรฐาน C ที่อิงตามการใช้งานบนระบบ Unix เป็นพื้นฐาน อย่างไรก็ตามส่วนที่ไม่สามารถพกพาได้ของไลบรารี C บน Unix ได้ถูกส่งต่อไปยังกลุ่มทำงาน IEEE 1003 เพื่อใช้เป็นพื้นฐานสำหรับ มาตรฐาน POSIX ในปี 1988 ในปี 1989 มาตรฐาน C ได้รับการรับรองเป็น ANSI X3.159-1989 "ภาษาโปรแกรม C" เวอร์ชันนี้ของภาษามักถูกเรียกว่า ANSI C, Standard C หรือบางครั้งเรียกว่า C89 -#h(9.75em) ในปี 1990 มาตรฐาน ANSI C (พร้อมการเปลี่ยนแปลงรูปแบบ) +#h(8.85em) ในปี 1990 มาตรฐาน ANSI C (พร้อมการเปลี่ยนแปลงรูปแบบ) ได้รับการรับรองโดยองค์การมาตรฐานสากล (ISO) ในชื่อ ISO/IEC 9899:1990 ซึ่งบางครั้งเรียกว่า C90 ดังนั้น คำว่า "C89" และ "C90" จึงหมายถึงภาษาโปรแกรมเดียวกัน -#h(9.75em) เช่นเดียวกับองค์กรมาตรฐานแห่งชาติอื่นๆ ANSI ไม่ได้พัฒนามาตรฐาน C ด้วยตนเองอีกต่อไป +#h(8.85em) เช่นเดียวกับองค์กรมาตรฐานแห่งชาติอื่นๆ ANSI ไม่ได้พัฒนามาตรฐาน C ด้วยตนเองอีกต่อไป แต่จะอ้างอิงถึงมาตรฐาน C สากล ซึ่งดูแลโดยคณะทำงาน ISO/IEC JTC1/SC22 /WG14 การนำมาตรฐานสากลฉบับปรับปรุงมาใช้ในระดับประเทศมักเกิดขึ้นภายในหนึ่งปีหลังจากที่ ISO เผยแพร่มาตรฐานดังกล่าว -#h(9.75em) หนึ่งในเป้าหมายของกระบวนการกำหนดมาตรฐานภาษา C คือการสร้างซูเปอร์เซ็ตของ K&R C +#h(8.85em) หนึ่งในเป้าหมายของกระบวนการกำหนดมาตรฐานภาษา C คือการสร้างซูเปอร์เซ็ตของ K&R C โดยรวมเอาคุณสมบัติที่ไม่เป็นทางการหลายอย่างที่ถูกนำมาใช้ในภายหลัง คณะกรรมการมาตรฐานยังได้เพิ่มคุณสมบัติเพิ่มเติมอีกหลายอย่างเช่นต้นแบบฟังก์ชัน (ยืมมาจาก C++), voidพอยเตอร์, การรองรับชุดอักขระและภาษาท้องถิ่นระหว่างประเทศ และการปรับปรุงพรีโปรเซสเซอร์ แม้ว่าไวยากรณ์สำหรับการประกาศพารามิเตอร์จะได้รับการปรับปรุงให้รวมรูปแบบที่ใช้ใน C++ แต่ก็ยังคงอนุญาตให้ใช้อินเทอร์เฟซ K&R เพื่อความเข้ากันได้กับซอร์สโค้ดที่มีอยู่ -#h(9.75em) C89 ได้รับการสนับสนุนจากคอมไพเลอร์ C ในปัจจุบัน และโค้ด C สมัยใหม่ส่วนใหญ่ก็ใช้ C89 +#h(8.85em) C89 ได้รับการสนับสนุนจากคอมไพเลอร์ C ในปัจจุบัน และโค้ด C สมัยใหม่ส่วนใหญ่ก็ใช้ C89 เป็นพื้นฐานโปรแกรมใดๆ ที่เขียนด้วยภาษา C มาตรฐานเท่านั้น และไม่มีข้อสมมติฐานใดๆ ที่ขึ้นอยู่กับฮาร์ดแวร์ จะทำงานได้อย่างถูกต้องบนแพลตฟอร์มใดๆ ที่มีการใช้งาน C ที่สอดคล้องกับมาตรฐาน ภายในขีดจำกัดของทรัพยากร หากไม่ระมัดระวัง @@ -145,48 +150,48 @@ voidพอยเตอร์, การรองรับชุดอักข ตัวอย่างเช่น เนื่องจากการใช้ไลบรารีที่ไม่เป็นมาตรฐาน เช่น ไลบรารี GUI หรือการพึ่งพาคุณลักษณะเฉพาะของคอมไพเลอร์หรือแพลตฟอร์ม เช่น ขนาดที่แน่นอนของชนิดข้อมูลและลำดับไบต์ -#h(9.75em) +#h(8.85em) ในกรณีที่โค้ดต้องสามารถคอมไพล์ได้ทั้งโดยคอมไพเลอร์ที่สอดคล้องกับมาตรฐานหรือคอมไพเลอร์ที่ใช้ C แบบ K&R นั้น `__STDC__` สามารถใช้มาโครเพื่อแบ่งโค้ดออกเป็นส่วนมาตรฐานและส่วน K&R เพื่อป้องกันการใช้คุณสมบัติที่มีเฉพาะใน C มาตรฐานบนคอมไพเลอร์ที่ใช้ C แบบ K&R -#h(9.75em) หลังจากกระบวนการกำหนดมาตรฐาน ANSI/ISO ข้อกำหนดภาษา C +#h(8.85em) หลังจากกระบวนการกำหนดมาตรฐาน ANSI/ISO ข้อกำหนดภาษา C ยังคงค่อนข้างคงที่เป็นเวลาหลายปี ในปี 1995 มีการเผยแพร่การแก้ไขมาตรฐานฉบับที่ 1 ของมาตรฐาน C ปี 1990 (ISO/IEC 9899/AMD1:1995 ซึ่งเรียกกันอย่างไม่เป็นทางการว่า C95) เพื่อแก้ไขรายละเอียดบางประการและเพิ่มการสนับสนุนชุดอักขระสากลที่ครอบคลุมมากขึ้น === C99 -#h(9.75em) มาตรฐาน C ได้รับการแก้ไขเพิ่มเติมในช่วงปลายทศวรรษ 1990 ส่งผลให้มีการตีพิมพ์ +#h(8.85em) มาตรฐาน C ได้รับการแก้ไขเพิ่มเติมในช่วงปลายทศวรรษ 1990 ส่งผลให้มีการตีพิมพ์ ISO/IEC 9899:1999 ในปี 1999 ซึ่งโดยทั่วไปเรียกว่า "C99" ต่อมาได้มีการแก้ไขเพิ่มเติมอีกสามครั้งโดย Technical Corrigenda -#h(9.75em) C99 ได้นำเสนอคุณสมบัติใหม่หลายประการรวมถึงฟังก์ชันอินไลน์ชนิดข้อมูลใหม่หลายชนิด(รวมถึง +#h(8.85em) C99 ได้นำเสนอคุณสมบัติใหม่หลายประการรวมถึงฟังก์ชันอินไลน์ชนิดข้อมูลใหม่หลายชนิด(รวมถึง long long intชนิด ข้อมูล complex ที่ใช้แทนจำนวนเชิงซ้อน) อาร์เรย์ที่มีความยาวแปรผันได้และสมาชิกอาร์เรย์ที่ยืดหยุ่นการสนับสนุนที่ดีขึ้นสำหรับเลขทศลอย IEEE 754 การสนับสนุนมาโครแบบแปรผัน (มาโครที่มีจำนวนอาร์กิวเมนต์ แปรผันได้) และการสนับสนุนความคิดเห็นแบบบรรทัดเดียวที่ขึ้นต้นด้วย `@` `//` เช่นเดียวกับใน BCPL หรือ C++ คุณสมบัติเหล่านี้หลายอย่างได้ถูกนำไปใช้เป็นส่วนขยายในคอมไพเลอร์ C หลายตัวแล้ว -#h(9.75em) โดยส่วนใหญ่แล้ว C99 สามารถใช้งานร่วมกับ C90 ได้ แต่มีความเข้มงวดมากกว่าในบางด้าน +#h(8.85em) โดยส่วนใหญ่แล้ว C99 สามารถใช้งานร่วมกับ C90 ได้ แต่มีความเข้มงวดมากกว่าในบางด้าน โดยเฉพาะอย่างยิ่ง การประกาศที่ไม่มีตัวระบุประเภทจะไม่ถือว่ามีintการกำหนดโดยปริยายอีกต่อไป มีการกำหนดมาโครมาตรฐาน `__STDC_VERSION__` พร้อมค่า `199901L` เพื่อระบุว่ามีการสนับสนุน C99 คอม ไพเลอร์ C อื่นๆ เช่น GCC, Solaris Studio และคอมไพเลอร์ C อื่นๆ ในปัจจุบันรองรับคุณสมบัติใหม่หลายอย่างหรือทั้งหมดของ C99 อย่างไรก็ตาม คอมไพเลอร์ C ใน Microsoft Visual C++ ใช้มาตรฐาน C89 และส่วนต่างๆ ของ C99 ที่จำเป็นสำหรับการใช้งานร่วมกับ C++11 -#h(9.75em) นอกจากนี้ มาตรฐาน C99 ยังกำหนดให้รองรับตัวระบุที่ใช้ Unicode +#h(8.85em) นอกจากนี้ มาตรฐาน C99 ยังกำหนดให้รองรับตัวระบุที่ใช้ Unicode ในรูปแบบของอักขระพิเศษ (เช่น `\u0040` หรือ `\U0001f431`) และแนะนำให้รองรับชื่อ Unicode ดิบด้วย === C11 -#h(9.75em) งานปรับปรุงมาตรฐาน C ฉบับใหม่เริ่มขึ้นในปี 2550 โดยเรียกกันอย่างไม่เป็นทางการว่า +#h(8.85em) งานปรับปรุงมาตรฐาน C ฉบับใหม่เริ่มขึ้นในปี 2550 โดยเรียกกันอย่างไม่เป็นทางการว่า "C1X" จนกระทั่งมีการประกาศใช้มาตรฐาน ISO/IEC 9899:2011 อย่างเป็นทางการในวันที่ 8 ธันวาคม 2554 คณะกรรมการมาตรฐาน C ได้กำหนดแนวทางเพื่อจำกัดการนำคุณสมบัติใหม่ๆ ที่ยังไม่ได้รับการทดสอบโดยระบบที่มีอยู่มาใช้ -#h(9.75em) มาตรฐาน C11 เพิ่มคุณสมบัติใหม่มากมายให้กับภาษา C และไลบรารี +#h(8.85em) มาตรฐาน C11 เพิ่มคุณสมบัติใหม่มากมายให้กับภาษา C และไลบรารี รวมถึงมาโครแบบเจเนริกชนิดโครงสร้างนิรนามการสนับสนุน Unicode ที่ดีขึ้น การดำเนินการอะตอมิกการทำงานแบบมัลติเธรดและฟังก์ชันตรวจสอบขอบเขต นอกจากนี้ยังทำให้บางส่วนของไลบรารี C99 ที่มีอยู่เป็นตัวเลือก และปรับปรุงความเข้ากันได้กับ C++ @@ -194,7 +199,7 @@ Visual C++ ใช้มาตรฐาน C89 และส่วนต่าง === C17 -#h(9.75em) C17 เป็นชื่อเรียกอย่างไม่เป็นทางการของ ISO/IEC 9899:2018 +#h(8.85em) C17 เป็นชื่อเรียกอย่างไม่เป็นทางการของ ISO/IEC 9899:2018 ซึ่งเป็นมาตรฐานสำหรับภาษาโปรแกรม C ที่เผยแพร่ในเดือนมิถุนายน 2018 มาตรฐานนี้ไม่ได้เพิ่มคุณสมบัติใหม่ใดๆ ให้กับภาษา แต่เป็นการแก้ไขทางเทคนิคและการชี้แจงข้อบกพร่องใน C11 เท่านั้น มาโครมาตรฐาน `__STDC_VERSION__` ถูกกำหนดขึ้นเพื่อ `201710L` ระบุว่ามีการรองรับ @@ -202,7 +207,7 @@ C17 แล้ว === C23 -#h(9.75em) C23 เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C หลักในปัจจุบัน +#h(9.4em) C23 เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C หลักในปัจจุบัน ซึ่งในระหว่างการพัฒนาส่วนใหญ่เรียกว่า "C2X" โดยสร้างขึ้นจากเวอร์ชันก่อนหน้า และแนะนำคุณสมบัติใหม่ เช่น คำหลักใหม่ ความหมายเพิ่มเติมสำหรับเพื่อ `auto` ให้มีการอนุมานประเภทเมื่อประกาศตัวแปรประเภทใหม่รวมถึง `nullptr_t` และ `_BitInt` (N) @@ -213,26 +218,26 @@ C23 ได้รับการเผยแพร่ในเดือนตุ === C2Y -#h(9.75em) C2Y เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C ครั้งใหญ่ถัดไป หลังจาก +#h(9.4em) C2Y เป็นชื่อเรียกอย่างไม่เป็นทางการของการแก้ไขมาตรฐานภาษา C ครั้งใหญ่ถัดไป หลังจาก C23 (C2X) ซึ่งคาดว่าจะออกในช่วงปลายทศวรรษ 2020 ดังนั้นจึงมีเลข '2' ใน "C2Y" ร่างฉบับแรกของ C2Y ได้รับการเผยแพร่ในเดือนกุมภาพันธ์ 2024 ในชื่อ N3220 โดยกลุ่มทำงาน ISO/IEC JTC1/SC22 /WG14 === Embedded C -#h(9.75em) ในอดีตการเขียนโปรแกรม C +#h(9.4em) ในอดีตการเขียนโปรแกรม C สำหรับระบบฝังตัวจำเป็นต้องใช้ส่วนขยายที่ไม่เป็นมาตรฐานของภาษา C เพื่อรองรับคุณสมบัติพิเศษ เช่นการคำนวณเลขทศนิยมคงที่ ธนาคารหน่วยความจำหลายชุดที่แตกต่างกันและการดำเนินการอินพุต/เอาต์พุตพื้นฐาน -#h(9.75em) ในปี 2551 คณะกรรมการมาตรฐาน C ได้เผยแพร่รายงานทางเทคนิคที่ขยายภาษา C +#h(9.4em) ในปี 2551 คณะกรรมการมาตรฐาน C ได้เผยแพร่รายงานทางเทคนิคที่ขยายภาษา C เพื่อแก้ไขปัญหาเหล่านี้โดยการจัดหามาตรฐานทั่วไปสำหรับการใช้งานทั้งหมดให้ปฏิบัติตาม ซึ่งรวมถึงคุณสมบัติหลายอย่างที่ไม่มีในภาษา C ปกติ เช่น การคำนวณเลขทศนิยมคงที่ พื้นที่แอดเดรสแบบมีชื่อและการกำหนดแอดเดรสฮาร์ดแวร์ I/O พื้นฐาน == ตัวแปร (Variables) -#i ตัวแปรในภาษา C เบื้องต้นแล้วประกอบไปด้วยประเภทของข้อมูลและชื่อตัวแปร +#h(5.05em) ตัวแปรในภาษา C เบื้องต้นแล้วประกอบไปด้วยประเภทของข้อมูลและชื่อตัวแปร โดยที่ชื่อตัวแปรนั้นสามารถเป็นรายการที่ถูกแบ่งด้วยเครื่องหมายจุลภาคได้ด้วยเช่นกัน ตัวอย่างคือ #afigure( @@ -246,51 +251,63 @@ C2Y ได้รับการเผยแพร่ในเดือนกุ == ประเภทข้อมูล (Data Types) -#h(6em) ข้อมูลที่เกี่ยวข้องกับตัวเลขมักมีประเภท unsigned และ signed โดยความแตกต่างหากอธิบายสั้น -ๆ คือ +#h(5.05em) ข้อมูลที่เกี่ยวข้องกับตัวเลขมักมีประเภท unsigned และ signed +โดยความแตกต่างหากอธิบายสั้น ๆ คือ #[ - #set enum(indent: 6em) - + Signed (มีเครื่องหมาย): ตัวเลขที่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ -128 ถึง 127 - + Unsigned (ไม่มีเครื่องหมาย): ตัวเลขที่ไม่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ 0 ถึง 255 + #set enum(indent: 5.05em) + 1. Signed (มีเครื่องหมาย): ตัวเลขที่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ -128 ถึง#jb 127 + 2. Unsigned (ไม่มีเครื่องหมาย): ตัวเลขที่ไม่สามารถติดลบได้ ระยะข้อมูลตัวอย่างคือ 0 ถึง 255 ] -#h(6em) จะสังเกตได้ว่า ข้อมูลประเภท unsigned นั้นสามารถเก็บตัวเลขบวกได้จำนวนมากกว่า คือสูงสุดที่ -255 แต่หากนำค่าสัมบูรณ์ (absolute value) ของระยะข้อมูลแบบ signed มาบวกกัน เช่น\ +#h(5.05em) จะสังเกตได้ว่า ข้อมูลประเภท unsigned นั้นสามารถเก็บตัวเลขบวกได้จำนวนมากกว่า +คือสูงสุดที่ 255 แต่หากนำค่าสัมบูรณ์ (absolute value) ของระยะข้อมูลแบบ signed มาบวกกัน เช่น\ #math.equation($|-128| + |127|$, alt: "ค่าสัมบูรณ์ของ -128 บวกค่าสัมบูรณ์ของ 127") จะพบว่าได้ค่า 255 หมายความว่า จริง ๆ แล้วข้อมูลประเภท signed สามารถเก็บข้อมูลได้ 255 ตัวเลขเช่นกัน เพียงแต่ว่าครึ่งหนึ่งของตัวเลขที่สามารถเก็บได้เป็นตัวเลขติดลบ -#h(6em) ดังนั้นโปรดจำไว้ว่า เลขคณิตจำนวนเต็มมีนิยามแตกต่างกันสำหรับชนิดจำนวนเต็มแบบ signed และ -unsigned โปรดดูตัวดำเนินการเลขคณิต โดยเฉพาะอย่างยิ่งการโอเวอร์โฟลว์จำนวนเต็ม +#h(5.05em) ดังนั้นโปรดจำไว้ว่า เลขคณิตจำนวนเต็มมีนิยามแตกต่างกันสำหรับชนิดจำนวนเต็มแบบ signed +และ unsigned โปรดดูตัวดำเนินการเลขคณิต โดยเฉพาะอย่างยิ่งการโอเวอร์โฟลว์จำนวนเต็ม === ประเภทบูลีน (Boolean) -ประเภทบูลีนนั้นถูกนำเสนอครั้งแรกในมาตรฐาน C99 โดยการกล่าวถึงประเภทข้อมูลบูลีนนั้น ในประวัติของภาษา C แล้วมีสองแบบ +#h(8.85em) ประเภทบูลีนนั้นถูกนำเสนอครั้งแรกในมาตรฐาน C99 โดยการกล่าวถึงประเภทข้อมูลบูลีนนั้น +ในประวัติของภาษา C แล้วมีสองแบบ + +#set enum(indent: 8.85em) + `_Bool` (และมีมาโคร `bool`): จนถึงมาตรฐาน C23 + `bool` (ที่ไม่ใช่แค่มาโคร): มีตั้งแต่มาตรฐาน C23 === ประเภทจำนวนเต็ม (Integer) -+ `short int` (หรืออีกชื่อหนึ่งคือ `short` และสามารถใช้คีย์เวิร์ด `signed` ได้) -+ `unsigned short int` (หรือ `unsigned short`) -+ `int` (หรือ `signed int`) \ +1. `short int` (หรืออีกชื่อหนึ่งคือ `short` และสามารถใช้คีย์เวิร์ด `signed` ได้) +2. `unsigned short int` (หรือ `unsigned short`) +3. `int` (หรือ `signed int`) \ คือประเภทข้อมูลตัวเลขที่ปกติที่สุด และจะถูกการันตีว่าจะมีขนาดขั้นต่ำ 16 บิตเสมอ โดยระบบทั่วไปส่วนใหญ่ในปัจจุบันจะเป็น 32 บิต -+ `unsigned int` (หรือเพียงแค่ `unsigned`): คือประเภท `int` ในแบบ `unsigned`, มี +4. `unsigned int` (หรือเพียงแค่ `unsigned`) คือประเภท `int` ในแบบ `unsigned`, มี modulo arithmetic, และเหมาะสมสำหรับการเปลี่ยนแปลงบิต -+ `long int` (หรือ `long`) -+ `unsigned long int` (หรือ `unsigned long`) -+ มีเพิ่มตั้งแต่ C99: - + `long long int` (หรือ `long long`) - + `unsigned long long int` (หรือ `unsigned long long`) -+ มีเพิ่มตั้งแต่ C23: - + `_BitInt(n)` (หรือ `signed _BitInt(n)`): ประเภทข้อมูล signed แบบมีขนาดชัดเจน โดย - n แทนด้วยจำนวนบิต (รวมถึงบิตเครื่องหมาย และ n จะต้องไม่มากกว่า `BITINT_MAXWIDTH` - จากไฟล์ ``) - + `unsigned _BitInt(n)`: เหมือนข้างต้น เพียงแค่เป็นประเภท unsigned - (และไม่มีบิตเครื่องหมาย) +5. `long int` (หรือ `long`) +6. `unsigned long int` (หรือ `unsigned long`) +7. มีเพิ่มตั้งแต่ C99 +#listy( + indent: 10.20em, + numbering: thai-numbering, + [`long long int` (หรือ `long long`)], + [`unsigned long long int` (หรือ `unsigned long long`)], +) +#v(0.4em) +8. มีเพิ่มตั้งแต่ C23 +#listy( + indent: 10.20em, + numbering: thai-numbering, + [`_BitInt(n)` (หรือ `signed _BitInt(n)`): ประเภทข้อมูล signed แบบมีขนาดชัดเจน โดย n + แทนด้วยจำนวนบิต (รวมถึงบิตเครื่องหมาย และ n จะต้องไม่มากกว่า `BITINT_MAXWIDTH` จากไฟล์ + ``)], + [`unsigned _BitInt(n)`: เหมือนข้างต้น เพียงแค่เป็นประเภท unsigned + (และไม่มีบิตเครื่องหมาย)], +) และเหมือนประเภทข้อมูลอื่น ๆ คุณสามารถเรียงคีย์เวิร์ดแบบใดก็ได้ เช่น `unsigned long long int` และ `long int unsigned long` นั้นเหมือนกัน @@ -316,11 +333,11 @@ unsigned โปรดดูตัวดำเนินการเลขคณ ), table.cell(`char`, align: left), `char`, - table.cell([อย่างน้อย\ *8*], rowspan: 3), - table.cell([*8*], rowspan: 3), - table.cell([*8*], rowspan: 3), - table.cell([*8*], rowspan: 3), - table.cell([*8*], rowspan: 3), + table.cell([อย่างน้อย\ 8], rowspan: 3), + table.cell([8], rowspan: 3), + table.cell([8], rowspan: 3), + table.cell([8], rowspan: 3), + table.cell([8], rowspan: 3), table.cell(`signed char`, align: left), `signed char`, table.cell(`unsigned char`, align: left), @@ -328,44 +345,17 @@ unsigned โปรดดูตัวดำเนินการเลขคณ table.cell(`short`, align: left), table.cell(`short int`, rowspan: 4), - table.cell([อย่างน้อย\ *16*], rowspan: 6), - table.cell([*16*], rowspan: 6), - table.cell([*16*], rowspan: 6), - table.cell([*16*], rowspan: 6), - table.cell([*16*], rowspan: 6), + table.cell([อย่างน้อย\ 16], rowspan: 6), + table.cell([16], rowspan: 6), + table.cell([16], rowspan: 6), + table.cell([16], rowspan: 6), + table.cell([16], rowspan: 6), table.cell(`short int`, align: left), table.cell(`signed short`, align: left), table.cell(`signed short int`, align: left), table.cell(`unsigned short`, align: left), table.cell([`unsigned`\ `short int`], rowspan: 2), table.cell(`unsigned short int`, align: left), - - table.cell(`int`, align: left), - table.cell(`int`, rowspan: 3), - table.cell([อย่างน้อย\ *16*], rowspan: 5), - table.cell([*16*], rowspan: 5), - table.cell([*32*], rowspan: 5), - table.cell([*32*], rowspan: 5), - table.cell([*32*], rowspan: 5), - table.cell(`signed`, align: left), - table.cell(`signed int`, align: left), - table.cell(`unsigned`, align: left), - table.cell([`unsigned int`], rowspan: 2), - table.cell(`unsigned int`, align: left), - - table.cell(`long`, align: left), - table.cell(`long int`, rowspan: 4), - table.cell([อย่างน้อย\ *32*], rowspan: 6), - table.cell([*32*], rowspan: 6), - table.cell([*32*], rowspan: 6), - table.cell([*32*], rowspan: 6), - table.cell([*64*], rowspan: 6), - table.cell(`long int`, align: left), - table.cell(`signed long`, align: left), - table.cell(`signed long int`, align: left), - table.cell(`unsigned long`, align: left), - table.cell([`unsigned`\ `long int`], rowspan: 2), - table.cell(`unsigned long int`, align: left), ), caption: [ขนาดของข้อมูลเป็นบิต], ) @@ -386,13 +376,40 @@ unsigned โปรดดูตัวดำเนินการเลขคณ [LLP64], [LP64], ), + table.cell(`int`, align: left), + table.cell(`int`, rowspan: 3), + table.cell([อย่างน้อย\ 16], rowspan: 5), + table.cell([16], rowspan: 5), + table.cell([32], rowspan: 5), + table.cell([32], rowspan: 5), + table.cell([32], rowspan: 5), + table.cell(`signed`, align: left), + table.cell(`signed int`, align: left), + table.cell(`unsigned`, align: left), + table.cell([`unsigned int`], rowspan: 2), + table.cell(`unsigned int`, align: left), + + table.cell(`long`, align: left), + table.cell(`long int`, rowspan: 4), + table.cell([อย่างน้อย\ 32], rowspan: 6), + table.cell([32], rowspan: 6), + table.cell([32], rowspan: 6), + table.cell([32], rowspan: 6), + table.cell([64], rowspan: 6), + table.cell(`long int`, align: left), + table.cell(`signed long`, align: left), + table.cell(`signed long int`, align: left), + table.cell(`unsigned long`, align: left), + table.cell([`unsigned`\ `long int`], rowspan: 2), + table.cell(`unsigned long int`, align: left), + table.cell(`long long`, align: left), table.cell([`long long int` (C99)], rowspan: 4), - table.cell([อย่างน้อย\ *64*], rowspan: 6), - table.cell([*64*], rowspan: 6), - table.cell([*64*], rowspan: 6), - table.cell([*64*], rowspan: 6), - table.cell([*64*], rowspan: 6), + table.cell([อย่างน้อย\ 64], rowspan: 6), + table.cell([64], rowspan: 6), + table.cell([64], rowspan: 6), + table.cell([64], rowspan: 6), + table.cell([64], rowspan: 6), table.cell(`long long int`, align: left), table.cell(`signed long long`, align: left), table.cell(`signed long long int`, align: left), @@ -403,10 +420,9 @@ unsigned โปรดดูตัวดำเนินการเลขคณ caption: [ขนาดของข้อมูลเป็นบิต (ต่อ)], ) +#h(12em) 1) รูปแบบข้อมูล (data model) -==== รูปแบบข้อมูล (data model) - -#h(13.5em) รูปแบบข้อมูล หรือ data model +#h(13.15em) รูปแบบข้อมูล หรือ data model คือรูปแบบการเก็บข้อมูลของโปรแกรมซึ่งเป็นสิ่งที่กำหนดขนาดของตัวแปร โดยรูปแบบข้อมูลนั้นจะถูกกำหนดโดยแพลตฟอร์มเป้าหมาย ซึ่งมีหน่วยประมวลผลและระบบปฏิบัติการเป็นปัจจัยหลัก โดยตามตารางในหัวข้อก่อนหน้า หลัก ๆ @@ -415,115 +431,110 @@ unsigned โปรดดูตัวดำเนินการเลขคณ === ประเภทจำนวนทศนิยมจริง (Real floating types) -#h(9.75em) ภาษา C นั้นมีประเภทข้อมูลสำหรับแทนตัวเลขทศนิยมจริง 3 (หรือ 6 ตั้งแต่ C23) ประเภท +#h(8.85em) ภาษา C นั้นมีประเภทข้อมูลสำหรับแทนตัวเลขทศนิยมจริง 3 (หรือ 6 ตั้งแต่ C23) ประเภท -+ `float`: จำนวนทศนิยมความแม่นยำเดี่ยว ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary32 หากรองรับ -+ `double`: จำนวนทศนิยมความแม่นยำสองเท่า ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary64 +1. `float` จำนวนทศนิยมความแม่นยำเดี่ยว ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary32 หากรองรับ +2. `double` จำนวนทศนิยมความแม่นยำสองเท่า ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary64 หากรองรับ -+ `long double`: จำนวนทศนิยมความแม่นยำเพิ่มเติม ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary128 +3. `long double` จำนวนทศนิยมความแม่นยำเพิ่มเติม ตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary128 หากรองรับ มิฉะนั้นจะตรงกับ IEEE-754 binary64-extended หากรองรับ มิฉะนั้นจะตรงกับรูปแบบจำนวนทศนิยมที่ไม่ตรงกับมาตรฐาน IEEE-754 รูปแบบใดก็ได้ตราบใดที่มีความแม่นยำกว่า binary64 และระยะข้อมูลนั้นอย่างน้อยก็ต้องดีเท่า binary64 และหากไม่รองรับทั้งหมดนั้น จะตรงกับฟอร์แมตมาตรฐาน IEEE-754 binary64 - + รูปแบบ binary128 นั้นถูกใช้โดยระบบ HP-UX, SPARC, MIPS, ARM64, และ z/OS บางระบบ - + รูปแบบ IEEE-754 binary64-extended ที่รู้จักกันอย่างแพร่หลายที่สุดคือรูปแบบความแม่นยำเพิ่มเติม - 80 บิต x87 ซึ่งถูกใช้โดยสถาปัตยกรรม x86 และ x86-64 บางระบบ (การยกเว้นที่ควรพูดถึงคือ - MSVC ที่กำหนดให้ `long double` อยู่ในรูปแบบเดียวกันกับ `double`, เช่น binary64) -เมื่อใช้มาตรฐาน C ตั้งแต่ C23 เป็นต้นไปและหากแพลตฟอร์มของคุณใช้งานคอนแสตนต์มาโคร +#listy( + indent: 10.20em, + numbering: thai-numbering, + [รูปแบบ binary128 นั้นถูกใช้โดยระบบ HP-UX, SPARC, MIPS, ARM64, และ z/OS บางระบบ], + [รูปแบบ IEEE-754 binary64-extended ที่รู้จักกันอย่างแพร่หลายที่สุดคือรูปแบบความแม่นยำเพิ่มเติม + 80 บิต x87 ซึ่งถูกใช้โดยสถาปัตยกรรม x86 และ x86-64 บางระบบ#jb (การยกเว้นที่ควรพูดถึงคือ + MSVC ที่กำหนดให้ `long double` อยู่ในรูปแบบเดียวกันกับ `double`, เช่น#jb binary64)], +) + +#h(8.85em) เมื่อใช้มาตรฐาน C ตั้งแต่ C23 เป็นต้นไปและหากแพลตฟอร์มของคุณใช้งานคอนแสตนต์มาโคร `__STDC_IEC_60559_DFP__` ข้อมูลประเภทตัวเลขทศนิยมดังต่อไปนี้จะถูกรองรับด้วย: -#[ - #set enum(indent:9.75em) - + `_Decimal32`: แทนรูปแบบมาตรฐาน IEEE-754 decimal32 -+ `_Decimal64`: แทนรูปแบบมาตรฐาน IEEE-754 decimal64 -+ `_Decimal128`: แทนรูปแบบมาตรฐาน IEEE-754 decimal128 -] ++ `_Decimal32` แทนรูปแบบมาตรฐาน IEEE-754 decimal32 ++ `_Decimal64` แทนรูปแบบมาตรฐาน IEEE-754 decimal64 ++ `_Decimal128` แทนรูปแบบมาตรฐาน IEEE-754 decimal128 -มิฉะนั้น ประเภทตัวเลขทศนิยมเพิ่มเติมเหล่านี้จะไม่ถูกรองรับ +#h(8.85em) มิฉะนั้น ประเภทตัวเลขทศนิยมเพิ่มเติมเหล่านี้จะไม่ถูกรองรับ -ข้อมูลประเภททศนิยมอาจรองรับค่าพิเศษเพิ่มเติมได้แก่ +#h(8.85em) ข้อมูลประเภททศนิยมอาจรองรับค่าพิเศษเพิ่มเติมได้แก่ -#[ - #set enum(indent: 9.75em) - + อนันต์ (Infinity, ทั้งบวกและลบ) -+ ศูนย์ติดลบ, `-0.0` โดยมีค่าเท่ากับศูยน์ที่ติดบวก แต่อาจมีความหมายในบางสมการ เช่น +1. อนันต์ (Infinity, ทั้งบวกและลบ) +2. ศูนย์ติดลบ, `-0.0` โดยมีค่าเท่ากับศูยน์ที่ติดบวก แต่อาจมีความหมายในบางสมการ เช่น `1.0 / 0.0 == INFINITY` แต่ `1.0 / -0.0 == -INFINITY` -+ ไม่ใช่ตัวเลข (not-a-number; NaN) ซึ่งไม่เท่ากับอะไรเลย (รวมถึงตัวมันเอง) -] +3. ไม่ใช่ตัวเลข (not-a-number; NaN) ซึ่งไม่เท่ากับอะไรเลย รวมถึงตัวมันเอง -ทศนิยมจำนวนจริงสามารถถูกใช้กับตัวดำเนินการทางคณิตศาสตร์ได้ *+ - / \** +#h(8.85em) ทศนิยมจำนวนจริงสามารถถูกใช้กับตัวดำเนินการทางคณิตศาสตร์ได้ *+ - / \** และฟังก์ชันทางคณิตศาสตร์จาก `` โดยทั้งตัวดำเนินการและฟังก์ชันจากไลบรารีนั้นสามารถก่อให้เกิดการแสดงข้อผิดพลาดของจำนวนทศนิยมได้และจะตั้งค่า `errno` === ประเภทจำนวนทศนิยมซับซ้อน (Complex floating types) -#h(9.75em) ประเภทข้อมูลจำนวนทศนิยมซับซ้อนนั้นเป็นประเภทที่แทนตัวเลขเชิงซ้อน (complex number) +#h(8.85em) ประเภทข้อมูลจำนวนทศนิยมซับซ้อนนั้นเป็นประเภทที่แทนตัวเลขเชิงซ้อน (complex number) นั้นคือ ตัวเลขที่สามารถถูกเขียนแทนเป็นผลรวมของจำนวนจริงและจำนวนจริงที่คูณด้วยจำนวนจินตภาพ (a + bi) โดยประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่ -+ `float _Complex` (และสามารถใช้ `float complex` ได้เช่นกันหากนำเข้า ``) -+ `double _Complex` (และสามารถใช้ `double complex` ได้เช่นกันหากนำเข้า ``) -+ `long double _Complex` (และสามารถใช้ `long double complex` ได้เช่นกันหากนำเข้า +1. `float _Complex` (และสามารถใช้ `float complex` ได้เช่นกันหากนำเข้า ``) +2. `double _Complex` (และสามารถใช้ `double complex` ได้เช่นกันหากนำเข้า + ``) +3. `long double _Complex` (และสามารถใช้ `long double complex` ได้เช่นกันหากนำเข้า ``) - === ประเภทจำนวนทศนิยมจินตภาพ (Imaginary floating types) -#i ประเภทข้อมูลจำนวนทศนิยมจินตภาพนั้นเป็นประเภทที่แทนตัวเลขจินตภาพ (imaginary number) นั้นคือ -ตัวเลขที่สามารถถูกเขียนแทนเป็นจำนวนจริงที่คูณด้วยจำนวนจินตภาพ: #math.equation( +#h(8.85em) ประเภทข้อมูลจำนวนทศนิยมจินตภาพนั้นเป็นประเภทที่แทนตัวเลขจินตภาพ#jb (imaginary +number) นั้นคือ ตัวเลขที่สามารถถูกเขียนแทนเป็นจำนวนจริงที่คูณด้วยจำนวนจินตภาพ #math.equation( $b i$, alt: "b i", -) +) โดยประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่ -ประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่ - -+ `float _Imaginary` (และสามารถใช้ `float imaginary` ได้เช่นกันหากนำเข้า +1. `float _Imaginary` (และสามารถใช้ `float imaginary` ได้เช่นกันหากนำเข้า#jb ``) -+ `double _Imaginary` (และสามารถใช้ `double imaginary` ได้เช่นกันหากนำเข้า +2. `double _Imaginary` (และสามารถใช้ `double imaginary` ได้เช่นกันหากนำเข้า ``) -+ `long double _Imaginary` (และสามารถใช้ `long double imaginary` ได้เช่นกันหากนำเข้า +3. `long double _Imaginary` (และสามารถใช้ `long double imaginary` ได้เช่นกันหากนำเข้า ``) - === ประเภทตัวอักษร (Character) -+ `signed char`: ประเภทสำหรับตัวอักษรแบบ signed -+ `unsigned char`: ประเภทสำหรับตัวอักษรแบบ unsigned -+ `char`: ประเภทสำหรับตัวอักษรแบบไม่ระบุระยะข้อมูล ซึ่งสามารถเท่ากับ `signed char` หรือ +1. `signed char` คือประเภทสำหรับตัวอักษรแบบ signed +2. `unsigned char` คือประเภทสำหรับตัวอักษรแบบ unsigned +3. `char` คือประเภทสำหรับตัวอักษรแบบไม่ระบุระยะข้อมูล ซึ่งสามารถเท่ากับ#jb `signed char` หรือ `unsigned char` ก็ได้ขึ้นอยู่กับแพลตฟอร์มและคอมไพเลอร์ แต่อย่างไรก็ตาม `char` นั้นไม่ใช่เพียงแค่มาโครที่ลิงก์ไปยังประเภทอื่น ๆ แต่ `char` คือประเภทของมันเอง === คีย์เวิร์ด -+ `bool`, `true`, `false`, `char`, `int`, `short`, `long`, `signed`, `unsigned`, - `float`, `double`. -+ `_Bool`, `_BitInt`, `_Complex`, `_Imaginary`, `_Decimal32`, `_Decimal64`, - `_Decimal128`. +1. `bool`, `true`, `false`, `char`, `int`, `short`, `long`, `signed`, + `unsigned`, `float`, `double` +2. `_Bool`, `_BitInt`, `_Complex`, `_Imaginary`, `_Decimal32`, `_Decimal64`, + `_Decimal128` === ระยะค่าที่เก็บได้ -#h(9.75em) ก่อนมาตรฐาน C23 มาตรฐาน C อนุญาตการแทนตัวเลขแบบใดก็ได้ และระยะขั้นต่ำของตัวเลข -N บิตคือ #math.equation($-(2^(N-1)-1)$, alt: "ลบ 2 ยกกำลัง N ลบ 1 ทั้งหมดลบ 1") ถึง -#math.equation($+2^(N-1)-1$, alt: "บวก 2 ยกกำลัง N ลบ 1 ทั้งหมดลบ 1") (เช่น -127 ถึง -127 สำหรับประเภทตัวเลข 8 บิต) ซึ่งตรงกับขอบเขตของส่วนเติมเต็มหนึ่ง (one's complement) -หรือการแทนจำนวนมีเครื่องหมาย (sign-and-magnitude) +#h(8.85em) ก่อนมาตรฐาน C23 มาตรฐาน C อนุญาตการแทนตัวเลขแบบใดก็ได้ และ#jb +ระยะขั้นต่ำของตัวเลข N บิตคือ #math.minus#[(2#super[N-1] #math.minus 1)] ถึง ++2#super[N-1] #math.minus 1 (เช่น -127 ถึง 127 สำหรับประเภทตัวเลข 8 บิต) +ซึ่งตรงกับขอบเขตของส่วนเติมเต็มหนึ่ง (one's complement) หรือการแทนจำนวนมีเครื่องหมาย +(sign-and-magnitude) -#h(9.75em) อย่างไรก็ตาม รูปแบบข้อมูลที่ใช้กันอย่างแพร่หลายทั้งหมด (รวมถึง ILP32, LP32, LP64, -และ LLP64) และคอมไพเลอร์ C เกือบทั้งหมดใช้การแทนตัวเลขแบบส่วนเติมเต็มสอง (two's +#h(8.85em) อย่างไรก็ตาม รูปแบบข้อมูลที่ใช้กันอย่างแพร่หลายทั้งหมด (รวมถึง ILP32, LP32, LP64, +และ LLP64) และคอมไพเลอร์ C เกือบทั้งหมดใช้การแทนตัวเลขแบบส่วนเติมเต็มสอง#jb (two's complement) (มีข้อยกเว้นที่ทราบแค่บางคอมไพเลอร์สำหรับระบบ UNISYS) และตั้งแต่มาตรฐาน C23 -มันคือการแทนตัวเลขแบบเดียวที่ถูกอนุญาตให้ใช้โดยมาตรฐาน และมีขอบเขตที่แน่นอนระหว่าง -#math.equation($-2^(N-1)$, alt: "ลบ 2 ยกกำลัง N ลบ 1") ถึง #math.equation( - $+2^(N-1)-1$, - alt: "บวก 2 ยกกำลัง N ลบ 1 ทั้งหมดลบ 1", -) (เช่น -128 ถึง 127 สำหรับประเภทตัวเลข 8 บิต) +มันคือการแทนตัวเลขแบบเดียวที่ถูกอนุญาตให้ใช้โดยมาตรฐาน +และมีขอบเขตที่แน่นอนระหว่าง -2#super[N#math.minus#[1]] ถึง +2#super[N#math.minus#[1]] +(เช่น -128 ถึง 127 สำหรับประเภทตัวเลข 8 บิต) -#h(9.75em) ตารางต่อไปนี้ให้ข้อมูลเกี่ยวกับขอบเขตของประเภทข้อมูลต่าง ๆ (มีการเพิ่มจุลภาคในทศนิยมเพื่อเพิ่มความสะดวกในการอ่าน) +#h(8.85em) ตารางต่อไปนี้ให้ข้อมูลเกี่ยวกับขอบเขตของประเภทข้อมูลต่าง ๆ +(มีการเพิ่มจุลภาคในทศนิยมเพื่อเพิ่มความสะดวกในการอ่าน) #show table.cell.where(x: 0): strong #show math.equation.where(block: true): set block(spacing: 0.6em) -#set list(indent: 0em) +#set enum(indent: 0em) #figure( table( @@ -540,49 +551,49 @@ complement) (มีข้อยกเว้นที่ทราบแค่บ table.cell([8], rowspan: 2), [signed], [], - [*-128* ถึง *127*], + [-128 ถึง 127], [unsigned], [], - [*0* ถึง *255*], + [0 ถึง 255], [16], [UTF-16], [], - [*0* ถึง *65535*], + [0 ถึง 65535], [32], [UTF-32], [], - [*0* ถึง *1114111 (0x10ffff)*], + [0 ถึง 1114111 (0x10ffff)], table.cell([จำนวน\ เต็ม], rowspan: 6), table.cell([16], rowspan: 2), [signed], - [*± 3.27 · 104*], - [*-32768* ถึง *32767*], + [± 3.27 · 104], + [-32768 ถึง 32767], [unsigned], - [*0* ถึง *6.55 · 104*], - [*0* ถึง *65535*], + [0 ถึง 6.55 · 104], + [0 ถึง 65535], table.cell([32], rowspan: 2), [signed], - [*± 2.14 · 109*], - [*-2,147,483,648* ถึง *2,147,483,647*], + [± 2.14 · 109], + [-2,147,483,648 ถึง 2,147,483,647], [unsigned], - [*0* ถึง *4.29 · 109*], - [*0* ถึง *4,294,967,295*], + [0 ถึง 4.29 · 109], + [0 ถึง 4,294,967,295], table.cell([64], rowspan: 2), [signed], - [*± 9.22 · 1018*], - [*-9,223,372,036,854,775,808* ถึง *9,223,372,036,854,775,807*], + [± 9.22 · 1018], + [-9,223,372,036,854,775,808 ถึง 9,223,372,036,854,775,807], [unsigned], - [*0* ถึง *1.84 · 1019*], - [*0* ถึง *18,446,744,073,709,551,615*], + [0 ถึง 1.84 · 1019], + [0 ถึง 18,446,744,073,709,551,615], table.cell([ทศนิยม\ ไบนารี], rowspan: 2), [32], @@ -811,15 +822,15 @@ complement) (มีข้อยกเว้นที่ทราบแค่บ caption: [ตารางแสดงขอบเขตประเภทข้อมูล (ต่อ)], ) -#set list(indent: 1em) +#set enum(indent: 1em) == ชุดแปลโปรแกรมของกนู (GNU Compiler Collection; GCC) -#h(6em) ในกระบวนการการพัฒนาโครงงานนี้ +#h(5.05em) ในกระบวนการการพัฒนาโครงงานนี้ ชุดแปลโปรแกรมของกนูนั้นถูกใช้เป็นหลักเนื่องจากเป็นชุดแปลโปรแกรม (คอมไพเลอร์; Compiler) ที่ใช้เป็นหลักในการพัฒนาโคดที่สร้างบนพื้นฐาน Arduino และบอร์ดต่าง ๆ รวมถึงบอร์ด ESP32 -#h(6em) ชุดคอมไพเลอร์ GNU (GNU Compiler Collection; GCC) (เดิมชื่อ GNU C Compiler) +#h(5.05em) ชุดคอมไพเลอร์ GNU (GNU Compiler Collection; GCC) (เดิมชื่อ GNU C Compiler) คือชุดคอมไพเลอร์จากโครงการ GNU ที่รองรับภาษาโปรแกรม สถาปัตยกรรมฮาร์ดแวร์ และระบบปฏิบัติการต่าง ๆ มูลนิธิซอฟต์แวร์เสรี (FSF) เผยแพร่ GCC ในฐานะซอฟต์แวร์เสรีภายใต้สัญญาอนุญาตสถูกเรียกาธารณะทั่วไปของ GNU (GNU GPL) GCC @@ -827,13 +838,14 @@ complement) (มีข้อยกเว้นที่ทราบแค่บ Linux ด้วยโคดประมาณ 15 ล้านบรรทัดในปี 2019 GCC จึงเป็นหนึ่งในโปรแกรมฟรีที่ใหญ่ที่สุดเท่าที่เคยมีมา GCC มีบทบาทสำคัญในการเติบโตของซอฟต์แวร์เสรี ทั้งในฐานะเครื่องมือและตัวอย่าง -#h(6em) นอกจากจะเป็นคอมไพเลอร์อย่างเป็นทางการของระบบปฏิบัติการ GNU แล้ว GCC +#h(5.05em) นอกจากจะเป็นคอมไพเลอร์อย่างเป็นทางการของระบบปฏิบัติการ GNU แล้ว GCC ยังได้รับการยอมรับให้เป็นคอมไพเลอร์มาตรฐานโดยระบบปฏิบัติการคอมพิวเตอร์สมัยใหม่ที่คล้ายกับ Unix อื่นๆ อีกมากมาย รวมถึงระบบปฏิบัติการ Linux ส่วนใหญ่ ระบบปฏิบัติการตระกูล BSD ส่วนใหญ่ก็เปลี่ยนมาใช้ GCC ไม่นานหลังจากเปิดตัว แม้ว่าหลังจากนั้น FreeBSD และ Apple macOS ได้เปลี่ยนมาใช้คอมไพเลอร์ Clang ส่วนใหญ่เป็นเพราะเหตุผลด้านลิขสิทธิ์ GCC ยังสามารถคอมไพเลอร์โคดสำหรับระบบปฏิบัติการ Windows, Android, iOS, Solaris, HP-UX, AIX และ MS-DOS ได้อีกด้วย -#h(6em) GCC ได้รับการพอร์ตไปยังแพลตฟอร์มและสถาปัตยกรรมชุดคำสั่งต่าง ๆ มากกว่าคอมไพเลอร์อื่น ๆ +#h(5.05em) GCC ได้รับการพอร์ตไปยังแพลตฟอร์มและสถาปัตยกรรมชุดคำสั่งต่าง ๆ มากกว่าคอมไพเลอร์อื่น +ๆ และถูกนำไปใช้งานอย่างกว้างขวางในฐานะเครื่องมือในการพัฒนาซอฟต์แวร์ทั้งแบบฟรีและแบบที่เป็นกรรมสิทธิ์ นอกจากนี้ GCC ยังพร้อมใช้งานสำหรับระบบฝังตัวมากมาย รวมถึงชิปที่ใช้ ARM และ Power ISA diff --git a/Chapter2/Chapter2.typ b/Chapter2/Chapter2.typ index 63dca8f..34884bf 100644 --- a/Chapter2/Chapter2.typ +++ b/Chapter2/Chapter2.typ @@ -1,18 +1,46 @@ #import "../PageTemplate.typ": page-theme #import "@preview/i-figured:0.2.4" #set enum(numbering: "1)") - #set heading(numbering: "บทที่ 1") -#include "Intro.typ" + +#[ + #show heading: it => { + if it.level > 2 { + block( + it, + inset: (left: 1.7em * (it.level - 2) + (0.9em * (it.level - 3))), + ) + } else { + it + } + } + + #include "Intro.typ" + + #set heading(numbering: "1.1", offset: 1) + #include "Microcontroller.typ" + #include "Sensors.typ" + #include "Buzzer.typ" + #include "HTTP.typ" + #include "HTTPS.typ" + #include "TLS.typ" + #include "NFC.typ" + #include "Flutter.typ" + #include "Git.typ" +] + +#show heading.where(level: 3): it => { + block( + it, + inset: (left: 2.1em * (it.level - 2)), + ) +} +#show heading.where(level: 4): it => { + block( + it, + inset: (left: 5.1em), + ) +} #set heading(numbering: "1.1", offset: 1) -#include "Microcontroller.typ" -#include "Sensors.typ" -#include "Buzzer.typ" -#include "HTTP.typ" -#include "HTTPS.typ" -#include "TLS.typ" -#include "NFC.typ" -#include "Flutter.typ" -#include "Git.typ" #include "CLanguage.typ" diff --git a/Chapter2/Flutter.typ b/Chapter2/Flutter.typ index 9acb86d..5b57f8d 100644 --- a/Chapter2/Flutter.typ +++ b/Chapter2/Flutter.typ @@ -6,33 +6,33 @@ = Flutter -#i Flutter เป็นชุดพัฒนาซอฟต์แวร์ UI แบบโอเพนซอร์สที่สร้างโดย Google +#h(1.7em) Flutter เป็นชุดพัฒนาซอฟต์แวร์ UI แบบโอเพนซอร์สที่สร้างโดย Google สามารถใช้พัฒนาแอปพลิเคชันข้ามแพลตฟอร์มจากฐานโคดเดียวสำหรับเว็บ Fuchsia, Android, iOS, -Linux, macOS และ Windows โดย Flutter ได้รับการพูดถึงครั้งแรกในปี 2015 -และเปิดตัวในเดือนพฤษภาคม 2017 และ Flutter ถูกใช้งานภายในโดย Google ในแอปพลิเคชันต่างๆ +Linux, macOS และ#jb Windows โดย Flutter ได้รับการพูดถึงครั้งแรกในปี 2015 +และเปิดตัวในเดือนพฤษภาคม 2017 และ#jb Flutter ถูกใช้งานภายในโดย Google ในแอปพลิเคชันต่างๆ เช่น Google Pay และ Google Earth รวมถึงโดยนักพัฒนาซอฟต์แวร์รายอื่นๆ เช่น ByteDance และ Alibaba -#i Flutter จะสร้างแอปพลิเคชันที่มีเอ็นจิ้นการเรนเดอร์ของตัวเอง ซึ่งส่งข้อมูลพิกเซลไปยังหน้าจอโดยตรง -ซึ่งแตกต่างจากเฟรมเวิร์ก UI อื่น ๆ อีกมากมายที่อาศัยแพลตฟอร์มเป้าหมายเพื่อจัดหาเอ็นจิ้นการเรนเดอร์ -เช่น แอป Android พื้นฐานที่ใช้ Android SDK ระดับอุปกรณ์ หรือ iOS SDK ที่ใช้ UI stack -ในตัวของแพลตฟอร์มเป้าหมาย การควบคุมขั้นตอนการแสดงผลของ Flutter -ช่วยลดความยุ่งยากในการรองรับหลายแพลตฟอร์ม เนื่องจากสามารถใช้โคด UI -ที่เหมือนกันได้กับทุกแพลตฟอร์มเป้าหมาย +#h(1.7em) Flutter จะสร้างแอปพลิเคชันที่มีเอ็นจิ้นการเรนเดอร์ของตัวเอง +ซึ่งส่งข้อมูลพิกเซลไปยังหน้าจอโดยตรง ซึ่งแตกต่างจากเฟรมเวิร์ก UI อื่น ๆ +อีกมากมายที่อาศัยแพลตฟอร์มเป้าหมายเพื่อจัดหาเอ็นจิ้นการเรนเดอร์ เช่น แอป Android พื้นฐานที่ใช้ +Android SDK ระดับอุปกรณ์ หรือ iOS SDK ที่ใช้ UI stack ในตัวของแพลตฟอร์มเป้าหมาย +การควบคุมขั้นตอนการแสดงผลของ Flutter ช่วยลดความยุ่งยากในการรองรับหลายแพลตฟอร์ม +เนื่องจากสามารถใช้โคด UI ที่เหมือนกันได้กับทุกแพลตฟอร์มเป้าหมาย == Dart -#iii Dart เป็นภาษาโปรแกรมที่ออกแบบโดย Lars Bak และ Kasper Lund และพัฒนาโดย Google -สามารถใช้พัฒนาแอปพลิเคชันบนเว็บ มือถือ เซิร์ฟเวอร์ และเดสก์ท็อปได้ +#h(4.2em) Dart เป็นภาษาโปรแกรมที่ออกแบบโดย Lars Bak และ Kasper Lund และพัฒนาโดย#jb +Google สามารถใช้พัฒนาแอปพลิเคชันบนเว็บ มือถือ เซิร์ฟเวอร์ และเดสก์ท็อปได้ และยังเป็นภาษาหลักที่ใช้ในการพัฒนาแอปพลิเคชัน Flutter -#iii Dart เป็นภาษาเชิงวัตถุ อิงคลาส และรวบรวมขยะ (garbage-collection) ด้วยไวยากรณ์แบบ C -สามารถคอมไพล์เป็นโค้ดเครื่อง JavaScript หรือ WebAssembly ได้ รองรับอินเทอร์เฟซ มิกซ์อิน -คลาสนามธรรม เจเนอริกแบบรีไฟด์ และการอนุมานชนิดข้อมูล +#h(4.2em) Dart เป็นภาษาเชิงวัตถุ อิงคลาส และรวบรวมขยะ (garbage-collection) +ด้วยไวยากรณ์แบบ C สามารถคอมไพล์เป็นโค้ดเครื่อง JavaScript หรือ WebAssembly ได้ +รองรับอินเทอร์เฟซ มิกซ์อิน คลาสนามธรรม เจเนอริกแบบรีไฟด์ และการอนุมานชนิดข้อมูล == สถาปัตยกรรม -#iii Flutter ถูกออกแบบมาให้เป็นระบบแบบเลเยอร์ที่ต่อขยายได้ +#h(4.2em) Flutter ถูกออกแบบมาให้เป็นระบบแบบเลเยอร์ที่ต่อขยายได้ ประกอบด้วยไลบรารีอิสระหลายชุดที่แต่ละชุดพึ่งพาเลเยอร์ที่อยู่ด้านล่าง ไม่มีเลเยอร์ใดที่มีสิทธิ์พิเศษในการเข้าถึงเลเยอร์ด้านล่าง และทุกส่วนของเฟรมเวิร์กถูกออกแบบมาให้เป็นตัวเลือกและสามารถทดแทนได้ @@ -44,15 +44,17 @@ Alibaba caption: [สถาปัตยกรรม Flutter], ) +#v(0.5em) + #iii สำหรับระบบปฏิบัติการที่อยู่ภายใต้ แอปพลิเคชัน Flutter จะถูกบรรจุในลักษณะเดียวกับแอปพลิเคชันเนทีฟอื่น ๆ โดยตัวฝังตัว (Embedder) -เฉพาะแพลตฟอร์มจะทำหน้าที่เป็นจุดเริ่มต้น ประสานงานกับระบบปฏิบัติการที่อยู่ภายใต้เพื่อเข้าถึงบริการต่างๆ -เช่น พื้นผิวการแสดงผล การเข้าถึง และการป้อนข้อมูล และจัดการลูปเหตุการณ์ข้อความ -ตัวฝังตัวเขียนด้วยภาษาที่เหมาะสมกับแพลตฟอร์ม ปัจจุบันคือ Java และ C++ สำหรับ Android, Swift -และ Objective-C/Objective-C++ สำหรับ#jb iOS และ macOS และ C++ สำหรับ Windows และ -Linux การใช้ตัวฝังตัว โค้ด Flutter สามารถรวมเข้ากับแอปพลิเคชันที่มีอยู่แล้วในรูปแบบโมดูล -หรือโค้ดอาจเป็นเนื้อหาทั้งหมดของแอปพลิเคชันก็ได้ Flutter -มีตัวฝังตัวจำนวนมากสำหรับแพลตฟอร์มเป้าหมายทั่วไป แต่ก็ยังมีตัวฝังตัวอื่นๆ อีกด้วย +เฉพาะแพลตฟอร์มจะทำหน้าที่เป็นจุดเริ่มต้น#jb +ประสานงานกับระบบปฏิบัติการที่อยู่ภายใต้เพื่อเข้าถึงบริการต่างๆ เช่น พื้นผิวการแสดงผล การเข้าถึง +และการป้อนข้อมูล และจัดการลูปเหตุการณ์ข้อความ ตัวฝังตัวเขียนด้วยภาษาที่เหมาะสมกับแพลตฟอร์ม#jb +ปัจจุบันคือ Java และ C++ สำหรับ Android, Swift และ Objective-C/Objective-C++ สำหรับ#jb +iOS และ macOS และ C++ สำหรับ Windows และ Linux การใช้ตัวฝังตัว โค้ด Flutter +สามารถรวมเข้ากับแอปพลิเคชันที่มีอยู่แล้วในรูปแบบโมดูล หรือโค้ดอาจเป็นเนื้อหาทั้งหมดของแอปพลิเคชันก็ได้ +Flutter มีตัวฝังตัวจำนวนมากสำหรับแพลตฟอร์มเป้าหมายทั่วไป แต่ก็ยังมีตัวฝังตัวอื่นๆ อีกด้วย #iii หัวใจหลักของ Flutter คือ Flutter engine ซึ่งส่วนใหญ่เขียนด้วยภาษา C++ และรองรับฟังก์ชันพื้นฐานที่จำเป็นต่อการทำงานของแอปพลิเคชัน Flutter ทั้งหมด @@ -64,28 +66,26 @@ Linux การใช้ตัวฝังตัว โค้ด Flutter สา ที่อยู่เบื้องหลังด้วยคลาส Dart ไลบรารีนี้เปิดเผยส่วนประกอบพื้นฐานระดับต่ำสุด เช่น คลาสสำหรับควบคุมระบบย่อยการรับข้อมูล กราฟิก และการแสดงผลข้อความ -#pagebreak() - #iii โดยทั่วไป นักพัฒนาจะโต้ตอบกับ Flutter ผ่านเฟรมเวิร์ก Flutter ซึ่งเป็นเฟรมเวิร์กที่ทันสมัยและตอบสนองต่อสิ่งรอบข้าง เขียนด้วยภาษา Dart เฟรมเวิร์กนี้ประกอบด้วยชุดไลบรารี แพลตฟอร์ม#jb เลย์เอาต์ และพื้นฐานที่ครบครัน ซึ่งประกอบด้วยเลเยอร์หลายชั้น เริ่มจากล่างขึ้นบน ได้แก่ #[ - #set enum(indent: 5.5em) - + คลาสพื้นฐานและบริการส่วนประกอบต่างๆ เช่น แอนิเมชัน การวาดภาพ และท่าทางสัมผัส + #set enum(indent: 4.1em) + 1. คลาสพื้นฐานและบริการส่วนประกอบต่างๆ เช่น แอนิเมชัน การวาดภาพ และท่าทางสัมผัส ซึ่งนำเสนอนามธรรมที่ใช้กันทั่วไปเหนือพื้นฐานที่อยู่เบื้องหลัง - + เลเยอร์การเรนเดอร์ให้นามธรรมสำหรับการจัดการเลย์เอาต์ ด้วยเลเยอร์นี้ + 2. เลเยอร์การเรนเดอร์ให้นามธรรมสำหรับการจัดการเลย์เอาต์ ด้วยเลเยอร์นี้ คุณสามารถสร้างโครงสร้างแบบต้นไม้ของวัตถุที่เรนเดอร์ได้ คุณสามารถจัดการวัตถุเหล่านี้แบบไดนามิก โดยโครงสร้างแบบต้นไม้จะอัปเดตเลย์เอาต์โดยอัตโนมัติเพื่อสะท้อนการเปลี่ยนแปลงของคุณ - + เลเยอร์วิดเจ็ตเป็นนามธรรมของการประกอบ + 3. เลเยอร์วิดเจ็ตเป็นนามธรรมของการประกอบ วัตถุเรนเดอร์แต่ละชิ้นในเลเยอร์การเรนเดอร์จะมีคลาสที่สอดคล้องกันในเลเยอร์วิดเจ็ต นอกจากนี้ เลเยอร์วิดเจ็ตยังช่วยให้คุณกำหนดการรวมกันของคลาสที่คุณสามารถนำกลับมาใช้ใหม่ได้ นี่คือเลเยอร์ที่แนะนำโมเดลการเขียนโปรแกรมแบบตอบสนอง - + ไลบรารี Material และ Cupertino + 4. ไลบรารี Material และ Cupertino นำเสนอชุดควบคุมที่ครอบคลุมซึ่งใช้ส่วนประกอบพื้นฐานของเลเยอร์วิดเจ็ตเพื่อนำภาษาการออกแบบ Material หรือ iOS ไปใช้ ] @@ -112,33 +112,33 @@ Linux การใช้ตัวฝังตัว โค้ด Flutter สา ) #[ - #set enum(indent: 9.25em) + #set enum(indent: 7.55em) === แอปพลิเคชัน Dart (Dart app) + ประกอบวิดเจ็ตเข้าด้วยกันเพื่อสร้าง UI ที่ต้องการ + ดำเนินการตามตรรกะทางธุรกิจ + นักพัฒนาแอปเป็นเจ้าของ === เฟรมเวิร์ก (Framework) - + ให้ API ระดับสูงสำหรับการสร้างแอปคุณภาพสูง (ตัวอย่างเช่น วิดเจ็ต การทดสอบการกด + 1. ให้ API ระดับสูงสำหรับการสร้างแอปคุณภาพสูง (ตัวอย่างเช่น วิดเจ็ต การทดสอบการกด การตรวจจับท่าทาง การเข้าถึงได้ และการอินพุต ข้อความ) - + ประกอบต้นวิดเจ็ตของแอปพลิเคชันเป็นฉาก + 2. ประกอบต้นวิดเจ็ตของแอปพลิเคชันเป็นฉาก === เอนจิน (Engine) - + มีหน้าที่แปลงฉากเป็นรูปแบบแรสเตอร์ - + ให้การทำงานระดับต่ำของแกนกลางของ Flutter API (เช่น กราฟิก การจัดข้อความ และรันไทม์ + 1. มีหน้าที่แปลงฉากเป็นรูปแบบแรสเตอร์ + 2. ให้การทำงานระดับต่ำของแกนกลางของ Flutter API (เช่น กราฟิก การจัดข้อความ และรันไทม์ Dart) - + เปิดเผยฟังก์ชันระดับนี้ให้แก่เฟรมเวิร์กผ่าน API `dart:ui` - + บูรณาการกับแพลตฟอร์มต่าง ๆ ด้วย API ตัวฝังตัว + 3. เปิดเผยฟังก์ชันระดับนี้ให้แก่เฟรมเวิร์กผ่าน API `dart:ui` + 4. บูรณาการกับแพลตฟอร์มต่าง ๆ ด้วย API ตัวฝังตัว === ตัวฝังตัว (Embedder) - + ประสานงานกับระบบปฏิบัติการภายใต้สำหรับการเข้าถึงบริการต่าง ๆ เช่น พื้นผิวการเรนเดอร์ + 1. ประสานงานกับระบบปฏิบัติการภายใต้สำหรับการเข้าถึงบริการต่าง ๆ เช่น พื้นผิวการเรนเดอร์ การเข้าถึง และการป้อนข้อมูล - + จัดการลูปอิเวนต์ - + เปิดเผย API เฉพาะแพลตฟอร์มเพื่อบูรณาการตัวฝังตัวเข้าไปยังแอป + 2. จัดการลูปอิเวนต์ + 3. เปิดเผย API เฉพาะแพลตฟอร์มเพื่อบูรณาการตัวฝังตัวเข้าไปยังแอป === ตัวรัน (Runner) - + ประกอบชิ้นส่วนที่ถูกเปิดเผยโดยตัวฝังตัวเข้าเป็นแพคเกจแอปพลิเคชันที่สามารถใช้งานได้บนแพลตฟอร์มเป้าหมาย - + บางส่วนถูกสร้างขึ้นโดย `flutter create` และมีเจ้าของเป็นผู้พัฒนาแอป + 1. ประกอบชิ้นส่วนที่ถูกเปิดเผยโดยตัวฝังตัวเข้าเป็นแพคเกจแอปพลิเคชันที่สามารถใช้งานได้บนแพลตฟอร์มเป้าหมาย + 2. บางส่วนถูกสร้างขึ้นโดย `flutter create` และมีเจ้าของเป็นผู้พัฒนาแอป ] == ระบบการดีไซน์ @@ -146,7 +146,7 @@ Linux การใช้ตัวฝังตัว โค้ด Flutter สา #iii โดยใน Flutter แล้วนั้น ไม่รวมแพคเกจบุคคลที่สาม จะมีระบบการดีไซน์อยู่สองแบบคือ: #[ - #set enum(indent: 5.5em) + #set enum(indent: 4.10em) + Material Design คือการดีไซน์ของ Google สำหรับ Android + Cupertino Design คือการดีไซน์ของ Apple สำหรับ iOS ] @@ -182,7 +182,9 @@ Glass ในแอปพลิเคชัน Flutter จึงจำเป็ caption: [หน้าต่างเลือกสี], ) -#iii มีหลายที่ที่สามารถเปลี่ยนสถานะได้: กล่องสี, แถบเลื่อนเฉดสี, ​​ปุ่มตัวเลือก เมื่อผู้ใช้โต้ตอบกับ UI +#v(0.5em) + +#iii มีหลายที่ที่สามารถเปลี่ยนสถานะได้ กล่องสี, แถบเลื่อนเฉดสี, ​​ปุ่มตัวเลือก เมื่อผู้ใช้โต้ตอบกับ UI การเปลี่ยนแปลงจะต้องสะท้อนให้เห็นในทุกที่ ที่เลวร้ายยิ่งกว่านั้น เว้นแต่จะได้รับการดูแล การเปลี่ยนแปลงเล็กน้อยในส่วนใดส่วนหนึ่งของอินเทอร์เฟซผู้ใช้อาจทำให้เกิดเอฟเฟกต์คลื่นส่งผลกระทบกับโค้ดที่ดูเหมือนจะไม่เกี่ยวข้องกัน @@ -205,10 +207,7 @@ Glass ในแอปพลิเคชัน Flutter จึงจำเป็ การแปลงแผนผังหลายแผนผังของวัตถุให้เป็นแผนผังระดับล่างของวัตถุ และการแพร่กระจายการเปลี่ยนแปลงไปยังแผนผังวิดเจ็ตเหล่านี้ -#pagebreak() - -#iii วิดเจ็ตประกาศส่วนติดต่อผู้ใช้โดยการเขียนทับเมธอด `build()` ซึ่งเป็นฟังก์ชันที่แปลงสถานะเป็น -UI: +#iii วิดเจ็ตประกาศส่วนติดต่อผู้ใช้โดยการเขียนทับเมธอด `build()` ซึ่งเป็นฟังก์ชันที่แปลงสถานะเป็น UI #afigure( ``` @@ -222,7 +221,7 @@ UI: ทำให้เมธอดนั้นสามารถถูกเรียกใช้โดยเฟรมเวิร์กเมื่อไหร่ก็ได้ที่จำเป็น (เป็นไปได้ที่จะบ่อยมากและมีการเรียกใช้หนึ่งครั้งต่อหนึ่งเฟรม) -#iii วิธีนี้พึ่งพาลักษณะเฉพาะรันไทม์ภาษา (หากเจาะจงคือการสร้างและทำลายวัตถุอย่างรวดเร็ว) ซึ่ง +#iii วิธีนี้พึ่งพาลักษณะเฉพาะรันไทม์ภาษา (หากเจาะจงคือการสร้างและทำลายวัตถุอย่างรวดเร็ว)#jb ซึ่ง Dart นั้นเหมาะสำหรับงานนี้เป็นพิเศษ == ประวัติ diff --git a/Chapter2/Git.typ b/Chapter2/Git.typ index e5fd1c0..e272886 100644 --- a/Chapter2/Git.typ +++ b/Chapter2/Git.typ @@ -2,7 +2,7 @@ = Git -#i Git เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย ที่สามารถจัดการเวอร์ชันของซอร์สโคดหรือข้อมูลได้ +#h(1.7em) Git เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย ที่สามารถจัดการเวอร์ชันของซอร์สโคดหรือข้อมูลได้ มักใช้เพื่อควบคุมซอร์สโคดโดยโปรแกรมเมอร์ที่พัฒนาซอฟต์แวร์ร่วมกัน == Gitea diff --git a/Chapter2/HTTP.typ b/Chapter2/HTTP.typ index 2aa5847..53133a0 100644 --- a/Chapter2/HTTP.typ +++ b/Chapter2/HTTP.typ @@ -2,14 +2,14 @@ = เกณฑ์วิธีขนส่งข้อความหลายมิติ (HyperText Transfer Protocol; HTTP) -#i HTTP (Hypertext Transfer Protocol) เป็น โปรโตคอลชั้นแอปพลิเคชันในชุดโปรโตคอลอินเทอร์เน็ตสำหรับระบบข้อมูลไฮเปอร์มีเดียแบบกระจายและร่วมมือกัน HTTP เป็นรากฐานของการสื่อสารข้อมูลสำหรับ World Wide Web ซึ่งเอกสารไฮเปอร์เท็กซ์ รวมถึง ไฮเปอร์ลิงก์ไปยังทรัพยากรอื่น ๆ ที่ผู้ใช้สามารถเข้าถึงได้อย่างง่ายดาย เช่น โดยการคลิกเมาส์ หรือโดยการแตะหน้าจอในเว็บเบราว์เซอร์ +#h(1.7em) HTTP (Hypertext Transfer Protocol) เป็น โปรโตคอลชั้นแอปพลิเคชันในชุดโปรโตคอลอินเทอร์เน็ตสำหรับระบบข้อมูลไฮเปอร์มีเดียแบบกระจายและร่วมมือกัน HTTP เป็นรากฐานของการสื่อสารข้อมูลสำหรับ World Wide Web ซึ่งเอกสารไฮเปอร์เท็กซ์ รวมถึง ไฮเปอร์ลิงก์ไปยังทรัพยากรอื่น ๆ ที่ผู้ใช้สามารถเข้าถึงได้อย่างง่ายดาย เช่น โดยการคลิกเมาส์ หรือโดยการแตะหน้าจอในเว็บเบราว์เซอร์ -#i HTTP เป็น โปรโตคอลแบบคำขอ-การตอบกลับในโมเดลไคลเอนต์-เซิร์ฟเวอร์ ธุรกรรมเริ่มต้นเมื่อไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะพยายามตอบสนองคำขอและส่งการตอบกลับกลับไปยังไคลเอนต์ ซึ่งอธิบายการจัดการคำขอ และอาจมีทรัพยากรที่ร้องขอ เช่น เอกสาร HTML หรือเนื้อหาอื่น ๆ ก็ได้ +#h(1.7em) HTTP เป็น โปรโตคอลแบบคำขอ-การตอบกลับในโมเดลไคลเอนต์-เซิร์ฟเวอร์ ธุรกรรมเริ่มต้นเมื่อไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ เซิร์ฟเวอร์จะพยายามตอบสนองคำขอและส่งการตอบกลับกลับไปยังไคลเอนต์ ซึ่งอธิบายการจัดการคำขอ และอาจมีทรัพยากรที่ร้องขอ เช่น เอกสาร HTML หรือเนื้อหาอื่น ๆ ก็ได้ -#i ในสถานการณ์ทั่วไปเว็บเบราว์เซอร์ทำหน้าที่เป็นไคลเอนต์และเว็บเซิร์ฟเวอร์ที่โฮสต์เว็บไซต์หนึ่งเว็บไซต์หรือมากกว่านั้นคือ เซิร์ฟเวอร์ เว็บเบราว์เซอร์เป็นตัวอย่างของตัวแทนผู้ใช้ (UA) ตัวแทนผู้ใช้ประเภทอื่น ๆ ได้แก่ ซอฟต์แวร์จัดทำดัชนีที่ใช้โดยผู้ให้บริการค้นหา (เว็บครอว์เลอร์) เบราว์เซอร์เสียง แอปพลิเคชันมือถือ และซอฟต์แวร์อื่น ๆ ที่เข้าถึง ใช้ หรือแสดงเนื้อหาเว็บ +#h(1.7em) ในสถานการณ์ทั่วไปเว็บเบราว์เซอร์ทำหน้าที่เป็นไคลเอนต์และเว็บเซิร์ฟเวอร์ที่โฮสต์เว็บไซต์หนึ่งเว็บไซต์หรือมากกว่านั้นคือ เซิร์ฟเวอร์ เว็บเบราว์เซอร์เป็นตัวอย่างของตัวแทนผู้ใช้ (UA) ตัวแทนผู้ใช้ประเภทอื่น ๆ ได้แก่ ซอฟต์แวร์จัดทำดัชนีที่ใช้โดยผู้ให้บริการค้นหา (เว็บครอว์เลอร์) เบราว์เซอร์เสียง แอปพลิเคชันมือถือ และซอฟต์แวร์อื่น ๆ ที่เข้าถึง ใช้ หรือแสดงเนื้อหาเว็บ -#i HTTP ถูกออกแบบมาเพื่ออนุญาตให้องค์ประกอบเครือข่ายตัวกลางสามารถปรับปรุงหรือเปิดใช้งานการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ เว็บไซต์ที่มีปริมาณการใช้งานสูงมักได้รับประโยชน์จาก เซิร์ฟเวอร์ แคชเว็บที่ส่งเนื้อหาแทนเซิร์ฟเวอร์ต้นทางเพื่อปรับปรุงเวลาตอบสนอง เว็บเบราว์เซอร์จะแคชทรัพยากรเว็บที่เข้าถึงก่อนหน้านี้และนำกลับมาใช้ซ้ำทุกครั้งที่ทำได้เพื่อลดปริมาณการใช้งานเครือข่ายพร็อกซีเซิร์ฟเวอร์ HTTP ที่ ขอบเขต เครือข่ายส่วนตัวสามารถอำนวยความสะดวกในการสื่อสารสำหรับไคลเอนต์ที่ไม่มีที่อยู่ที่กำหนดเส้นทางได้ทั่วโลก โดยการส่งต่อข้อความไปยังเซิร์ฟเวอร์ภายนอก +#h(1.7em) HTTP ถูกออกแบบมาเพื่ออนุญาตให้องค์ประกอบเครือข่ายตัวกลางสามารถปรับปรุงหรือเปิดใช้งานการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ เว็บไซต์ที่มีปริมาณการใช้งานสูงมักได้รับประโยชน์จาก เซิร์ฟเวอร์ แคชเว็บที่ส่งเนื้อหาแทนเซิร์ฟเวอร์ต้นทางเพื่อปรับปรุงเวลาตอบสนอง เว็บเบราว์เซอร์จะแคชทรัพยากรเว็บที่เข้าถึงก่อนหน้านี้และนำกลับมาใช้ซ้ำทุกครั้งที่ทำได้เพื่อลดปริมาณการใช้งานเครือข่ายพร็อกซีเซิร์ฟเวอร์ HTTP ที่ ขอบเขต เครือข่ายส่วนตัวสามารถอำนวยความสะดวกในการสื่อสารสำหรับไคลเอนต์ที่ไม่มีที่อยู่ที่กำหนดเส้นทางได้ทั่วโลก โดยการส่งต่อข้อความไปยังเซิร์ฟเวอร์ภายนอก -#i เพื่ออนุญาตให้โหนด HTTP ตัวกลาง (พร็อกซีเซิร์ฟเวอร์ แคชเว็บ ฯลฯ) ทำหน้าที่ของตนได้ ส่วนหัว HTTP บางส่วน (พบในคำขอ/การตอบสนอง HTTP) จะได้รับการจัดการแบบฮอปต่อฮอปในขณะที่ส่วนหัว HTTP อื่นๆ จะได้รับการจัดการแบบต้นทางถึงปลายทาง (จัดการโดยไคลเอนต์ต้นทางและเว็บเซิร์ฟเวอร์เป้าหมายเท่านั้น) +#h(1.7em) เพื่ออนุญาตให้โหนด HTTP ตัวกลาง (พร็อกซีเซิร์ฟเวอร์ แคชเว็บ ฯลฯ) ทำหน้าที่ของตนได้ ส่วนหัว HTTP บางส่วน (พบในคำขอ/การตอบสนอง HTTP) จะได้รับการจัดการแบบฮอปต่อฮอปในขณะที่ส่วนหัว HTTP อื่นๆ จะได้รับการจัดการแบบต้นทางถึงปลายทาง (จัดการโดยไคลเอนต์ต้นทางและเว็บเซิร์ฟเวอร์เป้าหมายเท่านั้น) -#i ทรัพยากรบนเว็บจะถูกระบุตำแหน่งโดยตัวระบุทรัพยากรแบบสากล (URL) โดยใช้รูปแบบ Uniform Resource Identifier (URI) _http_ และ _https_ โดย URI จะถูกเข้ารหัสเป็นไฮเปอร์ลิงก์ในเอกสาร HTML เพื่อสร้างเอกสารไฮเปอร์เท็กซ์ที่เชื่อมโยงกัน +#h(1.7em) ทรัพยากรบนเว็บจะถูกระบุตำแหน่งโดยตัวระบุทรัพยากรแบบสากล (URL) โดยใช้รูปแบบ Uniform Resource Identifier (URI) _http_ และ _https_ โดย URI จะถูกเข้ารหัสเป็นไฮเปอร์ลิงก์ในเอกสาร HTML เพื่อสร้างเอกสารไฮเปอร์เท็กซ์ที่เชื่อมโยงกัน diff --git a/Chapter2/HTTPS.typ b/Chapter2/HTTPS.typ index 165825b..0041b59 100644 --- a/Chapter2/HTTPS.typ +++ b/Chapter2/HTTPS.typ @@ -2,14 +2,15 @@ = เกณฑ์วิธีขนส่งข้อความหลายมิติแบบมั่นคง (Hypertext Transfer Protocol Secure; HTTPS) -#i เกณฑ์วิธีขนส่งข้อความหลายมิติแบบมั่นคง (Hypertext Transfer Protocol Secure; HTTPS) -คือส่วนต่อขยายของโปรโตคอลเกณฑ์วิธีขนส่งข้อความหลายมิติ (Hypertext Transfer Protocol; HTTP) -ซึ่งใช้การเข้ารหัสเพื่อการสื่อสารที่ปลอดภัยผ่านเครือข่ายคอมพิวเตอร์ และถูกใช้อย่างแพร่หลายบนอินเทอร์เน็ต -โดยโปรโตคอลเครือข่าย HTTPS จะถูกเข้ารหัสด้วยเกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer -Security; TLS) หรือก่อนหน้านี้คือเกณฑ์วิธีชั้นซ็อกเก็ตปลอดภัย (Secure Sockets Layer; SSL) -ด้วยเหตุนั้น โปรโตคอลนี้สามารถเรียกด้วยชื่อ HTTP over TLS หรือ HTTP over SSL ได้เช่นกัน +#h(1.7em) เกณฑ์วิธีขนส่งข้อความหลายมิติแบบมั่นคง (Hypertext Transfer Protocol Secure; +HTTPS) คือส่วนต่อขยายของโปรโตคอลเกณฑ์วิธีขนส่งข้อความหลายมิติ (Hypertext Transfer +Protocol; HTTP) ซึ่งใช้การเข้ารหัสเพื่อการสื่อสารที่ปลอดภัยผ่านเครือข่ายคอมพิวเตอร์ +และถูกใช้อย่างแพร่หลายบนอินเทอร์เน็ต โดยโปรโตคอลเครือข่าย HTTPS +จะถูกเข้ารหัสด้วยเกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer Security; TLS) +หรือก่อนหน้านี้คือเกณฑ์วิธีชั้นซ็อกเก็ตปลอดภัย (Secure Sockets Layer; SSL) ด้วยเหตุนั้น +โปรโตคอลนี้สามารถเรียกด้วยชื่อ HTTP over TLS หรือ HTTP over SSL ได้เช่นกัน -#i แรงจูงใจหลักของ HTTPS คือการยืนยันตัวตนของเว็บไซต์ที่เข้าถึง +#h(1.7em) แรงจูงใจหลักของ HTTPS คือการยืนยันตัวตนของเว็บไซต์ที่เข้าถึง และการปกป้องความเป็นส่วนตัวและความสมบูรณ์ของข้อมูลที่แลกเปลี่ยนระหว่างการรับส่งข้อมูล HTTPS ป้องกันการโจมตีแบบ man-in-the-middle และการเข้ารหัสบล็อกไซเฟอร์แบบสองทิศทางในการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์ @@ -109,10 +110,9 @@ QUIC) ซึ่งเป็น HTTP เวอร์ชันใหม่ที คุกกี้บนเว็บไซต์ที่รันผ่าน HTTPS จะต้องเปิดใช้งานแอตทริบิวต์ secure ในเว็บไซต์ที่มีข้อมูลละเอียดอ่อน ผู้ใช้และเซสชันจะถูกเปิดเผยทุกครั้งที่เข้าถึงเว็บไซต์นั้นด้วย HTTP แทนที่จะเป็น HTTPS -#v(1em) +#pagebreak() == รายละเอียดทางเทคนิค -#v(1em) === ความแตกต่างจาก HTTP @@ -146,47 +146,49 @@ HTTP เริ่มต้นด้วย "http://" และใช้พอร โดยทั่วไปเว็บเบราว์เซอร์จะเผยแพร่รายชื่อใบรับรองการลงนามของผู้ออกใบรับรองหลักๆ เพื่อให้สามารถตรวจสอบใบรับรองที่ลงนามโดยผู้ออกใบรับรองเหล่านั้นได้ -==== การขอใบรับรอง +#iiii 1) การขอใบรับรอง -#iiiii มีผู้ให้บริการออกใบรับรองเชิงพาณิชย์จำนวนหนึ่งที่เสนอใบรับรอง SSL/TLS +#h(8.7em) มีผู้ให้บริการออกใบรับรองเชิงพาณิชย์จำนวนหนึ่งที่เสนอใบรับรอง SSL/TLS แบบชำระเงินหลายประเภท รวมถึงใบรับรองการตรวจสอบขยาย -#iiiii Let's Encrypt เปิดตัวในเดือนเมษายน 2559 ให้บริการใบรับรอง#jb SSL/TLS +#h(8.7em) Let's Encrypt เปิดตัวในเดือนเมษายน 2559 ให้บริการใบรับรอง SSL/TLS พื้นฐานแบบอัตโนมัติฟรีแก่เว็บไซต์ มูลนิธิ Electronic Frontier Foundation ระบุว่า Let's Encrypt จะทำให้การเปลี่ยนจาก HTTP เป็น HTTPS "ง่ายดายเพียงแค่ออกคำสั่งหรือคลิกปุ่ม" ปัจจุบันผู้ให้บริการเว็บโฮสต์และผู้ให้บริการคลาวด์ส่วนใหญ่ใช้ประโยชน์จาก Let's Encrypt เพื่อมอบใบรับรองฟรีให้กับลูกค้า -==== ใช้เป็นการควบคุมการเข้าถึง +#pagebreak() -#iiiii +#iiii 2) ใช้เป็นการควบคุมการเข้าถึง + +#h(8.7em) ระบบนี้ยังสามารถใช้สำหรับการตรวจสอบสิทธิ์ไคลเอ็นต์เพื่อจำกัดการเข้าถึงเว็บเซิร์ฟเวอร์เฉพาะผู้ใช้ที่ได้รับอนุญาตเท่านั้น ในการดำเนินการนี้ ผู้ดูแลระบบเว็บไซต์มักจะสร้างใบรับรองสำหรับผู้ใช้แต่ละราย ซึ่งผู้ใช้จะโหลดใบรับรองลงในเบราว์เซอร์ โดยปกติใบรับรองจะมีชื่อและที่อยู่อีเมลของผู้ใช้ที่ได้รับอนุญาต และจะถูกตรวจสอบโดยเซิร์ฟเวอร์โดยอัตโนมัติในแต่ละการเชื่อมต่อเพื่อยืนยันตัวตนของผู้ใช้ ซึ่งอาจไม่จำเป็นต้องใช้รหัสผ่านด้วยซ้ำ -==== ในกรณีที่คีย์ลับถูกบุกรุก +#iiii 3) ในกรณีที่คีย์ลับถูกบุกรุก -#iiiii คุณสมบัติที่สำคัญในบริบทนี้คือการเข้ารหัสแบบส่งต่อที่สมบูรณ์แบบ (PFS) +#h(8.7em) คุณสมบัติที่สำคัญในบริบทนี้คือการเข้ารหัสแบบส่งต่อที่สมบูรณ์แบบ (PFS) การมีคีย์ลับแบบอสมมาตรระยะยาวตัวใดตัวหนึ่งที่ใช้สร้างเซสชัน HTTPS ไม่น่าจะทำให้การได้มาซึ่งคีย์เซสชันระยะสั้นเพื่อถอดรหัสการสนทนาทำได้ง่ายขึ้น แม้ในภายหลังก็ตาม ในปี 2013 มีเพียงการแลกเปลี่ยนคีย์ Diffie--Hellman (DHE) และการแลกเปลี่ยนคีย์ Diffie--Hellman -แบบเส้นโค้งวงรี (ECDHE) เท่านั้นที่ทราบว่ามีคุณสมบัตินี้ ในปี 2013 มีเพียง 30% ของเซสชัน Firefox, -Opera และ Chromium Browser เท่านั้นที่ใช้คุณสมบัตินี้ และเกือบ 0% ของเซสชัน Safari และ -Microsoft Internet Explorer ของ Apple ที่ใช้คุณสมบัตินี้ TLS 1.3 ซึ่งเผยแพร่ในเดือนสิงหาคม -2018 ได้ยกเลิกการสนับสนุนการเข้ารหัสแบบไม่มีการเข้ารหัสแบบส่งต่อ ณ เดือนกุมภาพันธ์ พ.ศ. 2562 -เว็บเซิร์ฟเวอร์ที่สำรวจ 96.6% รองรับการรักษาความลับแบบ Forward ในรูปแบบใดรูปแบบหนึ่ง และ -52.1% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่ ณ เดือนกรกฎาคม พ.ศ. 2566 -เว็บเซิร์ฟเวอร์ที่สำรวจ 99.6% รองรับการรักษาความลับแบบ Forward ในรูปแบบใดรูปแบบหนึ่ง และ -75.2% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่ +แบบเส้นโค้งวงรี#jb (ECDHE) เท่านั้นที่ทราบว่ามีคุณสมบัตินี้ ในปี 2013 มีเพียง 30% ของเซสชัน +Firefox, Opera และ#jb Chromium Browser เท่านั้นที่ใช้คุณสมบัตินี้ และเกือบ 0% ของเซสชัน +Safari และ Microsoft Internet Explorer ของ Apple ที่ใช้คุณสมบัตินี้ TLS 1.3 +ซึ่งเผยแพร่ในเดือนสิงหาคม 2018 ได้ยกเลิกการสนับสนุนการเข้ารหัสแบบไม่มีการเข้ารหัสแบบส่งต่อ ณ +เดือนกุมภาพันธ์ พ.ศ. 2562 เว็บเซิร์ฟเวอร์ที่สำรวจ 96.6% รองรับการรักษาความลับแบบ Forward +ในรูปแบบใดรูปแบบหนึ่ง และ 52.1% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่ ณ +เดือนกรกฎาคม พ.ศ. 2566 เว็บเซิร์ฟเวอร์ที่สำรวจ 99.6% รองรับการรักษาความลับแบบ Forward +ในรูปแบบใดรูปแบบหนึ่ง และ 75.2% จะใช้การรักษาความลับแบบ Forward กับเบราว์เซอร์ส่วนใหญ่ -===== การเพิกถอนใบรับรอง +#iiii 4) การเพิกถอนใบรับรอง -#iiiiii ใบรับรองอาจถูกเพิกถอนก่อนหมดอายุได้ เช่น เนื่องจากความลับของคีย์ส่วนตัวถูกละเมิด -เบราว์เซอร์ยอดนิยมเวอร์ชันที่ใหม่พอเช่น Firefox Opera และ#jb Internet Explorer บน Windows +#h(8.7em) ใบรับรองอาจถูกเพิกถอนก่อนหมดอายุได้ เช่น เนื่องจากความลับของคีย์ส่วนตัวถูกละเมิด +เบราว์เซอร์ยอดนิยมเวอร์ชันที่ใหม่พอเช่น Firefox Opera และ Internet Explorer บน Windows Vista จะใช้ Online Certificate Status Protocol (OCSP) เพื่อตรวจสอบว่าไม่เป็นเช่นนั้น -เบราว์เซอร์จะส่งหมายเลขซีเรียลของใบรับรองไปยังผู้ออกใบรับรองหรือผู้แทนผ่าน OCSP +เบราว์เซอร์จะส่งหมายเลขซีเรียลของใบรับรองไปยังผู้ออกใบรับรองหรือผู้แทนผ่าน#jb OCSP และผู้ออกใบรับรองจะตอบกลับ โดยแจ้งให้เบราว์เซอร์ทราบว่าใบรับรองยังคงใช้ได้อยู่หรือไม่ นอกจากนี้ CA อาจออกรายการเพิกถอนใบรับรอง (Certificate Revocation List; CRL) เพื่อแจ้งให้ผู้ใช้ทราบว่าใบรับรองเหล่านี้ถูกเพิกถอนแล้ว อย่างไรก็ตาม CRL ไม่จำเป็นสำหรับฟอรัม diff --git a/Chapter2/Intro.typ b/Chapter2/Intro.typ index 0ae73c4..3aa8cb8 100644 --- a/Chapter2/Intro.typ +++ b/Chapter2/Intro.typ @@ -24,25 +24,25 @@ == ไมโครคอนโทรเลอร์ (Microcontroller) -#i ไมโครคอนโทรลเลอร์ (Microcontroller, MC, uC, หรือ #(sym.mu)C) +#h(1.7em) ไมโครคอนโทรลเลอร์ (Microcontroller, MC, uC, หรือ #(sym.mu)C) หรือหน่วยไมโครคอนโทรลเลอร์ (Microcontroller Unit; MCU) เป็นคอมพิวเตอร์ขนาดเล็กบนวงจรรวมเดียว (Integrated Circuit; IC) โดยไมโครคอนโทรลเลอร์ประกอบด้วยแกนประมวลผลหนึ่งแกนหรือมากกว่า พร้อมด้วยหน่วยความจำและอุปกรณ์ต่อพ่วงอินพุต/เอาต์พุตที่ตั้งโปรแกรมได้ หน่วยความจำโปรแกรมในรูปแบบของ NOR flash, OTP ROM, หรือ ferroelectric RAM -มักจะถูกรวมไว้ในชิปด้วยเช่นกัน รวมถึง RAM จำนวนเล็กน้อย +มักจะถูกรวมไว้ในชิปด้วยเช่นกัน รวมถึง RAM จำนวนเล็กน้อย#jb ไมโครคอนโทรลเลอร์ได้รับการออกแบบมาสำหรับการใช้งานแบบฝังตัว ซึ่งแตกต่างจากไมโครโปรเซสเซอร์ที่ใช้ในคอมพิวเตอร์ส่วนบุคคลหรือแอปพลิเคชันทั่วไปอื่น ๆ ที่ประกอบด้วยชิปแยกชิ้นต่าง ๆ -#i ในศัพท์สมัยใหม่ ไมโครคอนโทรลเลอร์นั้นคล้ายคลึงกับระบบบนชิป (System on a chip; SoC) -แต่มีความซับซ้อนน้อยกว่า SoC อาจมีไมโครคอนโทรลเลอร์เป็นส่วนประกอบหนึ่ง +#h(1.7em) ในศัพท์สมัยใหม่ ไมโครคอนโทรลเลอร์นั้นคล้ายคลึงกับระบบบนชิป (System on a chip; +SoC) แต่มีความซับซ้อนน้อยกว่า SoC อาจมีไมโครคอนโทรลเลอร์เป็นส่วนประกอบหนึ่ง แต่โดยทั่วไปแล้วจะรวมเข้ากับอุปกรณ์ต่อพ่วงขั้นสูง เช่น หน่วยประมวลผลกราฟิก (GPU) โมดูล Wi-Fi หรือตัวประมวลผลร่วม (coprocessor) อย่างน้อยหนึ่งตัว -#i ไมโครคอนโทรลเลอร์ถูกนำไปใช้ในผลิตภัณฑ์และอุปกรณ์ควบคุมอัตโนมัติ เช่น +#h(1.7em) ไมโครคอนโทรลเลอร์ถูกนำไปใช้ในผลิตภัณฑ์และอุปกรณ์ควบคุมอัตโนมัติ เช่น ระบบควบคุมเครื่องยนต์รถยนต์ อุปกรณ์ทางการแพทย์ที่ฝังในร่างกาย รีโมทคอนโทรล เครื่องใช้สำนักงาน -เครื่องใช้ไฟฟ้า เครื่องมือไฟฟ้า ของเล่น และระบบฝังตัวอื่น ๆ +เครื่องใช้ไฟฟ้า#jb เครื่องมือไฟฟ้า ของเล่น และระบบฝังตัวอื่น ๆ การลดขนาดและต้นทุนเมื่อเทียบกับการออกแบบที่ใช้ไมโครโปรเซสเซอร์ หน่วยความจำ และอุปกรณ์อินพุต/เอาต์พุตแยกต่างหาก ทำให้การควบคุมแบบดิจิทัลสำหรับอุปกรณ์และกระบวนการต่าง ๆ เป็นไปได้มากขึ้น ไมโครคอนโทรลเลอร์แบบผสมสัญญาณเป็นที่นิยม diff --git a/Chapter2/Microcontroller.typ b/Chapter2/Microcontroller.typ index e2ac994..1f1c9c9 100644 --- a/Chapter2/Microcontroller.typ +++ b/Chapter2/Microcontroller.typ @@ -3,8 +3,8 @@ ในบริบทของ Internet of Things (IoT) ไมโครคอนโทรลเลอร์เป็นวิธีการรวบรวมข้อมูล การตรวจจับ และการกระตุ้นโลกทางกายภาพในฐานะอุปกรณ์ปลายทางที่มีราคาประหยัดและเป็นที่นิยม -#i ไมโครคอนโทรลเลอร์บางตัวอาจใช้คำแบบสี่บิตและทำงานที่ความถี่ต่ำถึง 4 kHz เพื่อการใช้พลังงานต่ำ -(มิลลิวัตต์หรือไมโครวัตต์หลักเดียว) โดยทั่วไปแล้ว +#h(1.7em) ไมโครคอนโทรลเลอร์บางตัวอาจใช้คำแบบสี่บิตและทำงานที่ความถี่ต่ำถึง 4 kHz +เพื่อการใช้พลังงานต่ำ (มิลลิวัตต์หรือไมโครวัตต์หลักเดียว) โดยทั่วไปแล้ว ไมโครคอนโทรลเลอร์เหล่านี้สามารถคงการทำงานไว้ได้ในขณะที่รอเหตุการณ์ เช่น การกดปุ่มหรือการขัดจังหวะอื่นๆ การใช้พลังงานขณะอยู่ในโหมดสลีป (โดยที่นาฬิกา CPU และอุปกรณ์ต่อพ่วงส่วนใหญ่ปิดอยู่) อาจอยู่ที่ระดับนาโนวัตต์เท่านั้น#jb @@ -164,7 +164,7 @@ IBM อ้างสิทธิ์ก่อนหน้านี้ คอมพ #iii ณ ปี 2008 มีผู้ขายและสถาปัตยกรรมไมโครคอนโทรลเลอร์จำนวนมาก รวมไปถึง:#jb #[ - #set enum(indent: 5.5em) + #set enum(indent: 4.1em) 1. หน่วยประมวลผล ARM core โดยเฉพาะคอร์ประเภท ARM Cortex-M 2. Microchip Technology Atmel AVR (8 บิต), AVR32 (32 บิต), และ AT91SAM (32 บิต) 3. คอร์ M8C ของ Cypress Semiconductor's ที่ถูกใช้ใน Cypress PSoC ของพวกเขา @@ -193,7 +193,7 @@ IBM อ้างสิทธิ์ก่อนหน้านี้ คอมพ 19. Toshiba TLCS-870 (8 บิต/16 บิต) ] -#iiii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก +#iii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก หรือเหมือนกับหน่วยประมวลผลเฉพาะแอปพลิเคชันมากกว่าไมโครคอนโทรลเลอร์ ตลาดไมโครคอนโทรลเลอร์นั้นกระจัดกระจายเป็นอย่างมาก และมีผู้ขาย เทคโนโลยี และตลาดมากมาย และผู้ขายจำนวนมากขายหลายสถาปัตยกรรม @@ -207,16 +207,16 @@ dual-core หรือไมโครโปรเซสเซอร์ RISC-V ยังรวมส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF เครื่องขยายกำลัง เครื่องรับสัญญาณรบกวนต่ำ ตัวกรอง และโมดูลการจัดการพลังงาน +#v(0.5em) + #afigure( - image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 2in), + image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 1.5in), alt: "บอร์ดสีดำ มีพิน GPIO ด้านข้างและมีชิพอยู่บริเวณด้านบนบอร์ด", attr: [Popolon, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=112634884], caption: [บอร์ด NodeMCU ที่มี ESP32-C3-32S], ) -#v(0.5em) - #iii โดยทั่วไปแล้ว ESP32 จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์หรือนำเสนอเป็นส่วนหนึ่งของชุดการพัฒนาที่มีพินและตัวเชื่อมต่อ GPIO ที่หลากหลาย โดยมีการกำหนดค่าที่แตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ได้รับการออกแบบโดย Espressif @@ -267,7 +267,7 @@ things (IoT) #iiii Type คือ ประเภทของพาร์ทิชัน สามารถเป็น data หรือ app ได้ #[ - #set enum(indent: 9.25em) + #set enum(indent: 7.55em) + app คือพาร์ทิชันที่ใช้ในการเก็บแอปพลิเคชัน + data คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป ] @@ -277,10 +277,10 @@ things (IoT) #iiii SubType คือ ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน data และ app #[ - #set enum(indent: 9.25em) + #set enum(indent: 7.55em) 1. data #listy( - indent: 10.75em, + indent: 8.8em, numbering: thai-numbering, [ota คือ พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update) โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB @@ -308,7 +308,7 @@ things (IoT) ) 2. app #listy( - indent: 10.75em, + indent: 8.8em, numbering: thai-numbering, [factory คือ พาร์ทิชันเก็บแอปพลิเคชันเริ่มต้น โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอปพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน diff --git a/Chapter2/NFC.typ b/Chapter2/NFC.typ index cd84cf2..a227547 100644 --- a/Chapter2/NFC.typ +++ b/Chapter2/NFC.typ @@ -2,7 +2,7 @@ = การสื่อสารสนามใกล้ (Near-field communication; NFC) -#i การสื่อสารแบบใกล้สนาม (NFC) +#h(1.7em) การสื่อสารแบบใกล้สนาม (NFC) คือชุดโปรโตคอลการสื่อสารที่ทำให้สามารถสื่อสารระหว่างอุปกรณ์อิเล็กทรอนิกส์สองเครื่องในระยะทาง 4 ซม. (#math.equation(alt: "1 เศษ 1 ส่วน 2", $1 1/2$) นิ้ว) หรือน้อยกว่า NFC นำเสนอการเชื่อมต่อความเร็วต่ำผ่านการตั้งค่าที่ง่ายดายซึ่งสามารถใช้สำหรับการบูตสแตรปของการเชื่อมต่อไร้สายที่สามารถใช้งานได้เช่นเดียวกับเทคโนโลยีการ์ดระยะใกล้อื่นๆ @@ -11,12 +11,12 @@ NFC มีพื้นฐานมาจากการเชื่อมต่ ISM ที่ไม่มีใบอนุญาต ซึ่งใช้กันทั่วโลก สอดคล้องกับมาตรฐานอินเทอร์เฟซทางอากาศ ISO/IEC 18000-3 ที่อัตราข้อมูลตั้งแต่ 106 ถึง 848 กิโลบิต/วินาที -#i ฟอรัม NFC +#h(1.7em) ฟอรัม NFC ได้ช่วยกำหนดและส่งเสริมเทคโนโลยีโดยกำหนดมาตรฐานสำหรับการรับรองการปฏิบัติตามข้อกำหนดของอุปกรณ์การสื่อสารที่ปลอดภัยสามารถทำได้โดยใช้ขั้นตอนวิธีการเข้ารหัสเช่นเดียวกับที่ใช้กับบัตรเครดิตและหากตรงตามเกณฑ์สำหรับการพิจารณาให้เป็นเครือข่ายพื้นที่ส่วนบุคคล == มาตราฐาน NFC -#iii มาตรฐาน NFC ครอบคลุมโปรโตคอลการสื่อสารและรูปแบบการแลกเปลี่ยนข้อมูล +#h(4.2em) มาตรฐาน NFC ครอบคลุมโปรโตคอลการสื่อสารและรูปแบบการแลกเปลี่ยนข้อมูล และอิงตามมาตรฐานการระบุด้วยคลื่นความถี่วิทยุ (RFID) ที่มีอยู่ รวมถึง ISO/IEC 14443 และ FeliCa มาตรฐานเหล่านี้รวมถึง ISO/IEC 18092 และมาตรฐานที่กำหนดโดย NFC Forum นอกจาก NFC Forum แล้วกลุ่ม GSMA ยังได้กำหนดแพลตฟอร์มสำหรับการปรับใช้มาตรฐาน NFC ของ GSMA ภายในโทรศัพท์มือถือ @@ -26,19 +26,20 @@ ISM ที่ไม่มีใบอนุญาต ซึ่งใช้กั เพื่ออ่านแท็กอิเล็กทรอนิกส์หรือชำระเงินเมื่อเชื่อมต่อกับระบบที่รองรับ NFC สิ่งเหล่านี้เป็นมาตรฐานของโปรโตคอล NFC แทนที่เทคโนโลยีที่เป็นกรรมสิทธิ์ที่ใช้ในระบบก่อนหน้านี้ -#iii โปรแกรมอนุญาตสิทธิ์สิทธิบัตรสำหรับ NFC กำลังอยู่ระหว่างการใช้งานโดย France Brevets +#h(4.2em) โปรแกรมอนุญาตสิทธิ์สิทธิบัตรสำหรับ NFC กำลังอยู่ระหว่างการใช้งานโดย France Brevets ซึ่งเป็นกองทุนสิทธิบัตรที่จัดตั้งขึ้นในปี 2011 โปรแกรมนี้อยู่ระหว่างการพัฒนาโดย Via Licensing Corporation ซึ่งเป็นบริษัทสาขาอิสระของ Dolby Laboratories และยุติลงในเดือน#jb พฤษภาคม 2012 ไลบรารี NFC แบบโอเพนซอร์สและอิสระต่อแพลตฟอร์ม libnfc มีให้บริการภายใต้ใบอนุญาต GNU Lesser General Public License (LGPL) -#iii แอปพลิเคชันปัจจุบันและที่คาดว่าจะมีในอนาคต ได้แก่ ธุรกรรมแบบไร้สัมผัส การแลกเปลี่ยนข้อมูล +#h(4.2em) แอปพลิเคชันปัจจุบันและที่คาดว่าจะมีในอนาคต ได้แก่ ธุรกรรมแบบไร้สัมผัส การแลกเปลี่ยนข้อมูล และการตั้งค่าการสื่อสารที่ซับซ้อนมากขึ้น เช่น Wi-Fi ที่ง่าย ขึ้นนอกจากนี้เมื่ออุปกรณ์ที่เชื่อมต่อเครื่องหนึ่งมีการเชื่อมต่ออินเทอร์เน็ตอีกเครื่องหนึ่งก็สามารถแลกเปลี่ยนข้อมูลกับบริการออนไลน์ได้ == ออกแบบ -#iii NFC เป็นชุดเทคโนโลยีไร้สายระยะสั้น โดยทั่วไปต้องมีระยะห่าง 10 ซม. (#math.equation( +#h(4.2em) NFC เป็นชุดเทคโนโลยีไร้สายระยะสั้น โดยทั่วไปต้องมีระยะห่าง 10 ซม. +(#math.equation( alt: "3 เศษ 7 ส่วน 8", $3 7/8$, ) นิ้ว) หรือน้อยกว่า NFC ทำงานที่ความถี่ 13.56 MHz บนอินเทอร์เฟซทางอากาศ ISO/IEC 18000-3 @@ -47,14 +48,14 @@ Lesser General Public License (LGPL) มีรูปแบบที่เรียบง่ายมาก เช่น แท็ก สติกเกอร์ พวงกุญแจ หรือการ์ดที่ไม่ได้รับพลังงานการสื่อสารแบบเพียร์ทูเพียร์ของ NFC สามารถทำได้หากอุปกรณ์ทั้งสองมีพลังงาน -#iii แท็ก NFC มีข้อมูลและโดยทั่วไปเป็นแบบอ่านอย่างเดียว แต่อาจเขียนได้ +#h(4.2em) แท็ก NFC มีข้อมูลและโดยทั่วไปเป็นแบบอ่านอย่างเดียว แต่อาจเขียนได้ ผู้ผลิตสามารถกำหนดรหัสเองได้ หรือใช้ข้อกำหนดของ NFC Forum แท็กสามารถจัดเก็บข้อมูลส่วนบุคคลอย่างปลอดภัย เช่น ข้อมูลบัตรเดบิตและบัตรเครดิต ข้อมูลโปรแกรมสะสมคะแนน รหัส PIN และรายชื่อผู้ติดต่อในเครือข่าย รวมถึงข้อมูลอื่นๆ NFC Forum กำหนดแท็กห้าประเภทที่มีความเร็วและความสามารถในการสื่อสารที่แตกต่างกันในแง่ของความสามารถในการกำหนดค่าหน่วยความจำ ความปลอดภัยการเก็บข้อมูลและความทนทานต่อการเขียน -#iii เช่นเดียวกับ เทคโนโลยี การ์ดแบบ Proximity NFC +#h(4.2em) เช่นเดียวกับ เทคโนโลยี การ์ดแบบ Proximity NFC ใช้การเชื่อมต่อแบบเหนี่ยวนำระหว่างเสาอากาศแบบวงสองต้นที่อยู่ใกล้เคียงกัน ซึ่งก่อตัวเป็นหม้อแปลงแกนอากาศได้อย่างมีประสิทธิภาพเนื่องจากระยะทางที่เกี่ยวข้องนั้นน้อยมากเมื่อเทียบกับความยาวคลื่นของรังสีแม่เหล็กไฟฟ้า (คลื่นวิทยุ) ของความถี่นั้น (ประมาณ 22 เมตร) ปฏิสัมพันธ์นี้จึงถูกเรียกว่า สนามแม่เหล็กใกล้ (Near @@ -66,8 +67,9 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็ 13.56 MHz พลังงาน RF ส่วนใหญ่กระจุกตัวอยู่ในแบนด์วิดท์ ±7 kHz ที่จัดสรรให้กับย่านความถี่นั้น แต่ ความกว้างสเปกตรัมของการแผ่รังสีอาจกว้างได้ถึง 1.8 MHz เพื่อรองรับอัตราข้อมูลสูง -#iii ระยะการทำงานด้วยเสาอากาศมาตรฐานขนาดกะทัดรัดและระดับพลังงานที่สมจริงอาจสูงถึงประมาณ 20 -ซม. (#math.equation(alt: "7 เศษ 7 ส่วน 8", $7 7/8$) นิ้ว) (แต่ในทางปฏิบัติ +#h(4.2em) +ระยะการทำงานด้วยเสาอากาศมาตรฐานขนาดกะทัดรัดและระดับพลังงานที่สมจริงอาจสูงถึงประมาณ 20 ซม. +(#math.equation(alt: "7 เศษ 7 ส่วน 8", $7 7/8$) นิ้ว) (แต่ในทางปฏิบัติ ระยะการทำงานไม่ควรเกิน 10 ซม. หรือ #math.equation(alt: "3 เศษ 7 ส่วน 8", $3 7/8$) นิ้ว) โปรดทราบว่าเนื่องจากเสาอากาศรับสัญญาณอาจถูกดับในกระแสวนโดยพื้นผิวโลหะที่อยู่ใกล้เคียง แท็กอาจต้องแยกออกจากพื้นผิวดังกล่าวอย่างน้อยที่สุด @@ -77,7 +79,7 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็ การสื่อสารเกิดขึ้นระหว่างอุปกรณ์ "ตัวเริ่มต้น" ที่ใช้งานอยู่และอุปกรณ์เป้าหมาย ซึ่งอาจเป็น #[ - #set enum(indent: 5.5em) + #set enum(indent: 4.2em) 1. พาสซีฟ โดยอุปกรณ์ตัวเริ่มต้นจะทำหน้าที่เป็นสนามแม่เหล็กพาหะ และอุปกรณ์เป้าหมายจะสื่อสารโดยการปรับสนามแม่เหล็กตกกระทบ ในโหมดนี้ อุปกรณ์เป้าหมายอาจดึงพลังงานจากสนามแม่เหล็กที่ตัวเริ่มต้นจัดหาให้ @@ -97,7 +99,7 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็ caption: [การเทียบความเร็วและวิธีการสื่อสารที่ใช้], ) -#iii NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล +#h(4.2em) NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล หากอุปกรณ์ที่ใช้งานอยู่ถ่ายโอนข้อมูลที่ความเร็ว 106 กิโลบิต/วินาที จะใช้การเข้ารหัสแบบมิลเลอร์ที่ปรับเปลี่ยนแล้วพร้อมการมอดูเลต 100 เปอร์เซ็นต์ในกรณีอื่นๆทั้งหมดจะใช้การเข้ารหัสแบบแมนเชสเตอร์โดยมีอัตราการมอดูเลต 10 เปอร์เซ็นต์ @@ -105,18 +107,18 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็ #iii อุปกรณ์ NFC ที่ใช้งานอยู่ทุกเครื่องสามารถทำงานในโหมดใดโหมดหนึ่งหรือหลายโหมดได้ #[ - #set enum(indent: 5.5em) - + การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด + #set enum(indent: 4.1em) + 1. การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด ช่วยให้ผู้ใช้ทำธุรกรรมต่างๆ เช่น การชำระเงินหรือการออกตั๋วได้ ดูการจำลองการ์ดโฮสต์ - + เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC + 2. เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้ - + NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC + 3. NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ ] -แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb +#iii แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb โดยทั่วไปจะมีข้อมูล (ณ ปี 2015 มีขนาดระหว่าง 96 ถึง 8,192 ไบต์) และเป็นแบบอ่านอย่างเดียวในการใช้งานปกติ แต่อาจเขียนซ้ำได้ การใช้งานรวมถึงการจัดเก็บข้อมูลส่วนบุคคลที่ปลอดภัย (เช่นข้อมูล บัตร -เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)\ แท็ก NFC -สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม +เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)#jb แท็ก +NFC สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม diff --git a/Chapter2/PIR.typ b/Chapter2/PIR.typ index 8a08c80..c6e2e69 100644 --- a/Chapter2/PIR.typ +++ b/Chapter2/PIR.typ @@ -19,6 +19,8 @@ PIR เซ็นเซอร์ PIR มักใช้ในสัญญาณ caption: [เครื่องตรวจจับการเคลื่อนไหวแบบ PIR ทั่วไปสำหรับที่พักอาศัย/เชิงพาณิชย์], ) +#v(0.5em) + #iii เซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว#jb ดังนั้น จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR" หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสซีฟ" เซ็นเซอร์ PIR @@ -117,7 +119,7 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก == การออกแบบผลิตภัณฑ์ #afigure( - image("PIR/PIR_Motion_Sensor-Sensinova_(SN-PR11).png", height: image-height), + image("PIR/PIR_Motion_Sensor-Sensinova_(SN-PR11).png", height: 1.75in), attr: [Versatile Techno - http://www.sensinova.in/pir-motion-sensor/SNPR11.php, CC BY-SA 4.0, https://commons.wikimedia.org/w/index.php?curid=48377787], @@ -125,6 +127,8 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก caption: [การออกแบบเซ็นเซอร์ตรวจจับการเคลื่อนไหว PIR], ) +#v(1em) + #iiii โดยทั่วไปเซ็นเซอร์ PIR จะติดตั้งอยู่บนแผงวงจรพิมพ์ซึ่งมีอุปกรณ์อิเล็กทรอนิกส์ที่จำเป็นสำหรับการตีความสัญญาณจากตัวเซ็นเซอร์เอง โดยทั่วไปแล้วชุดประกอบทั้งหมดจะบรรจุอยู่ภายในตัวเรือน @@ -146,10 +150,10 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก #iiii ม่านพลาสติกอาจหล่อขึ้นรูปหลายเหลี่ยมเพื่อรวมพลังงานอินฟราเรดไปยังเซ็นเซอร์ แต่ละเหลี่ยมคือเลนส์เฟรสเนล -=== เลนส์มัลติเฟรสเนลของ PIR +#h(12em) 1) เลนส์มัลติเฟรสเนลของ PIR #afigure( - image("PIR/FacetLensOfMotionDetector_animation2.gif", height: 2in), + image("PIR/FacetLensOfMotionDetector_animation2.gif", height: 1.75in), attr: [CC BY-SA 3.0, https://en.wikipedia.org/w/index.php?curid=14193664], alt: "เครื่องตรวจจับความเคลื่อนไหวทรงกระบอก", caption: [ตัวเรือนเครื่องตรวจจับความเคลื่อนไหว PIR @@ -184,7 +188,7 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก #iiii บางรุ่นผลิตขึ้นโดยใช้กระจกพาราโบลา แบบแบ่งส่วนภายใน เพื่อรวมพลังงานอินฟราเรด ในกรณีที่ใช้กระจก ฝาครอบกระจกพลาสติกโดยทั่วไปจะไม่มีเลนส์เฟรสเนลหล่อขึ้นรูป -#h(12em) 1) PIR ชนิดกระจกแบ่งส่วน +#iiii 1) PIR ชนิดกระจกแบ่งส่วน #afigure( image("PIR/Front-(mirror_type).jpg", height: 2in), @@ -248,23 +252,23 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก #v(2em) -#h(9.75em) จากการโฟกัส ทำให้มุมมองของเครื่องตรวจจับกลายเป็นรูปแบบลำแสง ภายใต้มุมบางมุม -(โซน) เซ็นเซอร์ PIR แทบจะไม่ได้รับพลังงานรังสีใด ๆ และภายใต้มุมอื่น ๆ PIR +#h(8em) จากการโฟกัส ทำให้มุมมองของเครื่องตรวจจับกลายเป็นรูปแบบลำแสง ภายใต้มุมบางมุม (โซน) +เซ็นเซอร์ PIR แทบจะไม่ได้รับพลังงานรังสีใด ๆ และภายใต้มุมอื่น ๆ PIR จะได้รับพลังงานอินฟราเรดในปริมาณที่เข้มข้น การแยกนี้ช่วยให้เครื่องตรวจจับความเคลื่อนไหวสามารถแยกแยะระหว่างแสงสว่างที่กว้างและวัตถุที่กำลังเคลื่อนที่ได้ -#h(9.75em) เมื่อบุคคลเดินจากมุมหนึ่ง (ลำแสง) ไปยังอีกมุมหนึ่ง +#h(8em) เมื่อบุคคลเดินจากมุมหนึ่ง (ลำแสง) ไปยังอีกมุมหนึ่ง เครื่องตรวจจับจะมองเห็นบุคคลที่กำลังเคลื่อนไหวเป็นระยะ ๆ เท่านั้น ส่งผลให้สัญญาณเซ็นเซอร์เปลี่ยนแปลงอย่างรวดเร็ว ซึ่งระบบอิเล็กทรอนิกส์จะใช้เพื่อส่งสัญญาณเตือนภัยหรือเปิดไฟ ระบบอิเล็กทรอนิกส์จะไม่สนใจสัญญาณที่เปลี่ยนแปลงช้า ๆ -#h(9.75em) จำนวน รูปร่าง การกระจาย และความไวของโซนเหล่านี้ถูกกำหนดโดยเลนส์และกระจก +#h(8em) จำนวน รูปร่าง การกระจาย และความไวของโซนเหล่านี้ถูกกำหนดโดยเลนส์และกระจก ผู้ผลิตพยายามอย่างเต็มที่เพื่อสร้างรูปแบบลำแสงความไวที่เหมาะสมที่สุดสำหรับการใช้งานแต่ละประเภท == การใช้งานระบบไฟอัตโนมัติ -#h(9.75em) เมื่อใช้เป็นส่วนหนึ่งของระบบไฟส่องสว่าง ระบบอิเล็กทรอนิกส์ใน PIR +#h(8em) เมื่อใช้เป็นส่วนหนึ่งของระบบไฟส่องสว่าง ระบบอิเล็กทรอนิกส์ใน PIR มักจะควบคุมรีเลย์ในตัวที่สามารถสลับแรงดันไฟฟ้าหลักได้ ซึ่งหมายความว่า PIR สามารถตั้งค่าให้เปิดไฟที่เชื่อมต่อกับ PIR เมื่อตรวจพบการเคลื่อนไหวได้ วิธีนี้มักใช้ในสถานการณ์กลางแจ้ง ทั้งเพื่อป้องกันอาชญากร (ไฟรักษาความปลอดภัย) หรือเพื่อการใช้งานจริง เช่น @@ -275,18 +279,18 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก == แอปพลิเคชั่นด้านความปลอดภัย -#h(9.75em) เมื่อใช้เป็นส่วนหนึ่งของระบบรักษาความปลอดภัย วงจรอิเล็กทรอนิกส์ใน PIR -มักจะควบคุมรีเลย์ ขนาดเล็ก รีเลย์นี้จะทำหน้าที่เชื่อมต่อวงจรไฟฟ้าผ่านหน้า +#h(8em) เมื่อใช้เป็นส่วนหนึ่งของระบบรักษาความปลอดภัย วงจรอิเล็กทรอนิกส์ใน PIR มักจะควบคุมรีเลย์ +ขนาดเล็ก รีเลย์นี้จะทำหน้าที่เชื่อมต่อวงจรไฟฟ้าผ่านหน้า สัมผัสไฟฟ้าคู่หนึ่งที่เชื่อมต่อกับโซนอินพุตตรวจจับของแผงควบคุมสัญญาณกันขโมยโดยทั่วไประบบจะออกแบบให้หากไม่มีการเคลื่อนไหว หน้าสัมผัสรีเลย์จะปิดอยู่ ซึ่งเรียกว่ารีเลย์แบบ 'ปกติปิด' (NC) หากตรวจพบการเคลื่อนไหว รีเลย์จะเปิดวงจรเพื่อส่งสัญญาณเตือนภัย หรือหากสายไฟถูกตัดการเชื่อมต่อ สัญญาณเตือนภัยก็จะทำงานเช่นกัน == การจัดวาง -#h(9.75em) ผู้ผลิตแนะนำให้วางผลิตภัณฑ์อย่างระมัดระวังเพื่อป้องกันการแจ้งเตือนที่ผิดพลาด (เช่น +#h(8em) ผู้ผลิตแนะนำให้วางผลิตภัณฑ์อย่างระมัดระวังเพื่อป้องกันการแจ้งเตือนที่ผิดพลาด (เช่น การตรวจจับใดๆ ที่ไม่ได้เกิดจากผู้บุกรุก) -#h(9.75em) พวกเขาแนะนำให้ติดตั้ง PIR ในลักษณะที่ PIR ไม่สามารถ "มองเห็น" ออกจากหน้าต่างได้ +#h(8em) พวกเขาแนะนำให้ติดตั้ง PIR ในลักษณะที่ PIR ไม่สามารถ "มองเห็น" ออกจากหน้าต่างได้ แม้ว่าความยาวคลื่นของรังสีอินฟราเรดที่ชิปมีความไวต่อแสงจะทะลุผ่านกระจกได้ไม่ดีนัก แต่แหล่งกำเนิดแสงอินฟราเรดที่แรง (เช่น จากไฟหน้ารถยนต์หรือแสงแดด) อาจทำให้เซ็นเซอร์รับภาพเกินพิกัดและทำให้เกิดสัญญาณเตือนภัยผิดพลาดได้ @@ -294,15 +298,15 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก ซึ่งอาจเป็นผลดีสำหรับหน้าต่างที่หันหน้าไปทางทางเท้าสาธารณะ หรือเป็นผลเสียสำหรับหน้าต่างในฉากกั้นภายใน -#h(9.75em) ขอแนะนำว่าไม่ควรติดตั้ง PIR ในตำแหน่งที่ ช่องระบายอากาศ HVAC +#h(8em) ขอแนะนำว่าไม่ควรติดตั้ง PIR ในตำแหน่งที่ ช่องระบายอากาศ HVAC จะเป่าลมร้อนหรือเย็นลงบนพื้นผิวพลาสติกที่ปิดหน้าต่างของตัวบ้าน แม้ว่าอากาศจะมีค่าการแผ่รังสี ต่ำมาก#jb (ปล่อยพลังงานอินฟราเรดในปริมาณน้อยมาก) แต่ลมที่พัดผ่านฝาครอบหน้าต่างพลาสติกอาจทำให้อุณหภูมิของพลาสติกเปลี่ยนแปลงจนทำให้เกิดสัญญาณเตือนที่ผิดพลาดได้ -#h(9.75em) เซ็นเซอร์มักได้รับการออกแบบมาให้ "เพิกเฉย" สัตว์เลี้ยงในบ้าน เช่น สุนัขหรือแมว +#h(8em) เซ็นเซอร์มักได้รับการออกแบบมาให้ "เพิกเฉย" สัตว์เลี้ยงในบ้าน เช่น สุนัขหรือแมว โดยการตั้งค่าความไวให้สูงขึ้น หรือทำให้แน่ใจว่าพื้นห้องจะไม่อยู่ในโฟกัส -#h(9.75em) เนื่องจากเซ็นเซอร์ PIR มีระยะการทำงานสูงสุด 10 เมตร (30 ฟุต) +#h(8em) เนื่องจากเซ็นเซอร์ PIR มีระยะการทำงานสูงสุด 10 เมตร (30 ฟุต) ดังนั้นการติดตั้งเครื่องตรวจจับเพียงตัวเดียวใกล้ทางเข้าจึงเพียงพอสำหรับห้องที่มีทางเข้าเพียงทางเดียว ระบบรักษาความปลอดภัยที่ใช้ PIR ยังใช้งานได้ดีกับระบบรักษาความปลอดภัยภายนอกอาคารและระบบไฟที่ไวต่อการเคลื่อนไหว @@ -310,9 +314,9 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก == เทอร์โมมิเตอร์แบบควบคุมระยะไกลด้วย PIR -#h(9.75em) มีการออกแบบวงจร PIR ที่ใช้วัดอุณหภูมิของวัตถุที่อยู่ห่างไกลในวงจรดังกล่าว#jb -จะใช้เอาต์พุต PIR แบบไม่มีค่าความแตกต่าง สัญญาณเอาต์พุตจะถูกประเมินตามการสอบเทียบ#jb สเปกตรัม -IR ของสสารชนิดเฉพาะที่ต้องการตรวจวัด ด้วยวิธีนี้ การวัดอุณหภูมิจากระยะไกลจึงค่อนข้างแม่นยำและแม่นยำ +#h(8em) มีการออกแบบวงจร PIR ที่ใช้วัดอุณหภูมิของวัตถุที่อยู่ห่างไกลในวงจรดังกล่าว#jb จะใช้เอาต์พุต +PIR แบบไม่มีค่าความแตกต่าง สัญญาณเอาต์พุตจะถูกประเมินตามการสอบเทียบ#jb สเปกตรัม IR +ของสสารชนิดเฉพาะที่ต้องการตรวจวัด ด้วยวิธีนี้ การวัดอุณหภูมิจากระยะไกลจึงค่อนข้างแม่นยำและแม่นยำ หากไม่มีการสอบเทียบกับชนิดของวัสดุที่ตรวจวัด อุปกรณ์เทอร์โมมิเตอร์ PIR จะสามารถวัดการเปลี่ยนแปลงของการแผ่รังสี IR ซึ่งสอดคล้องกับการเปลี่ยนแปลงของอุณหภูมิโดยตรง แต่ไม่สามารถคำนวณค่าอุณหภูมิที่แท้จริงได้ diff --git a/Chapter2/Sensors.typ b/Chapter2/Sensors.typ index 6ad9d55..9fda011 100644 --- a/Chapter2/Sensors.typ +++ b/Chapter2/Sensors.typ @@ -3,28 +3,28 @@ = เซนเซอร์ (Sensors) -#i โดยทั่วไปแล้ว เซนเซอร์จะถูกนิยามว่าเป็นอุปกรณ์ที่รับและตอบสนองต่อสัญญาณหรือสิ่งเร้าสิ่งเร้าคือปริมาณ +#h(1.7em) โดยทั่วไปแล้ว เซนเซอร์จะถูกนิยามว่าเป็นอุปกรณ์ที่รับและตอบสนองต่อสัญญาณหรือสิ่งเร้าสิ่งเร้าคือปริมาณ คุณสมบัติ หรือสภาวะที่ถูกตรวจจับและแปลงเป็นสัญญาณไฟฟ้า -#i ในความหมายกว้างที่สุด เซนเซอร์คืออุปกรณ์ โมดูล เครื่องจักร +#h(1.7em) ในความหมายกว้างที่สุด เซนเซอร์คืออุปกรณ์ โมดูล เครื่องจักร หรือระบบย่อยที่ตรวจจับเหตุการณ์หรือการเปลี่ยนแปลงในสภาพแวดล้อม และส่งข้อมูลไปยังอุปกรณ์อิเล็กทรอนิกส์อื่นๆ ซึ่งส่วนใหญ่มักจะเป็นหน่วยประมวลผลของคอมพิวเตอร์ -#i เซ็นเซอร์ถูกนำมาใช้ในสิ่งของในชีวิตประจำวัน เช่น ปุ่มลิฟต์แบบสัมผัส (เซ็นเซอร์สัมผัส) +#h(1.7em) เซ็นเซอร์ถูกนำมาใช้ในสิ่งของในชีวิตประจำวัน เช่น ปุ่มลิฟต์แบบสัมผัส (เซ็นเซอร์สัมผัส) และโคมไฟที่หรี่หรือสว่างขึ้นโดยการสัมผัสที่ฐาน และในแอปพลิเคชันมากมายนับไม่ถ้วนซึ่งคนส่วนใหญ่ไม่เคยตระหนักถึง ด้วยความก้าวหน้าในด้านไมโครแมชชีนเนอรี่ และแพลตฟอร์ม ไมโครคอนโทรลเลอร์ที่ใช้งานง่ายการใช้งานเซ็นเซอร์จึงขยายออกไปนอกเหนือจากสาขาแบบดั้งเดิมของการวัดอุณหภูมิ ความดัน และการไหลตัวอย่างเช่น ไปสู่เซ็นเซอร์ MARG -#i เซ็นเซอร์แบบอนาล็อก เช่นโพเทนชิโอมิเตอร์และตัวต้านทานรับแรงยังคงมีการใช้งานอย่างแพร่หลาย +#h(1.7em) เซ็นเซอร์แบบอนาล็อก เช่นโพเทนชิโอมิเตอร์และตัวต้านทานรับแรงยังคงมีการใช้งานอย่างแพร่หลาย การใช้งานของเซ็นเซอร์เหล่านี้รวมถึงการผลิตและเครื่องจักร เครื่องบินและอวกาศ รถยนต์ การแพทย์ หุ่นยนต์และอีกหลายแง่มุมในชีวิตประจำวันของเรา นอกจากนี้ยังมีเซ็นเซอร์อื่นๆ อีกมากมายที่ใช้วัดคุณสมบัติทางเคมีและกายภาพของวัสดุ รวมถึงเซ็นเซอร์แบบออปติคอลสำหรับการวัดดัชนีหักเห เซ็นเซอร์แบบสั่นสะเทือนสำหรับการวัดความหนืดของของเหลว และเซ็นเซอร์ทางเคมีไฟฟ้าสำหรับการตรวจสอบค่า pH ของของเหลว -#i ความไวของเซนเซอร์บ่งชี้ว่าเอาต์พุตเปลี่ยนแปลงไปมากน้อยเพียงใดเมื่อปริมาณอินพุตที่วัดเปลี่ยนแปลง +#h(1.7em) ความไวของเซนเซอร์บ่งชี้ว่าเอาต์พุตเปลี่ยนแปลงไปมากน้อยเพียงใดเมื่อปริมาณอินพุตที่วัดเปลี่ยนแปลง ตัวอย่างเช่น หากปรอทในเทอร์โมมิเตอร์เคลื่อนที่ 1 ซม. เมื่ออุณหภูมิเปลี่ยนแปลง#jb 1 °C ความไวของมันคือ 1 ซม./°C (โดยพื้นฐานแล้วคือความชัน dy/dx โดยสมมติว่ามีลักษณะเชิงเส้น)#jb เซนเซอร์บางชนิดอาจส่งผลต่อสิ่งที่วัดได้เช่นกัน ตัวอย่างเช่น @@ -32,7 +32,7 @@ โดยทั่วไปเซนเซอร์ได้รับการออกแบบให้มีผลกระทบต่อสิ่งที่วัดน้อยที่สุด การทำให้เซนเซอร์มีขนาดเล็กลงมักจะช่วยปรับปรุงสิ่งนี้และอาจนำมาซึ่งข้อดีอื่นๆ -#i ความก้าวหน้าทางเทคโนโลยีทำให้สามารถผลิตเซ็นเซอร์ได้มากขึ้นเรื่อย ๆ ในระดับจุลภาคเช่น +#h(1.7em) ความก้าวหน้าทางเทคโนโลยีทำให้สามารถผลิตเซ็นเซอร์ได้มากขึ้นเรื่อย ๆ ในระดับจุลภาคเช่น ไมโครเซ็นเซอร์โดยใช้เทคโนโลยี MEMS ในกรณีส่วนใหญ่ ไมโครเซ็นเซอร์สามารถวัดได้เร็วกว่าและมีความไวสูงกว่าเมื่อเทียบกับวิธีการแบบมหภาคเนื่องจากความต้องการข้อมูลที่รวดเร็ว ราคาไม่แพง#jb และเชื่อถือได้เพิ่มมากขึ้นในโลกปัจจุบัน เซ็นเซอร์แบบใช้แล้วทิ้ง diff --git a/Chapter2/TLS.typ b/Chapter2/TLS.typ index d3be639..acbce4d 100644 --- a/Chapter2/TLS.typ +++ b/Chapter2/TLS.typ @@ -3,22 +3,22 @@ = เกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer Security; TLS) -#i +#h(1.7em) เกณฑ์วิธีความมั่นคงของชั้นขนส่ง (Transport Layer Security; TLS) เป็นโปรโตคอลการเข้ารหัสที่ออกแบบมาเพื่อรักษาความปลอดภัยการสื่อสารบนเครือข่ายคอมพิวเตอร์เช่นอินเทอร์เน็ตโปรโตคอลนี้ถูกใช้อย่างแพร่หลายในแอปพลิเคชันต่างๆเช่นอีเมลการส่งข้อความโต้ตอบแบบทันทีและบริการเสียงผ่าน IP แต่การใช้งานเพื่อรักษาความปลอดภัย HTTPS ยังคงเป็นที่เปิดเผยต่อสาธารณะมากที่สุด -#i โปรโตคอล TLS มีวัตถุประสงค์หลักเพื่อรักษาความปลอดภัย รวมถึงความเป็นส่วนตัว (ความลับ) +#h(1.7em) โปรโตคอล TLS มีวัตถุประสงค์หลักเพื่อรักษาความปลอดภัย รวมถึงความเป็นส่วนตัว (ความลับ) ความสมบูรณ์ และความถูกต้อง ผ่านการใช้การเข้ารหัสเช่น การใช้ใบรับรองระหว่างแอปพลิเคชันคอมพิวเตอร์ที่สื่อสารกันตั้งแต่สองแอปพลิเคชันขึ้นไป โปรโตคอลนี้ทำงานในเลเยอร์การนำเสนอและประกอบด้วยสองชั้น ได้แก่ ระเบียน TLS และโปรโตคอล TLS handshake -#i Datagram Transport Layer Security (DTLS) +#h(1.7em) Datagram Transport Layer Security (DTLS) ซึ่งเป็นโปรโตคอลการสื่อสารที่เกี่ยวข้องอย่างใกล้ชิดมอบความปลอดภัยให้กับ แอปพลิเคชันที่ใช้ ดาต้าแกรมในงานเขียนทางเทคนิค มักพบการอ้างอิงถึง "(D)TLS" เมื่อใช้กับทั้งสองเวอร์ชัน -#i TLS เป็นมาตรฐานที่ได้รับการเสนอโดย Internet Engineering Task Force (IETF) +#h(1.7em) TLS เป็นมาตรฐานที่ได้รับการเสนอโดย Internet Engineering Task Force (IETF) ซึ่งกำหนดขึ้นครั้งแรกในปี 1999 และเวอร์ชันปัจจุบันคือ TLS 1.3 ซึ่งกำหนดขึ้นในเดือนสิงหาคม 2018 TLS สร้างขึ้นจาก ข้อกำหนด SSL (Secure Sockets Layer) ที่ไม่รองรับอีกต่อไป (1994, 1995, 1996) ซึ่งพัฒนาโดย Netscape Communications เพื่อเพิ่มโปรโตคอล HTTPS ลงในเว็บเบราว์เซอร์ Netscape @@ -41,23 +41,30 @@ Navigator ซึ่งการสื่อสารต่อไปจะถูกเข้ารหัสโดยใช้รหัสแบบสมมาตรในระหว่างการจับมือนี้ ไคลเอนต์และเซิร์ฟเวอร์จะตกลงกันเกี่ยวกับพารามิเตอร์ต่างๆ ที่ใช้สร้างความปลอดภัยของการเชื่อมต่อ -#block(inset: (left: 6em))[ - + การจับมือเริ่มต้นเมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS +#[ + #set enum(indent: 4.1em) + 1. การจับมือเริ่มต้นเมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS เพื่อขอการเชื่อมต่อที่ปลอดภัยและไคลเอนต์แสดงรายการชุดรหัสที่รองรับ (รหัสและฟังก์ชันแฮช) - + จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ - + โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง + 2. จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ + และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ + 3. โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง (CA) ที่เชื่อถือได้ซึ่งรับรองความถูกต้องของใบรับรอง และคีย์การเข้ารหัสสาธารณะของเซิร์ฟเวอร์ - + ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ - + ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้ - + เข้ารหัสตัวเลขสุ่ม (PreMasterSecret) + 4. ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ + 5. ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้ + + #listy( + indent: 5.4em, + numbering: thai-numbering, + [เข้ารหัสตัวเลขสุ่ม (PreMasterSecret) ด้วยคีย์สาธารณะของเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังเซิร์ฟเวอร์ (ซึ่งเฉพาะเซิร์ฟเวอร์เท่านั้นที่จะสามารถถอดรหัสด้วยคีย์ส่วนตัว) - จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ - + ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี) + จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ], + [ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี) เพื่อสร้างคีย์เซสชันแบบสุ่มและไม่ซ้ำกันอย่างปลอดภัยสำหรับการเข้ารหัสและถอดรหัส ซึ่งมีคุณสมบัติเพิ่มเติมของการปกปิดแบบส่งต่อ โดยหากคีย์ส่วนตัวของเซิร์ฟเวอร์ถูกเปิดเผยในอนาคต จะไม่สามารถใช้คีย์นั้นเพื่อถอดรหัสเซสชันปัจจุบันได้ - แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม + แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม], + ) ] #iii @@ -75,7 +82,7 @@ TLS จะล้มเหลวและการเชื่อมต่อจ และเซิร์ฟเวอร์ (เช่น wikipedia.org) จะมีคุณสมบัติทั้งหมดดังต่อไปนี้ #[ - #set enum(indent: 6em) + #set enum(indent: 4.1em) 1. การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้ อัลกอริทึมคีย์แบบสมมาตรในการเข้ารหัสข้อมูลที่ส่ง คีย์สำหรับการเข้ารหัสแบบสมมาตรนี้จะถูกสร้างขึ้นอย่างเฉพาะเจาะจงสำหรับแต่ละการเชื่อมต่อ diff --git a/Chapter2/X509.typ b/Chapter2/X509.typ index d156a6b..2e59a34 100644 --- a/Chapter2/X509.typ +++ b/Chapter2/X509.typ @@ -28,19 +28,24 @@ Notation One (ASN.1) #iiii โครงสร้างของใบรับรองดิจิทัล X.509 v3 มีดังนี้ -#block(inset: (left: 9.25em))[ - + ใบรับรอง - + หมายเลขเวอร์ชัน - + หมายเลขซีเรียล - + รหัสอัลกอริทึมลายเซ็น - + ชื่อผู้ออก - + ระยะเวลาใช้งาน โดยระบุเวลาไม่ก่อนและไม่หลังจากนั้น - + ชื่อเรื่อง - + ข้อมูลคีย์สาธารณะของเรื่อง ได้แก่ อัลกอริทึมคีย์สาธารณะ +#[ + #set enum(indent: 7.55em) + 1. ใบรับรอง + #listy( + indent: 8.9em, + numbering: thai-numbering, + [หมายเลขเวอร์ชัน], + [หมายเลขซีเรียล], + [รหัสอัลกอริทึมลายเซ็น], + [ชื่อผู้ออก], + [ระยะเวลาใช้งาน โดยระบุเวลาไม่ก่อนและไม่หลังจากนั้น], + [ชื่อเรื่อง], + [ข้อมูลคีย์สาธารณะของเรื่อง ได้แก่ อัลกอริทึมคีย์สาธารณะ คีย์สาธารณะของเรื่องเช่นรหัสประจำตัวผู้ออก (ไม่จำเป็น) รหัสประจำตัวเฉพาะเรื่อง (ไม่จำเป็น) - ส่วนขยาย (ไม่จำเป็น) - + อัลกอริทึมลายเซ็นใบรับรอง - + ลายเซ็นใบรับรอง + ส่วนขยาย (ไม่จำเป็น)], + ) + 2. อัลกอริทึมลายเซ็นใบรับรอง + 3. ลายเซ็นใบรับรอง ] #iiii ฟิลด์ส่วนขยาย (ถ้ามี) จะเป็นลำดับของส่วนขยายใบรับรองอย่างน้อยหนึ่งรายการ @@ -73,7 +78,7 @@ Notation One (ASN.1) มีหลายประเภทนามสกุลไฟล์เหล่านี้ยังใช้สำหรับข้อมูลอื่น ๆ เช่น คีย์ส่วนตัวด้วย #[ - #set enum(indent: 9.25em) + #set enum(indent: 7.55em) 1. `.pem` -- (อีเมลอิเล็กทรอนิกส์ที่เพิ่มความเป็นส่วนตัว) ใบรับรอง DER ที่เข้ารหัส Base64 แนบระหว่าง `-----BEGIN CERTIFICATE-----` และ `-----END CERTIFICATE-----` 2. `.cer`, `.crt`, `.der` -- โดยปกติจะอยู่ในรูปแบบไบนารี DER แต่ใบรับรองที่เข้ารหัส diff --git a/Chapter3/BuildApp.typ b/Chapter3/BuildApp.typ index e878995..c7b3be8 100644 --- a/Chapter3/BuildApp.typ +++ b/Chapter3/BuildApp.typ @@ -2,13 +2,14 @@ == สร้างไฟล์แอปพลิเคชันด้วยตนเอง -#i โครงงานนี้ใช้แอปพลิเคชันที่สร้างขึ้นมาเอง โดยในการพัฒนาแอปพลิเคชัน +#h(1.7em) โครงงานนี้ใช้แอปพลิเคชันที่สร้างขึ้นมาเอง โดยในการพัฒนาแอปพลิเคชัน อย่างน้อยต้องมีส่วนประกอบดังกล่าวก่อน -- Flutter -- Git (ซึ่งคุณจะติดตั้งแล้วหากคุณทำตาม@writingFirmware) +#set enum(indent: 1.7em) +1. Flutter +2. Git (ซึ่งคุณจะติดตั้งแล้วหากคุณทำตาม@writingFirmware) -#i อย่างไรก็ตาม Flutter มีข้อจำกัดว่า มีเพียง Android +#h(1.7em) อย่างไรก็ตาม Flutter มีข้อจำกัดว่า มีเพียง Android เท่านั้นที่ไม่ว่าแพลตฟอร์มไหนก็จะสามารถคอมไพล์ไฟล์ `.apk` ออกมาได้ ดังนั้น การสร้างแอปพลิเคชันสำหรับ Linux ต้องทำบน Linux เท่านั้น และการสร้างแอปพลิเคชันสำหรับ Windows ต้องทำบน Windows เท่านั้น @@ -16,12 +17,13 @@ === การติดตั้งโปรแกรมเขียนโคด #iii จริง ๆ แล้วนั้น Flutter สามารถทำงานกับโปรแกรมเขียนโคดใดก็ได้ -แต่มีโปรแกรมเหล่านี้ที่อาจมีประสบการณ์การพัฒนาที่ดีกว่าโปรแกรมอื่น: +แต่มีโปรแกรมเหล่านี้ที่อาจมีประสบการณ์การพัฒนาที่ดีกว่าโปรแกรมอื่น -- Visual Studio Code (VS Code) -- Android Studio -- JetBrains IntelliJ -- Firebase Studio +#set enum(indent: 4.1em) +1. Visual Studio Code (VS Code) +2. Android Studio +3. JetBrains IntelliJ +4. Firebase Studio #iii โครงงานนี้ใช้โปรแกรมเขียนโคด Android Studio เป็นหลักเนื่องจากแอปพลิเคชันโครงงานมี Android เป็นเป้าหมายหลัก และ Android SDK สามารถจัดการได้ง่ายกว่าใน Android Studio @@ -31,66 +33,64 @@ Code) และการติดตั้งด้วยตนเอง โด สามารถติดตั้งผ่าน VS Code ได้เลย แต่ก่อนอื่น ต้องทำการติดตั้งโปรแกรมและไลบรารีพื้นฐานที่จำเป็นสำหรับ Flutter ก่อน -#pagebreak() - === การติดตั้งโปรแกรมและไลบรารีที่จำเป็น -#[ - #set enum(indent: 5.5em) - + Windows: ติดตั้ง Git สำหรับ Windows ซึ่งคุณสามารถดูขั้นตอนการติดตั้งได้ที่ - https://git-scm.com/install/windows หรือเพียงแค่ใช้คำสั่งด้านล่าง - #afigure( - ```sh - winget install --id Git.Git -e --source winget - ```, - kind: image, - caption: [คำสั่งในการติดตั้ง Git], - ) - + Linux: โปรดดู@flLinuxDetails สำหรับรายละเอียดแพคเกจและคำสั่งที่ต้องใช้สำหรับระบบต่าง ๆ - - + macOS: ใช้คำสั่งต่อไปนี้ในการติดตั้งเครื่องมือ Xcode ต่าง ๆ รวมถึง Git - #afigure( - ```sh - xcode-select --install - ```, - kind: image, - caption: [คำสั่งในการติดตั้งเครื่องมือ Xcode], - ) -] +1. สำหรับ Windows ติดตั้ง Git สำหรับ Windows ซึ่งคุณสามารถดูขั้นตอนการติดตั้งได้ที่ + https://git-scm.com/install/windows หรือเพียงแค่ใช้คำสั่งด้านล่าง + #figure( + ```sh + winget install --id Git.Git -e --source winget + ```, + kind: image, + caption: [คำสั่งในการติดตั้ง Git], + ) +2. สำหรับ Linux โปรดดู@flLinuxDetails + สำหรับรายละเอียดแพคเกจและคำสั่งที่ต้องใช้สำหรับระบบต่าง ๆ +3. สำหรับ macOS ใช้คำสั่งต่อไปนี้ในการติดตั้งเครื่องมือ Xcode ต่าง ๆ รวมถึง Git + #figure( + ```sh + xcode-select --install + ```, + kind: image, + caption: [คำสั่งในการติดตั้งเครื่องมือ Xcode], + ) === การติดตั้งผ่าน Visual Studio Code -#block(inset: (left: 4.5em))[ - #set enum(indent: 1em) - + เปิด VSCode - + ติดตั้งส่วนขยาย Flutter \ - อยู่ภายใต้ ID `Dart-Code.flutter` ทั้งบน Visual Studio Marketplace และ OpenVSX - + ติดตั้ง Flutter ด้วย VS Code - + เปิด Command Palette ด้วยเมนู *View* > *Command Palette* หรือกด Ctrl + Shift + - P - + ใน Command Palette พิมพ์ `flutter`. - + เลือก *Flutter: New Project* - + VS Code จะให้คุณเลือก Flutter SDK บนคอมพิวเตอร์ของคุณ เลือก *Download SDK* - + เมือหน้าไดอะลอก *Select Folder for Flutter SDK* แสดงขึ้น เลือกสถานที่ที่คุณอยากติดตั้ง - Flutter - + คลิก *Clone Flutter* \ - ในระหว่างการดาวน์โหลด VS Code จะแสดงการแจ้งเตือนนี้: +#[ + #set enum(indent: 4.1em) + 1. เปิด VSCode + 2. ติดตั้งส่วนขยาย Flutter ซึ่งอยู่ภายใต้ ID `Dart-Code.flutter` ทั้งบน Visual Studio + Marketplace และ OpenVSX + 3. ติดตั้ง Flutter ด้วย VS Code + + #listy( + indent: 5.5em, + numbering: thai-numbering, + [เปิด Command Palette ด้วยเมนู _View > Command Palette_ หรือกด Ctrl + Shift + + P], + [ใน Command Palette พิมพ์ `flutter`], + [เลือก _Flutter: New Project_], + [VS Code จะให้คุณเลือก Flutter SDK บนคอมพิวเตอร์ของคุณ เลือก _Download SDK_], + [เมือหน้าไดอะลอก _Select Folder for Flutter SDK_ แสดงขึ้น เลือกสถานที่ที่คุณอยากติดตั้ง + Flutter], + [คลิก _Clone Flutter_ โดยในระหว่างการดาวน์โหลด VS Code จะแสดงการแจ้งเตือนนี้ ``` Downloading the Flutter SDK. This may take a few minutes. ``` การดาวน์โหลดนี้จะใช้เวลาสองสามนาที หากคุณเชื่อว่าการดาวน์โหลดหยุดชะงัก คุณสามารถคลิก - *Cancel* แล้วเริ่มต้นการติดตั้งใหม่ได้ - + คลิก *Add SDK to PATH* \ - เมื่อเสร็จสิ้น จะมีการแจ้งเตือน + _Cancel_ แล้วเริ่มต้นการติดตั้งใหม่ได้], + [คลิก _Add SDK to PATH_ และเมื่อเสร็จสิ้น จะมีการแจ้งเตือน ``` The Flutter SDK was added to your PATH - ``` - + VS Code อาจแสดงการแจ้งเตือนเกี่ยวกับการเก็บข้อมูลของ Google หากคุณยินยอม คลิก *OK* - + เพื่อความแน่ใจ กรุณาปิดเทอร์มินัลทุกหน้าต่างหรือรีสตาร์ท VS Code เพื่อให้แน่ใจว่า Flutter - จะสามารถใช้ผ่านเทอร์มินัลได้ - + เมื่อเสร็จสิ้น ใช้คำสั่ง `flutter doctor -v` ในเทอร์มินัลที่คุณเลือกเพื่อตรวจสอบการติดตั้ง - Flutter ของคุณ \ - หากคำสั่งไม่เจอหรือเกิดข้อผิดพลาดขึ้น ตรวจสอบ + ```], + [VS Code อาจแสดงการแจ้งเตือนเกี่ยวกับการเก็บข้อมูลของ Google หากคุณยินยอม คลิก _OK_], + [เพื่อความแน่ใจ กรุณาปิดเทอร์มินัลทุกหน้าต่างหรือรีสตาร์ท VS Code เพื่อให้แน่ใจว่า Flutter + จะสามารถใช้ผ่านเทอร์มินัลได้], + ) + + 4. เมื่อเสร็จสิ้น ใช้คำสั่ง `flutter doctor -v` ในเทอร์มินัลที่คุณเลือกเพื่อตรวจสอบการติดตั้ง + Flutter ของคุณ หากคำสั่งไม่เจอหรือเกิดข้อผิดพลาดขึ้น ตรวจสอบ https://docs.flutter.dev/install/troubleshoot สำหรับข้อมูลเพิ่มเติม ] @@ -99,32 +99,38 @@ Flutter ก่อน #iii แนะนำให้ทำตาม https://docs.flutter.dev/install/manual#install-flutter เนื่องจากกระบวนการนี้ต้องใช้ข้อมูลที่ใหม่ล่าสุด -1. ดาวน์โหลด Flutter (สามารถหาปุ่มดาวน์โหลดได้จากลิงก์ด้านบน) -2. สร้างโฟลเดอร์สำหรับเก็บ Flutter SDK -3. ทำการแตกไฟล์ที่ดาวน์โหลดมา -4. เพิ่ม Flutter เข้าไปยัง PATH ของคุณ (วิธีการขึ้นอยู่กับระบบปฏิบัติการ) -5. ยืนยันความถูกต้องของการติดตั้งของคุณด้วยคำสั่ง `flutter doctor -v` +#[ + #set enum(indent: 4.1em) + 1. ดาวน์โหลด Flutter (สามารถหาปุ่มดาวน์โหลดได้จากลิงก์ด้านบน) + 2. สร้างโฟลเดอร์สำหรับเก็บ Flutter SDK + 3. ทำการแตกไฟล์ที่ดาวน์โหลดมา + 4. เพิ่ม Flutter เข้าไปยัง PATH ของคุณ (วิธีการขึ้นอยู่กับระบบปฏิบัติการ) + 5. ยืนยันความถูกต้องของการติดตั้งของคุณด้วยคำสั่ง `flutter doctor -v` +] === ข้อมูลเฉพาะแพลตฟอร์ม ==== Android -#iiii ในการพัฒนาแอปพลิเคชัน Android โดยใช้เฟรมเวิร์ก Flutter +#h(7.3em) ในการพัฒนาแอปพลิเคชัน Android โดยใช้เฟรมเวิร์ก Flutter จำเป็นต้องใช้ส่วนประกอบเครื่องมือพัฒนา Android ดังนี้ -- Android SDK (API Level 36 ณ เวลาที่พิมพ์) -- Android SDK Build-Tools -- Android SDK Command-line Tools -- Android SDK Platform-Tools -- Android Emulator (ไม่บังคับ) +#[ + #set enum(indent: 7.3em) + 1. Android SDK (API Level 36 ณ เวลาที่พิมพ์) + 2. Android SDK Build-Tools + 3. Android SDK Command-line Tools + 4. Android SDK Platform-Tools + 5. Android Emulator (ไม่บังคับ) +] โดยแนะนำให้จัดการและติดตั้งเครื่องมือเหล่านี้ผ่าน Android Studio -#iiii ในการติดตั้ง Android SDK ควรติดตั้ง Android SDK +#h(7.3em) ในการติดตั้ง Android SDK ควรติดตั้ง Android SDK ล่าสุดถึงแม้ว่าอุปกรณ์ของคุณจะใช้เวอร์ชันที่เก่ากว่านั้น เพื่อความมั่นใจว่าแอปพลิเคชันจะสามารถใช้กับอุปกรณ์ที่ใหม่ล่าสุดได้ -#iiii แอปพลิเคชัน Android จะมี SDK/API level เป้าหมาย (Target SDK/API level) และ +#h(7.3em) แอปพลิเคชัน Android จะมี SDK/API level เป้าหมาย (Target SDK/API level) และ SDK/API level ขั้นต่ำ (Minimum SDK/API level) โครงงานนี้ ณ เวลาที่พิมพ์ ใช้ API level เป้าหมาย 36 (Android 16) และ API level ขั้นต่ำ 24 (Android 7) ซึ่งรวมกันแล้ว แอปพลิเคชัน#jb Android จะสามารถติดตั้งได้บนระบบตั้งแต่ API level ขั้นต่ำจนถึง API level @@ -133,70 +139,68 @@ SDK/API level ขั้นต่ำ (Minimum SDK/API level) โครงงา ===== Java/Kotlin -#iiiii Java และ Kotlin เป็นภาษาสำคัญสำหรับการพัฒนาแอปพลิเคชัน Android ถึงอย่างไรก็ตาม +#h(11.3em) Java และ Kotlin เป็นภาษาสำคัญสำหรับการพัฒนาแอปพลิเคชัน Android ถึงอย่างไรก็ตาม แอปพลิเคชัน Flutter นั้นถูกเขียนด้วยภาษา Dart แต่ยังจำเป็นต้องมีโคด Java และ Kotlin เล็กน้อยเพื่อเริ่มต้นแอปพลิเคชัน Flutter -#iiiii โดยปกติแล้ว Flutter จะสร้างโคดพื้นฐานขึ้นมาให้สำหรับการเริ่มแอปพลิเคชันแบบพื้นฐาน +#h(11.3em) โดยปกติแล้ว Flutter จะสร้างโคดพื้นฐานขึ้นมาให้สำหรับการเริ่มแอปพลิเคชันแบบพื้นฐาน ดังนั้นจึงไม่จำเป็นต้องมีการเขียนโคด Java หรือ Kotlin เอง แต่ในบางกรณี อาจต้องเขียนโคดเพิ่มเองหากมีความต้องการเข้าถึงฟีเจอร์พื้นฐานระบบที่ Flutter ไม่มี API เพื่อให้เข้าถึงได้และไม่มีแพคเกจเพื่อรองรับฟีเจอร์ที่ต้องการ -#iiiii โครงการนี้ใช้ Java 21 (JetBrains Runtime/Azul Zulu OpenJDK) +#h(11.3em) โครงการนี้ใช้ Java 21 (JetBrains Runtime/Azul Zulu OpenJDK) เป็นหลักในการทำงานกับ Gradle แต่แอปพลิเคชัน Android ที่ผลิตออกมานั้น เพื่อให้เข้ากับเวอร์ชันที่เก่ากว่าของระบบปฏิบัติการได้ ใช้ Java 11 ===== Gradle -#iiiii Gradle เป็นเครื่องมือสร้างระบบอัตโนมัติสำหรับการพัฒนาซอฟต์แวร์หลายภาษา จัดการงานต่าง ๆ -เช่น การคอมไพล์ การแพ็คเกจ การทดสอบ การปรับใช้ และการเผยแพร่ ภาษาที่รองรับ ได้แก่ Java -(รวมถึงภาษา Kotlin, Groovy, Scala ที่ใช้ JDK), C/C++ และ JavaScript Gradle +#h(11.3em) Gradle เป็นเครื่องมือสร้างระบบอัตโนมัติสำหรับการพัฒนาซอฟต์แวร์หลายภาษา +จัดการงานต่าง ๆ เช่น การคอมไพล์ การแพ็คเกจ การทดสอบ การปรับใช้ และการเผยแพร่ ภาษาที่รองรับ +ได้แก่ Java (รวมถึงภาษา Kotlin, Groovy, Scala ที่ใช้ JDK), C/C++ และ JavaScript Gradle พัฒนาต่อยอดจากแนวคิดของ Apache Ant และ Apache Maven และนำเสนอภาษาเฉพาะโดเมนที่ใช้ Groovy และ Kotlin ซึ่งต่างจากการกำหนดค่าโครงการที่ใช้ XML ที่ Maven ใช้ Gradle ใช้กราฟแบบอะไซคลิกกำกับทิศทางเพื่อจัดการการอ้างอิง กราฟนี้ใช้เพื่อกำหนดลำดับของงานที่ควรดำเนินการ Gradle ทำงานบน Java Virtual Machine -#iiiii Gradle คือเครื่องมือหลักที่ใช้ในการจัดการโปรเจกต์ Java ส่วนใหญ่ รวมถึงโปรเจกต์ Android -โดยในโครงการนี้ จะใช้ Gradle เวอร์ชัน 8.14.3 เป็นหลัก +#h(11.3em) Gradle คือเครื่องมือหลักที่ใช้ในการจัดการโปรเจกต์ Java ส่วนใหญ่ รวมถึงโปรเจกต์ +Android โดยในโครงการนี้ จะใช้ Gradle เวอร์ชัน 8.14.3 เป็นหลัก -#iiiii โดยปกติแล้ว ผู้พัฒนานั้นไม่มีความจำเป็นที่จะต้องแตะต้อง Gradle ด้วยตนเอง และ Flutter +#h(11.3em) โดยปกติแล้ว ผู้พัฒนานั้นไม่มีความจำเป็นที่จะต้องแตะต้อง Gradle ด้วยตนเอง และ Flutter จะทำการจัดการเอง แต่หากมีความจำเป็นต้องใช้คำสั่ง Gradle ด้วยตนเอง จะมีสคริปต์ `gradlew` (หรือ `gradlew.bat` สำหรับผู้ใช้ Windows) ภายในโฟลเดอร์ `android` ของโปรเจกต์ Flutter เสมอเพื่อเรียกใช้ Gradle ที่ถูกดาวน์โหลดมาสำหรับโปรเจกต์นั้น ๆ ==== Linux -#iiii เช่นเดียวกับ Android ที่กล่าวไปข้างต้น Flutter +#h(7.3em) เช่นเดียวกับ Android ที่กล่าวไปข้างต้น Flutter มีการสร้างโคดสำหรับการเปิดแอปพลิเคชันแบบพื้นฐาน แต่สำหรับ Linux แล้วนั้น Flutter ใช้โคด C++ และเฟรมเวิร์ก CMake ในการสร้างรากฐานของแอปพลิเคชัน -#iiii ในการพัฒนาแอปพลิเคชันสำหรับ Linux ต้องติดตั้งโปรแกรมเพิ่มเติม#jb (build dependencies) -ขยายความคือ ด้านบนคือสิ่งที่จำเป็นหากมีระบบอื่นเป็นเป้าหมาย แต่หากต้องการพัฒนาแอปพลิเคชัน Linux -ต้องติดตั้งโปรแกรมในรายการหน้าถัดไปเพิ่ม +#h(7.3em) ในการพัฒนาแอปพลิเคชันสำหรับ Linux ต้องติดตั้งโปรแกรมเพิ่มเติม#jb (build +dependencies) ขยายความคือ ด้านบนคือสิ่งที่จำเป็นหากมีระบบอื่นเป็นเป้าหมาย +แต่หากต้องการพัฒนาแอปพลิเคชัน Linux ต้องติดตั้งโปรแกรมในรายการหน้าถัดไปเพิ่ม #pagebreak() -#grid( - columns: 2, - column-gutter: 1in, - [ - - GTK 3 (ไลบรารีสำหรับการพัฒนา) - - pkg-config - - ไลบรารี GNU Standard C++ v3 - ], - [ - - Clang - - CMake - - Ninja - ], -) +#[ + #set enum(indent: 7.3em) + 1. GTK 3 (ไลบรารีสำหรับการพัฒนา) + 2. pkg-config + 3. ไลบรารี GNU Standard C++ v3 + 4. Clang + 5. CMake + 6. Ninja +] -#iiii การติดตั้งไลบรารีและโปรแกรมที่กล่าวไปข้างต้นจะแตกต่างกันไปแต่ละการแจกจ่าย Linux และ +#h(7.3em) การติดตั้งไลบรารีและโปรแกรมที่กล่าวไปข้างต้นจะแตกต่างกันไปแต่ละการแจกจ่าย Linux และ Flutter ใช้ไลบรารีพื้นฐานดังกล่าวในการทำงานของแอปพลิเคชัน (runtime dependencies) -- GTK 3 -- blkid -- LZMA +#[ + #set enum(indent: 7.3em) + 1. GTK 3 + 2. blkid + 3. LZMA +] แต่โดยทั่วไปแล้ว ไลบรารีเหล่านี้ควรถูกติดตั้งมาอยู่แล้วหากคุณใช้ graphical desktop ทั่วไป @@ -217,6 +221,8 @@ Flutter ใช้ไลบรารีพื้นฐานดังกล่า caption: [คำสั่งในการติดตั้งรายการแพคเกจต่าง ๆ บน Debian], ) +#v(0.5em) + ===== Fedora Linux #afigure( @@ -251,8 +257,10 @@ Flutter ใช้ไลบรารีพื้นฐานดังกล่า caption: [คำสั่งในการติดตั้งรายการแพคเกจต่าง ๆ บน Arch Linux], ) +#v(0.5em) + ==== macOS/iOS -#iiii การพัฒนาแอปพลิเคชันสำหรับ macOS และ iOS นั้นต้องทำบน#jb macOS +#h(7.3em) การพัฒนาแอปพลิเคชันสำหรับ macOS และ iOS นั้นต้องทำบน macOS เท่านั้นและจำเป็นต้องพึ่งพาเครื่องมือ Xcode แต่เนื่องจากในโครงงานนี้ไม่มีผู้ใช้ macOS จึงไม่สามารถสร้างไบนารีสำหรับ macOS และ iOS ออกมาได้ และไม่ใช่เป้าหมายของโครงงานนี้เช่นกัน diff --git a/Chapter3/Chapter3.typ b/Chapter3/Chapter3.typ index 6998593..bd37885 100644 --- a/Chapter3/Chapter3.typ +++ b/Chapter3/Chapter3.typ @@ -12,12 +12,32 @@ คณะผู้จัดทำโครงงานได้ศึกษาข้อมูลเบื้องต้นในการสร้างเครื่องยืนยันตัวตนด้วย NFC และได้ดำเนินการตามขั้นตอนนี้ -+ วางแผนการดำเนินงาน -+ การออกแบบ -+ วัสดุอุปกรณ์ -+ ขั้นตอนการประกอบ -+ การทดลอง -+ การวิเคราะห์ข้อมูล +#set enum(indent: 3em) +1. วางแผนการดำเนินงาน +2. การออกแบบ +3. วัสดุอุปกรณ์ +4. ขั้นตอนการประกอบ +5. การทดลอง +6. การวิเคราะห์ข้อมูล + +#show heading.where(level: 3): it => { + block( + it, + inset: (left: 1.7em), + ) +} +#show heading.where(level: 4): it => { + block( + it, + inset: (left: 4.1em), + ) +} +#show heading.where(level: 5): it => { + block( + it, + inset: (left: 7.3em), + ) +} == วางแผนการดำเนินงาน @@ -115,45 +135,69 @@ == การออกแบบ +#figure( + image( + "imgs/ProjectDraft_Modules.png", + alt: "ภาพแสดงการโมเดลโครงงานซึ่งประกอบไปด้วยสามส่วน", + width: 5in, + ), + caption: [การออกแบบโครงสร้างเครื่องยืนยันตัวตนด้วย NFC], +) + +#v(2em) + == วัสดุอุปกรณ์ -+ บอร์ด ESP32 (NodeMCU) -+ กล่องพลาสติก -+ Buzzer -+ เซนเซอร์ PIR -+ เซนเซอร์ NFC 2 ชิ้น +#set enum(indent: 1.7em) + +1. บอร์ด ESP32 (NodeMCU) +2. กล่องพลาสติก +3. บัซเซอร์ (Buzzer) +4. เซนเซอร์ NFC (PN532) +// 5. เซนเซอร์ PIR == ขั้นตอนการประกอบ === การติดตั้งอุปกรณ์ -โครงงานแบ่งออกเป็น 3 โมดูล +#h(4.1em) โครงงานแบ่งออกเป็น 3 โมดูล -+ โมดูลเซนเซอร์ NFC ขาเข้าและบอร์ด ESP32 -+ โมดูลเซนเซอร์ NFC ขาออก -+ โมดูลเซนเซอร์ PIR +#set enum(indent: 4.1em) +1. โมดูลบอร์ด ESP32 +2. โมดูลเซนเซอร์ NFC +// 3. โมดูลเซนเซอร์ PIR -#show heading: it => { - if it.level > 2 { - block( - it, - inset: (left: -3em * (it.level - 2)), - ) - } else { - it - } -} +==== โมดูลบอร์ด ESP32 -==== โมดูลเซนเซอร์ NFC ขาเข้าและบอร์ด ESP32 +#h(7.3em) ทำการเจาะรู 2 รูสำหรับสายและร้อยสายเข้าไปในกล่อง -#iiii ทำการเจาะรู +#figure( + image( + "imgs/MainModuleInternal.jpg", + alt: "ภายในกล่องโมดูลหลัก มีบอร์ดอยู่ภายใน", + height: 2in, + ), + caption: [ภายในกล่องโมดูล ESP32], +) -==== โมดูลเซนเซอร์ NFC ขาออก +#v(2em) -#iiii ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ +==== โมดูลเซนเซอร์ NFC + +#h(7.3em) ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ จากนั้นนำสายไฟร้อยผ่านช่องดังกล่าวและต่อเข้ากับเซนเซอร์ NFC ให้เรียบร้อย -==== โมดูลเซนเซอร์ PIR +#figure( + image( + "imgs/NFCSensor_cropped.jpg", + alt: "ภายกล่องโมดูลเซนเซอร์ NFC", + height: 2in, + ), + caption: [โมดูลเซนเซอร์ NFC], +) +#v(1.5em) + +// ==== โมดูลเซนเซอร์ PIR === การเขียนเฟิร์มแวร์ @@ -171,9 +215,15 @@ Windows Terminal อย่างไรก็ตาม เมื่อเปิ #iii โดยในปัจจุบัน Python เวอร์ชันล่าสุดคือ Python 3.14.2 โดยคุณสามารถติดตั้ง Python และ Git บน Windows ได้ด้วยการใช้คำสั่งต่อไปนี้ -```sh -winget install Python.Python.3.14 Git.Git -e -s winget -``` +#figure( + ```sh + winget install Python.Python.3.14 Git.Git -e -s winget + ```, + kind: image, + caption: [คำสั่งในการติดตั้ง Python 3.14 และ Git], +) + +#v(1.5em) #iii สำหรับระบบปฏิบัติการอื่นนั้น โดยปกติแล้วจะไม่ต้องติดตั้ง Python เพิ่มเนื่องจากมีติดมากับระบบปฏิบัติการอยู่แล้ว อย่างไรก็ตาม บน Linux อาจต้องมีการติดตั้งการรองรับ @@ -181,156 +231,244 @@ Virtual Environment แยก โดยแต่ละระบบจะมี และ Arch สามารถใช้คำสั่งต่อไปนี้ในการติดตั้งทั้ง Python Virtual Environment และ Git พร้อมกันได้ -#pagebreak() - -```sh -# Debian -sudo apt install python3-venv git -# Fedora -sudo dnf install python3-virtualenv git -# Arch -sudo pacman -S python-virtualenv git -``` - #show raw.where(block: true): set block(below: 2em) +#figure( + ```sh + # Debian + sudo apt install python3-venv git + # Fedora + sudo dnf install python3-virtualenv git + # Arch + sudo pacman -S python-virtualenv git + ```, + kind: image, + caption: [คำสั่งในการติดตั้ง Virtual Environment และ Git บนการแจกจ่าย Linux ต่าง ๆ], +) + +#v(1.5em) + +#pagebreak() ==== การติดตั้ง PlatformIO Core ผ่านแพคเกจ -#iiii หากคุณใช้ Fedora Linux หรือ Arch Linux (หรือลูก ๆ ของมัน) คุณสามารถติดตั้งแพคเกจ -PlatformIO ได้โดยตรง โดยมีคำสั่งดังนี้: +#h(7.3em) หากคุณใช้ Fedora Linux หรือ Arch Linux (หรือลูก ๆ ของมัน) คุณสามารถติดตั้งแพคเกจ +PlatformIO ได้โดยตรง โดยมีคำสั่งดังนี้ -```sh -# Fedora Linux -sudo dnf install platformio -# Arch Linux -sudo pacman -S platformio-core -``` - -- หากคุณติดตั้งแพคเกจ Fedora นั้นแล้ว คุณไม่จำเป็นที่จะต้องติดตั้งกฎ udev ด้วยตนเอง -(ที่จะถูกกล่าวถึงใน@pioudev) -- หากคุณใช้ Arch คุณสามารถติดตั้งแพคเกจกฎ udev ได้โดยตรงโดยไม่ต้องดาวน์โหลดเอง +#figure( ```sh - sudo pacman -S --asdeps platformio-core-udev - ``` + # Fedora Linux + sudo dnf install platformio + # Arch Linux + sudo pacman -S platformio-core + ```, + kind: image, + caption: [คำสั่งในการติดตั้ง PlatformIO Core บน Fedora และ Arch Linux], +) + +#v(1.5em) + +#set enum(indent: 7.3em) +1. หากคุณติดตั้งแพคเกจ Fedora นั้นแล้ว คุณไม่จำเป็นที่จะต้องติดตั้งกฎ udev ด้วยตนเอง +(ที่จะถูกกล่าวถึงใน@pioudev) + +2. หากคุณใช้ Arch คุณสามารถติดตั้งแพคเกจกฎ udev ได้โดยตรงโดยไม่ต้องดาวน์โหลดเอง + #figure( + ```sh + sudo pacman -S --asdeps platformio-core-udev + ```, + kind: image, + caption: [คำสั่งในการติดตั้งกฎ udev ของ PlatformIO บน Arch Linux], + ) + +#v(2.5em) ==== การติดตั้ง PlatformIO Core ผ่านสคริปต์ -#iiii ถัดไป ในการติดตั้ง PlatformIO Core สามารถทำได้โดยการใช้สคริปต์ติดตั้ง โดยสำหรับ `curl` -สามารถใช้คำสั่งนี้ได้: +#h(7.3em) ถัดไป ในการติดตั้ง PlatformIO Core สามารถทำได้โดยการใช้สคริปต์ติดตั้ง โดยสำหรับ +`curl` สามารถใช้คำสั่งนี้ได้ -```sh -curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -``` - -หรือหากต้องการใช้ `wget`: - -```sh -wget -O get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -``` +#figure( + ```sh + curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py + ```, + kind: image, + caption: [คำสั่ง `curl` ที่ใช้ในการดาวน์โหลดสคริปต์ติดตั้ง PlatformIO], +) #pagebreak() -หรือสำหรับ PowerShell, สามารถใช้ `iwr` (หรือชื่อเต็มคือ `Invoke-WebRequest`) ได้: +#h(7.3em) หรือหากต้องการใช้ `wget` -```sh -iwr -OutFile get-platformio.py -Uri https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -``` +#figure( + ```sh + wget -O get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py + ```, + kind: image, + caption: [คำสั่ง `wget` ที่ใช้ในการดาวน์โหลดสคริปต์ติดตั้ง PlatformIO], +) + +#v(1.5em) + +#h(7.3em) หรือสำหรับ PowerShell, สามารถใช้ `iwr` (หรือชื่อเต็มคือ `Invoke-WebRequest`) +ได้ + +#figure( + ```sh + iwr -OutFile get-platformio.py -Uri https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py + ```, + kind: image, + caption: [คำสั่ง `iwr` ที่ใช้ในการดาวน์โหลดสคริปต์ติดตั้ง PlatformIO], +) + +#v(1.5em) (มีการเว้นบรรทัดใหม่เนื่องจากพื้นที่ไม่เพียงพอ โปรดอย่าเว้นบรรทัดเมื่อพิมพ์คำสั่งจริง) -#iiii แล้วดังนั้นจึงใช้คำสั่ง `python3 get-platformio.py` +#h(7.3em) แล้วดังนั้นจึงใช้คำสั่ง `python3 get-platformio.py` ในการรันสคริปต์ติดตั้งที่ได้ทำการดาวน์โหลดมา โดยค่าเริ่มต้นแล้ว PlatformIO จะไม่เพิ่มตนเองเข้าไปยังตัวแปรสิ่งแวดล้อม PATH ซึ่งจำเป็นในการใช้คำสั่งจากที่ใหนก็ได้โดยไม่ต้องกล่าวถึงไฟล์พาธ -#iiii โดยสำหรับ Linux แล้วนั้น คุณต้องเพิ่ม `$HOME/.local/bin/` เข้าไปยัง PATH ของคุณ -โดยหากคุณใช้ Bash คุณสามารถแก้ไข `~/.bash_profile` และเพิ่มบรรทัดนี้เข้าไปได้: +#h(7.3em) โดยสำหรับ Linux แล้วนั้น คุณต้องเพิ่ม `$HOME/.local/bin/` เข้าไปยัง PATH ของคุณ +โดยหากคุณใช้ Bash คุณสามารถแก้ไข `~/.bash_profile` และเพิ่มบรรทัดนี้เข้าไปได้ -```sh -export PATH=$PATH:$HOME/.local/bin -``` +#figure( + ```sh + export PATH=$PATH:$HOME/.local/bin + ```, + kind: image, + caption: [โคดที่ต้องใช้ในการเพิ่ม `~/.local/bin` เข้า PATH], +) -#iiii หากคุณใช้ Zsh สามารถใช้โคดเดียวกันได้ เพียงแต่คุณต้องแก้ไขไฟล์ `~/.zprofile` หรือ +#v(1.5em) + +#h(7.3em) หากคุณใช้ Zsh สามารถใช้โคดเดียวกันได้ เพียงแต่คุณต้องแก้ไขไฟล์ `~/.zprofile` หรือ `~/.zshrc` แทน -โดยบน Windows มีขั้นตอนดังนี้: +#h(7.3em) โดยบน Windows มีขั้นตอนดังนี้ -+ กด Windows + R -+ พิมพ์ `sysdm.cpl` และกด Enter -+ ในหน้าต่าง *System Properties* คลิกไปยังแท็บ *Advanced* -+ คลิกปุ่ม *Environment Variables* +#[ + #set enum(indent: 7.3em) + 1. กด Windows + R + 2. พิมพ์ `sysdm.cpl` และกด Enter + 3. ในหน้าต่าง _System Properties_ คลิกไปยังแท็บ _Advanced_ + 4. คลิกปุ่ม _Environment Variables_ +] -หลังจากนั้น เลือกตัวแปร *Path* ในส่วน *User variables* แล้วจึงกด *Edit* แล้วเพิ่ม +#h(7.3em) จากนั้น เลือกตัวแปร _Path_ ในส่วน _User variables_ แล้วจึงกด _Edit_ แล้วเพิ่ม `%USERPROFILE%\.platformio\penv\Scripts\` เข้าไปในรายการ ==== 99-platformio-udev.rules -#iiii ผู้ใช้ Linux จำเป็นที่จะต้องติดตั้งกฎ udev โดยสามารถดูไฟล์กฎ udev เวอร์ชันล่าสุดได้ที่ +#h(7.3em) ผู้ใช้ Linux จำเป็นที่จะต้องติดตั้งกฎ udev โดยสามารถดูไฟล์กฎ udev เวอร์ชันล่าสุดได้ที่ https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules - -*หมายเหตุ:* โปรดตรวจสอบว่า PID และ VID ของบอร์ดคุณอยู่ในไฟล์กฎนั้น โดยคุณสามารถดู PID/VID +และโปรดตรวจสอบว่า PID และ VID ของบอร์ดคุณอยู่ในไฟล์กฎนั้น โดยคุณสามารถดู PID/VID ของบอร์ดคุณได้ผ่านคำสั่ง `pio device list` -#iiii โดยไฟล์นั้นต้องถูกวางอยู่ที่ `/etc/udev/rules.d/99-platformio-udev.rules` +#h(7.3em) โดยไฟล์นั้นต้องถูกวางอยู่ที่ `/etc/udev/rules.d/99-platformio-udev.rules` (ตำแหน่งที่ดีที่สุด) หรือ `/lib/udev/rules.d/99-platformio-udev.rules` (อาจจำเป็นสำหรับบางระบบที่พัง) -โปรดใช้คำสั่งต่อไปนี้ในการดาวน์โหลดและวางไฟล์นั้นไว้ในสถานที่ที่ถูกต้อง: +#h(7.3em) โปรดใช้คำสั่งต่อไปนี้ในการดาวน์โหลดและวางไฟล์นั้นไว้ในสถานที่ที่ถูกต้อง -```sh -curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules -``` +#figure( + ```sh + curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/develop/platformio/assets/system/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules + ```, + kind: image, + caption: [คำสั่งในการดาวน์โหลดไฟล์กฎ `udev`], +) -หรือคุณก็สามารถดาวน์โหลดไฟล์นั้นด้วยตัวเองและคัดลอกมันไปในโฟลเดอร์ที่หมายได้เช่นกัน +#v(1.5em) -```sh -sudo cp 99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules -``` +#h(7.3em) หรือคุณก็สามารถดาวน์โหลดไฟล์นั้นด้วยตัวเองและคัดลอกมันไปในโฟลเดอร์ที่หมายได้เช่นกัน -หลังจากนั้น รีสตาร์ทบริการ udev: +#figure( + ```sh + sudo cp 99-platformio-udev.rules /etc/udev/rules.d/99-platformio-udev.rules + ```, + kind: image, + caption: [คำสั่งในการคัดลอกไฟล์กฎ `udev` ไปยังสถานที่ที่ถูกต้อง], +) -```sh -sudo service udev restart -``` -หรือ: -```sh -sudo udevadm control --reload-rules -sudo udevadm trigger -``` +#v(1.5em) -หลังจากติดตั้งไฟล์นี้แล้ว ถอดสายที่เชื่อมต่อระหว่างบอร์ดและคอมพิวเตอร์ของคุณแล้วเสียบมันใหม่ +#h(7.3em) หลังจากนั้น รีสตาร์ทบริการ udev + +#figure( + ```sh + sudo service udev restart + ```, + kind: image, + caption: [คำสั่งในการรีสตาร์ทบริการ `udev`], +) + +#v(1.5em) + +#h(7.3em) หรือทำการรีโหลดและทริกเกอร์กฎ + +#figure( + ```sh + sudo udevadm control --reload-rules + sudo udevadm trigger + ```, + kind: image, + caption: [คำสั่งในการรีโหลดกฎ `udev`], +) + +#v(1.5em) + +#h(7.3em) หลังจากติดตั้งไฟล์นี้แล้ว ถอดสายที่เชื่อมต่อระหว่างบอร์ดและคอมพิวเตอร์ของคุณแล้วเสียบมันใหม่ ==== การดาวน์โหลดโปรเจกต์ -#iiii สามารถใช้ Git ในการ clone โปรเจกต์ได้ด้วยคำสั่งต่อไปนี้: +#h(7.3em) สามารถใช้ Git ในการ clone โปรเจกต์ได้ด้วยคำสั่งต่อไปนี้ -```sh -git clone https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32.git -``` +#figure( + ```sh + git clone https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32.git + ```, + kind: image, + caption: [คำสั่งในการโคลนโคดสำหรับเฟิร์มแวร์], +) -#iiii โดย Git นั้นจะทำการโคลนโปรเจกต์ไปที่โฟลเดอร์ `liteauth-firmware32` +#v(1.5em) + +#h(7.3em) โดย Git นั้นจะทำการโคลนโปรเจกต์ไปที่โฟลเดอร์ `liteauth-firmware32` เนื่องจากเป็นชื่อของ Git repository หรือหากไม่ต้องการใช้ Git กรุณาไปที่ https://gitskette.dailitation.xyz/linesofcodes/liteauth-firmware32 และทำการคลิกปุ่ม -*Code* แล้วกด *Download ZIP* หรือ *Download TAR.GZ* แล้วทำการแตกไฟล์ได้ตามปกติ - -หลังจากนั้น ไปที่โฟลเดอร์ของคุณในเทอร์มินัลโดยใช้คำสั่ง `cd` - -#pagebreak() +_Code_ แล้วกด _Download ZIP_ หรือ _Download TAR.GZ_ แล้วทำการแตกไฟล์ได้ตามปกติ +จากนั้นจึงไปที่โฟลเดอร์ของคุณในเทอร์มินัลโดยใช้คำสั่ง `cd` ==== คำสั่ง PlatformIO เบื้องต้น #[ - #set list(indent: 9.25em) - - `pio run --list-targets`: ดูรายการเป้าหมายคำสั่งรัน - - `pio run upload`: รันเป้าหมายอัพโหลด + #set enum(indent: 7.3em) + 1. `pio run --list-targets` เพื่อดูรายการเป้าหมายคำสั่งรัน + 2. `pio run upload` เพื่อรันเป้าหมายอัพโหลด ซึ่งนี่คือคำสั่งที่คุณควรจะใช้ในการเขียนเฟิร์มแวร์ลงบนบอร์ด - - `pio device monitor`: เปิด Serial Monitor + 3. `pio device monitor` เพื่อเปิด Serial Monitor ] -#iiii *หมายเหตุ:* โปรดใช้คำสั่งประเภท `pio run` ในโฟลเดอร์ของโปรเจกต์ +#h(7.3em) และโปรดใช้คำสั่งประเภท `pio run` ในโฟลเดอร์ของโปรเจกต์ #include "BuildApp.typ" == การทดสอบ +#set enum(indent: 1.7em) +1. เข้าแอพลิเคชัน liteauthconfig +2. ทำการเชื่อมต่อไวไฟที่ต้องการให้อุปกรณ์เชื่อมต่อ (ต้องไม่ใช่ไวไฟ 2.4 GHz) +3. กดปุ่มบวก +4. กดตั้งค่าอุปกรณ์ใหม่ (Setup new device) +5. ตั้งชื่ออุปกรณ์และใส่รหัสผ่านเครือข่าย +6. กดปุ่มติ๊กถูกเพื่อเริ่มการตั้งค่าอุปกรณ์ +7. เข้าสู่โหมดลงทะเบียนอุปกรณ์ NFC +8. ทำการแตะอุปกรณ์ NFC (เช่นโทรศัพท์ที่รองรับหรือแท็ก NFC) +9. ออกจากโหมดลงทะเบียน +10. ทำการแตะอุปกรณ์ NFC ที่ลงทะเบียน +11. รอสังเกตุรายการกิจกรรม (Activity Logs) + == การวิเคราะห์ข้อมูล + +#h(1.7em) วิเคราะห์จากตารางการทดลองตามความเร็วในการทำงานจริงของเครื่องยืนยันตัวตนด้วย NFC diff --git a/Chapter3/ProductFlowchart.typ b/Chapter3/ProductFlowchart.typ index dab79ac..e3fba44 100644 --- a/Chapter3/ProductFlowchart.typ +++ b/Chapter3/ProductFlowchart.typ @@ -18,17 +18,17 @@ node((1, 3), [เชื่อมต่อเครือข่าย]), edge("-|>"), - node((0, 4), [มีอุปกรณ์ควบคุม\ หลักแล้วหรือไม่], shape: diamond), + node((0, 3.5), [ตั้งค่าเซิร์ฟเวอร์ HTTPS]), + edge("-|>"), + + node((0, 5), [มีอุปกรณ์ควบคุม\ หลักแล้วหรือไม่], shape: diamond), edge("-|>", [ไม่มี]), edge("d", "-|>", [มี]), node((1, 4), [สร้างโทเค็นสำหรับการยืนยัน\ อุปกรณ์ควบคุมหลัก]), edge("-|>"), - node((1, 5), [รออุปกรณ์ควบคุมหลัก\ แตะเซนเซอร์ NFC]), - edge("-|>"), - - node((0, 5), [ตั้งค่าเซิร์ฟเวอร์ HTTPS]), + node((1, 5), [รออุปกรณ์ควบคุมหลัก\ ติดต่อกับอุปกรณ์]), edge("-|>"), node((0, 6), shape: circle, radius: 1em), diff --git a/Chapter3/imgs/MainModuleInternal.jpg b/Chapter3/imgs/MainModuleInternal.jpg new file mode 100644 index 0000000..b4102e4 Binary files /dev/null and b/Chapter3/imgs/MainModuleInternal.jpg differ diff --git a/Chapter3/imgs/IMG_20251226_140332784.jpg b/Chapter3/imgs/NFCSensor.jpg similarity index 100% rename from Chapter3/imgs/IMG_20251226_140332784.jpg rename to Chapter3/imgs/NFCSensor.jpg diff --git a/Chapter3/imgs/NFCSensor_cropped.jpg b/Chapter3/imgs/NFCSensor_cropped.jpg new file mode 100644 index 0000000..32e308f Binary files /dev/null and b/Chapter3/imgs/NFCSensor_cropped.jpg differ diff --git a/Chapter3/imgs/ProjectDraft_Modules.png b/Chapter3/imgs/ProjectDraft_Modules.png new file mode 100644 index 0000000..382b918 Binary files /dev/null and b/Chapter3/imgs/ProjectDraft_Modules.png differ diff --git a/Chapter4.typ b/Chapter4.typ index a98cc3b..e8b4864 100644 --- a/Chapter4.typ +++ b/Chapter4.typ @@ -5,3 +5,93 @@ #heading([#linebreak()ผลการทดสอบ]) #set heading(numbering: "1.1") +#i ผลการทำโครงงานเครื่องยืนยันตัวตนด้วย NFC สามารถตรวจสอบอุปกรณ์ NFC +ได้ตามวัตถุประสงค์ที่ตั้งไว้ในข้างต้น และสามารถใช้เป็นต้นแบบในการพัฒนาได้อีกต่อไป +โดยการทดสอบจะทำการตรวจสอบค่าความหน่วง (latency) +ของการติดต่อสื่อสารระหว่างอุปกรณ์ควบคุมและเครื่องยืนยันตัวตนเป็นหลัก +โดยสิ่งที่เหมือนกันในทุกการทดลองคือแอพลิเคชันไคลเอนต์จะทำการขอข้อมูลใหม่ทุก 15 +วินาทีโดยไม่รอเวลาคำขอเก่าสำเร็จ + +#i การทดสอบจะใช้อุปกรณ์ไคลเอนต์สองประเภทด้วยกัน ได้แก่ คอมพิวเตอร์และโทรศัพท์มือถือ +โดยรายละเอียดทางเทคนิคของอุปกรณ์ไคลเอนต์ที่ใช้มีดังนี้ + +#set enum(indent: 3em) +1. คอมพิวเตอร์ที่ใช้คือโน๊ตบุ๊ค MSI Thin 15 B12UCX +#listy( + numbering: thai-numbering, + indent: 4.5em, + [หน่วยประมวลผล Intel#sym.trademark.registered Core#sym.trademark i5-12450H], + [ตัวควบคุมเครือข่ายไร้สาย Intel#sym.trademark.registered Wi-Fi 6E AX211], + [ระบบปฏิบัติการ Arch Linux, Linux Kernel 6.18.9-arch1-2, Avahi 1:0.9rc3-1, + `nss-mdns` 0.15.1-2], + [มีการปรับแต่ง `nss-mdns` โดยการแก้ไขไฟล์ `/etc/nsswitch.conf` ในบรรทัด `hosts` + เป็นดังนี้ (โดยไม่รวมการเว้นบรรทัดใหม่) + #figure( + ``` + hosts: mymachines mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] files myhostname dns + ```, + kind: image, + caption: [บรรทัดที่มีการแก้ไขของไฟล์ `/etc/nsswitch.conf`], + ) + #v(4em) + ], +) +2. โทรศัพท์มือถือที่ใช้คือ CMF by Nothing Phone 2 Pro +#listy( + numbering: thai-numbering, + indent: 4.5em, + [หน่วยประมวลผล MediaTek Dimensity 7300 Pro 5G], + [Android 16 (Kernel 6.1.134, 14 พฤษภาคม 2025), Nothing OS 4.0, Build + Galaga-B4.0-260108-1654], +) + +#i และรายละเอียดทางเทคนิคของเซิร์ฟเวอร์ (ESP32) มีดังนี้: + +1. บอร์ด 30-pin ESP-WROOM-32 (NodeMCU) +2. หน่วยประมวลผล Xtensa LX6 (240 MHz) +3. หน่วยประมวลผลร่วม (Coprocessor) FSM (20 MHz) +4. Wi-Fi 802.11 b/g/n/e/i +#listy( + numbering: thai-numbering, + indent: 4.5em, + [รองรับเครือข่าย Wi-Fi 2 (802.11b), Wi-Fi 3 (802.11g), และ Wi-Fi 4 (802.11n)], + [รองรับ 802.11n ในคลื่นความถี่ 2.4 GHz และความเร็วสูงสุด 150 Mbps], + [รองรับมาตรฐานปรับปรุงคุณภาพบริการเครือข่ายไร้สาย (802.11e)], + [รองรับมาตรฐานความปลอดภัย 802.11i (ซึ่งเป็นส่วนหนึ่งของ WPA2)], +) +5. SRAM 520 KiB +6. ROM 448 KiB + +== ระยะเวลาในการเดินทางของข้อมูลทั้งสิ้น + +#h(1.7em) +โดยการทดสอบนี้จะทำการเปรียบเทียบและหาระยะเวลาที่ใช้ในการเดินทางของข้อมูลตั้งแต่เซนเซอร์ถูกใช้จนถึงเวลาไคลเอนต์ได้รับข้อมูลบนอุปกรณ์ไคลเอนต์ทั้งสองประเภท + +#figure( + table( + columns: (2em, 2fr, 2fr, 1fr), + [ที่], [เวลาที่ตรวจจับ], [เวลาที่ไคลเอนต์ได้รับข้อมูล], [ความต่าง (ms)], + [1], [2026-02-26T05:52:56.380Z], [2026-02-26T05:53:03.239Z], [6859ms], + [2], [2026-02-26T07:07:32.241Z], [2026-02-26T07:07:44.924Z], [12683ms], + [3], [2026-02-26T07:09:21.382Z], [2026-02-26T07:09:31.166Z], [9784ms], + ), + caption: [ระยะเวลาในการเดินทางของข้อมูลทั้งสิ้นบนคอมพิวเตอร์], +) + +#figure( + table( + columns: (2em, 2fr, 2fr, 1fr), + [ที่], [เวลาที่ตรวจจับ], [เวลาที่ไคลเอนต์ได้รับข้อมูล], [ความต่าง (ms)], + ), + caption: [ระยะเวลาในการเดินทางของข้อมูลทั้งสิ้นบนโทรศัพท์มือถือ], +) + +== ระยะเวลาในการส่งคำขอ + +#figure( + table( + columns: (1fr, 2fr, 2fr), + [ที่], [คอมพิวเตอร์], [โทรศัพท์มือถือ], + ), + caption: [เปรียบเทียบระยะเวลาในการส่งคำขอ], +) diff --git a/Chapter5.typ b/Chapter5.typ index a9d3388..e055055 100644 --- a/Chapter5.typ +++ b/Chapter5.typ @@ -6,8 +6,33 @@ #counter(heading).update((5, 0)) #set heading(numbering: "1.1") +#i จากการทำโครงงานเรื่อง เครื่องยืนยันตัวตนด้วย NFC โดยมีวัตถุประสงค์เผื่อ + +การจัดทำโครงงานครั้งนี้ ผู้จัดทำได้ผลสรุปดังนี้ + == สรุปผลโครงงาน +#h(1.7em) เครื่องยืนยันตัวตนด้วย NFC สามารถทำงานได้ตามวัตถุประสงค์ที่ตั้งไว้ โดยเมื่อมีการแตะบัตรหรือสมาร์ตโฟนที่รองรับ NFC เข้ากับตัวอ่าน ระบบจะทำการตรวจสอบข้อมูลกับฐานข้อมูลที่บันทึกไว้ หากข้อมูลถูกต้อง ระบบจะสั่งปลดล็อกและอนุญาตให้เข้าใช้งานได้ แต่หากข้อมูลไม่ถูกต้อง ระบบจะไม่อนุญาตและอาจมีการแจ้งเตือน + +#h(1.7em) 5.1.1 โมดูล NFC สามารถอ่านข้อมูลจากบัตรได้อย่างถูกต้องในระยะใกล้ + +#h(1.7em) 5.1.2 บอร์ดควบคุมสามารถประมวลผลข้อมูลและสั่งงานอุปกรณ์ได้ตามโปรแกรมที่กำหนด + +#h(1.7em) 5.1.3 ระบบสามารถลดการใช้กุญแจแบบเดิม และเพิ่มความสะดวกให้กับผู้ใช้งาน + == อภิปรายผล +#h(1.7em) จากการทดลองใช้งานจริง พบว่าเครื่องสามารถอ่านบัตรได้รวดเร็ว ใช้เวลาเพียงไม่กี่วินาทีในการตรวจสอบสิทธิ์การเข้าใช้งาน ระบบมีความแม่นยำสูงเมื่ออยู่ในระยะที่เหมาะสม อย่างไรก็ตาม หากวางบัตรห่างจากตัวอ่านมากเกินไป ระบบจะไม่สามารถอ่านข้อมูลได้ + +การใช้งาน NFC ช่วยเพิ่มความปลอดภัย เนื่องจากต้องมีบัตรหรืออุปกรณ์ที่ลงทะเบียนไว้เท่านั้นจึงจะสามารถเข้าใช้งานได้ ทำให้ลดความเสี่ยงจากบุคคลภายนอกได้อย่างมีประสิทธิภาพ + == ข้อเสนอแนะ + +#h(1.7em) 5.3.1 ควรพัฒนาให้สามารถบันทึกข้อมูลการเข้า–ออกเพื่อตรวจสอบย้อนหลังได้ + +#h(1.7em) 5.3.2 ควรเพิ่มระบบแจ้งเตือนผ่านแอปพลิเคชันหรือไลน์เมื่อมีการเข้าใช้งาน + +#h(1.7em) 5.3.3 ควรพัฒนาระบบให้รองรับผู้ใช้งานจำนวนมากขึ้น + +#h(1.7em) 5.3.4 +ควรออกแบบกล่องอุปกรณ์ให้มีความแข็งแรงและสวยงามมากขึ้น \ No newline at end of file diff --git a/PageTemplate.typ b/PageTemplate.typ index ab0b910..777b427 100644 --- a/PageTemplate.typ +++ b/PageTemplate.typ @@ -8,7 +8,7 @@ } #let thai-numbering(n) = { - let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช") + let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช", "ซ", "ฌ", "ญ") if n <= chars.len() { chars.at(n - 1) } else { @@ -35,17 +35,11 @@ #let i = h(3em) /// Insane shit forced upon by my teacher - /// For indenting in 3rd level subheadings -// #let iii = h(3em) -#let iii = h(5.5em) - +#let iii = h(4.1em) /// For indenting in 4th level subheadings -// #let iiii = h(6em) -#let iiii = h(9.25em) - +#let iiii = h(7.55em) #let iiiii = h(13em) - #let iiiiii = h(16.85em) #let listy( @@ -68,7 +62,7 @@ } } -#let page-theme(doc) = { +#let page-theme(doc, has-header: true) = { set page( paper: "a4", margin: ( @@ -77,10 +71,12 @@ right: 1in, bottom: 1in, ), - header: context [ - #h(1fr) - #counter(page).display(page-numbering) - ], + header: if has-header { + context [ + #h(1fr) + #counter(page).display(page-numbering) + ] + }, ) set text( lang: "th", @@ -114,21 +110,8 @@ show heading.where(level: 1): set block(below: 2em) show heading.where(level: 2): set block(above: 2em) show heading.where(level: 2): set text(weight: "bold") - show heading: it => { - if it.level > 2 { - block( - it, - inset: (left: 3em * (it.level - 2)), - ) - } else { - it - } - } show math.equation: set text(font: "Laksaman") show table.cell.where(y: 0): strong - show image: it => { - block(stroke: black + 2pt, it) - } show figure.where(kind: "i-figured-table"): set align(start) show figure.where(kind: table): set figure.caption(position: top) show figure.where(kind: table): t => { @@ -141,7 +124,6 @@ } it } - show figure.caption.where(position: bottom): it => place(center, it, dy: 2em) show figure.where(kind: "i-figured-image"): i => { show figure.caption: it => { place( @@ -156,6 +138,9 @@ dy: 2em, ) } + show image: it => { + block(stroke: black + 2pt, it) + } i } set figure.caption(separator: " ") @@ -221,7 +206,6 @@ show heading: set text(size: 10.5pt) show heading: set block(below: 1em) show heading.where(level: 1): set text(size: 12pt, weight: "bold") - show heading.where(level: 1): set align(center) show heading.where(level: 2): set text(weight: "bold") show math.equation: set text(font: "Laksaman") show table.cell.where(y: 0): strong diff --git a/References.yaml b/References.yaml index 962f9b8..f571a30 100644 --- a/References.yaml +++ b/References.yaml @@ -178,6 +178,36 @@ wkNFC: date: 2025-12-10 value: https://en.wikipedia.org/w/index.php?title=Near-field_communication&oldid=1320616102 +wkWiFi: + type: Web + title: Wi-Fi + date: 2026-02-18 + language: en + publisher: มูลนิธิวิกิมีเดีย (ภายใต้ CC BY-SA 4.0) + url: + date: 2026-02-19 + value: https://en.wikipedia.org/w/index.php?title=Wi-Fi&oldid=1338995964 + +wkIEEE80211i: + type: Web + date: 2025-03-22 + title: IEEE 802.11i-2004 + language: en + publisher: มูลนิธิวิกิมีเดีย (ภายใต้ CC BY-SA 4.0) + url: + date: 2026-02-19 + value: https://en.wikipedia.org/w/index.php?title=IEEE_802.11i-2004&oldid=1281726294 + +wkIEEE80211e: + type: Web + date: 2025-08-26 + title: IEEE 802.11e-2005 + language: en + publisher: มูลนิธิวิกิมีเดีย (ภายใต้ CC BY-SA 4.0) + url: + date: 2026-02-19 + value: https://en.wikipedia.org/w/index.php?title=IEEE_802.11e-2005&oldid=1307917729 + androidJdkVersion: type: Web title: Java versions in Android builds @@ -374,3 +404,11 @@ pioInsScript: url: date: 2025-12-15 value: https://docs.platformio.org/en/latest/core/installation/methods/installer-script.html + +esp32Datasheet: + type: reference + date: 2016-10-8 + title: ESP32 Datasheet + url: + date: 2026-02-19 + value: https://www.esp32.dk/esp32_datasheet_en.pdf diff --git a/internal/README.md b/internal/README.md new file mode 100644 index 0000000..77ae424 --- /dev/null +++ b/internal/README.md @@ -0,0 +1,4 @@ +# HTTP API + +This folder documents the HTTP API. The contents of this is not included in the +printed book version. diff --git a/internal/api.typ b/internal/api.typ new file mode 100644 index 0000000..2fe9d94 --- /dev/null +++ b/internal/api.typ @@ -0,0 +1,76 @@ += HTTP API + +== Authorization + +The API uses the `Authorization` header with a 16 characters long bearer token. + +An example of the header would be: + +``` +Authorization: Bearer tC8UMiiyaLnVWaW2 +``` + +The token is generated from a set of characters: + +``` +abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 +``` + +Which means you can also create a mock token by using the following code: + +```py +import string +import random + +s = string.ascii_letters + string.digits + +for i in range(16): + print(random.choice(s), end="") + +print() +``` + +== [GET] /api/status + +Example response: + +```json +{ + "nfc": true +} +``` + +== [GET] /api/restart + +Requires auth + +== [GET] /api/factoryReset + +Requires auth + +== [GET] /api/logs + +Requires auth + +Returns a JSON array + +Example: + +```json +[ + { + "time": "2026-02-03T18:48:50Z", + "uid": "b1c3600" + } +] +``` + +== [GET] /api/getToken + +Retrieves the authentication token. _Only available in initial device setup._ + +If the token has already been retrieved (initial setup has been done), This +endpoint will return 403 Forbidden. + +Returns `text/plain` with the 16 characters token + diff --git a/main.typ b/main.typ index 2616051..27e19dc 100644 --- a/main.typ +++ b/main.typ @@ -36,7 +36,7 @@ grid( columns: 3, column-gutter: 1fr, - it.indented(it.prefix(), it.body()), + [#h(3.25em * (it.level - 1)) #it.prefix() #it.body()], h(1em), context page-numbering(counter(page).at(it.element.location()).first()), ), @@ -55,39 +55,84 @@ if current-page > outline-pages { fake-h1("สารบัญ (ต่อ)") v(1em) + h(1fr) + [หน้า] } } } - #outline(depth: 2, indent: 3.75em) + #place(center, heading()[สารบัญ]) + #linebreak() + #linebreak() + #h(1fr) + หน้า + #outline(title: none, depth: 2, indent: 3.75em) ] - #pagebreak() #import "@preview/i-figured:0.2.4" - #i-figured.outline(target-kind: table, title: [สารบัญตาราง]) + #[ + #show outline.entry: it => { + show linebreak: [ ] + link( + it.element.location(), + grid( + columns: 3, + column-gutter: 1fr, + [#h(3.25em * (it.level - 1)) #it.prefix().children.at(2) #it.body()], + h(1em), + context page-numbering( + counter(page).at(it.element.location()).first(), + ), + ), + ) + } - #pagebreak() + #place(center, heading[สารบัญตาราง]) + #linebreak() + #linebreak() + ตารางที่ + #h(1fr) + หน้า - #i-figured.outline( - title: [สารบัญภาพ], - ) + #i-figured.outline(target-kind: table, title: none) + + #pagebreak() + + #place(center, heading[สารบัญรูป]) + #linebreak() + #linebreak() + รูปที่ + #h(1fr) + หน้า + + #i-figured.outline( + title: none, + ) + ] #show heading: i-figured.reset-counters #show figure: i-figured.show-figure - #include "Chapter1.typ" - #include "Chapter2/Chapter2.typ" - #include "Chapter3/Chapter3.typ" - #include "Chapter4.typ" - #include "Chapter5.typ" + #[ + #show figure.caption.where(position: bottom): it => place( + center, + it, + dy: 2em, + ) + #include "Chapter1.typ" + #include "Chapter2/Chapter2.typ" + #include "Chapter3/Chapter3.typ" + #include "Chapter4.typ" + #include "Chapter5.typ" + ] #bibliography( "References.yaml", title: "บรรณานุกรม", full: true, - style: "nong-khai-technical-college-project-guidelines.csl", + style: "nktc-style.csl", ) #pagebreak() @@ -117,8 +162,12 @@ } f.caption - linebreak() - h(2.2em) + h(3.8em) + + if (idx + offset >= 9) { + h(0.5em) + } + attributions.at(idx + offset).body.body linebreak() } @@ -128,4 +177,3 @@ ] #include "ภาคผนวก/ภาคผนวก.typ" -#include "History.typ" diff --git a/nong-khai-technical-college-project-guidelines.csl b/nktc-style.csl similarity index 100% rename from nong-khai-technical-college-project-guidelines.csl rename to nktc-style.csl diff --git a/ภาคผนวก/BlockDiagram.typ b/ภาคผนวก/BlockDiagram.typ new file mode 100644 index 0000000..5489a1e --- /dev/null +++ b/ภาคผนวก/BlockDiagram.typ @@ -0,0 +1,13 @@ +#pagebreak() +#v(1fr) +== บล็อคไดอะแกรม +#v(1fr) +#pagebreak() + +#figure( + image( + "imgs/NFCAuthSystemWiring_bb.png", + alt: "แผนผังการต่อวงจรภายในโปรแกรม Fritzing ของระบบยืนยันตัวตนด้วย NFC โดย ESP32 ถูกเชื่อมต่อกับบัซเซอร์และโมดูลตัวอ่าน NFC PN532 ผ่านโหมด SPI โดยทั้งสองส่วนประกอบมี breadboard เป็นตัวกลางในการเชื่อมต่อไฟบวกและไฟลบ (VCC/GND)", + ), + caption: [แผนผังการต่อวงจร], +) diff --git a/ภาคผนวก/Budget.typ b/ภาคผนวก/Budget.typ new file mode 100644 index 0000000..3ce2996 --- /dev/null +++ b/ภาคผนวก/Budget.typ @@ -0,0 +1,30 @@ +#import "../PageTemplate.typ": * +#show: page-theme.with(has-header: false) + +#v(1fr) +== งบประมาณในการจัดทำเครื่องยืนยันตัวตนด้วย NFC +#v(1fr) +#pagebreak() + +#show: page-theme + +*งบประมาณในการจัดทำเครื่องยืนยันตัวตนด้วย NFC* + +#table( + columns: (2em, 3fr, 1fr, 1fr, 1fr), + align: (center, left, center, center, center), + [ที่], table.cell(align: center)[รายการ], [จำนวน], [หน่วย], [ราคา (บาท)], + [1], [ESP32 NodeMCU ESP-WROOM-32 Wi-Fi and Bluetooth], [1], [175], [175], + + [2], [Active Buzzer ลำโพงสัญญาณ 5V TMB12A05 12*9.5mm], [1], [6], [6], + + [3], [PIR Motion Sensor HC-SR501], [1], [40], [40], + + [4], [เซนเซอร์ NFC PN532 Module Set], [2], [79], [158], + + [5], [แผ่นไม้], [4], [20], [80], + + [6], [กล่องพลาสติก], [3], [40], [120], + + table.cell(colspan: 4, align: left)[*รวมค่าใช้จ่าย*], [579], +) diff --git a/History.typ b/ภาคผนวก/History.typ similarity index 67% rename from History.typ rename to ภาคผนวก/History.typ index bed0fdf..85aa00e 100644 --- a/History.typ +++ b/ภาคผนวก/History.typ @@ -1,7 +1,18 @@ -#import "PageTemplate.typ": * -#show: page-theme +#import "../PageTemplate.typ": * -= ประวัติย่อผู้จัดทำ +#set text(font: "Laksaman", size: 10.5pt) +#set par(leading: 1em) +#show heading: set text(size: 10.5pt) +#pagebreak() +#v(1fr) +== ประวัติย่อผู้จัดทำ +#v(1fr) +#pagebreak() +#show: page-theme.with(has-header: true) +#show heading.where(level: 3): set text(weight: "bold") +#show heading.where(level: 3): set align(center) + +#heading(outlined: false, level: 3)[ประวัติย่อผู้จัดทำ] #place(right, box(stroke: (thickness: 1pt), width: 0.8in, height: 1in)) @@ -18,6 +29,7 @@ ], ) +#linebreak() *ประวัติการศึกษา* #grid( @@ -29,7 +41,18 @@ [พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย], ) -#v(1in) +#linebreak() +*ประวัติการฝึกงาน* + +#grid( + columns: 2, + row-gutter: 1em, + column-gutter: 2em, + [พ.ศ. 2569], [ฝึกงานโรงพยาบาลหนองคาย], +) + +#pagebreak() +#heading(outlined: false, level: 3)[ประวัติย่อผู้จัดทำ] #place(right, box(stroke: (thickness: 1pt), width: 0.8in, height: 1in)) @@ -46,6 +69,7 @@ ], ) +#linebreak() *ประวัติการศึกษา* #grid( @@ -57,7 +81,18 @@ [พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย], ) -#v(1in) +#linebreak() +*ประวัติการฝึกงาน* + +#grid( + columns: 2, + row-gutter: 1em, + column-gutter: 2em, + [พ.ศ. 2569], [ฝึกงานที่ไอทีเซอร์วิซ ฟิกซ์เซ็นเตอร์], +) + +#pagebreak() +#heading(outlined: false, level: 3)[ประวัติย่อผู้จัดทำ] #place(right, box(stroke: (thickness: 1pt), width: 0.8in, height: 1in)) @@ -74,6 +109,7 @@ ], ) +#linebreak() *ประวัติการศึกษา* #grid( @@ -84,3 +120,13 @@ [พ.ศ.2567], [ม.3], [โรงเรียนหัสดีศึกษา], [พ.ศ.2569], [ปวช.], [สาขาวิชาช่างเทคนิคคอมพิวเตอร์ วิทยาลัยเทคนิคหนองคาย], ) + +#linebreak() +*ประวัติการฝึกงาน* + +#grid( + columns: 2, + row-gutter: 1em, + column-gutter: 2em, + [พ.ศ. 2569], [ฝึกงานที่ร้าน ทูโฟร์อิ้งค์], +) diff --git a/ภาคผนวก/Programs.typ b/ภาคผนวก/Programs.typ new file mode 100644 index 0000000..c3e8385 --- /dev/null +++ b/ภาคผนวก/Programs.typ @@ -0,0 +1,58 @@ +#import "../PageTemplate.typ": * +#show: page-theme.with(has-header: false) + +#v(1fr) +== โปรแกรม +#v(1fr) +#pagebreak() + +#show: page-theme + +*โปรแกรมเครื่องยืนยันตัวตนด้วย NFC* + +#show heading.where(level: 3): set heading(numbering: (..n) => { + str(n.at(-1)) + [. ] +}) + +1. Android Studio + +#afigure( + image("imgs/Android_Studio_icon_(2023).svg"), + attr: [Android Studio, CC BY 2.5 Generic], + alt: "โลโก Android Studio", + caption: [Android Studio], +) + +2. CLion + +#afigure( + image("imgs/CLion.svg"), + attr: [JetBrains เป็นเจ้าของเครื่องหมายการค้า CLion], + alt: "โลโก CLion", + caption: [JetBrains CLion], +) + +3. PlatformIO + +#afigure( + image("imgs/platformio-logo.png", width: 1.5in), + alt: "โลโก PlatformIO", + caption: [PlatformIO], +) + +4. liteauthconfig + +#figure( + image("imgs/liteauthconfig_deviceinfo_desktop.png", width: 3.5in), + alt: "หน้าอุปกรณ์ข้อมูลของแอพลิเคชัน liteauthconfig บนเดสก์ท็อป", + caption: [liteauthconfig บนเดสก์ท็อป], +) + +5. liteauth-firmware + +#figure( + image("imgs/liteauthfirmware_clion.png", width: 5in), + alt: "รูปแสดงโคด lite auth firmware ที่เปิดอยู่ภายใน CLion", + caption: [โคด liteauth-firmware], +) diff --git a/ภาคผนวก/UsageGuide.typ b/ภาคผนวก/UsageGuide.typ new file mode 100644 index 0000000..7b52108 --- /dev/null +++ b/ภาคผนวก/UsageGuide.typ @@ -0,0 +1,116 @@ +#import "@preview/tiaoma:0.3.0": qrcode +#import "../PageTemplate.typ": * +#show: page-theme.with(has-header: false) + +#v(1fr) +== คู่มือการใช้งาน +#v(1fr) +#pagebreak() + +#show: page-theme +#show heading.where(level: 3): set text(weight: "bold") +#show heading.where(level: 4): it => { + block( + it, + inset: (left: 3em * (it.level - 3)), + ) +} +#set enum(indent: 3em) + +#text("คู่มือการใช้งานเครื่องยืนยันตัวตนด้วย NFC", size: 12pt, weight: "bold") + +=== การเปิดใช้อุปกรณ์ + +ทำการเสียบสายชาร์จของอุปกรณ์ + +=== การใช้งานแอพลิเคชัน + +#grid( + columns: 2, + column-gutter: 2em, + [ + ==== การติดตั้งแอพลิเคชัน + 1. ไปยัง + https://gitskette.dailitation.xyz/linesofcodes/liteauthconfig/releases + หรือสแกน QR code ด้านข้าง + 2. เลือกเวอร์ชันล่าสุด และดาวน์โหลดไฟล์นามสกุล .apk + 3. ติดตั้งไฟล์ .apk + ], + qrcode( + "https://gitskette.dailitation.xyz/linesofcodes/liteauthconfig/releases", + ), +) + +==== การตั้งค่าอุปกรณ์ + +#grid( + columns: 2, + column-gutter: 2em, + [ + 1. เชื่อมต่อเครือข่ายไร้สายที่ต้องการให้อุปกรณ์เชื่อมต่อ + 2. เพื่อลงทะเบียนอุปกรณ์ กดปุ่มสัญลักษณ์บวก + 3. กด _ตั้งค่าอุปกรณ์ใหม่_ + 4. อาจมีไดอะล็อกถามเกี่ยวกับข้อมูลเครือข่าย + หากต้องการให้แอพลิเคชันกรอกข้อมูลเครือข่ายโดยอัตโนมัติ แตะ _ดำเนินการต่อ_#jb + แอพลิเคชันจะขออนุญาตในการเข้าถึงตำแหน่งอย่างละเอียดเนื่องจากจำเป็นในการเข้าถึงข้อมูลเครือข่าย + 5. ตั้งชื่อให้แก่อุปกรณ์ + 6. หากปฏิเสธการกรอกข้อมูลเครือข่ายอัตโนมัติ กรอก SSID และ BSSID + ของเครือข่ายที่ต้องการให้อุปกรณ์เชื่อมต่อ + 7. กรอกรหัสผ่านเครือข่าย + 8. คลิกปุ่มเครื่องหมายติ๊กถูก + 9. รอกระบวณการการตั้งค่าเครือข่าย + ], + figure( + image("imgs/th-mobile-home-empty.png", width: 1.5in), + caption: [เมื่อเปิดแอพลิเคชันเป็นครั้งแรก], + ), +) + +#pagebreak() + +==== การตรวจสอบสถานะอุปกรณ์ + +#grid( + columns: 2, + column-gutter: 2em, + [ + #i หน้าสถานะอุปกรณ์ประกอบไปด้วยข้อมูลดังนี้ + + 1. สถานะอุปกรณ์ + 2. ข้อมูลเครือข่ายอุปกรณ์ + 3. รายการกิจกรรม + ], +) + +==== การจัดการอุปกรณ์ + +#grid( + columns: 2, + column-gutter: 2em, + [ + 1. รีเฟรช ทำการรีเฟรชรายการกิจกรรมของอุปกรณ์ + 2. จัดการโทเค็น ทำการแสดงหรือแก้ไขโทเค็นที่ถูกใช้ในการสื่อสารกับอุปกรณ์ + 3. ตั้งค่าเครือข่ายใหม่ + ใช้ในกรณีที่เครือข่ายมีการเปลี่ยนแปลงและอุปกรณ์ไม่สามารถเชื่อมต่อเครือข่ายเดิมได้ + 4. คืนค่าโรงงาน ลบข้อมูลทั้งหมดบนอุปกรณ์ + 5. ลบ ทำการลืมอุปกรณ์นี้ + ], + figure( + image("imgs/th-mobile-device-actions.png", width: 1.5in), + caption: [รายการการกระทำต่ออุปกรณ์], + ), +) + +#v(4em) + +==== การคืนค่าโรงงาน + +#i การคืนค่าโรงงานจะส่งผลให้อุปกรณ์ยืนยันตัวตนกลับสู่ค่าเริ่มต้น โดยหลังจากกดใช้แล้ว +ผู้ใช้สามารถเลือกที่จะใช้ฟังก์ชันตั้งค่าเครือข่ายใหม่ หรือทำการลบอุปกรณ์ได้ + +=== ข้อจำกัดทางเครือข่าย + +1. อุปกรณ์ยืนยันตัวตนสามารถเชื่อมต่อเครือข่ายย่านความถี่ 2.4 GHz ที่รองรับมาตรฐาน Wi-Fi 2, 3, + และ 4 (802.11b/g/n) ได้เท่านั้น +2. เนื่องจากข้อจำกัดของเทคโนโลยี mDNS + หลังจากการตั้งค่าเครือข่ายอุปกรณ์อาจมีความล่าช้าในการอัปเดตสถานะอุปกรณ์ diff --git a/ภาคผนวก/gpl-3.0.typ b/ภาคผนวก/gpl-3.0.typ index 62fc04f..b34303a 100644 --- a/ภาคผนวก/gpl-3.0.typ +++ b/ภาคผนวก/gpl-3.0.typ @@ -1,6 +1,6 @@ #import "../PageTemplate.typ": sane-theme #show: sane-theme -#set heading(offset: 1) +#set heading(outlined: false) #set enum(numbering: "a)") = GNU GENERAL PUBLIC LICENSE diff --git a/ภาคผนวก/imgs/Android_Studio_icon_(2023).svg b/ภาคผนวก/imgs/Android_Studio_icon_(2023).svg new file mode 100644 index 0000000..f5c8cd0 --- /dev/null +++ b/ภาคผนวก/imgs/Android_Studio_icon_(2023).svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ภาคผนวก/imgs/CLion.svg b/ภาคผนวก/imgs/CLion.svg new file mode 100644 index 0000000..ae7afe5 --- /dev/null +++ b/ภาคผนวก/imgs/CLion.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/ภาคผนวก/imgs/NFCAuthSystemWiring_bb.png b/ภาคผนวก/imgs/NFCAuthSystemWiring_bb.png new file mode 100644 index 0000000..b186ea8 Binary files /dev/null and b/ภาคผนวก/imgs/NFCAuthSystemWiring_bb.png differ diff --git a/ภาคผนวก/imgs/liteauthconfig_deviceinfo_desktop.png b/ภาคผนวก/imgs/liteauthconfig_deviceinfo_desktop.png new file mode 100644 index 0000000..565f268 Binary files /dev/null and b/ภาคผนวก/imgs/liteauthconfig_deviceinfo_desktop.png differ diff --git a/ภาคผนวก/imgs/liteauthfirmware_clion.png b/ภาคผนวก/imgs/liteauthfirmware_clion.png new file mode 100644 index 0000000..e541c8e Binary files /dev/null and b/ภาคผนวก/imgs/liteauthfirmware_clion.png differ diff --git a/ภาคผนวก/imgs/platformio-logo.png b/ภาคผนวก/imgs/platformio-logo.png new file mode 100644 index 0000000..8cbe937 Binary files /dev/null and b/ภาคผนวก/imgs/platformio-logo.png differ diff --git a/ภาคผนวก/imgs/th-mobile-device-actions.png b/ภาคผนวก/imgs/th-mobile-device-actions.png new file mode 100644 index 0000000..d212bcb Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-device-actions.png differ diff --git a/ภาคผนวก/imgs/th-mobile-device.png b/ภาคผนวก/imgs/th-mobile-device.png new file mode 100644 index 0000000..47e5d96 Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-device.png differ diff --git a/ภาคผนวก/imgs/th-mobile-home-empty.png b/ภาคผนวก/imgs/th-mobile-home-empty.png new file mode 100644 index 0000000..09883a2 Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-home-empty.png differ diff --git a/ภาคผนวก/imgs/th-mobile-home-fab.png b/ภาคผนวก/imgs/th-mobile-home-fab.png new file mode 100644 index 0000000..a70ce0a Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-home-fab.png differ diff --git a/ภาคผนวก/imgs/th-mobile-home-list.png b/ภาคผนวก/imgs/th-mobile-home-list.png new file mode 100644 index 0000000..d20793c Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-home-list.png differ diff --git a/ภาคผนวก/imgs/th-mobile-location-request.png b/ภาคผนวก/imgs/th-mobile-location-request.png new file mode 100644 index 0000000..f5eb7ab Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-location-request.png differ diff --git a/ภาคผนวก/imgs/th-mobile-networkconfig.png b/ภาคผนวก/imgs/th-mobile-networkconfig.png new file mode 100644 index 0000000..b477b8f Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-networkconfig.png differ diff --git a/ภาคผนวก/imgs/th-mobile-networkinfofill.png b/ภาคผนวก/imgs/th-mobile-networkinfofill.png new file mode 100644 index 0000000..5fd758f Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-networkinfofill.png differ diff --git a/ภาคผนวก/imgs/th-mobile-register.png b/ภาคผนวก/imgs/th-mobile-register.png new file mode 100644 index 0000000..7e12143 Binary files /dev/null and b/ภาคผนวก/imgs/th-mobile-register.png differ diff --git a/ภาคผนวก/ภาคผนวก.typ b/ภาคผนวก/ภาคผนวก.typ index d74a3bd..ad7eba8 100644 --- a/ภาคผนวก/ภาคผนวก.typ +++ b/ภาคผนวก/ภาคผนวก.typ @@ -1,12 +1,46 @@ #import "../PageTemplate.typ": * +#import "@preview/i-figured:0.2.4" #[ - #show: page-theme - = ภาคผนวก + #show heading: i-figured.reset-counters + #show figure: i-figured.show-figure.with(numbering: (..n) => n.at(-1)) + #show heading.where(level: 2): set heading(numbering: (..nums) => { + [ภาคผนวก ] + page-numbering(nums.at(-1)) + linebreak() + }) + #show heading.where(level: 2): set align(center) + #counter(heading).update((5, 0)) - == ลิขสิทธิ์เนื้อหาโครงงาน + #show: page-theme.with(has-header: false) + #[ + #show heading.where(level: 1): set text(size: 10.5pt, weight: "bold") + #v(1fr) + = ภาคผนวก + #v(1fr) + #pagebreak() + ] - #i #sym.copyright พ.ศ. 2568 งานนี้อยู่ภายใต้สัญญาอนุญาต Creative Commons + #include "Budget.typ" + #include "UsageGuide.typ" + #include "Programs.typ" + #include "BlockDiagram.typ" + #include "History.typ" + + #pagebreak() + #v(1fr) + == แผ่นพับคู่มือการใช้งาน + #v(1fr) + #pagebreak() + + #pagebreak() + #v(1fr) + == ลิขสิทธิ์โครงงาน + #v(1fr) + #pagebreak() + + #show: page-theme.with(has-header: true) + #i #sym.copyright พ.ศ. 2569 เนื้อหาในหนังสือเล่มนี้อยู่ภายใต้สัญญาอนุญาต Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) หากต้องการดูรายละเอียดเพิ่มเติมเกี่ยวกับสัญญาอนุญาตนี้ โปรดไปที่ https://creativecommons.org/licenses/by-sa/4.0/ @@ -16,32 +50,34 @@ และไอคอนจากปลั๊กอิน Dart ใน Visual Studio Code (`Dart-Code/Dart-Code`) เวอร์ชัน 3.124.0 ซึ่งทั้งคู่อยู่ภายใต้ MIT license - == ลิขสิทธิ์ซอร์สโคดโครงงาน - #i เนื่องจากโคดในโครงการนี้เป็นสาธารณะและถูกปกป้องด้วยกฎหมายลิขสิทธิ์ - โคดนี้จึงมาพร้อมกับสัญญาอนุญาตในการใช้งานโคดสาธารณะทั่วไปของ GNU (GNU Public License) - เวอร์ชัน 3 + โคดนี้จึงมาพร้อมกับสัญญาอนุญาตในการใช้งานโคดสาธารณะทั่วไปของ GNU (GNU General Public + License)#jb เวอร์ชัน 3 #i โดยสรุปแล้ว สัญญาอนุญาตนี้มีคุณสมบัติดังนี้ (ไม่ใช่คำแนะนำทางกฎหมาย โปรดอ่านเนื้อหาสัญญาเต็มเพื่อรายละเอียดที่ชัดเจน) - การอนุญาต: - - อนุญาตการใช้เนื้อหาที่ติดลิขสิทธิ์ในเชิงพาณิชย์ - - อนุญาตให้สามารถเผยแพร่เนื้อหาที่ติดลิขสิทธ์ได้ - - อนุญาตให้ดัดแปลงเนื้อหาที่ติดลิขสิทธิ์ได้ - - ใบอนุญาตนี้ให้สิทธิ์ในการจดสิทธิบัตรจากผู้สนับสนุน - - อนุญาตให้ใช้และดัดแปลงเนื้อหาที่ติดลิขสิทธิ์อย่างเป็นส่วนตัวได้ + #i การอนุญาต - โดยมีเงื่อนไขว่า: - - โคดต้องถูกเปิดเผยหากเนื้อหาที่ติดลิขสิทธิ์ถูกแจกจ่าย - - สัญญาอนุญาตต้องถูกรวมกับเนื้อหาที่ติดลิขสิทธิ์ที่ถูกเผยแพร่ - - การแก้ไขเนื้อหาที่ติดลิขสิทธิ์จะต้องอยู่ภายใต้สัญญาอนุญาตเดียวกัน - - หากมีการแก้ไขเนื้อหาที่ติดลิขสัทธิ์ ต้องมีหมายเหตุชัดเจนว่างานนั้นถูกแก้ไขจากงานต้นฉบับ + #set enum(indent: 3em) + 1. อนุญาตการใช้เนื้อหาที่ติดลิขสิทธิ์ในเชิงพาณิชย์ + 2. อนุญาตให้สามารถเผยแพร่เนื้อหาที่ติดลิขสิทธ์ได้ + 3. อนุญาตให้ดัดแปลงเนื้อหาที่ติดลิขสิทธิ์ได้ + 4. ใบอนุญาตนี้ให้สิทธิ์ในการจดสิทธิบัตรจากผู้สนับสนุน + 5. อนุญาตให้ใช้และดัดแปลงเนื้อหาที่ติดลิขสิทธิ์อย่างเป็นส่วนตัวได้ - และมีข้อจำกัดว่า: - - ผู้ที่เป็นเจ้าของงานไม่มีความรับผิดชอบใด ๆ + #i โดยมีเงื่อนไขว่า + + 1. โคดต้องถูกเปิดเผยหากเนื้อหาที่ติดลิขสิทธิ์ถูกแจกจ่าย + 2. สัญญาอนุญาตต้องถูกรวมกับเนื้อหาที่ติดลิขสิทธิ์ที่ถูกเผยแพร่ + 3. การแก้ไขเนื้อหาที่ติดลิขสิทธิ์จะต้องอยู่ภายใต้สัญญาอนุญาตเดียวกัน + 4. หากมีการแก้ไขเนื้อหาที่ติดลิขสัทธิ์ ต้องมีหมายเหตุชัดเจนว่างานนั้นถูกแก้ไขจากงานต้นฉบับ + + #i และมีข้อจำกัดว่า + + 1. ผู้ที่เป็นเจ้าของงานไม่มีความรับผิดชอบใด ๆ ทั้งสิ้นหากเกิดความเสียหายต่อการใช้หรือใช้ไม่ได้ของโปรแกรม - - โปรแกรมไม่มีการรับประกันใด ๆ ทั้งสิ้น + 2. โปรแกรมไม่มีการรับประกันใด ๆ ทั้งสิ้น สัญญาอนุญาตแบบเต็มที่ถูกบังคับใช้กับโคดในโครงงานนี้มีดังนี้ ]