Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
9b3e813327
|
|||
|
3b1d18b001
|
|||
| e6ff2cf07a | |||
| 2baaafb9c9 |
@@ -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.
|
||||
|
||||
@@ -4,6 +4,8 @@
|
||||
|
||||
#i ผู้จัดทำขอขอบคุณครูที่ปรึกษาและครูที่ปรึกษาร่วม นายภาคิน เหรียญทอง และนายวสันต์ สารคำ ที่ได้ให้คำปรึกษาและคำแนะนำวิธีการในการจัดทำโครงงานให้แก่กลุ่มของข้าพเจ้า ช่วยให้ชิ้นงานสำเร็จลุล่วงตามจุดประสงค์ที่ได้ตั้งไว้อย่างราบรื่น และขอขอบคุณวิทยาลัยเทคนิคหนองคายที่ได้ให้โอกาศแก่กลุ่มของข้าพเจ้าในการประดิษฐ์เครื่องยืนยันตัวตนด้วยระบบ NFC นี้ขึ้นมา
|
||||
|
||||
#v(1em)
|
||||
|
||||
#align(right, grid(
|
||||
columns: 2,
|
||||
column-gutter: 1em,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
= ลำโพงสัญญาณ (Buzzer)
|
||||
|
||||
#i Buzzer เป็นอุปกรณ์ส่งสัญญาณเสียงซึ่งอาจเป็น อุปกรณ์ เชิงกลเครื่องกลไฟฟ้าหรือเพียโซอิเล็กทริก
|
||||
#h(1.70em) Buzzer เป็นอุปกรณ์ส่งสัญญาณเสียงซึ่งอาจเป็น อุปกรณ์ เชิงกลเครื่องกลไฟฟ้าหรือเพียโซอิเล็กทริก
|
||||
(เรียกสั้น ๆ ว่าเพียโซ) การใช้งานทั่วไปของบัซเซอร์และบี๊บเปอร์
|
||||
ได้แก่อุปกรณ์แจ้งเตือนตัวตั้งเวลาวงจรและการยืนยันการป้อนข้อมูลของผู้ใช้ เช่น
|
||||
การคลิกเมาส์หรือการกดแป้นพิมพ์
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
|
||||
= ภาษาซี (C Programming Language) <cprogramming>
|
||||
|
||||
#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`
|
||||
จากไฟล์ `<limits.h>`)
|
||||
+ `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` จากไฟล์
|
||||
`<limits.h>`)],
|
||||
[`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) ทศนิยมจำนวนจริงสามารถถูกใช้กับตัวดำเนินการทางคณิตศาสตร์ได้ *+ - / \**
|
||||
และฟังก์ชันทางคณิตศาสตร์จาก `<math.h>`
|
||||
โดยทั้งตัวดำเนินการและฟังก์ชันจากไลบรารีนั้นสามารถก่อให้เกิดการแสดงข้อผิดพลาดของจำนวนทศนิยมได้และจะตั้งค่า
|
||||
`errno`
|
||||
|
||||
=== ประเภทจำนวนทศนิยมซับซ้อน (Complex floating types)
|
||||
|
||||
#h(9.75em) ประเภทข้อมูลจำนวนทศนิยมซับซ้อนนั้นเป็นประเภทที่แทนตัวเลขเชิงซ้อน (complex number)
|
||||
#h(8.85em) ประเภทข้อมูลจำนวนทศนิยมซับซ้อนนั้นเป็นประเภทที่แทนตัวเลขเชิงซ้อน (complex number)
|
||||
นั้นคือ ตัวเลขที่สามารถถูกเขียนแทนเป็นผลรวมของจำนวนจริงและจำนวนจริงที่คูณด้วยจำนวนจินตภาพ (a +
|
||||
bi) โดยประเภทจำนวนเชิงซ้อนมีอยู่สามประเภท ได้แก่
|
||||
|
||||
+ `float _Complex` (และสามารถใช้ `float complex` ได้เช่นกันหากนำเข้า `<complex.h>`)
|
||||
+ `double _Complex` (และสามารถใช้ `double complex` ได้เช่นกันหากนำเข้า `<complex.h>`)
|
||||
+ `long double _Complex` (และสามารถใช้ `long double complex` ได้เช่นกันหากนำเข้า
|
||||
1. `float _Complex` (และสามารถใช้ `float complex` ได้เช่นกันหากนำเข้า `<complex.h>`)
|
||||
2. `double _Complex` (และสามารถใช้ `double complex` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
3. `long double _Complex` (และสามารถใช้ `long double complex` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
|
||||
|
||||
=== ประเภทจำนวนทศนิยมจินตภาพ (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
|
||||
`<complex.h>`)
|
||||
+ `double _Imaginary` (และสามารถใช้ `double imaginary` ได้เช่นกันหากนำเข้า
|
||||
2. `double _Imaginary` (และสามารถใช้ `double imaginary` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
+ `long double _Imaginary` (และสามารถใช้ `long double imaginary` ได้เช่นกันหากนำเข้า
|
||||
3. `long double _Imaginary` (และสามารถใช้ `long double imaginary` ได้เช่นกันหากนำเข้า
|
||||
`<complex.h>`)
|
||||
|
||||
|
||||
=== ประเภทตัวอักษร (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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -6,33 +6,33 @@
|
||||
|
||||
= Flutter <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 นั้นเหมาะสำหรับงานนี้เป็นพิเศษ
|
||||
|
||||
== ประวัติ
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
= Git
|
||||
|
||||
#i Git เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย ที่สามารถจัดการเวอร์ชันของซอร์สโคดหรือข้อมูลได้
|
||||
#h(1.7em) Git เป็นระบบซอฟต์แวร์ควบคุมเวอร์ชันแบบกระจาย ที่สามารถจัดการเวอร์ชันของซอร์สโคดหรือข้อมูลได้
|
||||
มักใช้เพื่อควบคุมซอร์สโคดโดยโปรแกรมเมอร์ที่พัฒนาซอฟต์แวร์ร่วมกัน
|
||||
|
||||
== Gitea
|
||||
|
||||
@@ -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 เพื่อสร้างเอกสารไฮเปอร์เท็กซ์ที่เชื่อมโยงกัน
|
||||
|
||||
@@ -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
|
||||
และการเข้ารหัสบล็อกไซเฟอร์แบบสองทิศทางในการสื่อสารระหว่างไคลเอนต์และเซิร์ฟเวอร์
|
||||
@@ -55,16 +56,16 @@ Foundation; EFF) ด้วยการสนับสนุนจากนัก
|
||||
|
||||
#[
|
||||
#set enum(indent: 6em)
|
||||
+ ผู้ใช้เชื่อมั่นว่าอุปกรณ์ของตน โฮสต์เบราว์เซอร์ และวิธีการเข้าถึงเบราว์เซอร์นั้นไม่ถูกบุกรุก (กล่าวคือ
|
||||
1. ผู้ใช้เชื่อมั่นว่าอุปกรณ์ของตน โฮสต์เบราว์เซอร์ และวิธีการเข้าถึงเบราว์เซอร์นั้นไม่ถูกบุกรุก (กล่าวคือ
|
||||
ไม่มีการโจมตีซัพพลายเชน)
|
||||
+ ผู้ใช้เชื่อมั่นว่าซอฟต์แวร์เบราว์เซอร์ใช้งาน HTTPS
|
||||
2. ผู้ใช้เชื่อมั่นว่าซอฟต์แวร์เบราว์เซอร์ใช้งาน HTTPS
|
||||
ได้อย่างถูกต้องพร้อมกับผู้ให้บริการออกใบรับรองที่ติดตั้งไว้ล่วงหน้าอย่างถูกต้อง
|
||||
+ ผู้ใช้เชื่อมั่นว่าผู้ให้บริการออกใบรับรองจะรับรองเฉพาะเว็บไซต์ที่ถูกต้องตามกฎหมายเท่านั้น (กล่าวคือ
|
||||
3. ผู้ใช้เชื่อมั่นว่าผู้ให้บริการออกใบรับรองจะรับรองเฉพาะเว็บไซต์ที่ถูกต้องตามกฎหมายเท่านั้น (กล่าวคือ
|
||||
ผู้ให้บริการออกใบรับรองจะไม่ถูกบุกรุกและไม่มีการออกใบรับรองที่ผิดพลาด)
|
||||
+ เว็บไซต์มีใบรับรองที่ถูกต้อง ซึ่งหมายความว่าได้รับการลงนามโดยผู้ให้บริการที่เชื่อถือได้
|
||||
+ ใบรับรองระบุเว็บไซต์ได้อย่างถูกต้อง (เช่น เมื่อเบราว์เซอร์เข้าชม https://example.com
|
||||
4. เว็บไซต์มีใบรับรองที่ถูกต้อง ซึ่งหมายความว่าได้รับการลงนามโดยผู้ให้บริการที่เชื่อถือได้
|
||||
5. ใบรับรองระบุเว็บไซต์ได้อย่างถูกต้อง (เช่น เมื่อเบราว์เซอร์เข้าชม https://example.com
|
||||
ใบรับรองที่ได้รับนั้นถูกต้องสำหรับ example.com และไม่ใช่ของหน่วยงานอื่น)
|
||||
+ ผู้ใช้เชื่อมั่นว่าเลเยอร์การเข้ารหัสของโปรโตคอล (SSL/TLS) มีความปลอดภัยเพียงพอจากการดักฟัง
|
||||
6. ผู้ใช้เชื่อมั่นว่าเลเยอร์การเข้ารหัสของโปรโตคอล (SSL/TLS) มีความปลอดภัยเพียงพอจากการดักฟัง
|
||||
]
|
||||
|
||||
#iii HTTPS มีความสำคัญอย่างยิ่งต่อเครือข่ายที่ไม่ปลอดภัยและเครือข่ายที่อาจถูกแทรกแซง
|
||||
@@ -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 ให้บริการใบรับรอง 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 ไม่จำเป็นสำหรับฟอรัม
|
||||
|
||||
@@ -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 เครื่องมือไฟฟ้า ของเล่น และระบบฝังตัวอื่น ๆ
|
||||
การลดขนาดและต้นทุนเมื่อเทียบกับการออกแบบที่ใช้ไมโครโปรเซสเซอร์ หน่วยความจำ
|
||||
และอุปกรณ์อินพุต/เอาต์พุตแยกต่างหาก ทำให้การควบคุมแบบดิจิทัลสำหรับอุปกรณ์และกระบวนการต่าง ๆ
|
||||
เป็นไปได้มากขึ้น ไมโครคอนโทรลเลอร์แบบผสมสัญญาณเป็นที่นิยม
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
ในบริบทของ Internet of Things (IoT) ไมโครคอนโทรลเลอร์เป็นวิธีการรวบรวมข้อมูล การตรวจจับ
|
||||
และการกระตุ้นโลกทางกายภาพในฐานะอุปกรณ์ปลายทางที่มีราคาประหยัดและเป็นที่นิยม
|
||||
|
||||
#i ไมโครคอนโทรลเลอร์บางตัวอาจใช้คำแบบสี่บิตและทำงานที่ความถี่ต่ำถึง 4 kHz เพื่อการใช้พลังงานต่ำ
|
||||
(มิลลิวัตต์หรือไมโครวัตต์หลักเดียว) โดยทั่วไปแล้ว
|
||||
#h(1.7em) ไมโครคอนโทรลเลอร์บางตัวอาจใช้คำแบบสี่บิตและทำงานที่ความถี่ต่ำถึง 4 kHz
|
||||
เพื่อการใช้พลังงานต่ำ (มิลลิวัตต์หรือไมโครวัตต์หลักเดียว) โดยทั่วไปแล้ว
|
||||
ไมโครคอนโทรลเลอร์เหล่านี้สามารถคงการทำงานไว้ได้ในขณะที่รอเหตุการณ์ เช่น
|
||||
การกดปุ่มหรือการขัดจังหวะอื่นๆ การใช้พลังงานขณะอยู่ในโหมดสลีป (โดยที่นาฬิกา CPU
|
||||
และอุปกรณ์ต่อพ่วงส่วนใหญ่ปิดอยู่) อาจอยู่ที่ระดับนาโนวัตต์เท่านั้น#jb
|
||||
@@ -163,36 +163,37 @@ IBM อ้างสิทธิ์ก่อนหน้านี้ คอมพ
|
||||
|
||||
#iii ณ ปี 2008 มีผู้ขายและสถาปัตยกรรมไมโครคอนโทรลเลอร์จำนวนมาก รวมไปถึง:#jb
|
||||
|
||||
#block(inset: (left: 5.5em))[
|
||||
+ หน่วยประมวลผล ARM core โดยเฉพาะคอร์ประเภท ARM Cortex-M
|
||||
+ Microchip Technology Atmel AVR (8 บิต), AVR32 (32 บิต), และ AT91SAM (32 บิต)
|
||||
+ คอร์ M8C ของ Cypress Semiconductor's ที่ถูกใช้ใน Cypress PSoC ของพวกเขา
|
||||
+ Freescale ColdFire (32 บิต) และ S08 (8 บิต)
|
||||
+ Freescale 68HC11 (8 บิต) และอื่น ๆ ที่มีรากฐานมาจากครอบครัว Motorola 6800
|
||||
+ Intel 8051, ซึ่งนอกจาก Intel ก็ถูกผลิตโดย NXP Semiconductors, Infineon, และอื่น ๆ
|
||||
#[
|
||||
#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 ของพวกเขา
|
||||
4. Freescale ColdFire (32 บิต) และ S08 (8 บิต)
|
||||
5. Freescale 68HC11 (8 บิต) และอื่น ๆ ที่มีรากฐานมาจากครอบครัว Motorola 6800
|
||||
6. Intel 8051, ซึ่งนอกจาก Intel ก็ถูกผลิตโดย NXP Semiconductors, Infineon, และอื่น ๆ
|
||||
หลายรายการ
|
||||
+ Infineon: 8 บิต XC800, 16 บิต XE166, 32 บิต XMC4000 (ARM based Cortex M4F), 32
|
||||
7. Infineon: 8 บิต XC800, 16 บิต XE166, 32 บิต XMC4000 (ARM based Cortex M4F), 32
|
||||
บิต TriCore, และ 32 บิต Aurix Tricore Bit microcontrollers
|
||||
+ Maxim Integrated MAX32600, MAX32620, MAX32625, MAX32630, MAX32650, MAX32640
|
||||
+ MIPS
|
||||
+ Microchip Technology PIC, (8 บิต PIC16, PIC18, 16 บิต dsPIC33 / PIC24), (32 บิต
|
||||
PIC32)
|
||||
+ NXP Semiconductors LPC1000, LPC2000, LPC3000, LPC4000 (32 บิต), LPC900,
|
||||
8. Maxim Integrated MAX32600, MAX32620, MAX32625, MAX32630, MAX32650, MAX32640
|
||||
9. MIPS
|
||||
10. Microchip Technology PIC, (8 บิต PIC16, PIC18, 16 บิต dsPIC33 / PIC24), (32
|
||||
บิต PIC32)
|
||||
11. NXP Semiconductors LPC1000, LPC2000, LPC3000, LPC4000 (32 บิต), LPC900,
|
||||
LPC700 (8 บิต)
|
||||
+ Parallax Propeller
|
||||
+ PowerPC ISE
|
||||
+ Rabbit 2000 (8 บิต)
|
||||
+ Renesas Electronics: RL78 16 บิต MCU; RX 32 บิต MCU; SuperH; V850 32 บิต MCU;
|
||||
12. Parallax Propeller
|
||||
13. PowerPC ISE
|
||||
14. Rabbit 2000 (8 บิต)
|
||||
15. Renesas Electronics: RL78 16 บิต MCU; RX 32 บิต MCU; SuperH; V850 32 บิต MCU;
|
||||
H8; R8C 16 บิต MCU
|
||||
+ Silicon Laboratories ไมโครคอนโทรลเลอร์ Pipelined 8 บิต 8051
|
||||
16. Silicon Laboratories ไมโครคอนโทรลเลอร์ Pipelined 8 บิต 8051
|
||||
และไมโครคอนโทรลเลอร์แบบ ARM-based 32 บิต สัญญาณผสม
|
||||
+ STMicroelectronics STM8 (8 บิต), ST10 (16 บิต), STM32 (32 บิต), SPC5
|
||||
17. STMicroelectronics STM8 (8 บิต), ST10 (16 บิต), STM32 (32 บิต), SPC5
|
||||
(automotive 32 บิต)
|
||||
+ Texas Instruments TI MSP430 (16 บิต), MSP432 (32 บิต), C2000 (32 บิต)
|
||||
+ Toshiba TLCS-870 (8 บิต/16 บิต)
|
||||
18. Texas Instruments TI MSP430 (16 บิต), MSP432 (32 บิต), C2000 (32 บิต)
|
||||
19. Toshiba TLCS-870 (8 บิต/16 บิต)
|
||||
]
|
||||
|
||||
#iiii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก
|
||||
#iii และยังมีอีกมากมาย โดยบางอย่างนั้นถูกใช้ในแอปพลิเคชันที่เจาะจงมาก
|
||||
หรือเหมือนกับหน่วยประมวลผลเฉพาะแอปพลิเคชันมากกว่าไมโครคอนโทรลเลอร์
|
||||
ตลาดไมโครคอนโทรลเลอร์นั้นกระจัดกระจายเป็นอย่างมาก และมีผู้ขาย เทคโนโลยี และตลาดมากมาย
|
||||
และผู้ขายจำนวนมากขายหลายสถาปัตยกรรม
|
||||
@@ -206,22 +207,21 @@ dual-core หรือไมโครโปรเซสเซอร์ RISC-V
|
||||
ยังรวมส่วนประกอบที่จำเป็นสำหรับการสื่อสารข้อมูลไร้สาย เช่น สวิตช์เสาอากาศในตัว บาลัน RF
|
||||
เครื่องขยายกำลัง เครื่องรับสัญญาณรบกวนต่ำ ตัวกรอง และโมดูลการจัดการพลังงาน
|
||||
|
||||
#[
|
||||
// #set par(spacing: 0.75em)
|
||||
#afigure(
|
||||
image("Microcontroller/ESP32-C3_RISC-V_NodeMCU_board.jpg", width: 2in),
|
||||
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 Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตร
|
||||
มันเป็นผู้สืบทอดของไมโครคอนโทรลเลอร์ ESP8266
|
||||
]
|
||||
#afigure(
|
||||
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],
|
||||
)
|
||||
|
||||
#iii โดยทั่วไปแล้ว ESP32
|
||||
จะถูกฝังอยู่บนแผงวงจรพิมพ์เฉพาะอุปกรณ์หรือนำเสนอเป็นส่วนหนึ่งของชุดการพัฒนาที่มีพินและตัวเชื่อมต่อ GPIO
|
||||
ที่หลากหลาย โดยมีการกำหนดค่าที่แตกต่างกันไปตามรุ่นและผู้ผลิต ESP32 ได้รับการออกแบบโดย Espressif
|
||||
Systems และผลิตโดย TSMC โดยใช้กระบวนการ 40 นาโนเมตร มันเป็นผู้สืบทอดของไมโครคอนโทรลเลอร์
|
||||
ESP8266
|
||||
|
||||
=== Espressif Systems
|
||||
|
||||
@@ -255,60 +255,92 @@ things (IoT)
|
||||
)
|
||||
|
||||
#iii ซึ่งคือตารางค่าเริ่มต้นของ ESP32 ใน Arduino platform
|
||||
อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่:
|
||||
อย่างไรก็ตามมีการเปลี่ยนแปลงระบบเก็บไฟล์จาก SPIFFS เป็น LittleFS โดยที่
|
||||
|
||||
#block(inset: (left: 6em))[
|
||||
+ Name คือ ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร
|
||||
(ไม่มีอักขระพิเศษ)
|
||||
+ Type คือ ประเภทของพาร์ทิชัน สามารถเป็น data หรือ app ได้
|
||||
+ app คือพาร์ทิชันที่ใช้ในการเก็บแอปพลิเคชัน
|
||||
+ data คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป
|
||||
+ SubType คือ ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน data และ app
|
||||
+ data
|
||||
+ ota คือ พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update)
|
||||
โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8
|
||||
KiB (0x2000 ไบต์)
|
||||
+ nvs คือ พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์,
|
||||
และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory)
|
||||
โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ
|
||||
และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส
|
||||
และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์)
|
||||
และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64
|
||||
KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS
|
||||
นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า
|
||||
+ coredump คือ ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช
|
||||
โดย core dump
|
||||
นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค
|
||||
โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช
|
||||
และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000)
|
||||
+ nvs_keys คือ พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS
|
||||
เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000)
|
||||
+ fat คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ
|
||||
และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling
|
||||
และการเข้ารหัสได้
|
||||
+ spiffs คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ
|
||||
wear leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส
|
||||
+ app
|
||||
+ factory คือ พาร์ทิชันเก็บแอปพลิเคชันเริ่มต้น
|
||||
โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอปพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA
|
||||
หรือพาร์ทิชัน OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน ota_0
|
||||
สามารถถูกใช้เป็นแอปพลิเคชันเริ่มต้นได้และพาร์ทิชัน factory สามารถถูกนำออกได้
|
||||
+ ota_0 ถึง ota_15 คือ พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA
|
||||
นั้นจำเป็นต้องใช้พาร์ทิชัน OTA อย่างน้อย 2 พาร์ทิชัน (โดยปกติคือ ota_0 และ ota_1)
|
||||
และจำเป็นต้องใช้พาร์ทิชัน ota ด้วยเช่นกันในการเก็บข้อมูลเกี่ยวกับ OTA โดยสามารถมีพาร์ทิชัน
|
||||
OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค
|
||||
+ test คือ ใช้สำหรับการทดสอบในโรงงาน
|
||||
+ Offset คือ กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset
|
||||
และขนาดของพาร์ทิชันก่อนหน้า 0 อย่างไรก็ตาม Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000)
|
||||
และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset
|
||||
จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น
|
||||
อย่างไรก็ตาม Offset ของพาร์ทิชันแรกนั้นจะต้องเป็น 0x9000 และ 0x10000
|
||||
สำหรับพาร์ทิชันแอปพลิเคชันแรก
|
||||
+ Size คือ ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย 0x),
|
||||
หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000
|
||||
+ Flags คือ ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่
|
||||
=== Name
|
||||
|
||||
#iiii Name คือ ชื่อของพาร์ทิชัน ห้ามซ้ำกัน ชื่อนั้นไม่สำคัญต่อระบบและต้องขนาดไม่เกิน 16 ตัวอักษร
|
||||
(ไม่มีอักขระพิเศษ)
|
||||
|
||||
=== Type
|
||||
|
||||
#iiii Type คือ ประเภทของพาร์ทิชัน สามารถเป็น data หรือ app ได้
|
||||
|
||||
#[
|
||||
#set enum(indent: 7.55em)
|
||||
+ app คือพาร์ทิชันที่ใช้ในการเก็บแอปพลิเคชัน
|
||||
+ data คือพาร์ทิชันที่ใช้ในการเก็บข้อมูลทั่วไป
|
||||
]
|
||||
|
||||
=== SubType
|
||||
|
||||
#iiii SubType คือ ประเภทย่อย ระบุการใช้งานของพาร์ทิชัน data และ app
|
||||
|
||||
#[
|
||||
#set enum(indent: 7.55em)
|
||||
1. data
|
||||
#listy(
|
||||
indent: 8.8em,
|
||||
numbering: thai-numbering,
|
||||
[ota คือ พาร์ทัชันเก็บข้อมูล OTA (สำหรับการอัพเดททางอากาศ, Over-the-air update)
|
||||
โดยหากไม่ใช้งาน OTA สามารถนำออกได้ โดยขนาดของพาร์ทิชันนี้ควรจะมีขนาดที่แน่นอนอยู่ที่ 8 KiB
|
||||
(0x2000 ไบต์)],
|
||||
[nvs คือ พาร์ทิชันเก็บข้อมูลทั่วไปเช่น ข้อมูล Wi-Fi, ข้อมูลการสอบเทียบ PHY ของอุปกรณ์,
|
||||
และข้อมูลอื่น ๆ ที่ต้องถูกเก็บบนหน่วยความจำถาวร (Non-volatile memory)
|
||||
โดยพาร์ทิชันประเภทนี้เหมาะสมสำหรับการเก็บข้อมูลการตั้งค่าเล็กน้อย ใบรองรับคลาวด์ ฯลฯ
|
||||
และการใช้งาน NVS อีกอย่างคือการเก็บข้อมูลที่ละเอียดอ่อน เนื่องจาก NVS รองรับการเข้ารหัส
|
||||
และเป็นสิ่งที่แนะนำอย่างมากที่จะมีพาร์ทิชัน NVS ขนาดขั้นต่ำ 12 KiB (0x3000 ไบต์)
|
||||
และหากจำเป็น คุณสามารถขยายขนาดเพิ่มได้ โดยขนาดที่แนะนำนั้นอยู่ระหว่าง 12 KiB และ 64
|
||||
KiB ถึงแม้ว่าคุณจะสามารถขยายให้มันใหญ่กว่านี้ได้ การใช้งานระบบไฟล์เช่น FAT หรือ SPIFFS
|
||||
นั้นจะเหมาะสมสำหรับข้อมูลที่ใหญ่กว่า],
|
||||
[coredump คือ ประเภทพาร์ทิชันย่อยนี้มีหน้าที่ในการเก็บข้อมูล core dump บนหน่วยความจำแฟลช
|
||||
โดย core dump
|
||||
นั้นคือข้อมูลที่ถูกใช้งานสำหรับการตรวจสอบข้อผิด-พลาดร้ายแรงเช่นการแครชและแพนิค
|
||||
โดยฟังก์ชันนี้จะต้องถูกเปิดในการตั้งค่าโปรเจกต์และตั้งที่หมายในการแฟลช
|
||||
และพาร์ทิชันนี้มีขนาดที่แนะนำอยู่ที่ 64 KiB (0x10000)],
|
||||
[nvs_keys คือ พาร์ทิชันที่เป็นประเภทย่อยนี้เก็บคีย์การเข้ารหัสของพาร์ทัชัน NVS
|
||||
เมื่อการเข้ารหัสถูกใช้งาน โดยมีขนาดอยู่ที่ 4 KiB (0x1000)],
|
||||
[fat คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ FAT โดยที่จะเหมาะสมสำหรับข้อมูลใหญ่ ๆ
|
||||
และหากข้อมูลนั้นถูกเปลี่ยนแปลงบ่อย โดยระบบไฟล์ FAT สามารถใช้ฟีเจอร์ wear leveling
|
||||
และการเข้ารหัสได้],
|
||||
[spiffs คือ กำหนดพาร์ทิชันสำหรับระบบไฟล์ SPIFFS เหมาะสำหรับไฟล์ใหญ่เช่นกันและรองรับ wear
|
||||
leveling อย่างไรก็ตาม ระบบไฟล์นี้ไม่รองรับการเข้ารหัส],
|
||||
)
|
||||
2. app
|
||||
#listy(
|
||||
indent: 8.8em,
|
||||
numbering: thai-numbering,
|
||||
[factory คือ พาร์ทิชันเก็บแอปพลิเคชันเริ่มต้น
|
||||
โปรแกรมบูตโหลดเดอร์จะเลือกพาร์ทิชันนี้เป็นแอปพลิเคชันเริ่มต้นหากไม่มีพาร์ทิชัน OTA หรือพาร์ทิชัน
|
||||
OTA นั้นว่างเปล่า หากมีการใช้พาร์ทิชัน OTA พาร์ทิชัน ota_0
|
||||
สามารถถูกใช้เป็นแอปพลิเคชันเริ่มต้นได้และพาร์ทิชัน factory สามารถถูกนำออกได้],
|
||||
[ota_0 ถึง ota_15 คือ พาร์ทิชัน ota_x นั้นถูกใช้สำหรับอัพเดท OTA โดยฟีเจอร์ OTA
|
||||
นั้นจำเป็นต้องใช้พาร์ทิชัน OTA อย่างน้อย 2 พาร์ทิชัน (โดยปกติคือ ota_0 และ ota_1)
|
||||
และจำเป็นต้องใช้พาร์ทิชัน ota ด้วยเช่นกันในการเก็บข้อมูลเกี่ยวกับ OTA โดยสามารถมีพาร์ทิชัน
|
||||
OTA ได้สูงสุด 16 พาร์ทิชัน แต่ 2 พาร์ทิชันคือจำนวนขั้นต่ำที่ต้องใช้สำหรับฟีเจอร์ OTA แบบเบสิค],
|
||||
[test คือ ใช้สำหรับการทดสอบในโรงงาน],
|
||||
)
|
||||
]
|
||||
|
||||
=== Offset
|
||||
|
||||
#iiii Offset คือ กำหนดพื้นที่ที่พาร์ทิชันนั้น ๆ เริ่มต้น โดย Offset นั้นถูกกำหนดโดยการรวมค่า Offset
|
||||
และขนาดของพาร์ทิชันก่อนหน้า 0 อย่างไรก็ตาม Offset จะต้องเป็นทวีคูณของ 4 KiB (0x1000)
|
||||
และพาร์ทิชันแอพจะต้องจัดตำแหน่งให้มีขนาด 64 KiB (0x10000) โดยหากปล่อยให้ว่าง ค่า Offset
|
||||
จะถูกคำนวนโดยอัตโนมัติตามตำแหน่งท้ายของพาร์ทิชันก่อนหน้า รวมถึงการจัดตำแหน่งใด ๆ ที่จำเป็น
|
||||
อย่างไรก็ตาม Offset ของพาร์ทิชันแรกนั้นจะต้องเป็น 0x9000 และ 0x10000
|
||||
สำหรับพาร์ทิชันแอปพลิเคชันแรก
|
||||
|
||||
=== Size
|
||||
|
||||
#iiii Size คือ ขนาดของพาร์ทิชัน โดยค่านี้สามารถเป็นเลขทศนิยม, ตัวเลข Hex (นำหน้าด้วย 0x),
|
||||
หรือใช้ตัวอักษรต่อท้ายเพื่อบ่งบอกหน่วย K (กิโล) หรือ M (เมกา) เช่น 4096 = 4K = 0x1000
|
||||
|
||||
=== Flags
|
||||
|
||||
#iiii Flags คือ ในปัจจุบันคอลัมน์นี้ใช้เพียงแค่เพื่อบ่งบอกว่าพาร์ทิชันนั้น ๆ ถูกเข้ารหัสหรือไม่
|
||||
|
||||
|
||||
== littlefs
|
||||
#iii littlefs คือระบบไฟล์ขนาดเล็กที่ปลอดภัยต่อความล้มเหลวที่ออกแบบมาสำหรับ#jb
|
||||
ไมโครคอนโทรลเลอร์
|
||||
|
||||
@@ -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$)
|
||||
นิ้ว) โปรดทราบว่าเนื่องจากเสาอากาศรับสัญญาณอาจถูกดับในกระแสวนโดยพื้นผิวโลหะที่อยู่ใกล้เคียง
|
||||
แท็กอาจต้องแยกออกจากพื้นผิวดังกล่าวอย่างน้อยที่สุด
|
||||
@@ -76,12 +78,15 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็
|
||||
|
||||
การสื่อสารเกิดขึ้นระหว่างอุปกรณ์ "ตัวเริ่มต้น" ที่ใช้งานอยู่และอุปกรณ์เป้าหมาย ซึ่งอาจเป็น
|
||||
|
||||
+ พาสซีฟ โดยอุปกรณ์ตัวเริ่มต้นจะทำหน้าที่เป็นสนามแม่เหล็กพาหะ
|
||||
#[
|
||||
#set enum(indent: 4.2em)
|
||||
1. พาสซีฟ โดยอุปกรณ์ตัวเริ่มต้นจะทำหน้าที่เป็นสนามแม่เหล็กพาหะ
|
||||
และอุปกรณ์เป้าหมายจะสื่อสารโดยการปรับสนามแม่เหล็กตกกระทบ ในโหมดนี้
|
||||
อุปกรณ์เป้าหมายอาจดึงพลังงานจากสนามแม่เหล็กที่ตัวเริ่มต้นจัดหาให้
|
||||
|
||||
+ คล่องแคล่ว โดยทั้งอุปกรณ์เริ่มต้นและอุปกรณ์เป้าหมายสื่อสารกันโดยการสร้างฟิลด์ของตัวเองสลับกัน
|
||||
อุปกรณ์จะหยุดส่งสัญญาณเพื่อรับข้อมูลจากอีกอุปกรณ์หนึ่ง โหมดนี้กำหนดให้อุปกรณ์ทั้งสองต้องมีแหล่งจ่ายไฟ
|
||||
2. คล่องแคล่ว โดยทั้งอุปกรณ์เริ่มต้นและอุปกรณ์เป้าหมายสื่อสารกันโดยการสร้างฟิลด์ของตัวเองสลับกัน
|
||||
อุปกรณ์จะหยุดส่งสัญญาณเพื่อรับข้อมูลจากอีกอุปกรณ์หนึ่ง โหมดนี้กำหนดให้อุปกรณ์ทั้งสองต้องมีแหล่งจ่ายไฟ
|
||||
]
|
||||
|
||||
#figure(
|
||||
table(
|
||||
@@ -94,23 +99,26 @@ Field) สนามแม่เหล็กไฟฟ้าสลับเป็
|
||||
caption: [การเทียบความเร็วและวิธีการสื่อสารที่ใช้],
|
||||
)
|
||||
|
||||
#iii NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล
|
||||
#h(4.2em) NFC ใช้การเข้ารหัสสองแบบที่แตกต่างกันในการถ่ายโอนข้อมูล
|
||||
หากอุปกรณ์ที่ใช้งานอยู่ถ่ายโอนข้อมูลที่ความเร็ว 106 กิโลบิต/วินาที
|
||||
จะใช้การเข้ารหัสแบบมิลเลอร์ที่ปรับเปลี่ยนแล้วพร้อมการมอดูเลต 100
|
||||
เปอร์เซ็นต์ในกรณีอื่นๆทั้งหมดจะใช้การเข้ารหัสแบบแมนเชสเตอร์โดยมีอัตราการมอดูเลต 10 เปอร์เซ็นต์
|
||||
|
||||
#iii อุปกรณ์ NFC ที่ใช้งานอยู่ทุกเครื่องสามารถทำงานในโหมดใดโหมดหนึ่งหรือหลายโหมดได้
|
||||
|
||||
+ การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด
|
||||
ช่วยให้ผู้ใช้ทำธุรกรรมต่างๆ เช่น การชำระเงินหรือการออกตั๋วได้ ดูการจำลองการ์ดโฮสต์
|
||||
+ เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC
|
||||
ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้
|
||||
+ NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC
|
||||
สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ
|
||||
#[
|
||||
#set enum(indent: 4.1em)
|
||||
1. การจำลองการ์ด NFC ช่วยให้อุปกรณ์ที่รองรับ NFC เช่น สมาร์ทโฟน ทำหน้าที่เหมือนสมาร์ทการ์ด
|
||||
ช่วยให้ผู้ใช้ทำธุรกรรมต่างๆ เช่น การชำระเงินหรือการออกตั๋วได้ ดูการจำลองการ์ดโฮสต์
|
||||
2. เครื่องอ่าน/เขียน NFC ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC สามารถอ่านข้อมูลที่จัดเก็บไว้ในแท็ก NFC
|
||||
ราคาไม่แพงที่ฝังอยู่ในฉลากหรือโปสเตอร์อัจฉริยะได้
|
||||
3. NFC เพียร์ทูเพียร์ ช่วยให้อุปกรณ์ที่เปิดใช้งาน NFC
|
||||
สองเครื่องสามารถสื่อสารกันเพื่อแลกเปลี่ยนข้อมูลในลักษณะ เฉพาะกิจ
|
||||
]
|
||||
|
||||
แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb
|
||||
#iii แท็ก NFC คือหน่วยเก็บข้อมูลแบบพาสซีฟที่อุปกรณ์ NFC สามารถอ่านและเขียนข้อมูลได้ในบางกรณี#jb
|
||||
โดยทั่วไปจะมีข้อมูล (ณ ปี 2015 มีขนาดระหว่าง 96 ถึง 8,192 ไบต์)
|
||||
และเป็นแบบอ่านอย่างเดียวในการใช้งานปกติ แต่อาจเขียนซ้ำได้
|
||||
การใช้งานรวมถึงการจัดเก็บข้อมูลส่วนบุคคลที่ปลอดภัย (เช่นข้อมูล บัตร
|
||||
เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)\ แท็ก NFC
|
||||
สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม
|
||||
เดบิตหรือบัตรเครดิตข้อมูลโปรแกรมสะสมคะแนน หมายเลขประจำตัว (PIN) และรายชื่อผู้ติดต่อ)#jb แท็ก
|
||||
NFC สามารถเข้ารหัสแบบกำหนดเองโดยผู้ผลิต หรือใช้ข้อกำหนดเฉพาะของอุตสาหกรรม
|
||||
|
||||
@@ -19,6 +19,8 @@ PIR เซ็นเซอร์ PIR มักใช้ในสัญญาณ
|
||||
caption: [เครื่องตรวจจับการเคลื่อนไหวแบบ PIR ทั่วไปสำหรับที่พักอาศัย/เชิงพาณิชย์],
|
||||
)
|
||||
|
||||
#v(0.5em)
|
||||
|
||||
#iii เซ็นเซอร์ PIR ตรวจจับการเคลื่อนไหวทั่วไป แต่ไม่ได้ให้ข้อมูลว่าใครหรือสิ่งใดเคลื่อนไหว#jb ดังนั้น
|
||||
จึงจำเป็นต้องใช้ เซ็นเซอร์ IR แบบสร้างภาพ เซ็นเซอร์ PIR มักเรียกสั้นๆ ว่า "PIR"
|
||||
หรือบางครั้งเรียกว่า "PID" ซึ่งย่อมาจาก "เครื่องตรวจจับอินฟราเรดแบบพาสซีฟ" เซ็นเซอร์ PIR
|
||||
@@ -38,13 +40,10 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
โดยปกติแล้วรังสีนี้มองไม่เห็นด้วยตาเปล่าเนื่องจากแผ่รังสีในช่วงความยาวคลื่นอินฟราเรด
|
||||
แต่อุปกรณ์อิเล็กทรอนิกส์ที่ออกแบบมาเพื่อจุดประสงค์นี้ สามารถตรวจจับได้
|
||||
|
||||
#v(1em)
|
||||
|
||||
|
||||
== เครื่องตรวจจับการเคลื่อนไหวแบบ PIR
|
||||
\
|
||||
|
||||
#afigure(
|
||||
image("PIR/Motion_detector.jpg", height: image-height),
|
||||
image("PIR/Motion_detector.jpg", height: 2in),
|
||||
alt: "เครื่องตรวจจับความเคลื่อนไหว ติดตั้งบนเพดาน",
|
||||
attr: [CHG, Public Domain,
|
||||
https://commons.wikimedia.org/w/index.php?curid=6087132],
|
||||
@@ -120,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],
|
||||
@@ -128,6 +127,8 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
caption: [การออกแบบเซ็นเซอร์ตรวจจับการเคลื่อนไหว PIR],
|
||||
)
|
||||
|
||||
#v(1em)
|
||||
|
||||
#iiii โดยทั่วไปเซ็นเซอร์ PIR
|
||||
จะติดตั้งอยู่บนแผงวงจรพิมพ์ซึ่งมีอุปกรณ์อิเล็กทรอนิกส์ที่จำเป็นสำหรับการตีความสัญญาณจากตัวเซ็นเซอร์เอง
|
||||
โดยทั่วไปแล้วชุดประกอบทั้งหมดจะบรรจุอยู่ภายในตัวเรือน
|
||||
@@ -149,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
|
||||
@@ -187,7 +188,7 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
#iiii บางรุ่นผลิตขึ้นโดยใช้กระจกพาราโบลา แบบแบ่งส่วนภายใน เพื่อรวมพลังงานอินฟราเรด
|
||||
ในกรณีที่ใช้กระจก ฝาครอบกระจกพลาสติกโดยทั่วไปจะไม่มีเลนส์เฟรสเนลหล่อขึ้นรูป
|
||||
|
||||
=== PIR ชนิดกระจกแบ่งส่วน
|
||||
#iiii 1) PIR ชนิดกระจกแบ่งส่วน
|
||||
|
||||
#afigure(
|
||||
image("PIR/Front-(mirror_type).jpg", height: 2in),
|
||||
@@ -251,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 เมื่อตรวจพบการเคลื่อนไหวได้ วิธีนี้มักใช้ในสถานการณ์กลางแจ้ง
|
||||
ทั้งเพื่อป้องกันอาชญากร (ไฟรักษาความปลอดภัย) หรือเพื่อการใช้งานจริง เช่น
|
||||
@@ -278,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 ไม่สามารถ "มองเห็น" ออกจากหน้าต่างได้
|
||||
แม้ว่าความยาวคลื่นของรังสีอินฟราเรดที่ชิปมีความไวต่อแสงจะทะลุผ่านกระจกได้ไม่ดีนัก
|
||||
แต่แหล่งกำเนิดแสงอินฟราเรดที่แรง (เช่น จากไฟหน้ารถยนต์หรือแสงแดด)
|
||||
อาจทำให้เซ็นเซอร์รับภาพเกินพิกัดและทำให้เกิดสัญญาณเตือนภัยผิดพลาดได้
|
||||
@@ -297,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
|
||||
ยังใช้งานได้ดีกับระบบรักษาความปลอดภัยภายนอกอาคารและระบบไฟที่ไวต่อการเคลื่อนไหว
|
||||
@@ -313,9 +314,9 @@ IR แบบสร้างภาพ เซ็นเซอร์ PIR มัก
|
||||
|
||||
== เทอร์โมมิเตอร์แบบควบคุมระยะไกลด้วย PIR
|
||||
|
||||
#h(9.75em) มีการออกแบบวงจร PIR ที่ใช้วัดอุณหภูมิของวัตถุที่อยู่ห่างไกลในวงจรดังกล่าว#jb
|
||||
จะใช้เอาต์พุต PIR แบบไม่มีค่าความแตกต่าง สัญญาณเอาต์พุตจะถูกประเมินตามการสอบเทียบ#jb สเปกตรัม
|
||||
IR ของสสารชนิดเฉพาะที่ต้องการตรวจวัด ด้วยวิธีนี้ การวัดอุณหภูมิจากระยะไกลจึงค่อนข้างแม่นยำและแม่นยำ
|
||||
#h(8em) มีการออกแบบวงจร PIR ที่ใช้วัดอุณหภูมิของวัตถุที่อยู่ห่างไกลในวงจรดังกล่าว#jb จะใช้เอาต์พุต
|
||||
PIR แบบไม่มีค่าความแตกต่าง สัญญาณเอาต์พุตจะถูกประเมินตามการสอบเทียบ#jb สเปกตรัม IR
|
||||
ของสสารชนิดเฉพาะที่ต้องการตรวจวัด ด้วยวิธีนี้ การวัดอุณหภูมิจากระยะไกลจึงค่อนข้างแม่นยำและแม่นยำ
|
||||
หากไม่มีการสอบเทียบกับชนิดของวัสดุที่ตรวจวัด อุปกรณ์เทอร์โมมิเตอร์ PIR
|
||||
จะสามารถวัดการเปลี่ยนแปลงของการแผ่รังสี IR ซึ่งสอดคล้องกับการเปลี่ยนแปลงของอุณหภูมิโดยตรง
|
||||
แต่ไม่สามารถคำนวณค่าอุณหภูมิที่แท้จริงได้
|
||||
|
||||
@@ -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 และเชื่อถือได้เพิ่มมากขึ้นในโลกปัจจุบัน เซ็นเซอร์แบบใช้แล้วทิ้ง
|
||||
|
||||
@@ -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
|
||||
เพื่อขอการเชื่อมต่อที่ปลอดภัยและไคลเอนต์แสดงรายการชุดรหัสที่รองรับ (รหัสและฟังก์ชันแฮช)
|
||||
+ จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ
|
||||
+ โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง
|
||||
(CA) ที่เชื่อถือได้ซึ่งรับรองความถูกต้องของใบรับรอง และคีย์การเข้ารหัสสาธารณะของเซิร์ฟเวอร์
|
||||
+ ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ
|
||||
+ ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้:
|
||||
+ เข้ารหัสตัวเลขสุ่ม (PreMasterSecret)
|
||||
ด้วยคีย์สาธารณะของเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังเซิร์ฟเวอร์
|
||||
(ซึ่งเฉพาะเซิร์ฟเวอร์เท่านั้นที่จะสามารถถอดรหัสด้วยคีย์ส่วนตัว)
|
||||
จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ
|
||||
+ ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี)
|
||||
เพื่อสร้างคีย์เซสชันแบบสุ่มและไม่ซ้ำกันอย่างปลอดภัยสำหรับการเข้ารหัสและถอดรหัส
|
||||
ซึ่งมีคุณสมบัติเพิ่มเติมของการปกปิดแบบส่งต่อ : หากคีย์ส่วนตัวของเซิร์ฟเวอร์ถูกเปิดเผยในอนาคต
|
||||
จะไม่สามารถใช้คีย์นั้นเพื่อถอดรหัสเซสชันปัจจุบันได้
|
||||
แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม
|
||||
#[
|
||||
#set enum(indent: 4.1em)
|
||||
1. การจับมือเริ่มต้นเมื่อไคลเอนต์เชื่อมต่อกับเซิร์ฟเวอร์ที่เปิดใช้งาน TLS
|
||||
เพื่อขอการเชื่อมต่อที่ปลอดภัยและไคลเอนต์แสดงรายการชุดรหัสที่รองรับ (รหัสและฟังก์ชันแฮช)
|
||||
2. จากรายการนี้ เซิร์ฟเวอร์จะเลือกฟังก์ชันรหัสและแฮชที่รองรับ
|
||||
และแจ้งให้ไคลเอนต์ทราบถึงการตัดสินใจ
|
||||
3. โดยปกติแล้วเซิร์ฟเวอร์จะระบุตัวตนในรูปแบบของใบรับรองดิจิทัลใบรับรองประกอบด้วยชื่อเซิร์ฟเวอร์ผู้ให้บริการออกใบรับรอง
|
||||
(CA) ที่เชื่อถือได้ซึ่งรับรองความถูกต้องของใบรับรอง และคีย์การเข้ารหัสสาธารณะของเซิร์ฟเวอร์
|
||||
4. ลูกค้าต้องยืนยันความถูกต้องของใบรับรองก่อนดำเนินการต่อ
|
||||
5. ในการสร้างคีย์เซสชันที่ใช้สำหรับการเชื่อมต่อที่ปลอดภัย ไคลเอนต์จะต้องทำดังนี้
|
||||
|
||||
#listy(
|
||||
indent: 5.4em,
|
||||
numbering: thai-numbering,
|
||||
[เข้ารหัสตัวเลขสุ่ม (PreMasterSecret)
|
||||
ด้วยคีย์สาธารณะของเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังเซิร์ฟเวอร์
|
||||
(ซึ่งเฉพาะเซิร์ฟเวอร์เท่านั้นที่จะสามารถถอดรหัสด้วยคีย์ส่วนตัว)
|
||||
จากนั้นทั้งสองฝ่ายใช้ตัวเลขสุ่มเพื่อสร้างคีย์เซสชันเฉพาะสำหรับการเข้ารหัสและถอดรหัสข้อมูลในระหว่างเซสชันในภายหลังหรือ],
|
||||
[ใช้การแลกเปลี่ยนคีย์ Diffie--Hellman (หรือรูปแบบ DH ที่เป็นเส้นโค้งวงรี)
|
||||
เพื่อสร้างคีย์เซสชันแบบสุ่มและไม่ซ้ำกันอย่างปลอดภัยสำหรับการเข้ารหัสและถอดรหัส
|
||||
ซึ่งมีคุณสมบัติเพิ่มเติมของการปกปิดแบบส่งต่อ โดยหากคีย์ส่วนตัวของเซิร์ฟเวอร์ถูกเปิดเผยในอนาคต
|
||||
จะไม่สามารถใช้คีย์นั้นเพื่อถอดรหัสเซสชันปัจจุบันได้
|
||||
แม้ว่าเซสชันนั้นจะถูกดักจับและบันทึกโดยบุคคลที่สามก็ตาม],
|
||||
)
|
||||
]
|
||||
|
||||
#iii
|
||||
@@ -75,8 +82,8 @@ TLS จะล้มเหลวและการเชื่อมต่อจ
|
||||
และเซิร์ฟเวอร์ (เช่น wikipedia.org) จะมีคุณสมบัติทั้งหมดดังต่อไปนี้
|
||||
|
||||
#[
|
||||
#set enum(indent: 6em)
|
||||
+ การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้
|
||||
#set enum(indent: 4.1em)
|
||||
1. การเชื่อมต่อเป็นแบบส่วนตัว (หรือมีความลับ) เนื่องจาก มีการใช้
|
||||
อัลกอริทึมคีย์แบบสมมาตรในการเข้ารหัสข้อมูลที่ส่ง
|
||||
คีย์สำหรับการเข้ารหัสแบบสมมาตรนี้จะถูกสร้างขึ้นอย่างเฉพาะเจาะจงสำหรับแต่ละการเชื่อมต่อ
|
||||
และอิงจากความลับร่วมที่เจรจากันไว้เมื่อเริ่มต้นเซสชัน
|
||||
@@ -85,9 +92,9 @@ TLS จะล้มเหลวและการเชื่อมต่อจ
|
||||
(ความลับที่เจรจากันไว้จะไม่สามารถเข้าถึงได้โดยผู้ดักฟังและไม่สามารถได้รับ
|
||||
แม้แต่โดยผู้โจมตีที่วางตัวเองอยู่ตรงกลางการเชื่อมต่อ) และเชื่อถือได้
|
||||
(ไม่มีผู้โจมตีคนใดสามารถแก้ไขการสื่อสารระหว่างการเจรจาโดยไม่ถูกตรวจพบ)
|
||||
+ การยืนยันตัวตนของฝ่ายที่สื่อสารสามารถยืนยันได้โดยใช้การเข้ารหัสด้วยคีย์สาธารณะการยืนยันตัวตนนี้จำเป็นสำหรับเซิร์ฟเวอร์และเป็นทางเลือกสำหรับไคลเอนต์
|
||||
+ การเชื่อมต่อมีความน่าเชื่อถือ (หรือมีความสมบูรณ์)
|
||||
เนื่องจากข้อความแต่ละข้อความที่ส่งออกจะมีการตรวจสอบความสมบูรณ์ของข้อความโดยใช้รหัสยืนยันข้อความเพื่อป้องกันการสูญหายหรือการเปลี่ยนแปลงข้อมูลที่ไม่ถูกตรวจพบระหว่างการส่งข้อมูล
|
||||
2. การยืนยันตัวตนของฝ่ายที่สื่อสารสามารถยืนยันได้โดยใช้การเข้ารหัสด้วยคีย์สาธารณะการยืนยันตัวตนนี้จำเป็นสำหรับเซิร์ฟเวอร์และเป็นทางเลือกสำหรับไคลเอนต์
|
||||
3. การเชื่อมต่อมีความน่าเชื่อถือ (หรือมีความสมบูรณ์)
|
||||
เนื่องจากข้อความแต่ละข้อความที่ส่งออกจะมีการตรวจสอบความสมบูรณ์ของข้อความโดยใช้รหัสยืนยันข้อความเพื่อป้องกันการสูญหายหรือการเปลี่ยนแปลงข้อมูลที่ไม่ถูกตรวจพบระหว่างการส่งข้อมูล
|
||||
]
|
||||
|
||||
#iii TLS รองรับวิธีการที่หลากหลายสำหรับการแลกเปลี่ยนคีย์ การเข้ารหัสข้อมูล
|
||||
|
||||
@@ -16,7 +16,7 @@ TLS/SSL ซึ่งเป็นพื้นฐานของ HTTPS โปร
|
||||
#iii X.509
|
||||
ยังกำหนดรายการเพิกถอนใบรับรองซึ่งเป็นวิธีการแจกจ่ายข้อมูลเกี่ยวกับใบรับรองที่ถือว่าไม่ถูกต้องโดยผู้มีอำนาจลงนาม
|
||||
ตลอดจนอัลกอริทึมการตรวจสอบเส้นทางการรับรองซึ่งช่วยให้ใบรับรองได้รับการลงนามโดยใบรับรอง CA
|
||||
ตัวกลาง ซึ่งใบรับรองเหล่านี้จะได้รับการลงนามโดยใบรับรองอื่นๆ ต่อไปจนไปถึงจุดยึดที่เชื่อถือได้ในที่สุด
|
||||
ตัวกลาง ซึ่งใบรับรองเหล่านี้จะได้รับการลงนามโดยใบรับรองอื่น ๆ ต่อไปจนไปถึงจุดยึดที่เชื่อถือได้ในที่สุด
|
||||
|
||||
#iii X.509 ถูกกำหนดโดย "Standardization Sector" ของ ITU (SG17 ของ ITU-T) ใน ITU-T
|
||||
Study Group 17 และมีพื้นฐานมาจาก Abstract Syntax Notation One (ASN.1)
|
||||
@@ -28,18 +28,25 @@ Notation One (ASN.1)
|
||||
|
||||
#iiii โครงสร้างของใบรับรองดิจิทัล X.509 v3 มีดังนี้
|
||||
|
||||
+ ใบรับรอง
|
||||
+ หมายเลขเวอร์ชัน
|
||||
+ หมายเลขซีเรียล
|
||||
+ รหัสอัลกอริทึมลายเซ็น
|
||||
+ ชื่อผู้ออก
|
||||
+ ระยะเวลาใช้งานไม่ก่อนหรือไม่หลังจากนั้น
|
||||
+ ชื่อเรื่อง
|
||||
+ ข้อมูลคีย์สาธารณะของเรื่องได้แก่อัลกอริทึมคีย์สาธารณะ
|
||||
คีย์สาธารณะของเรื่องเช่นรหัสประจำตัวผู้ออก (ไม่จำเป็น)
|
||||
รหัสประจำตัวเฉพาะเรื่อง (ไม่จำเป็น) ส่วนขยาย (ไม่จำเป็น)
|
||||
+ อัลกอริทึมลายเซ็นใบรับรอง
|
||||
+ ลายเซ็นใบรับรอง
|
||||
#[
|
||||
#set enum(indent: 7.55em)
|
||||
1. ใบรับรอง
|
||||
#listy(
|
||||
indent: 8.9em,
|
||||
numbering: thai-numbering,
|
||||
[หมายเลขเวอร์ชัน],
|
||||
[หมายเลขซีเรียล],
|
||||
[รหัสอัลกอริทึมลายเซ็น],
|
||||
[ชื่อผู้ออก],
|
||||
[ระยะเวลาใช้งาน โดยระบุเวลาไม่ก่อนและไม่หลังจากนั้น],
|
||||
[ชื่อเรื่อง],
|
||||
[ข้อมูลคีย์สาธารณะของเรื่อง ได้แก่ อัลกอริทึมคีย์สาธารณะ
|
||||
คีย์สาธารณะของเรื่องเช่นรหัสประจำตัวผู้ออก (ไม่จำเป็น) รหัสประจำตัวเฉพาะเรื่อง (ไม่จำเป็น)
|
||||
ส่วนขยาย (ไม่จำเป็น)],
|
||||
)
|
||||
2. อัลกอริทึมลายเซ็นใบรับรอง
|
||||
3. ลายเซ็นใบรับรอง
|
||||
]
|
||||
|
||||
#iiii ฟิลด์ส่วนขยาย (ถ้ามี) จะเป็นลำดับของส่วนขยายใบรับรองอย่างน้อยหนึ่งรายการ
|
||||
แต่ละส่วนขยายมีรหัสประจำตัวเฉพาะของตัวเอง ซึ่งแสดงเป็นตัวระบุวัตถุ (OID)
|
||||
@@ -71,39 +78,40 @@ Notation One (ASN.1)
|
||||
มีหลายประเภทนามสกุลไฟล์เหล่านี้ยังใช้สำหรับข้อมูลอื่น ๆ เช่น คีย์ส่วนตัวด้วย
|
||||
|
||||
#[
|
||||
#set enum(indent: 9.75em)
|
||||
+ `.pem` -- (อีเมลอิเล็กทรอนิกส์ที่เพิ่มความเป็นส่วนตัว) ใบรับรอง DER ที่เข้ารหัส Base64
|
||||
แนบระหว่าง `-----BEGIN CERTIFICATE-----` และ `-----END CERTIFICATE-----`
|
||||
+ `.cer`, `.crt`, `.der` -- โดยปกติจะอยู่ในรูปแบบไบนารี DER แต่ใบรับรองที่เข้ารหัส Base64
|
||||
ก็เป็นเรื่องปกติเช่นกัน (ดู `.pem` ด้านบน)
|
||||
+ `.p8`, `.p8e`, `.pk8` -- คีย์ส่วนตัวที่ส่งออกตามที่ระบุไว้ใน PKCS\#8 อาจอยู่ในรูปแบบ DER หรือ
|
||||
PEM ที่ขึ้นต้นด้วย `-----BEGIN PRIVATE KEY-----` คีย์ที่เข้ารหัสจะขึ้นต้นด้วย
|
||||
`-----BEGIN ENCRYPTED PRIVATE KEY-----` และอาจมี `.p8e` เป็นนามสกุลไฟล์
|
||||
+ `.p10`, `.csr` -- PKCS\#10 เป็นคำขอลงนามใบรับรอง (CSR) ในรูปแบบ PEM ขึ้นต้นด้วย
|
||||
`-----BEGIN CERTIFICATE REQUEST-----` แบบฟอร์มเหล่านี้สร้างขึ้นเพื่อส่งไปยังผู้ออกใบรับรอง
|
||||
(CA) แบบฟอร์มประกอบด้วยรายละเอียดสำคัญของใบรับรองที่ร้องขอ เช่น ชื่อสามัญ (/CN), หัวเรื่อง,
|
||||
องค์กร, รัฐ, ประเทศ รวมถึงคีย์สาธารณะของใบรับรองที่ต้องการให้ลงนาม
|
||||
คีย์เหล่านี้จะได้รับการลงนามโดย CA และใบรับรองจะถูกส่งกลับคืน ใบรับรองที่ส่งคืนคือใบรับรอง
|
||||
สาธารณะ (ซึ่งมีคีย์สาธารณะแต่ไม่มีคีย์ส่วนตัว) ซึ่งตัวใบรับรองเองสามารถอยู่ในรูปแบบต่างๆ
|
||||
ได้หลายรูปแบบ แต่โดยปกติจะเป็น `.p7r`
|
||||
+ `.p7r` -- คำตอบ ของ PKCS\#7 ต่อ CSR ประกอบด้วยใบรับรองที่เพิ่งลงนาม และใบรับรองของ CA
|
||||
เอง
|
||||
+ `.p7s` -- ลายเซ็นดิจิทัล PKCS\#7 อาจมีไฟล์หรือข้อความที่ลงนามต้นฉบับ ใช้ใน S/MIME
|
||||
สำหรับการลงนามในอีเมลกำหนดไว้ใน RFC 2311
|
||||
+ `.p7m` -- PKCS\#7 (SignedData, EnvelopedData) ข้อความ เช่น ไฟล์ที่เข้ารหัส
|
||||
("enveloped") ข้อความ หรือจดหมายอีเมล MIME กำหนดไว้ใน RFC 2311
|
||||
+ `.p7c` -- โครงสร้าง SignedData แบบ "certs-only" ของ PKCS\#7 ที่เสื่อมลง
|
||||
โดยไม่มีข้อมูลใดๆ ให้ลงนาม กำหนดไว้ใน RFC 2311
|
||||
+ `.p7b` -- โครงสร้าง SignedData ของ PKCS\#7 ที่ไม่มีข้อมูล มีเพียงใบรับรองแบบบันเดิลหรือ CRL
|
||||
(ไม่ค่อยเกิดขึ้น) แต่ไม่มีคีย์ส่วนตัว ใช้รูปแบบ DER หรือ BER หรือ PEM ที่ขึ้นต้นด้วย
|
||||
`-----BEGIN PKCS7-----` รูปแบบที่ Windows ใช้สำหรับการแลกเปลี่ยนใบรับรอง รองรับโดย Java
|
||||
แต่มักใช้นามสกุล `.keystore` แทน ซึ่งแตกต่างจากใบรับรองแบบ `.pem`
|
||||
รูปแบบนี้มีวิธีที่กำหนดไว้สำหรับการรวมใบรับรองเส้นทางการรับรอง
|
||||
+ `.p12`, `.pfx`, `.pkcs12` -- PKCS\#12 อาจมีใบรับรอง (สาธารณะ) และคีย์ส่วนตัว
|
||||
(ป้องกันด้วยรหัสผ่าน) ในไฟล์เดียว `.pfx` - _Personal Information eXchange_ PFX
|
||||
ซึ่งเป็นรุ่นก่อนของ PKCS\#12 (โดยปกติจะมีข้อมูลในรูปแบบ PKCS\#12 เช่น ไฟล์ PFX ที่สร้างใน IIS)
|
||||
+ `.crl` -- รายการเพิกถอนใบรับรอง (CRL)
|
||||
หน่วยงานที่ออกใบรับรองจะจัดทำรายการเหล่านี้ขึ้นเพื่อใช้ในการเพิกถอนใบรับรองก่อนหมดอายุ
|
||||
#set enum(indent: 7.55em)
|
||||
1. `.pem` -- (อีเมลอิเล็กทรอนิกส์ที่เพิ่มความเป็นส่วนตัว) ใบรับรอง DER ที่เข้ารหัส Base64
|
||||
แนบระหว่าง `-----BEGIN CERTIFICATE-----` และ `-----END CERTIFICATE-----`
|
||||
2. `.cer`, `.crt`, `.der` -- โดยปกติจะอยู่ในรูปแบบไบนารี DER แต่ใบรับรองที่เข้ารหัส
|
||||
Base64 ก็เป็นเรื่องปกติเช่นกัน (ดู `.pem` ด้านบน)
|
||||
3. `.p8`, `.p8e`, `.pk8` -- คีย์ส่วนตัวที่ส่งออกตามที่ระบุไว้ใน PKCS\#8 อาจอยู่ในรูปแบบ DER
|
||||
หรือ PEM ที่ขึ้นต้นด้วย `-----BEGIN PRIVATE KEY-----` คีย์ที่เข้ารหัสจะขึ้นต้นด้วย
|
||||
`-----BEGIN ENCRYPTED PRIVATE KEY-----` และอาจมี `.p8e` เป็นนามสกุลไฟล์
|
||||
4. `.p10`, `.csr` -- PKCS\#10 เป็นคำขอลงนามใบรับรอง (CSR) ในรูปแบบ PEM ขึ้นต้นด้วย
|
||||
`-----BEGIN CERTIFICATE REQUEST-----` แบบฟอร์มเหล่านี้สร้างขึ้นเพื่อส่งไปยังผู้ออกใบรับรอง
|
||||
(CA) แบบฟอร์มประกอบด้วยรายละเอียดสำคัญของใบรับรองที่ร้องขอ เช่น ชื่อสามัญ (/CN), หัวเรื่อง,
|
||||
องค์กร, รัฐ, ประเทศ รวมถึงคีย์สาธารณะของใบรับรองที่ต้องการให้ลงนาม
|
||||
คีย์เหล่านี้จะได้รับการลงนามโดย CA และใบรับรองจะถูกส่งกลับคืน ใบรับรองที่ส่งคืนคือใบรับรอง
|
||||
สาธารณะ (ซึ่งมีคีย์สาธารณะแต่ไม่มีคีย์ส่วนตัว) ซึ่งตัวใบรับรองเองสามารถอยู่ในรูปแบบต่างๆ
|
||||
ได้หลายรูปแบบ แต่โดยปกติจะเป็น `.p7r`
|
||||
5. `.p7r` -- คำตอบ ของ PKCS\#7 ต่อ CSR ประกอบด้วยใบรับรองที่เพิ่งลงนาม และใบรับรองของ
|
||||
CA เอง
|
||||
6. `.p7s` -- ลายเซ็นดิจิทัล PKCS\#7 อาจมีไฟล์หรือข้อความที่ลงนามต้นฉบับ ใช้ใน S/MIME
|
||||
สำหรับการลงนามในอีเมลกำหนดไว้ใน RFC 2311
|
||||
7. `.p7m` -- PKCS\#7 (SignedData, EnvelopedData) ข้อความ เช่น ไฟล์ที่เข้ารหัส
|
||||
("enveloped") ข้อความ หรือจดหมายอีเมล MIME กำหนดไว้ใน RFC 2311
|
||||
8. `.p7c` -- โครงสร้าง SignedData แบบ "certs-only" ของ PKCS\#7 ที่เสื่อมลง
|
||||
โดยไม่มีข้อมูลใดๆ ให้ลงนาม กำหนดไว้ใน RFC 2311
|
||||
9. `.p7b` -- โครงสร้าง SignedData ของ PKCS\#7 ที่ไม่มีข้อมูล มีเพียงใบรับรองแบบบันเดิลหรือ
|
||||
CRL (ไม่ค่อยเกิดขึ้น) แต่ไม่มีคีย์ส่วนตัว ใช้รูปแบบ DER หรือ BER หรือ PEM ที่ขึ้นต้นด้วย
|
||||
`-----BEGIN PKCS7-----` รูปแบบที่ Windows ใช้สำหรับการแลกเปลี่ยนใบรับรอง รองรับโดย
|
||||
Java แต่มักใช้นามสกุล `.keystore` แทน ซึ่งแตกต่างจากใบรับรองแบบ `.pem`
|
||||
รูปแบบนี้มีวิธีที่กำหนดไว้สำหรับการรวมใบรับรองเส้นทางการรับรอง
|
||||
10. `.p12`, `.pfx`, `.pkcs12` -- PKCS\#12 อาจมีใบรับรอง (สาธารณะ) และคีย์ส่วนตัว
|
||||
(ป้องกันด้วยรหัสผ่าน) ในไฟล์เดียว `.pfx` - _Personal Information eXchange_ PFX
|
||||
ซึ่งเป็นรุ่นก่อนของ PKCS\#12 (โดยปกติจะมีข้อมูลในรูปแบบ PKCS\#12 เช่น ไฟล์ PFX ที่สร้างใน
|
||||
IIS)
|
||||
11. `.crl` -- รายการเพิกถอนใบรับรอง (CRL)
|
||||
หน่วยงานที่ออกใบรับรองจะจัดทำรายการเหล่านี้ขึ้นเพื่อใช้ในการเพิกถอนใบรับรองก่อนหมดอายุ
|
||||
]
|
||||
|
||||
#iiii PKCS\#7 เป็นมาตรฐานสำหรับการลงนามหรือเข้ารหัสข้อมูล (เรียกอย่างเป็นทางการว่า
|
||||
|
||||
@@ -24,14 +24,3 @@ ASN.1 เช่นเดียวกับ CER การเข้ารหัส
|
||||
ในการเข้ารหัสลับและช่วยให้มั่นใจว่าโครงสร้างข้อมูลที่จำเป็นต้องมีการลงนามดิจิทัลจะสร้างการแสดงแบบอนุกรมที่ไม่ซ้ำกัน
|
||||
DER ถือเป็นรูปแบบมาตรฐานของ BER ตัวอย่างเช่นใน BER ค่าบูลีน true
|
||||
สามารถเข้ารหัสเป็นค่าไบต์ที่ไม่ใช่ศูนย์ 255 ค่า ในขณะที่ DER มีวิธีการเข้ารหัสค่าบูลีน true เพียงวิธีเดียว
|
||||
|
||||
#pagebreak()
|
||||
|
||||
ข้อจำกัดการเข้ารหัส DER ที่สำคัญที่สุดคือ:
|
||||
|
||||
1. การเข้ารหัสความยาวจะต้องใช้รูปแบบที่แน่นอน
|
||||
- นอกจากนี้ จะต้องใช้การเข้ารหัสที่มีความยาวสั้นที่สุดเท่าที่จะเป็นไปได้
|
||||
2. บิตสตริง อ็อกเท็ตสตริง และสตริงอักขระที่จำกัดต้องใช้การเข้ารหัสแบบดั้งเดิม
|
||||
3. องค์ประกอบของชุดจะถูกเข้ารหัสตามลำดับการเรียงลำดับตามค่าแท็ก
|
||||
|
||||
DER ถูกใช้กันอย่างแพร่หลายสำหรับใบรับรอง ดิจิทัลเช่น X.509
|
||||
|
||||
@@ -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 <flAndroid>
|
||||
|
||||
#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 <flLinuxDetails>
|
||||
|
||||
#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 ออกมาได้ และไม่ใช่เป้าหมายของโครงงานนี้เช่นกัน
|
||||
|
||||
@@ -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),
|
||||
)
|
||||
}
|
||||
|
||||
== วางแผนการดำเนินงาน
|
||||
|
||||
@@ -47,8 +67,11 @@
|
||||
|
||||
=== แผนขั้นตอนและวิธีการดำเนินงาน
|
||||
|
||||
ตาราง 3.1 ระยะเวลาการดำเนินงาน
|
||||
#v(0.5em, weak: true)
|
||||
|
||||
#table(
|
||||
columns: 12,
|
||||
columns: (2fr, 1fr, 1fr, 1fr, 1fr, 1fr),
|
||||
align: (
|
||||
left + horizon,
|
||||
center,
|
||||
@@ -56,16 +79,10 @@
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
center,
|
||||
),
|
||||
table.header(
|
||||
table.cell(
|
||||
[ขั้นตอนการ\ ดำเนินการ],
|
||||
[ขั้นตอนการดำเนินการ],
|
||||
rowspan: 2,
|
||||
),
|
||||
table.cell(
|
||||
@@ -74,48 +91,30 @@
|
||||
),
|
||||
table.cell(
|
||||
[พ.ศ.2569],
|
||||
colspan: 8,
|
||||
colspan: 2,
|
||||
),
|
||||
[ต.ค.],
|
||||
[พ.ย.],
|
||||
[ธ.ค.],
|
||||
[ม.ค.],
|
||||
[ก.พ.],
|
||||
[มี.ค],
|
||||
[เม.ย],
|
||||
[พ.ค.],
|
||||
[มิ.ย.],
|
||||
[ก.ค.],
|
||||
[ส.ค.],
|
||||
),
|
||||
[ศึกษาค้นคว้าข้อมูล],
|
||||
table.cell(arrow, colspan: 3),
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[เสนอหัวข้อ], arrow, [], [], [], [], [], [], [], [], [], [],
|
||||
[เสนอครั้งที่ 1], [], arrow, [], [], [], [], [], [], [], [], [],
|
||||
[ออกแบบและสร้าง], [], table.cell(arrow, colspan: 5), [], [], [], [], [],
|
||||
[เสนอหัวข้อ], arrow, [], [], [], [],
|
||||
[เสนอครั้งที่ 1], [], arrow, [], [], [],
|
||||
[ออกแบบและสร้าง], [], table.cell(arrow, colspan: 3), [],
|
||||
[จัดซื้ออุปกรณ์ทดลอง],
|
||||
[],
|
||||
table.cell(arrow, colspan: 3),
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[],
|
||||
[ทดลองการทำงาน], [], [], table.cell(arrow, colspan: 4), [], [], [], [], [],
|
||||
[ปรับปรุงแก้ไข], [], [], [], [], table.cell(arrow, colspan: 5), [], [],
|
||||
[เสนอครั้งที่ 2], [], [], [], arrow, [], [], [], [], [], [], [],
|
||||
[จัดทำรูปเล่ม], table.cell(arrow, colspan: 11),
|
||||
[นำเสนอโครงงาน], [], [], [], [], [], [], [], [], [], [], [],
|
||||
[ทดลองการทำงาน], [], [], table.cell(arrow, colspan: 2), [],
|
||||
[ปรับปรุงแก้ไข], [], [], [], [], arrow,
|
||||
[เสนอครั้งที่ 2], [], [], [], arrow, [],
|
||||
[จัดทำรูปเล่ม], table.cell(arrow, colspan: 5),
|
||||
[นำเสนอโครงงาน], [], [], [], [], [],
|
||||
)
|
||||
|
||||
#show: page-theme
|
||||
@@ -136,40 +135,70 @@
|
||||
|
||||
== การออกแบบ
|
||||
|
||||
#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 โมดูล
|
||||
|
||||
+ โมดูลเซนเซอร์ NFC ขาเข้าและบอร์ด ESP32
|
||||
+ โมดูลเซนเซอร์ NFC ขาออก
|
||||
+ โมดูลเซนเซอร์ PIR
|
||||
|
||||
#show heading: it => {
|
||||
if it.level > 2 {
|
||||
block(
|
||||
it,
|
||||
inset: (left: -3em * (it.level - 2)),
|
||||
)
|
||||
} else {
|
||||
it
|
||||
}
|
||||
}
|
||||
|
||||
=== โมดูลเซนเซอร์ NFC ขาออก
|
||||
|
||||
#i ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ
|
||||
จากนั้นนำสายไฟร้อยผ่านช่องดังกล่าวและต่อเข้ากับเซนเซอร์ NFC ให้เรียบร้อยตามขั้นตอน
|
||||
|
||||
=== การติดตั้งอุปกรณ์
|
||||
|
||||
#h(4.1em) โครงงานแบ่งออกเป็น 3 โมดูล
|
||||
|
||||
#set enum(indent: 4.1em)
|
||||
1. โมดูลบอร์ด ESP32
|
||||
2. โมดูลเซนเซอร์ NFC
|
||||
// 3. โมดูลเซนเซอร์ PIR
|
||||
|
||||
==== โมดูลบอร์ด ESP32
|
||||
|
||||
#h(7.3em) ทำการเจาะรู 2 รูสำหรับสายและร้อยสายเข้าไปในกล่อง
|
||||
|
||||
#figure(
|
||||
image(
|
||||
"imgs/MainModuleInternal.jpg",
|
||||
alt: "ภายในกล่องโมดูลหลัก มีบอร์ดอยู่ภายใน",
|
||||
height: 2in,
|
||||
),
|
||||
caption: [ภายในกล่องโมดูล ESP32],
|
||||
)
|
||||
|
||||
#v(2em)
|
||||
|
||||
==== โมดูลเซนเซอร์ NFC
|
||||
|
||||
#h(7.3em) ดำเนินการเจาะรูบริเวณตัวกล่องเพื่อใช้เป็นช่องสำหรับสายไฟ
|
||||
จากนั้นนำสายไฟร้อยผ่านช่องดังกล่าวและต่อเข้ากับเซนเซอร์ NFC ให้เรียบร้อย
|
||||
|
||||
#figure(
|
||||
image(
|
||||
"imgs/NFCSensor_cropped.jpg",
|
||||
alt: "ภายกล่องโมดูลเซนเซอร์ NFC",
|
||||
height: 2in,
|
||||
),
|
||||
caption: [โมดูลเซนเซอร์ NFC],
|
||||
)
|
||||
#v(1.5em)
|
||||
|
||||
// ==== โมดูลเซนเซอร์ PIR
|
||||
|
||||
=== การเขียนเฟิร์มแวร์ <writingFirmware>
|
||||
|
||||
#iii โครงงานนี้ใช้ซอฟต์แวร์ PlatformIO ในการสร้างและจัดการโปรเจกต์เฟิร์มแวร์
|
||||
@@ -186,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 อาจต้องมีการติดตั้งการรองรับ
|
||||
@@ -196,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 <pioudev>
|
||||
|
||||
#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
|
||||
|
||||
@@ -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),
|
||||
|
||||
|
After Width: | Height: | Size: 3.6 MiB |
|
Before Width: | Height: | Size: 2.8 MiB After Width: | Height: | Size: 2.8 MiB |
|
After Width: | Height: | Size: 839 KiB |
|
After Width: | Height: | Size: 21 KiB |
@@ -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: [เปรียบเทียบระยะเวลาในการส่งคำขอ],
|
||||
)
|
||||
|
||||
@@ -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
|
||||
ควรออกแบบกล่องอุปกรณ์ให้มีความแข็งแรงและสวยงามมากขึ้น
|
||||
@@ -1,4 +1,4 @@
|
||||
#let thai-numbering(n) = {
|
||||
#let page-numbering(n) = {
|
||||
let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช")
|
||||
if n <= chars.len() {
|
||||
chars.at(n - 1)
|
||||
@@ -7,6 +7,16 @@
|
||||
}
|
||||
}
|
||||
|
||||
#let thai-numbering(n) = {
|
||||
let chars = ("ก", "ข", "ค", "ง", "จ", "ฉ", "ช", "ซ", "ฌ", "ญ")
|
||||
if n <= chars.len() {
|
||||
chars.at(n - 1)
|
||||
} else {
|
||||
str(n - chars.len()) // fallback to numbers if exceeds available characters
|
||||
}
|
||||
[)]
|
||||
}
|
||||
|
||||
#let chapter-page(doc) = {
|
||||
set page(
|
||||
paper: "a4",
|
||||
@@ -25,20 +35,34 @@
|
||||
#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 page-theme(doc) = {
|
||||
#let listy(
|
||||
numbering: "1)",
|
||||
indent: 1em,
|
||||
hanging-indent: 0em,
|
||||
body-spacing: .3em,
|
||||
..items,
|
||||
) = context {
|
||||
let nums = range(1, items.pos().len() + 1)
|
||||
let fnums = nums.map(std.numbering.with(numbering))
|
||||
let numwidth = calc.max(..fnums.map(it => measure(it).width))
|
||||
for (num, item) in fnums.zip(items.pos()) {
|
||||
block(inset: (left: hanging-indent), {
|
||||
h(indent - hanging-indent)
|
||||
box(width: numwidth + body-spacing, stroke: none, num)
|
||||
item
|
||||
})
|
||||
v(1em, weak: true)
|
||||
}
|
||||
}
|
||||
|
||||
#let page-theme(doc, has-header: true) = {
|
||||
set page(
|
||||
paper: "a4",
|
||||
margin: (
|
||||
@@ -47,10 +71,12 @@
|
||||
right: 1in,
|
||||
bottom: 1in,
|
||||
),
|
||||
header: context [
|
||||
#h(1fr)
|
||||
#counter(page).display(thai-numbering)
|
||||
],
|
||||
header: if has-header {
|
||||
context [
|
||||
#h(1fr)
|
||||
#counter(page).display(page-numbering)
|
||||
]
|
||||
},
|
||||
)
|
||||
set text(
|
||||
lang: "th",
|
||||
@@ -84,35 +110,63 @@
|
||||
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.caption: it => {
|
||||
text(weight: "bold")[
|
||||
#it.supplement
|
||||
#it.counter.display(it.numbering)
|
||||
]
|
||||
it.body
|
||||
show figure.where(kind: table): t => {
|
||||
show figure.caption: it => {
|
||||
it.supplement
|
||||
" "
|
||||
it.counter.display(it.numbering)
|
||||
" "
|
||||
it.body
|
||||
}
|
||||
it
|
||||
}
|
||||
show figure.caption.where(position: bottom): it => place(center, it, dy: 2em)
|
||||
set figure.caption(separator: "")
|
||||
// show figure.where(kind: image): set figure(gap: 2em)
|
||||
show figure.where(kind: "i-figured-image"): i => {
|
||||
show figure.caption: it => {
|
||||
place(
|
||||
center,
|
||||
[
|
||||
#text(weight: "bold")[
|
||||
#it.supplement
|
||||
#it.counter.display(it.numbering)
|
||||
]
|
||||
#it.body
|
||||
],
|
||||
dy: 2em,
|
||||
)
|
||||
}
|
||||
show image: it => {
|
||||
block(stroke: black + 2pt, it)
|
||||
}
|
||||
i
|
||||
}
|
||||
set figure.caption(separator: " ")
|
||||
show figure.where(kind: image): set block(below: 2.5em)
|
||||
set enum(number-align: start + top)
|
||||
show enum.item: it => context {
|
||||
if (it.number == auto) {
|
||||
return it
|
||||
}
|
||||
|
||||
let spacing = enum.indent
|
||||
if spacing == auto {
|
||||
if enum.tight {
|
||||
spacing = par.leading
|
||||
} else {
|
||||
spacing = par.spacing
|
||||
}
|
||||
}
|
||||
(
|
||||
h(spacing)
|
||||
+ [#{ str(it.number) + ")" }]
|
||||
+ h(enum.body-indent)
|
||||
+ it.body
|
||||
+ linebreak()
|
||||
)
|
||||
}
|
||||
set ref(supplement: "หัวข้อ")
|
||||
doc
|
||||
}
|
||||
@@ -132,7 +186,7 @@
|
||||
),
|
||||
header: context [
|
||||
#h(1fr)
|
||||
#counter(page).display(thai-numbering)
|
||||
#counter(page).display(page-numbering)
|
||||
],
|
||||
)
|
||||
set text(
|
||||
@@ -152,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
# HTTP API
|
||||
|
||||
This folder documents the HTTP API. The contents of this is not included in the
|
||||
printed book version.
|
||||
@@ -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
|
||||
|
||||
@@ -36,9 +36,9 @@
|
||||
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 thai-numbering(counter(page).at(it.element.location()).first()),
|
||||
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"
|
||||
|
||||
@@ -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: [แผนผังการต่อวงจร],
|
||||
)
|
||||
@@ -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],
|
||||
)
|
||||
@@ -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], [ฝึกงานที่ร้าน ทูโฟร์อิ้งค์],
|
||||
)
|
||||
@@ -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],
|
||||
)
|
||||
@@ -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
|
||||
หลังจากการตั้งค่าเครือข่ายอุปกรณ์อาจมีความล่าช้าในการอัปเดตสถานะอุปกรณ์
|
||||
@@ -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
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
<svg width="128" height="128" viewBox="0 0 128 128" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path opacity="0.2" d="M49.8535 123.492C47.8751 123.023 46.2193 121.926 43.9021 119.549C40.0315 115.578 36.8904 113.925 31.4309 112.985C25.7674 112.01 23.2506 109.905 21.7375 104.877C19.8698 98.6708 17.9177 95.6985 13.6285 92.5305C8.7629 88.9366 7.51452 85.7674 8.70211 80.0242C9.80208 74.7048 9.38087 70.9229 7.14689 66.0604C4.48145 60.2587 4.81049 57.1586 8.5962 52.4053C12.0668 48.0478 13.1561 45.1674 13.6759 38.9737C14.2004 32.7233 15.9394 30.159 21.0608 28.0837C25.3351 26.3518 28.9917 23.3452 31.0189 19.8957C33.3632 15.9068 33.7054 15.4495 35.1579 14.3658C37.5018 12.6171 39.3969 12.1325 43.0061 12.3588C49.2755 12.7519 52.6358 11.9991 56.846 9.25832C62.3354 5.68473 65.6639 5.68473 71.1534 9.25832C75.3636 11.9991 78.7239 12.7519 84.9933 12.3588C90.922 11.987 93.389 13.5434 97.0028 19.9355C98.7937 23.1032 102.454 26.1862 106.461 27.9007C112.167 30.3428 113.825 32.5717 114.246 38.3638C114.702 44.6367 115.988 48.144 119.395 52.4053C123.189 57.1501 123.52 60.2531 120.852 66.0604C118.619 70.9229 118.197 74.7048 119.297 80.0242C120.485 85.7674 119.236 88.9366 114.371 92.5305C110.082 95.6985 108.13 98.6708 106.262 104.877C104.749 109.905 102.232 112.01 96.5685 112.985C91.0974 113.927 87.9527 115.585 84.0973 119.562C79.8233 123.969 76.7594 124.697 70.7842 122.721C65.8971 121.106 62.1344 121.099 57.2668 122.697C53.8571 123.816 52.0396 124.011 49.8535 123.492V123.492Z" fill="black"/>
|
||||
<path d="M49.8535 122.321C47.8751 121.851 46.2193 120.754 43.9021 118.377C40.0315 114.407 36.8904 112.753 31.4309 111.814C25.7674 110.839 23.2506 108.733 21.7375 103.706C19.8698 97.499 17.9177 94.5267 13.6285 91.3586C8.7629 87.7647 7.51452 84.5955 8.70211 78.8524C9.80208 73.5329 9.38087 69.751 7.14689 64.8885C4.48145 59.0868 4.81049 55.9867 8.5962 51.2335C12.0668 46.8759 13.1561 43.9955 13.6759 37.8018C14.2004 31.5514 15.9394 28.9871 21.0608 26.9119C25.3351 25.1799 28.9917 22.1733 31.0189 18.7238C33.3632 14.7349 33.7054 14.2776 35.1579 13.194C37.5018 11.4452 39.3969 10.9606 43.0061 11.1869C49.2755 11.58 52.6358 10.8273 56.846 8.08645C62.3354 4.51285 65.6639 4.51285 71.1534 8.08645C75.3636 10.8273 78.7239 11.58 84.9933 11.1869C90.922 10.8151 93.389 12.3715 97.0028 18.7636C98.7937 21.9314 102.454 25.0143 106.461 26.7289C112.167 29.1709 113.825 31.3998 114.246 37.192C114.702 43.4648 115.988 46.9721 119.395 51.2335C123.189 55.9782 123.52 59.0812 120.852 64.8885C118.619 69.751 118.197 73.5329 119.297 78.8524C120.485 84.5955 119.236 87.7647 114.371 91.3586C110.082 94.5267 108.13 97.499 106.262 103.706C104.749 108.733 102.232 110.839 96.5685 111.814C91.0974 112.755 87.9527 114.414 84.0973 118.39C79.8233 122.798 76.7594 123.525 70.7842 121.55C65.8971 119.934 62.1344 119.927 57.2668 121.525C53.8571 122.644 52.0396 122.839 49.8535 122.321V122.321Z" fill="white"/>
|
||||
<path d="M85.0051 59.0295C84.6361 58.2764 84.9524 57.3728 85.7054 57.0038C86.4584 56.6349 87.362 56.9511 87.731 57.7041C88.1 58.4572 87.7837 59.3608 87.0307 59.7298C86.2777 60.0987 85.3741 59.7825 85.0051 59.0295ZM92.332 74.0898C91.963 73.3368 92.2792 72.4332 93.0323 72.0642C93.7853 71.6952 94.6889 72.0115 95.0579 72.7645C95.4269 73.5175 95.1106 74.4211 94.3576 74.7901C93.6046 75.1591 92.7009 74.8428 92.332 74.0898ZM92.972 54.549C88.1527 51.1077 81.865 50.2192 76.0442 52.4707L91.9554 85.1893C97.3169 82.004 100.495 76.4995 100.766 70.5883L106.805 71.0175C107.151 71.0401 107.453 70.7841 107.475 70.4301C107.498 70.0837 107.242 69.7825 106.888 69.76L100.773 69.3232C100.713 66.7479 100.096 64.1199 98.8681 61.5897C97.6407 59.0671 95.954 56.9587 93.966 55.3171L97.3998 50.2342C97.5955 49.9481 97.5202 49.5565 97.2341 49.3607C96.948 49.1649 96.5564 49.2402 96.3606 49.5264L92.972 54.5415" fill="#3DDC84"/>
|
||||
<path d="M78.3033 66.8683C73.8153 69.037 68.9884 70.1364 63.9583 70.1364C52.6254 70.1364 42.3316 64.3834 36.3301 55.2267C35.8557 54.5038 34.8768 54.3306 34.1765 54.8426L28.4008 59.0972C27.7457 59.5791 27.5951 60.4978 28.0544 61.1755C35.9385 72.9452 49.2895 80.3172 63.9583 80.3172C70.5321 80.3172 76.8499 78.8789 82.731 76.0401L78.3033 66.8683Z" fill="#4285F4"/>
|
||||
<path d="M63.9057 30.6708H67.0307V23.7656C67.0307 22.0412 65.6301 20.6406 63.9057 20.6406C62.1813 20.6406 60.7806 22.0412 60.7806 23.7656V30.6708H63.9057Z" fill="#4285F4"/>
|
||||
<path d="M55.7729 44.1499L34.2893 88.367C33.8225 89.3234 33.574 90.3625 33.5514 91.4243L33.4234 97.215C33.3932 98.7135 35.1252 99.5569 36.2848 98.6081L40.7577 94.9334C41.5785 94.2632 42.2412 93.4198 42.7081 92.4635L63.8829 48.8713L55.7804 44.1574L55.7729 44.1499Z" fill="#4285F4"/>
|
||||
<path d="M94.2671 91.4167C94.2445 90.355 93.9885 89.3158 93.5292 88.3595L72.0456 44.1423L63.9431 48.8713L85.118 92.4484C85.5848 93.4047 86.2475 94.2406 87.0683 94.9183L91.5412 98.593C92.7008 99.5418 94.4403 98.6984 94.4027 97.1999L94.2747 91.4092L94.2671 91.4167Z" fill="#4285F4"/>
|
||||
<path d="M63.9053 30.1211C58.7321 30.1211 54.5303 34.3305 54.5303 39.4962C54.5303 44.6619 58.7396 48.8713 63.9053 48.8713C69.071 48.8713 73.2804 44.6619 73.2804 39.4962C73.2804 34.3305 69.071 30.1211 63.9053 30.1211ZM63.9053 44.6544C61.0665 44.6544 58.7472 42.3426 58.7472 39.4962C58.7472 36.6498 61.0589 34.338 63.9053 34.338C66.7517 34.338 69.0635 36.6498 69.0635 39.4962C69.0635 42.3426 66.7517 44.6544 63.9053 44.6544Z" fill="#073042"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 5.2 KiB |
@@ -0,0 +1,20 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="226" height="79" fill="none" viewBox="0 0 226 79">
|
||||
<defs>
|
||||
<linearGradient id="a" x1="3.98138" x2="62.6868" y1="4.22438" y2="62.9293" gradientUnits="userSpaceOnUse">
|
||||
<stop offset=".29" stop-color="#009AE5"/>
|
||||
<stop offset=".7" stop-color="#00D980"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="b" x1="56.3788" x2="2.75258" y1="-.71738" y2="24.1455" gradientUnits="userSpaceOnUse">
|
||||
<stop offset=".3" stop-color="#FF318C"/>
|
||||
<stop offset=".54" stop-color="#009AE5"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<path fill="#000" fill-rule="evenodd" d="M98.1941 21.33c-1.84 0-3.51.46-5 1.38v-.01c-1.49.92-2.66 2.19-3.5 3.81-.84 1.62-1.26 3.44-1.26 5.47s.42 3.85 1.26 5.47c.84 1.62 2.01 2.89 3.5 3.81 1.49.92 3.16 1.38 5 1.38 1.36 0 2.6099-.22 3.7799-.68 1.17-.46 2.17-1.11 3-1.97.83-.86 1.46-1.86 1.87-3h5.61c-.49 2.06-1.39 3.88-2.73 5.47-1.34 1.59-3 2.82-5 3.7-2 .88-4.19 1.32-6.5699 1.32-2.86 0-5.44-.67-7.74-2.02-2.31-1.34-4.12-3.2-5.44-5.56-1.32-2.36-1.98-5-1.98-7.91s.66-5.55 1.98-7.91c1.32-2.36 3.14-4.21 5.44-5.56 2.31-1.35 4.89-2.02 7.74-2.02 2.3799 0 4.5699.44 6.5699 1.32 2 .87 3.66 2.11 5 3.7 1.34 1.59 2.25 3.42 2.73 5.47h-5.61c-.41-1.15-1.03-2.14-1.87-3-.84-.86-1.83-1.51-3-1.97-1.17-.46-2.4199-.69-3.7799-.69ZM121.904 17h.01l-.01-.01V17Zm0 0h-5.3v29.96h19.75v-4.82h-14.45V17Zm22.51 29.97h-5.05V25.05h5.05v21.92Zm.35-24.23h-5.76v-5.01h5.76v5.01Zm14.77 1.8c2.15 0 4.11.5 5.86 1.5s3.13 2.37 4.14 4.12c1.01 1.74 1.51 3.7 1.51 5.85 0 2.15-.5 4.1-1.51 5.85s-2.38 3.12-4.14 4.12c-1.76 1-3.74 1.5-5.89 1.5-2.15 0-4.11-.5-5.86-1.5s-3.13-2.37-4.14-4.12c-1.01-1.74-1.51-3.7-1.51-5.85 0-2.15.5-4.1 1.5-5.85s2.38-3.12 4.14-4.12c1.77-1 3.75-1.5 5.9-1.5Zm3.26 17.55c.95-.58 1.69-1.4 2.21-2.46s.78-2.25.78-3.62-.26-2.58-.79-3.63c-.52-1.05-1.26-1.87-2.21-2.46-.95-.59-2.04-.89-3.26-.89-1.22 0-2.31.3-3.26.88-.95.58-1.68 1.4-2.2 2.46-.52 1.06-.78 2.28-.78 3.64 0 1.36.26 2.56.78 3.62.52 1.05 1.25 1.88 2.2 2.46.94.59 2.04.88 3.26.88 1.22 0 2.32-.3 3.27-.88Zm27.78-16.52c1.18.68 2.1 1.67 2.76 2.97l.01.03c.65 1.29.98 2.84.98 4.64v13.78h-5.03V33.98c0-1.06-.18-1.96-.54-2.7-.36-.74-.87-1.31-1.54-1.7-.67-.39-1.47-.59-2.4-.59-1 0-1.88.22-2.65.67-.77.45-1.37 1.07-1.79 1.88-.42.81-.63 1.72-.63 2.75v12.69h-5.05V25.06h4.9v3.21c.63-1.06 1.45-1.92 2.45-2.55 1.25-.79 2.72-1.18 4.4-1.18 1.57 0 2.95.34 4.13 1.03ZM87.7041 74.22c.17-.31.25-.66.25-1.05h.01v-9.15h3.1v9.37c0 .88-.2 1.67-.61 2.38s-.97 1.26-1.68 1.66c-.71.4-1.52.6-2.41.6h-2.37v-2.85h1.95c.4 0 .75-.08 1.05-.25.31-.17.54-.4.71-.71Zm15.2599-1.9h-6.4999v3.02h7.3799v2.7H93.4441V64.02h10.1999v2.71h-7.1799v2.97h6.4999v2.62Zm6.16-5.52h-4.16v-2.78h11.39v2.78h-4.13v11.23h-3.1V66.8Zm17.2 3.9c.29.08.56.18.81.31h.01c.57.31 1.02.73 1.34 1.28.32.55.48 1.17.48 1.86 0 .75-.2 1.42-.61 2.01-.41.59-.98 1.05-1.72 1.38-.74.33-1.58.5-2.52.5h-6.35V64.02h6.23c.89 0 1.69.16 2.39.47.7.31 1.24.75 1.63 1.31.39.56.58 1.2.58 1.91 0 .62-.15 1.17-.44 1.65-.29.48-.7.86-1.21 1.12-.179.0945-.386.1533-.585.2101l-.035.0099Zm-2.8-4.33h-2.75v3.45h2.75c.38 0 .72-.08 1.01-.22.3-.14.52-.34.69-.61.17-.27.25-.59.25-.93 0-.34-.09-.64-.25-.89-.17-.26-.4-.45-.69-.59-.29-.14-.63-.21-1.01-.21Zm1.24 9.1c.32-.15.57-.35.75-.62v.02c.18-.27.27-.57.27-.93 0-.36-.09-.68-.27-.96-.18-.28-.44-.5-.76-.65-.33-.15-.7-.23-1.11-.23h-2.87v3.59h2.87c.42 0 .8-.07 1.12-.22Zm16.56-4.67c-.43.67-1.03 1.2-1.81 1.57h-.01c-.14.07-.3.13-.46.19l3.2 5.48h-3.54l-2.84-5.11h-2.02v5.11h-3.1V64.02h6.14c1.01 0 1.9.18 2.67.55.77.37 1.36.89 1.78 1.56.42.67.63 1.43.63 2.32 0 .89-.21 1.68-.64 2.35Zm-3.56-.61c.32-.16.57-.39.74-.68v.01c.17-.29.26-.63.26-1.03s-.09-.74-.26-1.03c-.17-.29-.42-.51-.74-.67-.32-.15-.7-.23-1.13-.23h-2.79v3.87h2.79c.43 0 .81-.08 1.13-.24Zm5.51 7.85 5.01-14.02h3.36l5.12 14.02h-3.09l-1.06-3.09h-5.2l-.99 3.09h-3.15Zm6.46-10.39-1.61 4.95h3.71l-1.72-4.95-.19-.9-.19.9Zm11.43 10.39h-3.2V64.02h3.2v14.02Zm5.44-14.02 6.02 9.48h.01v-9.48h2.83v14.02h-3.05l-6-9.48v9.48h-2.83V64.02h3.02Zm17.78 5.66c.71.13 1.33.4 1.88.79v-.02c.55.4.97.88 1.28 1.47.31.59.46 1.23.46 1.92 0 .85-.23 1.61-.68 2.28-.45.67-1.08 1.2-1.88 1.58-.81.38-1.74.57-2.77.57s-1.95-.19-2.75-.56c-.8-.37-1.43-.9-1.89-1.56-.46-.66-.7-1.44-.71-2.31h3.1c0 .36.1.68.29.96.19.28.46.49.81.64.35.15.75.23 1.18.23.43 0 .8-.07 1.12-.2.32-.13.56-.32.74-.57.18-.25.27-.53.27-.84 0-.39-.12-.71-.36-.97s-.57-.44-.98-.54l-2.52-.52c-.66-.14-1.24-.39-1.74-.75s-.89-.82-1.16-1.36c-.27-.55-.41-1.16-.41-1.83 0-.84.22-1.58.64-2.23.43-.65 1.02-1.16 1.78-1.53.76-.37 1.62-.55 2.6-.55s1.86.18 2.62.53c.76.35 1.36.84 1.79 1.47.43.62.66 1.35.68 2.16h-3.1c0-.3-.09-.57-.25-.81-.17-.24-.4-.42-.69-.55-.29-.14-.64-.2-1.02-.2s-.72.07-1.01.19c-.29.12-.52.3-.68.52-.16.23-.24.49-.24.79 0 .34.11.61.33.84.22.23.52.38.89.47l2.38.49Zm14.38 8.36h-3.2V64.02h3.2v14.02Zm7.88-14.02c1.33 0 2.53.31 3.59.91 1.06.61 1.9 1.44 2.5 2.51.61 1.06.91 2.27.91 3.59 0 1.32-.31 2.52-.91 3.59-.6 1.07-1.43 1.9-2.5 2.51-1.07.61-2.26.91-3.59.91h-5.47V64.02h5.47Zm2.01 10.86c.58-.35 1.03-.85 1.34-1.5v-.01c.31-.65.47-1.44.47-2.35 0-.91-.16-1.7-.47-2.35-.31-.65-.76-1.15-1.34-1.5-.58-.35-1.26-.52-2.05-.52h-2.32v8.75h2.32c.79 0 1.47-.17 2.05-.52Zm9.8-2.56v3.02h7.38v2.7h-10.4V64.02h10.2v2.71h-7.18v2.97h6.5v2.62h-6.5Z" clip-rule="evenodd"/>
|
||||
<path fill="url(#a)" d="M64 59.9294V25.9611c0-1.6291-.9711-3.1017-2.4681-3.7434L24.0413 6.14962c-.5068-.21702-1.0531-.32931-1.6046-.32931H4.07273C1.82342 5.82031 0 7.64373 0 9.89304V27.859c0 .8047.238545 1.5913.685382 2.261L22.0887 62.1886c.7552 1.1322 2.0265 1.8118 3.3874 1.8118l34.4512.0017c2.2493 0 4.0727-1.8234 4.0727-4.0727Z"/>
|
||||
<path fill="url(#b)" d="M58.1818 14.5193V4.07273C58.1818 1.82342 56.3584 0 54.1091 0H41.0164c-.1925 0-.3851.013964-.576.040727L3.49673 5.3184C1.49004 5.60465 0 7.32334 0 9.34982V25.0228c0 2.2499 1.824 4.0733 4.07389 4.0728l18.53851-.0047c.4375 0 .8721-.0704 1.2869-.2089l31.4979-10.4995c1.6629-.5544 2.7846-2.1108 2.7846-3.8638v.0006Z"/>
|
||||
<path fill="#FF318C" d="m58.1814 15.9476-.0017-11.87545C58.1797 1.82342 56.3562 0 54.1069 0H42.6003c-1.1886 0-2.3185.519564-3.0923 1.42196L6.79872 39.5834c-.63243.7383-.98036 1.6786-.98036 2.6508v11.8755c0 2.2493 1.82342 4.0727 4.07273 4.0727H21.3994c1.1887 0 2.3186-.5196 3.0924-1.422L57.201 18.599c.6331-.7383.9804-1.6786.9804-2.6514Z"/>
|
||||
<path fill="#000" d="M52 12H12v40h40V12Z"/>
|
||||
<path fill="#fff" d="M20.0471 31.161c1.1594.668 2.4537 1.0029 3.8828 1.0029v-.0011c1.2086 0 2.3183-.2241 3.328-.6721 1.0097-.448 1.8486-1.0731 2.5172-1.8771.6754-.8108 1.1274-1.7388 1.3548-2.784h-3.0508c-.1995.54-.4977 1.0172-.896 1.4292-.3915.4057-.864.7188-1.4189.9388-.5543.22-1.1588.3309-1.8131.3309-.8817 0-1.6783-.22-2.3892-.6612-.7114-.4411-1.2697-1.0451-1.6748-1.8131-.3983-.7743-.5972-1.6463-.5972-2.6132 0-.9668.1989-1.8348.5972-2.6028.4057-.7749.964-1.3829 1.6748-1.824.7109-.4412 1.5075-.6612 2.3892-.6612.6537 0 1.2583.1109 1.8131.3309.5549.22 1.0274.5371 1.4189.9491.3983.4057.6965.8789.896 1.4189h3.0508c-.228-1.0451-.6794-1.9691-1.3548-2.7731-.6686-.8109-1.5075-1.44-2.5172-1.888-1.0097-.448-2.1194-.672-3.328-.672-1.4297 0-2.724.3371-3.8828 1.0131-1.1595.668-2.0697 1.5931-2.7309 2.7731-.6611 1.1732-.992 2.4852-.992 3.936 0 1.4509.3309 2.7669.992 3.9469.6617 1.1731 1.572 2.0971 2.7309 2.7731Z"/>
|
||||
<path fill="#fff" d="M36.1248 29.2833V16.9742h-2.9012v14.9331h9.984v-2.624h-7.0828Z"/>
|
||||
<path fill="#fff" d="M16.9941 43.9988h16v3h-16v-3Z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 7.2 KiB |
|
After Width: | Height: | Size: 214 KiB |
|
After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 263 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 89 KiB |
|
After Width: | Height: | Size: 97 KiB |
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 59 KiB |
|
After Width: | Height: | Size: 183 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 127 KiB |
|
After Width: | Height: | Size: 79 KiB |
@@ -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. โปรแกรมไม่มีการรับประกันใด ๆ ทั้งสิ้น
|
||||
|
||||
สัญญาอนุญาตแบบเต็มที่ถูกบังคับใช้กับโคดในโครงงานนี้มีดังนี้
|
||||
]
|
||||
|
||||