<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Learning_compete - NOVELBIZ</title>
	<atom:link href="https://www.novelbiz.co.th/category/learning_compete/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.novelbiz.co.th</link>
	<description>บริษัท โนเวลบิซ จำกัด</description>
	<lastBuildDate>Mon, 20 Oct 2025 03:50:45 +0000</lastBuildDate>
	<language>th</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.novelbiz.co.th/wp-content/uploads/2025/01/cropped-S__711508000-32x32.jpg</url>
	<title>Learning_compete - NOVELBIZ</title>
	<link>https://www.novelbiz.co.th</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>เขียนโปรแกรม Python เชื่อมต่อเครื่องพิมพ์บัตร</title>
		<link>https://www.novelbiz.co.th/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1-python-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad/</link>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Mon, 10 Feb 2025 03:37:24 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[GPT-4]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=60272</guid>

					<description><![CDATA[<p>เขียนโปรแกรม Python เชื่อมต่อเครื่องพิมพ์บัตร HiTi CS-2&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1-python-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad/">เขียนโปรแกรม Python เชื่อมต่อเครื่องพิมพ์บัตร</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">เขียนโปรแกรม Python เชื่อมต่อเครื่องพิมพ์บัตร</h2>



<p class="wp-block-paragraph"><br></p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="1920" height="1080" src="https://www.novelbiz.co.th/wp-content/uploads/2025/02/python-hitics200.png" alt="" class="wp-image-60273" srcset="https://www.novelbiz.co.th/wp-content/uploads/2025/02/python-hitics200.png 1920w, https://www.novelbiz.co.th/wp-content/uploads/2025/02/python-hitics200-768x432.png 768w, https://www.novelbiz.co.th/wp-content/uploads/2025/02/python-hitics200-1536x864.png 1536w" sizes="(max-width: 1920px) 100vw, 1920px" /></figure>



<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>HiTi CS-200e</strong> เป็นเครื่องพิมพ์บัตรพลาสติกแบบ <strong>Direct-to-Card (DTC)</strong> ที่ใช้ความร้อนในการพิมพ์หมึกลงบนพื้นผิวบัตร PVC โดยตรง เหมาะสำหรับการพิมพ์บัตรพนักงาน บัตรนักเรียน บัตรสมาชิก และบัตรประจำตัวอื่น ๆ</p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">คุณสมบัติหลักของ HiTi CS-200e</h3>



<ul class="wp-block-list">
<li><strong>เทคโนโลยีการพิมพ์</strong>: Direct-to-Card (DTC)</li>



<li><strong>ความละเอียดการพิมพ์</strong>: 300 dpi</li>



<li><strong>ความเร็วการพิมพ์</strong>:
<ul class="wp-block-list">
<li>พิมพ์สี (YMCKO) ประมาณ <strong>21 วินาที/ใบ</strong></li>



<li>พิมพ์ขาวดำ ประมาณ <strong>4.5 วินาที/ใบ</strong></li>
</ul>
</li>



<li><strong>รองรับบัตร</strong>: ขนาดมาตรฐาน CR-80 (85.6 x 54 mm)</li>



<li><strong>การพิมพ์สองหน้า</strong>: ต้องกลับบัตรเอง (Manual Duplex)</li>



<li><strong>การเชื่อมต่อ</strong>: USB 2.0 (บางรุ่นอาจรองรับ Ethernet)</li>



<li><strong>ซอฟต์แวร์ที่รองรับ</strong>: มีไดรเวอร์สำหรับ Windows และอาจมี SDK สำหรับพัฒนาโปรแกรมเพิ่มเติม</li>
</ul>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">การใช้งาน</h3>



<p class="wp-block-paragraph">เครื่องนี้สามารถใช้งานร่วมกับซอฟต์แวร์ออกแบบบัตร เช่น <strong>HiTi Card Desiree</strong> หรือโปรแกรมอื่น ๆ ที่รองรับเครื่องพิมพ์บัตรทั่วไป นอกจากนี้ยังสามารถพัฒนาโปรแกรมควบคุมการพิมพ์บัตรเองได้ผ่าน SDK หากต้องการใช้ร่วมกับระบบอื่น ๆ เช่น การพิมพ์บัตรนักเรียนหรือบัตรพนักงานอัตโนมัติ</p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">Code Python เพื่อควบคุม</h3>



<p class="wp-block-paragraph">เนื่องจาก <strong>HiTi CS-200e</strong> เป็นเครื่องพิมพ์บัตรพลาสติกที่ทำงานผ่านไดรเวอร์ Windows และมักใช้การพิมพ์ผ่านคำสั่ง <strong>Windows Print API</strong> หรือ <strong>Direct Printing ผ่าน SDK</strong>, เราสามารถใช้ <strong>Python</strong> ควบคุมการพิมพ์ได้โดยใช้ไลบรารี <strong><code>win32print</code></strong> และ <strong><code>PIL</code></strong> (Pillow) เพื่อเตรียมภาพที่ต้องการพิมพ์</p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">วิธีพิมพ์บัตรโดยใช้ Python ผ่าน Windows API</h3>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> win32print
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">import</span> win32ui
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">from</span> PIL <span class="hljs-keyword">import</span> Image, ImageWin
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># เลือกเครื่องพิมพ์ HiTi CS-200e</span>
</span></span><span class='shcb-loc'><span>printer_name = <span class="hljs-string">"HiTi CS-200e"</span>
</span></span><span class='shcb-loc'><span>hprinter = win32print.OpenPrinter(printer_name)
</span></span><span class='shcb-loc'><span>printer_info = win32print.GetPrinter(hprinter, <span class="hljs-number">2</span>)
</span></span><span class='shcb-loc'><span>pdc = win32ui.CreateDC()
</span></span><span class='shcb-loc'><span>pdc.CreatePrinterDC(printer_name)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># โหลดภาพที่ต้องการพิมพ์</span>
</span></span><span class='shcb-loc'><span>image_path = <span class="hljs-string">"card_design.png"</span>  <span class="hljs-comment"># เปลี่ยนเป็นพาธของภาพที่ต้องการพิมพ์</span>
</span></span><span class='shcb-loc'><span>img = Image.open(image_path)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ตั้งค่าขนาดภาพให้พอดีกับขนาดบัตร (CR-80: 85.6 x 54 mm)</span>
</span></span><span class='shcb-loc'><span>width, height = <span class="hljs-number">1011</span>, <span class="hljs-number">638</span>  <span class="hljs-comment"># พิกเซล (ขึ้นอยู่กับ 300 dpi)</span>
</span></span><span class='shcb-loc'><span>img = img.resize((width, height))
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># เริ่มการพิมพ์</span>
</span></span><span class='shcb-loc'><span>pdc.StartDoc(<span class="hljs-string">"Print ID Card"</span>)
</span></span><span class='shcb-loc'><span>pdc.StartPage()
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>dib = ImageWin.Dib(img)
</span></span><span class='shcb-loc'><span>dib.draw(pdc.GetHandleOutput(), (<span class="hljs-number">0</span>, <span class="hljs-number">0</span>, width, height))
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>pdc.EndPage()
</span></span><span class='shcb-loc'><span>pdc.EndDoc()
</span></span><span class='shcb-loc'><span>pdc.DeleteDC()
</span></span><span class='shcb-loc'><span>win32print.ClosePrinter(hprinter)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>print(<span class="hljs-string">"พิมพ์บัตรเรียบร้อยแล้ว!"</span>)
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">อธิบายการทำงานของโค้ด</h3>



<ol class="wp-block-list">
<li><strong>เลือกเครื่องพิมพ์</strong> – ใช้ <code>win32print.OpenPrinter()</code> เพื่อเลือกเครื่องพิมพ์ <strong>HiTi CS-200e</strong></li>



<li><strong>โหลดภาพบัตร</strong> – ใช้ <code>PIL.Image.open()</code> โหลดภาพที่ต้องการพิมพ์</li>



<li><strong>กำหนดขนาดบัตร</strong> – ปรับภาพให้พอดีกับขนาดมาตรฐานของบัตร (CR-80: 85.6 x 54 mm)</li>



<li><strong>สั่งพิมพ์ภาพลงบนบัตร</strong> – ใช้ <code>win32ui.CreateDC()</code> เพื่อสร้างหน้าการพิมพ์ และใช้ <code>ImageWin.Dib().draw()</code> วาดภาพลงในเอกสารการพิมพ์</li>



<li><strong>เริ่มและจบการพิมพ์</strong> – ใช้ <code>StartDoc()</code>, <code>StartPage()</code>, <code>EndPage()</code>, <code>EndDoc()</code> เพื่อดำเนินการพิมพ์</li>
</ol>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">2. ถ้าต้องการพิมพ์ผ่านคำสั่ง Windows (Raw Printing)</h3>



<p class="wp-block-paragraph">หากต้องการส่งคำสั่งไปที่เครื่องพิมพ์โดยตรง (Raw Printing) สามารถใช้ <code>win32print.WritePrinter()</code> ได้ เช่น</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> win32print
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>printer_name = <span class="hljs-string">"HiTi CS-200e"</span>
</span></span><span class='shcb-loc'><span>hprinter = win32print.OpenPrinter(printer_name)
</span></span><span class='shcb-loc'><span>hprinter_handle = win32print.StartDocPrinter(hprinter, <span class="hljs-number">1</span>, (<span class="hljs-string">"Print ID Card"</span>, <span class="hljs-literal">None</span>, <span class="hljs-string">"RAW"</span>))
</span></span><span class='shcb-loc'><span>win32print.StartPagePrinter(hprinter)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ส่งคำสั่ง RAW (ขึ้นอยู่กับ SDK ของ HiTi)</span>
</span></span><span class='shcb-loc'><span>data = <span class="hljs-string">b'\x1B\x40'</span>  <span class="hljs-comment"># ตัวอย่างคำสั่ง ESC/P สำหรับรีเซ็ตเครื่องพิมพ์</span>
</span></span><span class='shcb-loc'><span>win32print.WritePrinter(hprinter, data)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>win32print.EndPagePrinter(hprinter)
</span></span><span class='shcb-loc'><span>win32print.EndDocPrinter(hprinter)
</span></span><span class='shcb-loc'><span>win32print.ClosePrinter(hprinter)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>print(<span class="hljs-string">"ส่งคำสั่งไปยังเครื่องพิมพ์แล้ว!"</span>)
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> วิธีนี้ใช้สำหรับพิมพ์ผ่านโค้ดที่ต้องส่งไปยังเครื่องพิมพ์โดยตรง เช่น คำสั่ง ESC/P หรือ ZPL ซึ่งอาจต้องดู <strong>SDK ของ HiTi CS-200e</strong> เพิ่มเติม</p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">3. ถ้าต้องการใช้ SDK ของ HiTi CS-200e</h3>



<p class="wp-block-paragraph">HiTi มี <strong>SDK</strong> สำหรับพัฒนาแอปพลิเคชันพิมพ์บัตร สามารถดาวน์โหลดและใช้ <code>ctypes</code> หรือ <code>win32com</code> ควบคุม API ของ SDK ได้โดยตรง เช่น</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> ctypes
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>hiti_dll = ctypes.WinDLL(<span class="hljs-string">"HiTi_SDK.dll"</span>)  <span class="hljs-comment"># โหลด SDK DLL ของ HiTi</span>
</span></span><span class='shcb-loc'><span>hiti_dll.PrintCard(<span class="hljs-string">"card_design.png"</span>)  <span class="hljs-comment"># ส่งไฟล์ภาพไปพิมพ์ (สมมติว่ามีฟังก์ชันนี้ใน SDK)</span>
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph">หากต้องการใช้วิธีนี้ คุณต้อง <strong>ดาวน์โหลด SDK จาก HiTi</strong> และศึกษาวิธีเรียก API ของ SDK</p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">สรุป</h3>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ถ้าพิมพ์บัตรแบบปกติ</strong> → ใช้ <code>win32print</code> + <code>PIL</code> เพื่อสั่งพิมพ์ภาพลงบัตร<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ถ้าพิมพ์ผ่านคำสั่งดิบ (Raw Command)</strong> → ใช้ <code>win32print.WritePrinter()</code> ส่งคำสั่งไปยังเครื่องพิมพ์โดยตรง<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ถ้าใช้ SDK ของ HiTi</strong> → ต้องดาวน์โหลด SDK และใช้ <code>ctypes</code> หรือ <code>win32com</code> เรียก API</p>



<p class="wp-block-paragraph"><a href="https://www.compete.co.th/id-card-printer" title="">สินค้าของเรา</a><br><a href="https://www.compete.co.th/contact-us">ติดต่อเรา</a></p><p>The post <a href="https://www.novelbiz.co.th/%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1-python-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad/">เขียนโปรแกรม Python เชื่อมต่อเครื่องพิมพ์บัตร</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ChatGPT ช่วยเขียนโปรแกรมภาษา Flutter เชื่อมต่อ Smart Card Reader ผ่าน Bluetooth</title>
		<link>https://www.novelbiz.co.th/chatgpt-%e0%b8%8a%e0%b9%88%e0%b8%a7%e0%b8%a2%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%a0%e0%b8%b2%e0%b8%a9%e0%b8%b2-flutter/</link>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Tue, 04 Feb 2025 03:28:53 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[GPT-4]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=60256</guid>

					<description><![CDATA[<p>ChatGPT ช่วยเขียนโปรแกรมภาษา Flutter เชื่อมต่อ Smart Ca&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/chatgpt-%e0%b8%8a%e0%b9%88%e0%b8%a7%e0%b8%a2%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%a0%e0%b8%b2%e0%b8%a9%e0%b8%b2-flutter/">ChatGPT ช่วยเขียนโปรแกรมภาษา Flutter เชื่อมต่อ Smart Card Reader ผ่าน Bluetooth</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">ChatGPT ช่วยเขียนโปรแกรมภาษา Flutter เชื่อมต่อ Smart Card Reader ผ่าน Bluetooth</h2>



<p class="wp-block-paragraph"><br></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img decoding="async" width="896" height="902" src="https://www.novelbiz.co.th/wp-content/uploads/2025/01/1738318396769@2x.jpg" alt="Flutter เชื่อมต่อ Smart Card Reader ผ่าน Bluetooth" class="wp-image-60253" srcset="https://www.novelbiz.co.th/wp-content/uploads/2025/01/1738318396769@2x.jpg 896w, https://www.novelbiz.co.th/wp-content/uploads/2025/01/1738318396769@2x-768x773.jpg 768w" sizes="(max-width: 896px) 100vw, 896px" /></figure>
</div>


<p class="wp-block-paragraph"><br></p>



<p class="has-text-align-right wp-block-paragraph">ฉันเป็นนักพัฒนาโปรแกรมระดับเริ่มต้น</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="512" height="512" src="https://www.novelbiz.co.th/wp-content/uploads/2025/02/chat-gpt.png" alt="" class="wp-image-60257" style="width:32px"/></figure>



<p class="wp-block-paragraph">ใช่ค่ะ! ฉันจำได้ว่าคุณเป็นนักพัฒนาโปรแกรมระดับเริ่มต้น และกำลังเรียนรู้เกี่ยวกับการเขียนโปรแกรม Python สำหรับ Smart Card Reader รวมถึงกำลังเริ่มต้นสร้าง Startup ด้าน AI กับพาร์ทเนอร์ <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br>มีอะไรที่คุณอยากให้ช่วยแนะนำหรืออธิบายเพิ่มเติมไหมคะ? <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"><br></p>



<p class="has-text-align-right wp-block-paragraph">คุณรู้จักเครื่อง acr3901u-s1 ยี่ห้อ ACS ใช่ไหม</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="512" height="512" src="https://www.novelbiz.co.th/wp-content/uploads/2025/02/chat-gpt.png" alt="" class="wp-image-60257" style="width:32px"/></figure>



<p class="wp-block-paragraph">ใช่ค่ะ! <strong>ACR3901U-S1</strong> เป็นเครื่องอ่านบัตรสมาร์ทการ์ด (Smart Card Reader) จากบริษัท <strong>ACS (Advanced Card Systems Ltd.)</strong> ซึ่งรองรับการเชื่อมต่อผ่าน <strong>Bluetooth</strong> และ <strong>USB</strong></p>



<ul class="wp-block-list">
<li><strong>คุณสมบัติเด่นของ ACR3901U-S1:</strong>
<ul class="wp-block-list">
<li>รองรับการอ่านบัตรสมาร์ทการ์ดตามมาตรฐาน <strong>ISO 7816</strong></li>



<li>เชื่อมต่อผ่าน <strong>USB (แบบใช้สาย)</strong> และ <strong>Bluetooth (ไร้สาย)</strong></li>



<li>รองรับ <strong>PC/SC และ CCID</strong> (โปรโตคอลมาตรฐานสำหรับสมาร์ทการ์ด)</li>



<li>มี SDK และไดรเวอร์ที่สามารถใช้พัฒนาโปรแกรมบน <strong>Windows, macOS, Linux, Android และ iOS</strong></li>
</ul>
</li>



<li><strong>การใช้งานร่วมกับ Python:</strong></li>
</ul>



<p class="wp-block-paragraph">หากคุณต้องการเชื่อมต่อ ACR3901U-S1 กับ Python เพื่ออ่านบัตร สามารถใช้ <strong>ไลบรารี <code>pyscard</code></strong> ซึ่งรองรับการสื่อสารกับเครื่องอ่านสมาร์ทการ์ดที่ใช้ <strong>PC/SC</strong> ได้</p>



<p class="wp-block-paragraph"><strong>ตัวอย่างการเชื่อมต่อ ACR3901U-S1 ผ่าน USB ด้วย Python</strong></p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">from</span> smartcard.System <span class="hljs-keyword">import</span> readers
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ค้นหาเครื่องอ่านบัตร</span>
</span></span><span class='shcb-loc'><span>r = readers()
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> r:
</span></span><span class='shcb-loc'><span>    print(<span class="hljs-string">"ไม่พบเครื่องอ่านบัตร"</span>)
</span></span><span class='shcb-loc'><span>    exit()
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>reader = r&#91;<span class="hljs-number">0</span>]  <span class="hljs-comment"># เลือกเครื่องอ่านบัตรตัวแรก</span>
</span></span><span class='shcb-loc'><span>connection = reader.createConnection()
</span></span><span class='shcb-loc'><span>connection.connect()
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>print(<span class="hljs-string">f"เชื่อมต่อกับเครื่องอ่าน: <span class="hljs-subst">{reader}</span>"</span>)
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph">ถ้าคุณต้องการเชื่อมต่อแบบ <strong>Bluetooth (ไร้สาย)</strong> ต้องใช้ไลบรารีที่รองรับ <strong>Bluetooth SPP</strong> (Serial Port Profile) เช่น <code>pyserial</code></p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>คำถาม:</strong></p>



<ul class="wp-block-list">
<li>ตอนนี้คุณต้องการเชื่อมต่อ ACR3901U-S1 ผ่าน <strong>USB หรือ Bluetooth</strong> คะ?</li>



<li>ต้องการให้อ่านข้อมูลจากบัตรแบบไหน (บัตรประชาชนไทย, บัตร Mifare ฯลฯ)? <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" /></li>
</ul>



<p class="wp-block-paragraph"><br></p>



<p class="has-text-align-right wp-block-paragraph">ช่วยแสดง Code การเชื่อมต่อด้วยภาษา Flutter แบบละเอียดให้ด้วย</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="512" height="512" src="https://www.novelbiz.co.th/wp-content/uploads/2025/02/chat-gpt.png" alt="" class="wp-image-60257" style="width:32px"/></figure>



<p class="wp-block-paragraph">ถ้าคุณต้องการใช้ <strong>Flutter</strong> เพื่อเชื่อมต่อกับเครื่องอ่านบัตร <strong>ACR3901U-S1</strong> (ผ่าน <strong>USB หรือ Bluetooth</strong>), คุณสามารถใช้ <strong>แพ็กเกจ <code>flutter_pcsc</code> หรือ <code>flutter_blue</code></strong> ตามลักษณะการเชื่อมต่อที่คุณต้องการ</p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>1. เชื่อมต่อผ่าน USB (PC/SC)</strong></h3>



<p class="wp-block-paragraph">สำหรับการเชื่อมต่อผ่าน USB กับ ACR3901U-S1 บน Android, iOS หรือ Desktop (Windows/macOS/Linux), เราสามารถใช้ <strong>แพ็กเกจ <code>flutter_pcsc</code></strong></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ขั้นตอนติดตั้งแพ็กเกจ</strong></h3>



<p class="wp-block-paragraph">รันคำสั่งนี้ใน Terminal:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-powershell shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span>flutter pub add flutter_pcsc
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>โค้ดตัวอย่างการเชื่อมต่อ USB และอ่านข้อมูลจากบัตร</strong></h3>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-dart shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter/material.dart'</span>;
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter_pcsc/flutter_pcsc.dart'</span>;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">void</span> main() {
</span></span><span class='shcb-loc'><span>  runApp(MyApp());
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyApp</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatefulWidget</span> </span>{
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  _MyAppState createState() =&gt; _MyAppState();
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">_MyAppState</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">State</span>&lt;<span class="hljs-title">MyApp</span>&gt; </span>{
</span></span><span class='shcb-loc'><span>  <span class="hljs-built_in">String</span> _status = <span class="hljs-string">"กำลังค้นหาเครื่องอ่าน..."</span>;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> initState() {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">super</span>.initState();
</span></span><span class='shcb-loc'><span>    connectToCardReader();
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  Future&lt;<span class="hljs-keyword">void</span>&gt; connectToCardReader() <span class="hljs-keyword">async</span> {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">try</span> {
</span></span><span class='shcb-loc'><span>      <span class="hljs-comment">// ค้นหารายชื่อเครื่องอ่านที่เชื่อมต่อ</span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">String</span>&gt; readers = <span class="hljs-keyword">await</span> Pcsc.listReaders();
</span></span><span class='shcb-loc'><span>      <span class="hljs-keyword">if</span> (readers.isEmpty) {
</span></span><span class='shcb-loc'><span>        setState(() {
</span></span><span class='shcb-loc'><span>          _status = <span class="hljs-string">"ไม่พบเครื่องอ่านบัตร"</span>;
</span></span><span class='shcb-loc'><span>        });
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">return</span>;
</span></span><span class='shcb-loc'><span>      }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-comment">// ใช้เครื่องอ่านบัตรตัวแรก</span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-built_in">String</span> readerName = readers.first;
</span></span><span class='shcb-loc'><span>      <span class="hljs-built_in">int</span> cardHandle = <span class="hljs-keyword">await</span> Pcsc.connect(readerName);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-comment">// ส่ง APDU Command (ตัวอย่าง: ตรวจสอบ ATR ของบัตร)</span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; response = <span class="hljs-keyword">await</span> Pcsc.transmit(cardHandle, &#91;<span class="hljs-number">0x00</span>, <span class="hljs-number">0xA4</span>, <span class="hljs-number">0x04</span>, <span class="hljs-number">0x00</span>, <span class="hljs-number">0x00</span>]);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>      setState(() {
</span></span><span class='shcb-loc'><span>        _status = <span class="hljs-string">"เชื่อมต่อสำเร็จ! ATR: <span class="hljs-subst">${response.map((e) =&gt; e.toRadixString(<span class="hljs-number">16</span>)).join(<span class="hljs-string">" "</span>)}</span>"</span>;
</span></span><span class='shcb-loc'><span>      });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-keyword">await</span> Pcsc.disconnect(cardHandle);
</span></span><span class='shcb-loc'><span>    } <span class="hljs-keyword">catch</span> (e) {
</span></span><span class='shcb-loc'><span>      setState(() {
</span></span><span class='shcb-loc'><span>        _status = <span class="hljs-string">"เกิดข้อผิดพลาด: <span class="hljs-subst">$e</span>"</span>;
</span></span><span class='shcb-loc'><span>      });
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  Widget build(BuildContext context) {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">return</span> MaterialApp(
</span></span><span class='shcb-loc'><span>      home: Scaffold(
</span></span><span class='shcb-loc'><span>        appBar: AppBar(title: Text(<span class="hljs-string">"ACR3901U-S1 Reader"</span>)),
</span></span><span class='shcb-loc'><span>        body: Center(child: Text(_status)),
</span></span><span class='shcb-loc'><span>      ),
</span></span><span class='shcb-loc'><span>    );
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>2. เชื่อมต่อผ่าน Bluetooth (BLE)</strong></h3>



<p class="wp-block-paragraph">หากต้องการเชื่อมต่อ ACR3901U-S1 ผ่าน <strong>Bluetooth (BLE)</strong>, ให้ใช้แพ็กเกจ <code>flutter_blue_plus</code></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ขั้นตอนติดตั้งแพ็กเกจ</strong></h3>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-powershell shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span>flutter pub add flutter_blue_plus
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>โค้ดตัวอย่างการค้นหาและเชื่อมต่อ Bluetooth</strong></h3>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-dart shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter/material.dart'</span>;
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter_blue_plus/flutter_blue_plus.dart'</span>;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">void</span> main() {
</span></span><span class='shcb-loc'><span>  runApp(MyApp());
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyApp</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatefulWidget</span> </span>{
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  _MyAppState createState() =&gt; _MyAppState();
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">_MyAppState</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">State</span>&lt;<span class="hljs-title">MyApp</span>&gt; </span>{
</span></span><span class='shcb-loc'><span>  FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
</span></span><span class='shcb-loc'><span>  BluetoothDevice? _connectedDevice;
</span></span><span class='shcb-loc'><span>  <span class="hljs-built_in">String</span> _status = <span class="hljs-string">"กำลังค้นหาเครื่องอ่าน..."</span>;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> initState() {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">super</span>.initState();
</span></span><span class='shcb-loc'><span>    scanForDevices();
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> scanForDevices() <span class="hljs-keyword">async</span> {
</span></span><span class='shcb-loc'><span>    flutterBlue.startScan(timeout: <span class="hljs-built_in">Duration</span>(seconds: <span class="hljs-number">10</span>));
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    flutterBlue.scanResults.listen((results) {
</span></span><span class='shcb-loc'><span>      <span class="hljs-keyword">for</span> (ScanResult r <span class="hljs-keyword">in</span> results) {
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> (r.device.name.contains(<span class="hljs-string">"ACR3901U"</span>)) {
</span></span><span class='shcb-loc'><span>          _connectToDevice(r.device);
</span></span><span class='shcb-loc'><span>          flutterBlue.stopScan();
</span></span><span class='shcb-loc'><span>          <span class="hljs-keyword">break</span>;
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>      }
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> _connectToDevice(BluetoothDevice device) <span class="hljs-keyword">async</span> {
</span></span><span class='shcb-loc'><span>    setState(() {
</span></span><span class='shcb-loc'><span>      _status = <span class="hljs-string">"กำลังเชื่อมต่อกับ <span class="hljs-subst">${device.name}</span>..."</span>;
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">await</span> device.connect();
</span></span><span class='shcb-loc'><span>    setState(() {
</span></span><span class='shcb-loc'><span>      _connectedDevice = device;
</span></span><span class='shcb-loc'><span>      _status = <span class="hljs-string">"เชื่อมต่อกับ <span class="hljs-subst">${device.name}</span> สำเร็จ!"</span>;
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-comment">// <span class="hljs-doctag">TODO:</span> อ่านข้อมูลจากบัตรที่เชื่อมต่อผ่าน ACR3901U-S1</span>
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  Widget build(BuildContext context) {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">return</span> MaterialApp(
</span></span><span class='shcb-loc'><span>      home: Scaffold(
</span></span><span class='shcb-loc'><span>        appBar: AppBar(title: Text(<span class="hljs-string">"ACR3901U-S1 Bluetooth"</span>)),
</span></span><span class='shcb-loc'><span>        body: Center(child: Text(_status)),
</span></span><span class='shcb-loc'><span>      ),
</span></span><span class='shcb-loc'><span>    );
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>สรุป</strong></h3>



<p class="wp-block-paragraph"><br></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>วิธีเชื่อมต่อ</th><th>ใช้แพ็กเกจ</th><th>โค้ดตัวอย่าง</th></tr></thead><tbody><tr><td>USB (PC/SC)</td><td>flutter_pcsc</td><td>อ่านบัตรผ่าน USB</td></tr><tr><td>Bluetooth (BLE)</td><td>flutter_blue_plus</td><td>ค้นหาและเชื่อมต่อผ่าน Bluetooth</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>คุณต้องการเชื่อมต่อผ่าน USB หรือ Bluetooth คะ?</strong> หรือมีอะไรอยากให้ปรับปรุงในโค้ดเพิ่มเติมไหม <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f60a.png" alt="😊" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"><br></p>



<p class="has-text-align-right wp-block-paragraph">Bluetooth</p>



<figure class="wp-block-image size-full is-resized"><img decoding="async" width="512" height="512" src="https://www.novelbiz.co.th/wp-content/uploads/2025/02/chat-gpt.png" alt="" class="wp-image-60257" style="width:32px"/></figure>



<p class="wp-block-paragraph">โอเคค่ะ! คุณต้องการเชื่อมต่อ <strong>ACR3901U-S1 ผ่าน Bluetooth (BLE)</strong> โดยใช้ <strong>Flutter</strong> <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>แผนการทำงาน</strong></h3>



<ol class="wp-block-list">
<li><strong>ค้นหาอุปกรณ์ Bluetooth</strong> → ค้นหา ACR3901U-S1 ผ่าน Bluetooth</li>



<li><strong>เชื่อมต่อกับอุปกรณ์</strong> → เชื่อมต่อและจับคู่กับเครื่องอ่านบัตร</li>



<li><strong>สื่อสารกับเครื่องอ่านบัตร</strong> → ส่งคำสั่ง APDU ไปยังบัตรที่อยู่ในเครื่องอ่าน</li>



<li><strong>อ่านข้อมูลจากบัตร</strong> → ดึงข้อมูลที่ต้องการ เช่น ATR หรือเลขซีเรียล</li>
</ol>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>1. ติดตั้งแพ็กเกจ</strong></h3>



<p class="wp-block-paragraph">ก่อนอื่นให้ติดตั้งแพ็กเกจ <strong><code>flutter_blue_plus</code></strong> สำหรับการเชื่อมต่อ Bluetooth รันคำสั่งนี้ใน Terminal:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-powershell">flutter pub add flutter_blue_plus</code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph">จากนั้นให้เพิ่ม <strong>Permission</strong> สำหรับ Android และ iOS</p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Android (เพิ่มใน <code>AndroidManifest.xml</code>)</strong></h3>



<p class="wp-block-paragraph">เปิดไฟล์ <code>android/app/src/main/AndroidManifest.xml</code> แล้วเพิ่มโค้ดนี้:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-xl shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span>&lt;uses-permission android:<span class="hljs-keyword">name</span>=<span class="hljs-string">"android.permission.BLUETOOTH"</span>/&gt;
</span></span><span class='shcb-loc'><span>&lt;uses-permission android:<span class="hljs-keyword">name</span>=<span class="hljs-string">"android.permission.BLUETOOTH_ADMIN"</span>/&gt;
</span></span><span class='shcb-loc'><span>&lt;uses-permission android:<span class="hljs-keyword">name</span>=<span class="hljs-string">"android.permission.ACCESS_FINE_LOCATION"</span>/&gt;
</span></span><span class='shcb-loc'><span>&lt;uses-permission android:<span class="hljs-keyword">name</span>=<span class="hljs-string">"android.permission.BLUETOOTH_SCAN"</span>/&gt;
</span></span><span class='shcb-loc'><span>&lt;uses-permission android:<span class="hljs-keyword">name</span>=<span class="hljs-string">"android.permission.BLUETOOTH_CONNECT"</span>/&gt;
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>iOS (เพิ่มใน <code>Info.plist</code>)</strong></h3>



<p class="wp-block-paragraph">เปิดไฟล์ <code>ios/Runner/Info.plist</code> แล้วเพิ่ม:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-xl">&lt;key&gt;NSBluetoothAlwaysUsageDescription&lt;/key&gt;
&lt;string&gt;แอปนี้ต้องการใช้ Bluetooth เพื่อเชื่อมต่อกับเครื่องอ่านบัตร&lt;/string&gt;</code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3d7.png" alt="🏗" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>2. โค้ด Flutter สำหรับเชื่อมต่อ ACR3901U-S1 ผ่าน Bluetooth</strong></h3>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-dart shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter/material.dart'</span>;
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">import</span> <span class="hljs-string">'package:flutter_blue_plus/flutter_blue_plus.dart'</span>;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">void</span> main() {
</span></span><span class='shcb-loc'><span>  runApp(MyApp());
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyApp</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">StatefulWidget</span> </span>{
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  _MyAppState createState() =&gt; _MyAppState();
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">_MyAppState</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">State</span>&lt;<span class="hljs-title">MyApp</span>&gt; </span>{
</span></span><span class='shcb-loc'><span>  FlutterBluePlus flutterBlue = FlutterBluePlus.instance;
</span></span><span class='shcb-loc'><span>  BluetoothDevice? _connectedDevice;
</span></span><span class='shcb-loc'><span>  <span class="hljs-built_in">String</span> _status = <span class="hljs-string">"กำลังค้นหาเครื่องอ่านบัตร..."</span>;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> initState() {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">super</span>.initState();
</span></span><span class='shcb-loc'><span>    scanForDevices();
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> scanForDevices() <span class="hljs-keyword">async</span> {
</span></span><span class='shcb-loc'><span>    setState(() {
</span></span><span class='shcb-loc'><span>      _status = <span class="hljs-string">"กำลังค้นหาอุปกรณ์ Bluetooth..."</span>;
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    flutterBlue.startScan(timeout: <span class="hljs-built_in">Duration</span>(seconds: <span class="hljs-number">10</span>));
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    flutterBlue.scanResults.listen((results) {
</span></span><span class='shcb-loc'><span>      <span class="hljs-keyword">for</span> (ScanResult r <span class="hljs-keyword">in</span> results) {
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> (r.device.name.contains(<span class="hljs-string">"ACR3901U"</span>)) {
</span></span><span class='shcb-loc'><span>          _connectToDevice(r.device);
</span></span><span class='shcb-loc'><span>          flutterBlue.stopScan();
</span></span><span class='shcb-loc'><span>          <span class="hljs-keyword">break</span>;
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>      }
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> _connectToDevice(BluetoothDevice device) <span class="hljs-keyword">async</span> {
</span></span><span class='shcb-loc'><span>    setState(() {
</span></span><span class='shcb-loc'><span>      _status = <span class="hljs-string">"กำลังเชื่อมต่อกับ <span class="hljs-subst">${device.name}</span>..."</span>;
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">try</span> {
</span></span><span class='shcb-loc'><span>      <span class="hljs-keyword">await</span> device.connect();
</span></span><span class='shcb-loc'><span>      setState(() {
</span></span><span class='shcb-loc'><span>        _connectedDevice = device;
</span></span><span class='shcb-loc'><span>        _status = <span class="hljs-string">"เชื่อมต่อกับ <span class="hljs-subst">${device.name}</span> สำเร็จ!"</span>;
</span></span><span class='shcb-loc'><span>      });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>      <span class="hljs-comment">// <span class="hljs-doctag">TODO:</span> ส่งคำสั่ง APDU ไปยังบัตรที่อยู่ในเครื่องอ่าน</span>
</span></span><span class='shcb-loc'><span>      _sendApduCommand(device);
</span></span><span class='shcb-loc'><span>    } <span class="hljs-keyword">catch</span> (e) {
</span></span><span class='shcb-loc'><span>      setState(() {
</span></span><span class='shcb-loc'><span>        _status = <span class="hljs-string">"เกิดข้อผิดพลาด: <span class="hljs-subst">$e</span>"</span>;
</span></span><span class='shcb-loc'><span>      });
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-keyword">void</span> _sendApduCommand(BluetoothDevice device) <span class="hljs-keyword">async</span> {
</span></span><span class='shcb-loc'><span>    setState(() {
</span></span><span class='shcb-loc'><span>      _status = <span class="hljs-string">"กำลังอ่านข้อมูลจากบัตร..."</span>;
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-comment">// หาบริการที่รองรับ (ACR3901U-S1 จะมี UUID เฉพาะ)</span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-built_in">List</span>&lt;BluetoothService&gt; services = <span class="hljs-keyword">await</span> device.discoverServices();
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">for</span> (BluetoothService service <span class="hljs-keyword">in</span> services) {
</span></span><span class='shcb-loc'><span>      <span class="hljs-keyword">for</span> (BluetoothCharacteristic characteristic <span class="hljs-keyword">in</span> service.characteristics) {
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> (characteristic.properties.write &amp;&amp; characteristic.properties.read) {
</span></span><span class='shcb-loc'><span>          <span class="hljs-comment">// ส่ง APDU Command (ตัวอย่าง: ตรวจสอบ ATR)</span>
</span></span><span class='shcb-loc'><span>          <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; apduCommand = &#91;<span class="hljs-number">0x00</span>, <span class="hljs-number">0xA4</span>, <span class="hljs-number">0x04</span>, <span class="hljs-number">0x00</span>, <span class="hljs-number">0x00</span>];
</span></span><span class='shcb-loc'><span>          <span class="hljs-keyword">await</span> characteristic.write(apduCommand);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>          <span class="hljs-built_in">List</span>&lt;<span class="hljs-built_in">int</span>&gt; response = <span class="hljs-keyword">await</span> characteristic.read();
</span></span><span class='shcb-loc'><span>          setState(() {
</span></span><span class='shcb-loc'><span>            _status = <span class="hljs-string">"ATR: <span class="hljs-subst">${response.map((e) =&gt; e.toRadixString(<span class="hljs-number">16</span>)).join(<span class="hljs-string">" "</span>)}</span>"</span>;
</span></span><span class='shcb-loc'><span>          });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>          <span class="hljs-keyword">return</span>;
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>      }
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>    
</span></span><span class='shcb-loc'><span>    setState(() {
</span></span><span class='shcb-loc'><span>      _status = <span class="hljs-string">"ไม่พบบริการที่รองรับการอ่านบัตร!"</span>;
</span></span><span class='shcb-loc'><span>    });
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>  <span class="hljs-meta">@override</span>
</span></span><span class='shcb-loc'><span>  Widget build(BuildContext context) {
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">return</span> MaterialApp(
</span></span><span class='shcb-loc'><span>      home: Scaffold(
</span></span><span class='shcb-loc'><span>        appBar: AppBar(title: Text(<span class="hljs-string">"ACR3901U-S1 Bluetooth Reader"</span>)),
</span></span><span class='shcb-loc'><span>        body: Center(child: Text(_status)),
</span></span><span class='shcb-loc'><span>      ),
</span></span><span class='shcb-loc'><span>    );
</span></span><span class='shcb-loc'><span>  }
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f525.png" alt="🔥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>วิธีการทำงานของโค้ด</strong></h3>



<ol class="wp-block-list">
<li><strong>สแกนอุปกรณ์ Bluetooth</strong> → ค้นหา <strong>ACR3901U-S1</strong> โดยตรวจสอบชื่ออุปกรณ์</li>



<li><strong>เชื่อมต่ออุปกรณ์</strong> → เมื่อพบอุปกรณ์ให้ทำการเชื่อมต่อ</li>



<li><strong>ค้นหาบริการ Bluetooth (GATT Services)</strong> → ตรวจสอบว่ามี <strong>UUID</strong> ของเครื่องอ่านบัตรหรือไม่</li>



<li><strong>ส่งคำสั่ง APDU ไปยังบัตร</strong> → ใช้ Bluetooth Characteristic ในการส่งและรับข้อมูล</li>
</ol>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6e0.png" alt="🛠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>3. Debugging และ ปัญหาที่อาจพบ</strong></h3>



<h4 class="wp-block-heading">1&#x20e3; <strong>เชื่อมต่อไม่ได้</strong></h4>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ตรวจสอบว่าเปิด Bluetooth แล้ว<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ลองเชื่อมต่อกับแอปอื่น เช่น <strong>nRF Connect</strong> เพื่อตรวจสอบว่ามองเห็นอุปกรณ์หรือไม่</p>



<h4 class="wp-block-heading">2&#x20e3; <strong>ไม่พบบริการของ ACR3901U-S1</strong></h4>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ใช้แอป <strong>nRF Connect</strong> ค้นหา <strong>GATT Services</strong> และดู UUID ของอุปกรณ์<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ลองเปลี่ยนโค้ดให้ <code>characteristic.write(apduCommand, withoutResponse: true);</code></p>



<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3af.png" alt="🎯" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>สรุป</strong></h3>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ใช้ <code>flutter_blue_plus</code></strong> เชื่อมต่อ <strong>ACR3901U-S1 ผ่าน Bluetooth</strong><br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>สแกนหาอุปกรณ์ Bluetooth</strong> และ <strong>เชื่อมต่ออัตโนมัติ</strong><br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ส่งคำสั่ง APDU ไปยังบัตร</strong> ผ่าน Bluetooth</p>



<p class="wp-block-paragraph"><a href="https://www.compete.co.th/smart-card-reader">สินค้าของเรา</a><br><a href="https://www.compete.co.th/contact-us">ติดต่อเรา</a></p><p>The post <a href="https://www.novelbiz.co.th/chatgpt-%e0%b8%8a%e0%b9%88%e0%b8%a7%e0%b8%a2%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b8%a0%e0%b8%b2%e0%b8%a9%e0%b8%b2-flutter/">ChatGPT ช่วยเขียนโปรแกรมภาษา Flutter เชื่อมต่อ Smart Card Reader ผ่าน Bluetooth</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>การเขียนโค้ด Android เพื่ออ่านบัตรประชาชน ผ่านเครื่องอ่านบัตรสมาร์ทการ์ด</title>
		<link>https://www.novelbiz.co.th/code-android-read-smart-card-reader/</link>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Fri, 03 Jan 2025 04:11:41 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[GPT-4]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=60160</guid>

					<description><![CDATA[<p>การเขียนโค้ด Android เพื่ออ่านบัตรประชาชน ผ่านเครื่องอ่&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/code-android-read-smart-card-reader/">การเขียนโค้ด Android เพื่ออ่านบัตรประชาชน ผ่านเครื่องอ่านบัตรสมาร์ทการ์ด</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">การเขียนโค้ด Android เพื่ออ่านบัตรประชาชน ผ่านเครื่องอ่านบัตรสมาร์ทการ์ด</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1500" height="1500" src="https://www.novelbiz.co.th/wp-content/uploads/2025/01/4764-images-acr39u.png" alt="" class="wp-image-60161" style="width:443px;height:auto" srcset="https://www.novelbiz.co.th/wp-content/uploads/2025/01/4764-images-acr39u.png 1500w, https://www.novelbiz.co.th/wp-content/uploads/2025/01/4764-images-acr39u-768x768.png 768w" sizes="auto, (max-width: 1500px) 100vw, 1500px" /></figure>
</div>


<p class="wp-block-paragraph">จำเป็นต้องใช้ <strong>Android USB Host API</strong> สำหรับการเชื่อมต่อกับเครื่องอ่านบัตรและ <strong>APDU Commands</strong> สำหรับการสื่อสารกับบัตรสมาร์ทการ์ด</p>



<h3 class="wp-block-heading">ตัวอย่างโค้ด Android (Java)</h3>



<ol class="wp-block-list">
<li><strong>เพิ่ม Permissions ใน <code>AndroidManifest.xml</code></strong></li>
</ol>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-xml shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-tag">&lt;<span class="hljs-name">uses-permission</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.permission.USB_PERMISSION"</span> /&gt;</span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">&lt;<span class="hljs-name">uses-feature</span> <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.hardware.usb.host"</span> /&gt;</span>
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">&lt;<span class="hljs-name">application</span>&gt;</span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-tag">&lt;<span class="hljs-name">meta-data</span></span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">        <span class="hljs-attr">android:name</span>=<span class="hljs-string">"android.hardware.usb.action.USB_DEVICE_ATTACHED"</span></span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">        <span class="hljs-attr">android:resource</span>=<span class="hljs-string">"@xml/device_filter"</span> /&gt;</span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">&lt;/<span class="hljs-name">application</span>&gt;</span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<ol start="2" class="wp-block-list">
<li><strong>สร้างไฟล์ <code>res/xml/device_filter.xml</code></strong></li>
</ol>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-xml shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-meta">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">&lt;<span class="hljs-name">resources</span>&gt;</span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-tag">&lt;<span class="hljs-name">usb-device</span> <span class="hljs-attr">vendor-id</span>=<span class="hljs-string">"1839"</span> <span class="hljs-attr">product-id</span>=<span class="hljs-string">"8721"</span> /&gt;</span>
</span></span><span class='shcb-loc'><span><span class="hljs-tag">&lt;/<span class="hljs-name">resources</span>&gt;</span>
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph">(ปรับ <code>vendor-id</code> และ <code>product-id</code> ให้ตรงกับเครื่องอ่านบัตรของคุณ)</p>



<ol start="3" class="wp-block-list">
<li><strong>โค้ดสำหรับเชื่อมต่อและอ่านข้อมูลบัตร</strong></li>
</ol>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-php shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span>import android.hardware.usb.*;
</span></span><span class='shcb-loc'><span>import android.content.Context;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SmartCardReader</span> </span>{
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">private</span> UsbManager usbManager;
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">private</span> UsbDevice device;
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">private</span> UsbDeviceConnection connection;
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">private</span> UsbEndpoint inEndpoint, outEndpoint;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">public</span> SmartCardReader(Context context) {
</span></span><span class='shcb-loc'><span>        usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">public</span> void connect(UsbDevice device) {
</span></span><span class='shcb-loc'><span>        this.device = device;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment">// Request permission if needed</span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> (!usbManager.hasPermission(device)) {
</span></span><span class='shcb-loc'><span>            <span class="hljs-comment">// Implement permission dialog</span>
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">return</span>;
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment">// Open connection to the device</span>
</span></span><span class='shcb-loc'><span>        UsbInterface usbInterface = device.getInterface(<span class="hljs-number">0</span>);
</span></span><span class='shcb-loc'><span>        connection = usbManager.openDevice(device);
</span></span><span class='shcb-loc'><span>        connection.claimInterface(usbInterface, <span class="hljs-keyword">true</span>);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">for</span> (int i = <span class="hljs-number">0</span>; i &lt; usbInterface.getEndpointCount(); i++) {
</span></span><span class='shcb-loc'><span>            UsbEndpoint endpoint = usbInterface.getEndpoint(i);
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">if</span> (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
</span></span><span class='shcb-loc'><span>                <span class="hljs-keyword">if</span> (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
</span></span><span class='shcb-loc'><span>                    inEndpoint = endpoint;
</span></span><span class='shcb-loc'><span>                } <span class="hljs-keyword">else</span> {
</span></span><span class='shcb-loc'><span>                    outEndpoint = endpoint;
</span></span><span class='shcb-loc'><span>                }
</span></span><span class='shcb-loc'><span>            }
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">public</span> String sendApduCommand(byte&#91;] command) {
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> (connection == <span class="hljs-keyword">null</span> || outEndpoint == <span class="hljs-keyword">null</span> || inEndpoint == <span class="hljs-keyword">null</span>) {
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">return</span> <span class="hljs-string">"Device not connected"</span>;
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment">// Send APDU command</span>
</span></span><span class='shcb-loc'><span>        connection.bulkTransfer(outEndpoint, command, command.length, <span class="hljs-number">5000</span>);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment">// Receive response</span>
</span></span><span class='shcb-loc'><span>        byte&#91;] response = <span class="hljs-keyword">new</span> byte&#91;<span class="hljs-number">256</span>];
</span></span><span class='shcb-loc'><span>        int received = connection.bulkTransfer(inEndpoint, response, response.length, <span class="hljs-number">5000</span>);
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> (received &gt; <span class="hljs-number">0</span>) {
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">return</span> bytesToHex(response, received);
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">return</span> <span class="hljs-string">"No response"</span>;
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">private</span> String bytesToHex(byte&#91;] bytes, int length) {
</span></span><span class='shcb-loc'><span>        StringBuilder sb = <span class="hljs-keyword">new</span> StringBuilder();
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">for</span> (int i = <span class="hljs-number">0</span>; i &lt; length; i++) {
</span></span><span class='shcb-loc'><span>            sb.append(String.format(<span class="hljs-string">"%02X"</span>, bytes&#91;i]));
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">return</span> sb.toString();
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<ol start="4" class="wp-block-list">
<li><strong>APDU Command สำหรับบัตรประชาชนไทย</strong></li>
</ol>



<ul class="wp-block-list">
<li><strong>Select File:</strong><code>00 A4 00 00 02 11 11</code></li>



<li><strong>Read Data:</strong><code>00 B0 00 00 20</code> (20 = จำนวนไบต์ที่ต้องการอ่าน)</li>
</ul>



<h3 class="wp-block-heading">การใช้งานใน Activity</h3>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-javascript">UsbDevice device = ... <span class="hljs-comment">// ค้นหา UsbDevice ผ่าน usbManager.getDeviceList()</span>
SmartCardReader reader = <span class="hljs-keyword">new</span> SmartCardReader(<span class="hljs-keyword">this</span>);
reader.connect(device);

<span class="hljs-comment">// ส่งคำสั่ง APDU เพื่อเลือกไฟล์</span>
<span class="hljs-built_in">String</span> response = reader.sendApduCommand(<span class="hljs-keyword">new</span> byte&#91;]{<span class="hljs-number">0x00</span>, (byte) <span class="hljs-number">0xA4</span>, <span class="hljs-number">0x00</span>, <span class="hljs-number">0x00</span>, <span class="hljs-number">0x02</span>, <span class="hljs-number">0x11</span>, <span class="hljs-number">0x11</span>});
Log.d(<span class="hljs-string">"APDU Response"</span>, response);
</code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">หมายเหตุ</h3>



<ul class="wp-block-list">
<li>ทดสอบการเชื่อมต่อผ่านเครื่องอ่านบัตร ACS ก่อนใช้งานจริง</li>



<li>ใช้ APDU Commands ที่เหมาะสมกับรูปแบบข้อมูลในบัตร</li>



<li>ตรวจสอบ <code>vendor-id</code> และ <code>product-id</code> ให้ตรงกับเครื่องอ่านของคุณ</li>
</ul>



<p class="wp-block-paragraph"><a href="https://www.compete.co.th/smart-card-reader" title="">สินค้าของเรา</a><br><a href="https://www.compete.co.th/contact-us" title="">ติดต่อเรา</a></p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://www.novelbiz.co.th/code-android-read-smart-card-reader/">การเขียนโค้ด Android เพื่ออ่านบัตรประชาชน ผ่านเครื่องอ่านบัตรสมาร์ทการ์ด</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>การเชื่อมต่อการใช้งาน Smart Card ในแอปพลิเคชัน .NET</title>
		<link>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-smart-card/</link>
					<comments>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-smart-card/#respond</comments>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Mon, 16 Dec 2024 04:01:07 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[Digital Marketing]]></category>
		<category><![CDATA[GPT-4]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Website]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=60110</guid>

					<description><![CDATA[<p>การเชื่อมต่อการใช้งาน Smart Card ในแอปพลิเคชัน .NET Sma&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-smart-card/">การเชื่อมต่อการใช้งาน Smart Card ในแอปพลิเคชัน .NET</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">การเชื่อมต่อการใช้งาน Smart Card ในแอปพลิเคชัน .NET</h2>



<p class="wp-block-paragraph"><br></p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="900" height="900" src="https://www.novelbiz.co.th/wp-content/uploads/2024/12/Smart-Card.png" alt="Smart Card" class="wp-image-60114" srcset="https://www.novelbiz.co.th/wp-content/uploads/2024/12/Smart-Card.png 900w, https://www.novelbiz.co.th/wp-content/uploads/2024/12/Smart-Card-768x768.png 768w" sizes="auto, (max-width: 900px) 100vw, 900px" /></figure>
</div>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>Smart Card API for .NET</strong> เป็นชุดของเครื่องมือและไลบรารีที่ออกแบบมาเพื่อช่วยนักพัฒนาซอฟต์แวร์ในการเชื่อมต่อและจัดการการใช้งาน Smart Card ภายในแอปพลิเคชันที่สร้างด้วยแพลตฟอร์ม .NET ซึ่ง API นี้ช่วยเพิ่มความสะดวกในการจัดการข้อมูลและสื่อสารกับ Smart Card โดยไม่ต้องทำความเข้าใจโครงสร้างที่ซับซ้อนของฮาร์ดแวร์</p>



<h3 class="wp-block-heading">การใช้งาน Smart Card API ใน .NET</h3>



<p class="wp-block-paragraph">.NET มีคลาสไลบรารีที่ช่วยให้สามารถสื่อสารกับ Smart Card ได้ผ่าน Windows Smart Card Subsystem โดยคลาสหลักที่เกี่ยวข้องคือ <code>System.Security.Cryptography</code> และ <code>System.SmartCard</code>.<br>นักพัฒนาสามารถใช้ API นี้เพื่อดำเนินการต่าง ๆ เช่น:</p>



<ol class="wp-block-list">
<li>เชื่อมต่อและส่งคำสั่ง APDU (Application Protocol Data Unit) ไปยัง Smart Card</li>



<li>อ่านข้อมูลที่เก็บอยู่บนการ์ด</li>



<li>จัดการกระบวนการยืนยันตัวตน</li>
</ol>



<h3 class="wp-block-heading">ตัวอย่างโค้ดพื้นฐาน: การเชื่อมต่อกับ Smart Card</h3>



<p class="wp-block-paragraph">ตัวอย่างต่อไปนี้แสดงการเชื่อมต่อกับ Smart Card และอ่านข้อมูลเบื้องต้น:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-vbnet shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">using</span> System;
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">using</span> System.Security.Cryptography.X509Certificates;
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">using</span> System.SmartCard;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">namespace</span> SmartCardExample
</span></span><span class='shcb-loc'><span>{
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">class</span> Program
</span></span><span class='shcb-loc'><span>    {
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">static</span> void Main(<span class="hljs-built_in">string</span>&#91;] args)
</span></span><span class='shcb-loc'><span>        {
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">try</span>
</span></span><span class='shcb-loc'><span>            {
</span></span><span class='shcb-loc'><span>                // ค้นหาอุปกรณ์ที่เชื่อมต่ออยู่
</span></span><span class='shcb-loc'><span>                SmartCardReader reader = <span class="hljs-keyword">new</span> SmartCardReader();
</span></span><span class='shcb-loc'><span>                <span class="hljs-keyword">if</span> (reader.IsCardPresent)
</span></span><span class='shcb-loc'><span>                {
</span></span><span class='shcb-loc'><span>                    Console.WriteLine(<span class="hljs-string">"Smart Card Detected!"</span>);
</span></span><span class='shcb-loc'><span>                    
</span></span><span class='shcb-loc'><span>                    // เชื่อมต่อกับการ์ด
</span></span><span class='shcb-loc'><span>                    reader.Connect();
</span></span><span class='shcb-loc'><span>                    <span class="hljs-built_in">byte</span>&#91;] response = reader.SendCommand(<span class="hljs-keyword">new</span> <span class="hljs-built_in">byte</span>&#91;] { <span class="hljs-number">0x00</span>, <span class="hljs-number">0xA4</span>, <span class="hljs-number">0x04</span>, <span class="hljs-number">0x00</span> });
</span></span><span class='shcb-loc'><span>                    Console.WriteLine(<span class="hljs-string">"Response: "</span> + BitConverter.ToString(response));
</span></span><span class='shcb-loc'><span>                }
</span></span><span class='shcb-loc'><span>                <span class="hljs-keyword">else</span>
</span></span><span class='shcb-loc'><span>                {
</span></span><span class='shcb-loc'><span>                    Console.WriteLine(<span class="hljs-string">"No Smart Card Found."</span>);
</span></span><span class='shcb-loc'><span>                }
</span></span><span class='shcb-loc'><span>            }
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">catch</span> (Exception ex)
</span></span><span class='shcb-loc'><span>            {
</span></span><span class='shcb-loc'><span>                Console.WriteLine(<span class="hljs-string">"Error: "</span> + ex.Message);
</span></span><span class='shcb-loc'><span>            }
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">คุณสมบัติเด่นของ Smart Card API for .NET</h3>



<ol class="wp-block-list">
<li><strong>ความง่ายต่อการพัฒนา</strong>: มีฟังก์ชันและคลาสที่ช่วยลดความยุ่งยากในการจัดการ APDU</li>



<li><strong>รองรับหลายอุปกรณ์</strong>: สามารถใช้งานร่วมกับ Card Reader หลายประเภท</li>



<li><strong>ความปลอดภัย</strong>: รองรับการเข้ารหัสลับสำหรับกระบวนการตรวจสอบและส่งข้อมูล</li>
</ol>



<h3 class="wp-block-heading">สรุป</h3>



<p class="wp-block-paragraph">Smart Card API for .NET เป็นเครื่องมือสำคัญที่ช่วยให้นักพัฒนาซอฟต์แวร์สามารถสร้างแอปพลิเคชันที่รองรับการใช้งาน Smart Card ได้อย่างรวดเร็วและปลอดภัย ด้วยฟีเจอร์ที่หลากหลายและความสามารถในการทำงานร่วมกับอุปกรณ์ฮาร์ดแวร์หลายรูปแบบ</p>



<h3 class="wp-block-heading">ที่มา</h3>



<ul class="wp-block-list">
<li>Microsoft Docs: <a href="https://www.codeproject.com/Articles/16653/A-Smart-Card-Framework-for-NET?utm_source=chatgpt.com" title="">Smart Card Overview</a></li>
</ul>



<p class="wp-block-paragraph"><strong><a href="https://www.compete.co.th/category/smart-card-reader" target="_blank" rel="noreferrer noopener">Smart Card Reader</a></strong></p><p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-smart-card/">การเชื่อมต่อการใช้งาน Smart Card ในแอปพลิเคชัน .NET</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%83%e0%b8%8a%e0%b9%89%e0%b8%87%e0%b8%b2%e0%b8%99-smart-card/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (Smart Card Reader) ในภาษา Java</title>
		<link>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87/</link>
					<comments>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87/#respond</comments>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Mon, 09 Dec 2024 03:45:00 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[ChatGPT]]></category>
		<category><![CDATA[GPT-4]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=60101</guid>

					<description><![CDATA[<p>การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (Smart Card Reade&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87/">การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (Smart Card Reader) ในภาษา Java</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="533" height="410" src="https://www.novelbiz.co.th/wp-content/uploads/2024/12/39U4.webp" alt="39U4" class="wp-image-60102"/></figure>
</div>


<p class="wp-block-paragraph"><br></p>



<h2 class="wp-block-heading">การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (Smart Card Reader) ในภาษา Java</h2>



<p class="wp-block-paragraph">สามารถทำได้โดยใช้ไลบรารี javax.smartcardio ซึ่งเป็นส่วนหนึ่งของ Java Standard Edition <a href="https://blog.protocolbench.org/2014/12/java-sample-smart-card/?utm_source=chatgpt.com" title="PROTOCOL BENCH BLOG">PROTOCOL BENCH BLOG</a> ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการเชื่อมต่อและส่งคำสั่ง APDU ไปยังสมาร์ทการ์ด:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-java shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">import</span> javax.smartcardio.*;
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">import</span> java.util.List;
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">SmartCardExample</span> </span>{
</span></span><span class='shcb-loc'><span>    <span class="hljs-function"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span><span class="hljs-params">(String&#91;] args)</span> </span>{
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">try</span> {
</span></span><span class='shcb-loc'><span>            <span class="hljs-comment">// สร้างโรงงานสำหรับเครื่องอ่านการ์ด</span>
</span></span><span class='shcb-loc'><span>            TerminalFactory factory = TerminalFactory.getDefault();
</span></span><span class='shcb-loc'><span>            <span class="hljs-comment">// รับรายการเครื่องอ่านการ์ดที่มีอยู่</span>
</span></span><span class='shcb-loc'><span>            List&lt;CardTerminal&gt; terminals = factory.terminals().list();
</span></span><span class='shcb-loc'><span>            System.out.println(<span class="hljs-string">"เครื่องอ่านการ์ดที่พบ: "</span> + terminals);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">if</span> (terminals.isEmpty()) {
</span></span><span class='shcb-loc'><span>                System.out.println(<span class="hljs-string">"ไม่พบเครื่องอ่านการ์ด"</span>);
</span></span><span class='shcb-loc'><span>                <span class="hljs-keyword">return</span>;
</span></span><span class='shcb-loc'><span>            }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>            <span class="hljs-comment">// ใช้เครื่องอ่านการ์ดเครื่องแรก</span>
</span></span><span class='shcb-loc'><span>            CardTerminal terminal = terminals.get(<span class="hljs-number">0</span>);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>            <span class="hljs-comment">// รอให้มีการ์ดถูกใส่เข้าไปในเครื่องอ่าน</span>
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">if</span> (terminal.waitForCardPresent(<span class="hljs-number">1000</span>)) {
</span></span><span class='shcb-loc'><span>                <span class="hljs-comment">// เชื่อมต่อกับการ์ด</span>
</span></span><span class='shcb-loc'><span>                Card card = terminal.connect(<span class="hljs-string">"*"</span>);
</span></span><span class='shcb-loc'><span>                System.out.println(<span class="hljs-string">"เชื่อมต่อกับการ์ด: "</span> + card);
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>                <span class="hljs-comment">// รับช่องสัญญาณพื้นฐาน</span>
</span></span><span class='shcb-loc'><span>                CardChannel channel = card.getBasicChannel();
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>                <span class="hljs-comment">// สร้างคำสั่ง APDU (ตัวอย่าง: GET CHALLENGE)</span>
</span></span><span class='shcb-loc'><span>                CommandAPDU command = <span class="hljs-keyword">new</span> CommandAPDU(<span class="hljs-keyword">new</span> <span class="hljs-keyword">byte</span>&#91;] {
</span></span><span class='shcb-loc'><span>                    (<span class="hljs-keyword">byte</span>)<span class="hljs-number">0x00</span>, <span class="hljs-comment">// CLA</span>
</span></span><span class='shcb-loc'><span>                    (<span class="hljs-keyword">byte</span>)<span class="hljs-number">0x84</span>, <span class="hljs-comment">// INS</span>
</span></span><span class='shcb-loc'><span>                    (<span class="hljs-keyword">byte</span>)<span class="hljs-number">0x00</span>, <span class="hljs-comment">// P1</span>
</span></span><span class='shcb-loc'><span>                    (<span class="hljs-keyword">byte</span>)<span class="hljs-number">0x00</span>, <span class="hljs-comment">// P2</span>
</span></span><span class='shcb-loc'><span>                    (<span class="hljs-keyword">byte</span>)<span class="hljs-number">0x08</span>  <span class="hljs-comment">// Le</span>
</span></span><span class='shcb-loc'><span>                });
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>                <span class="hljs-comment">// ส่งคำสั่งและรับการตอบสนอง</span>
</span></span><span class='shcb-loc'><span>                ResponseAPDU response = channel.transmit(command);
</span></span><span class='shcb-loc'><span>                <span class="hljs-keyword">byte</span>&#91;] responseData = response.getData();
</span></span><span class='shcb-loc'><span>                System.out.println(<span class="hljs-string">"ข้อมูลที่ได้รับ: "</span> + bytesToHex(responseData));
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>                <span class="hljs-comment">// ตัดการเชื่อมต่อกับการ์ด</span>
</span></span><span class='shcb-loc'><span>                card.disconnect(<span class="hljs-keyword">false</span>);
</span></span><span class='shcb-loc'><span>            } <span class="hljs-keyword">else</span> {
</span></span><span class='shcb-loc'><span>                System.out.println(<span class="hljs-string">"ไม่มีการ์ดในเครื่องอ่าน"</span>);
</span></span><span class='shcb-loc'><span>            }
</span></span><span class='shcb-loc'><span>        } <span class="hljs-keyword">catch</span> (Exception e) {
</span></span><span class='shcb-loc'><span>            e.printStackTrace();
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-comment">// ฟังก์ชันช่วยในการแปลงข้อมูลไบต์เป็นสตริงฐานสิบหก</span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-function"><span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> String <span class="hljs-title">bytesToHex</span><span class="hljs-params">(<span class="hljs-keyword">byte</span>&#91;] bytes)</span> </span>{
</span></span><span class='shcb-loc'><span>        StringBuilder sb = <span class="hljs-keyword">new</span> StringBuilder();
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">byte</span> b : bytes) {
</span></span><span class='shcb-loc'><span>            sb.append(String.format(<span class="hljs-string">"%02X"</span>, b));
</span></span><span class='shcb-loc'><span>        }
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">return</span> sb.toString();
</span></span><span class='shcb-loc'><span>    }
</span></span><span class='shcb-loc'><span>}
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>ในโค้ดนี้:</strong></p>



<ol class="wp-block-list">
<li>สร้าง <code>TerminalFactory</code> และรับรายการของ <code>CardTerminal</code> ที่มีอยู่ในระบบ</li>



<li>ตรวจสอบว่าเครื่องอ่านการ์ดมีการ์ดถูกใส่หรือไม่</li>



<li>เชื่อมต่อกับการ์ดและรับ <code>CardChannel</code> เพื่อสื่อสารกับการ์ด</li>



<li>สร้างและส่งคำสั่ง APDU เพื่อรับข้อมูลจากการ์ด</li>



<li>รับและแสดงผลข้อมูลที่ได้รับจากการ์ด</li>



<li>ตัดการเชื่อมต่อกับการ์ดเมื่อเสร็จสิ้น</li>
</ol>



<p class="wp-block-paragraph">สำหรับการอ่านข้อมูลจากบัตรประชาชนไทย (Thai National ID Card) ซึ่งมีข้อมูลในรูปแบบอักษรไทย คุณอาจต้องแปลงข้อมูลที่ได้รับให้อยู่ในรูปแบบที่ถูกต้อง เช่น การแปลงเป็น UTF-8 เพื่อให้สามารถอ่านอักษรไทยได้อย่างถูกต้อง</p>



<p class="wp-block-paragraph">นอกจากนี้ ยังมีโครงการโอเพนซอร์สที่พัฒนาไลบรารีสำหรับการอ่านข้อมูลจากบัตรประชาชนไทยโดยใช้ภาษา Java ซึ่งคุณสามารถศึกษาและนำมาใช้ในโครงการของคุณได้</p>



<p class="wp-block-paragraph">โปรดทราบว่าการสื่อสารกับสมาร์ทการ์ดต้องใช้คำสั่ง APDU ที่ถูกต้อง ซึ่งอาจแตกต่างกันไปตามประเภทของการ์ด ดังนั้น ควรศึกษาคู่มือหรือเอกสารที่เกี่ยวข้องกับการ์ดที่คุณใช้งานเพื่อให้สามารถสื่อสารกับการ์ดได้อย่างถูกต้อง</p>



<p class="wp-block-paragraph"><a href="https://github.com/wnameless/smartcard-reader/blob/master/src/main/java/com/github/wnameless/smartcard/CardReader.java" target="_blank" rel="noopener" title="">code java</a></p>



<p class="wp-block-paragraph"><strong><a href="https://www.compete.co.th/category/smart-card-reader" target="_blank" rel="noopener" title="">Smart Card Reader</a></strong></p>



<p class="wp-block-paragraph"></p><p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87/">การเชื่อมต่อกับเครื่องอ่านสมาร์ทการ์ด (Smart Card Reader) ในภาษา Java</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad%e0%b8%81%e0%b8%b1%e0%b8%9a%e0%b9%80%e0%b8%84%e0%b8%a3%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%87/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>การเขียน Program เชื่อมต่อ Smart Card Reader และอ่านบัตรประชาชนไทย</title>
		<link>https://www.novelbiz.co.th/programming-smart-card-reader-thai-id-card/</link>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Mon, 18 Nov 2024 01:30:53 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=59785</guid>

					<description><![CDATA[]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element " >
		<div class="wpb_wrapper">
			<div class="Smart-Card">
<h2>การเขียน Program เชื่อมต่อ Smart Card Reader และอ่านบัตรประชาชนไทย</h2>
<p>โปรแกรม Command-line สำหรับอ่านข้อมูลจากบัตรประชาชนไทยผ่านเครื่องอ่านบัตรอัจฉริยะ (Smart Card Reader)</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-59791 size-full" src="https://www.novelbiz.co.th/wp-content/uploads/2024/11/asc.png" alt="" width="500" height="500" /></p>
<h2>คุณสมบัติ (Features)</h2>
<p>โปรแกรมสามารถอ่านข้อมูลจากบัตรประชาชนไทยได้ดังนี้:</p>
<ul class="ol-post">
<li>เลขบัตรประชาชน 13 หนัก</li>
<li>ชื่อ-นามสกุล (ภาษาไทยและอังกฤษ)</li>
<li>วันเกิด (แสดงทั้งรูปแบบไทยและอังกฤษ)</li>
<li>เพศ</li>
<li>วันที่ออกบัตร</li>
<li>วันที่หมดอายุ</li>
<li>สถานที่ออกบัตร</li>
<li>ที่อยู่ตามทะเบียนบ้าน</li>
<li>หมายเลขคำขอ</li>
</ul>
<h2>ความต้องการของระบบ (System Requirements)</h2>
<h3>ฮาร์ดแวร์</h3>
<ul class="ol-post">
<li>เครื่องอ่านบัตรอัจฉริยะ (Smart Card Reader) ที่รองรับมาตรฐาน ISO 7816</li>
<li>พอร์ต USB สำหรับเชื่อมต่อเครื่องอ่านบัตร</li>
</ul>
<h3>ซอฟต์แวร์</h3>
<ul class="ol-post">
<li><strong>ระบบปฏิบัติการ:</strong> Windows 10/11 (แนะนำ) หรือ Linux/macOS</li>
<li><strong>Python:</strong> เวอร์ชัน 3.7 ขึ้นไป</li>
<li><strong>Smart Card Service:</strong> ต้องเปิดใช้งาน Smart Card Service บน Windows</li>
</ul>
<h2>การติดตั้ง (Installation)</h2>
<h3>ขั้นตอนที่ 1: ติดตั้ง Python</h3>
<p>ดาวน์โหลดและติดตั้ง Python จาก <a href="https://www.python.org/downloads/">python.org</a></p>
<p>ตรวจสอบการติดตั้ง:</p>
<pre><code>python --version</code></pre>
<h3>ขั้นตอนที่ 2: ติดตั้ง Driver สำหรับ Smart Card Reader</h3>
<p>ติดตั้ง driver ของเครื่องอ่านบัตรตามคู่มือของผู้ผลิต</p>
<h3>ขั้นตอนที่ 3: เปิดใช้งาน Smart Card Service (สำหรับ Windows)</h3>
<ol class="ol-post">
<li>กดปุ่ม <code>Win + R</code> พิมพ์ <code>services.msc</code> แล้วกด Enter</li>
<li>หาบริการชื่อ <strong>Smart Card</strong></li>
<li>คลิกขวาเลือก <strong>Properties</strong></li>
<li>ตั้งค่า Startup type เป็น <strong>Automatic</strong></li>
<li>คลิก <strong>Start</strong> เพื่อเริ่มบริการ</li>
<li>คลิก <strong>OK</strong></li>
</ol>
<h3>ขั้นตอนที่ 4: ติดตั้ง Library ที่จำเป็น</h3>
<h4>สำหรับ Windows:</h4>
<pre><code>pip install pyscard</code></pre>
<h4>สำหรับ Linux (Ubuntu/Debian):</h4>
<pre><code># ติดตั้ง dependencies
sudo apt-get update
sudo apt-get install pcscd pcsc-tools libpcsclite-dev swig

# ติดตั้ง Python library
pip install pyscard</code></pre>
<h4>สำหรับ macOS:</h4>
<pre><code># ติดตั้ง dependencies ผ่าน Homebrew
brew install swig

# ติดตั้ง Python library
pip install pyscard</code></pre>
<h3>ขั้นตอนที่ 5: ดาวน์โหลดโปรแกรม</h3>
<pre><code># ดาวน์โหลดไฟล์ หรือ clone repository
git clone https://github.com/novelbiz/Smart-Card/blob/main/Thai_id_card/Thai_id_card_cli.py
cd Thai_id_card</code></pre>
<p>หรือคัดลอกไฟล์ <code>Thai_id_card_cli.py</code> ไปยังโฟลเดอร์ที่ต้องการ</p>
<h2>วิธีใช้งาน (Usage)</h2>
<h3>ขั้นตอนการใช้งาน</h3>
<ol class="ol-post">
<li>เชื่อมต่อเครื่องอ่านบัตรเข้ากับคอมพิวเตอร์</li>
<li>เปิด Command Prompt หรือ Terminal</li>
<li>ไปยังโฟลเดอร์ที่มีไฟล์โปรแกรม</li>
<li>รันคำสั่ง: <code>python Thai_id_card_cli.py</code></li>
<li>ใส่บัตรประชาชนลงในเครื่องอ่านบัตร</li>
<li>รอให้โปรแกรมอ่านข้อมูล</li>
<li>ข้อมูลจะแสดงบนหน้าจอ</li>
</ol>
<h3>ตัวอย่างผลลัพธ์</h3>
<pre><code>======================================================================
               โปรแกรมอ่านบัตรประชาชนไทย - Novelbiz
                         MIT License 2025
======================================================================
[เริ่มต้น] โปรแกรมพร้อมทำงาน
======================================================================

[สถานะ] พบเครื่องอ่านบัตร: ACS ACR122U PICC Interface 0

[พร้อม] ใส่บัตรประชาชนเพื่ออ่านข้อมูล...

======================================================================
[เริ่มอ่าน] กำลังอ่านข้อมูลบัตรประชาชน...
======================================================================

[เชื่อมต่อ] เชื่อมต่อกับ: ACS ACR122U PICC Interface 0
[ATR] 3B 67 00 00 ...
[สำเร็จ] เลือก Thai ID Applet สำเร็จ (SW: 90 00)

----------------------------------------------------------------------
                         ข้อมูลบัตรประชาชน
----------------------------------------------------------------------

&#x1f4cc; เลขบัตรประชาชน: 1234567890123
&#x1f464; ชื่อ-นามสกุล (ไทย): นาย สมชาย ใจดี
&#x1f464; ชื่อ-นามสกุล (อังกฤษ): Mr. Somchai Jaidee
&#x1f382; วันเกิด (ไทย): 15 มกราคม 2533
&#x1f382; วันเกิด (อังกฤษ): 15 January 1990
&#x26a7; เพศ: ชาย

&#x1f4c5; วันที่ออกบัตร (ไทย): 1 มกราคม 2563
&#x1f4c5; วันที่ออกบัตร (อังกฤษ): 1 January 2020
&#x1f4c5; วันที่หมดอายุ (ไทย): 31 ธันวาคม 2573
&#x1f4c5; วันที่หมดอายุ (อังกฤษ): 31 December 2030
&#x1f3e2; สถานที่ออกบัตร: สำนักทะเบียนอำเภอเมือง จังหวัดกรุงเทพมหานคร

&#x1f3e0; ที่อยู่: 123 ถนนสุขุมวิท แขวงคลองเตย เขตคลองเตย กรุงเทพมหานคร 10110
&#x1f522; หมายเลขคำขอ: AA1234567890

======================================================================
[สำเร็จ] &#x2705; อ่านข้อมูลบัตรประชาชนเรียบร้อยแล้ว
======================================================================

[เสร็จสิ้น] อ่านข้อมูลเสร็จสมบูรณ์</code></pre>
<h2>การแก้ปัญหา (Troubleshooting)</h2>
<h3>ปัญหา: ไม่พบเครื่องอ่านบัตร</h3>
<p><strong>แก้ไข:</strong></p>
<ul class="ol-post">
<li>ตรวจสอบว่าเครื่องอ่านบัตรเชื่อมต่อกับคอมพิวเตอร์แล้ว</li>
<li>ติดตั้ง driver ของเครื่องอ่านบัตร</li>
<li>ตรวจสอบว่า Smart Card Service ทำงานอยู่ (Windows)</li>
</ul>
<h3>ปัญหา: ไม่สามารถติดตั้ง pyscard ได้</h3>
<p><strong>แก้ไข:</strong></p>
<pre><code># ลองอัปเดต pip ก่อน
python -m pip install --upgrade pip

# สำหรับ Windows อาจต้องติดตั้ง Visual C++ Build Tools
# ดาวน์โหลดจาก: <a href="https://visualstudio.microsoft.com/visual-cpp-build-tools/">https://visualstudio.microsoft.com/visual-cpp-build-tools/</a>

# ลองติดตั้งอีกครั้ง
pip install pyscard</code></pre>
<h3>ปัญหา: Smart Card Service ไม่ทำงาน (Windows)</h3>
<p><strong>แก้ไข:</strong></p>
<pre><code># เปิด Command Prompt แบบ Administrator แล้วรันคำสั่ง:
sc start SCardSvr</code></pre>
<h3>ปัญหา: ไม่สามารถอ่านข้อมูลจากบัตรได้</h3>
<p><strong>แก้ไข:</strong></p>
<ul class="ol-post">
<li>ทำความสะอาดบัตรและเครื่องอ่านบัตร</li>
<li>ตรวจสอบว่าบัตรใส่ถูกทิศทาง</li>
<li>ลองถอดบัตรแล้วใส่ใหม่</li>
<li>รีสตาร์ทโปรแกรม</li>
</ul>
<h3>ปัญหา: ข้อความแสดงผลผิดเพี้ยน</h3>
<p><strong>แก้ไข:</strong></p>
<ul class="ol-post">
<li>ตรวจสอบว่า Terminal รองรับ UTF-8 และ TIS-620</li>
<li>สำหรับ Windows ให้ตั้งค่า Code Page: <code>chcp 65001</code></li>
</ul>
<h2>โครงสร้างของโปรแกรม (Code Structure)</h2>
<h3>คลาสหลัก: IDCardReader</h3>
<p>โปรแกรมประกอบด้วยคลาสหลัก 1 คลาส ที่มี methods สำคัญดังนี้:</p>
<h3>1. Helper Functions &#8211; ฟังก์ชันช่วยเหลือ</h3>
<h4>decode_text(data)</h4>
<ul class="ol-post">
<li>แปลงข้อมูล bytes จากบัตรเป็นข้อความที่อ่านได้</li>
<li>รองรับ encoding แบบ TIS-620 (มาตรฐานภาษาไทย)</li>
</ul>
<h4>send_apdu_with_get_response(connection, apdu)</h4>
<ul class="ol-post">
<li>ส่งคำสั่ง APDU (Application Protocol Data Unit) ไปยังบัตร</li>
<li>จัดการ GET_RESPONSE อัตโนมัติเมื่อบัตรตอบกลับด้วย SW1=0x61</li>
</ul>
<h4>parse_thai_date(date_str)</h4>
<ul class="ol-post">
<li>แปลงวันที่จากรูปแบบ YYYYMMDD เป็นรูปแบบที่อ่านง่าย</li>
<li>คำนวณปีพุทธศักราช (Thai) และคริสต์ศักราช (English)</li>
<li>รองรับกรณีพิเศษ &#8220;99999999&#8221; = ตลอดชีพ</li>
</ul>
<h4>disconnect_card()</h4>
<ul class="ol-post">
<li>ตัดการเชื่อมต่อกับบัตรอย่างปลอดภัย</li>
</ul>
<h3>2. Card Reader Functions &#8211; ฟังก์ชันเครื่องอ่านบัตร</h3>
<h4>check_service_status()</h4>
<ul class="ol-post">
<li>ตรวจสอบว่า Smart Card Service ทำงานอยู่หรือไม่ (Windows)</li>
<li>ใช้คำสั่ง <code>sc query SCardSvr</code></li>
</ul>
<h4>check_reader_status()</h4>
<ul class="ol-post">
<li>ตรวจสอบว่ามีเครื่องอ่านบัตรเชื่อมต่ออยู่หรือไม่</li>
<li>แสดงชื่อเครื่องอ่านบัตรที่พบ</li>
</ul>
<h3>3. Main Function &#8211; ฟังก์ชันหลัก</h3>
<h4>read_id_card()</h4>
<p>ฟังก์ชันหลักในการอ่านข้อมูลจากบัตรประชาชน ทำงานตามลำดับ:</p>
<ol class="ol-post">
<li>เชื่อมต่อกับบัตร</li>
<li>เลือก Thai ID Card Applet</li>
<li>อ่านข้อมูลแต่ละฟิลด์</li>
<li>แสดงผลและตัดการเชื่อมต่อ</li>
</ol>
<h4>run()</h4>
<ul class="ol-post">
<li>ฟังก์ชันรันโปรแกรมหลัก</li>
<li>ตรวจสอบระบบและรอให้ผู้ใช้ใส่บัตร</li>
</ul>
<h2>APDU Commands ที่ใช้</h2>
<p>APDU (Application Protocol Data Unit) คือคำสั่งมาตรฐานสำหรับสื่อสารกับ Smart Card</p>
<h3>คำสั่งเลือก Applet</h3>
<pre><code>SELECT = [0x00, 0xA4, 0x04, 0x00, 0x08]
THAI_ID_CARD = [0xA0, 0x00, 0x00, 0x00, 0x54, 0x48, 0x00, 0x01]</code></pre>
<ul class="ol-post">
<li><code>0x00, 0xA4</code> = SELECT command</li>
<li><code>0x04, 0x00</code> = เลือกโดยใช้ AID (Application Identifier)</li>
<li><code>0x08</code> = ความยาวของ AID</li>
<li>AID ของบัตรประชาชนไทย = <code>A0 00 00 00 54 48 00 01</code></li>
</ul>
<h3>คำสั่งอ่านข้อมูล</h3>
<p>รูปแบบคำสั่ง READ BINARY:</p>
<pre><code>[0x80, 0xB0, offset_high, offset_low, 0x02, 0x00, length]</code></pre>
<p><strong>ตัวอย่างคำสั่งอ่านข้อมูลแต่ละฟิลด์:</strong></p>
<table>
<thead>
<tr>
<th>ข้อมูล</th>
<th>คำสั่ง APDU</th>
<th>Offset</th>
<th>Length</th>
</tr>
</thead>
<tbody>
<tr>
<td>เลขบัตรประชาชน</td>
<td><code>80 B0 00 04 02 00 0D</code></td>
<td>0x0004</td>
<td>13 bytes</td>
</tr>
<tr>
<td>ชื่อ-สกุล (ไทย)</td>
<td><code>80 B0 00 11 02 00 64</code></td>
<td>0x0011</td>
<td>100 bytes</td>
</tr>
<tr>
<td>ชื่อ-สกุล (อังกฤษ)</td>
<td><code>80 B0 00 75 02 00 64</code></td>
<td>0x0075</td>
<td>100 bytes</td>
</tr>
<tr>
<td>วันเกิด</td>
<td><code>80 B0 00 D9 02 00 08</code></td>
<td>0x00D9</td>
<td>8 bytes</td>
</tr>
<tr>
<td>เพศ</td>
<td><code>80 B0 00 E1 02 00 01</code></td>
<td>0x00E1</td>
<td>1 byte</td>
</tr>
<tr>
<td>วันออกบัตร</td>
<td><code>80 B0 01 67 02 00 08</code></td>
<td>0x0167</td>
<td>8 bytes</td>
</tr>
<tr>
<td>วันหมดอายุ</td>
<td><code>80 B0 01 6F 02 00 08</code></td>
<td>0x016F</td>
<td>8 bytes</td>
</tr>
<tr>
<td>สถานที่ออกบัตร</td>
<td><code>80 B0 00 F6 02 00 64</code></td>
<td>0x00F6</td>
<td>100 bytes</td>
</tr>
<tr>
<td>ที่อยู่</td>
<td><code>80 B0 15 79 02 00 64</code></td>
<td>0x1579</td>
<td>100 bytes</td>
</tr>
<tr>
<td>หมายเลขคำขอ</td>
<td><code>80 B0 16 19 02 00 0E</code></td>
<td>0x1619</td>
<td>14 bytes</td>
</tr>
</tbody>
</table>
<h2>การทำงานของโปรแกรม (Flow)</h2>
<h3>ขั้นตอนการทำงานหลัก</h3>
<ol class="ol-post">
<li>เริ่มโปรแกรม</li>
<li>ตรวจสอบ Smart Card Service (Windows)</li>
<li>ตรวจสอบเครื่องอ่านบัตร</li>
<li>รอให้ผู้ใช้ใส่บัตร (Timeout 5 วินาที)</li>
<li>เชื่อมต่อกับบัตร (T0 หรือ T1 protocol)</li>
<li>อ่าน ATR (Answer To Reset)</li>
<li>เลือก Thai ID Card Applet
<ul class="ol-post">
<li>ส่งคำสั่ง SELECT</li>
<li>ตรวจสอบ SW (Status Word) = 90 00</li>
</ul>
</li>
<li>อ่านข้อมูลแต่ละฟิลด์
<ul class="ol-post">
<li>ส่งคำสั่ง READ BINARY</li>
<li>รับ Response และ SW</li>
<li>จัดการ GET_RESPONSE (ถ้า SW1=61)</li>
<li>Decode ข้อมูล</li>
</ul>
</li>
<li>แสดงผลข้อมูล</li>
<li>ตัดการเชื่อมต่อ</li>
</ol>
<h3>การจัดการ Status Word (SW)</h3>
<p>โปรแกรมตรวจสอบ Status Word ที่ได้รับจากบัตร:</p>
<ul class="ol-post">
<li><strong>90 00</strong> = Success (สำเร็จ)</li>
<li><strong>61 XX</strong> = มีข้อมูลเพิ่มเติม XX bytes (ต้องส่ง GET_RESPONSE)</li>
<li><strong>อื่นๆ</strong> = Error (ผิดพลาด)</li>
</ul>
<pre><code>response, sw1, sw2 = connection.transmit(apdu)

if sw1 == 0x61:  # มีข้อมูลเพิ่มเติม
    get_response = [0x00, 0xC0, 0x00, 0x00, sw2]
    response, sw1, sw2 = connection.transmit(get_response)

if sw1 == 0x90 and sw2 == 0x00:  # สำเร็จ
    # ประมวลผลข้อมูล</code></pre>
<h2>จุดเด่นของโค้ด</h2>
<h3>1. Error Handling ที่ครอบคลุม</h3>
<ul class="ol-post">
<li>จัดการ Exception ในทุกขั้นตอน</li>
<li>Timeout สำหรับการรอบัตร</li>
<li>ตัดการเชื่อมต่ออัตโนมัติเมื่อเกิดข้อผิดพลาด</li>
</ul>
<h3>2. การแสดงผลที่เป็นมิตร</h3>
<ul class="ol-post">
<li>แสดง emoji เพื่อความชัดเจน</li>
<li>แบ่งหมวดหมู่ข้อมูลด้วยเส้นกั้น</li>
<li>แสดงข้อมูลทั้งภาษาไทยและอังกฤษ</li>
</ul>
<h3>3. รองรับ Encoding หลายแบบ</h3>
<ul class="ol-post">
<li>TIS-620 สำหรับภาษาไทย</li>
<li>ASCII fallback เมื่อ decode ไม่สำเร็จ</li>
</ul>
<h3>4. ตรวจสอบระบบอัตโนมัติ</h3>
<ul class="ol-post">
<li>ตรวจสอบ Smart Card Service (Windows)</li>
<li>ตรวจสอบเครื่องอ่านบัตรก่อนเริ่มทำงาน</li>
</ul>
<h2>หมายเหตุ</h2>
<ul class="ol-post">
<li>โปรแกรมนี้ออกแบบมาสำหรับบัตรประชาชนไทยเท่านั้น</li>
<li>ข้อมูลที่อ่านได้จะแสดงบนหน้าจอเท่านั้น ไม่มีการบันทึกลงไฟล์</li>
<li>การอ่านข้อมูลต้องปฏิบัติตามกฎหมายและระเบียบที่เกี่ยวข้อง</li>
<li>ควรใช้โปรแกรมนี้เพื่อวัตถุประสงค์ที่ถูกต้องตามกฎหมายเท่านั้น</li>
<li>โปรแกรมใช้ Protocol T0 หรือ T1 ตามที่บัตรรองรับ</li>
<li>Offset และ Length ของแต่ละฟิลด์เป็นไปตามมาตรฐานบัตรประชาชนไทย</li>
</ul>
<h2>License</h2>
<p>โปรแกรมนี้เผยแพร่ภายใต้ Apache License</p>
<pre><code>Copyright 2025 NOVELBIZ CO., LTD.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.</code></pre>
<h2><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f468-200d-1f4bb.png" alt="👨‍💻" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ผู้พัฒนา</h2>
<p><strong>Novelbiz Co., Ltd.</strong></p>
<ul class="ol-post">
<li>Website: <a href="https://novelbiz.co.th">https://novelbiz.co.th</a></li>
<li>Email: <a href="mailto:support@novelbiz.co.th">support@novelbiz.co.th</a></li>
<li>GitHub Sound Code: <a href="https://github.com/novelbiz/Smart-Card/tree/main/Thai_id_card">https://github.com/novelbiz/Smart-Card/tree/main/Thai_id_card</a></li>
</ul>
<h2><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f91d.png" alt="🤝" class="wp-smiley" style="height: 1em; max-height: 1em;" /> การสนับสนุน</h2>
<p>หากพบปัญหาหรือต้องการสอบถามข้อมูลเพิ่มเติม กรุณาติดต่อผ่าน:</p>
<ul class="ol-post">
<li style="list-style-type: none;">
<ul class="ol-post">
<li>Website: <a href="https://novelbiz.co.th">https://novelbiz.co.th</a></li>
<li>หรือสร้าง Issue ใน GitHub Repository</li>
</ul>
</li>
</ul>
<h2><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> เอกสารอ้างอิง</h2>
<ul class="ol-post">
<li><a href="https://pyscard.sourceforge.io/">pyscard Documentation</a></li>
<li><a href="https://www.pcscworkgroup.com/">PC/SC Workgroup</a></li>
<li><a href="https://www.iso.org/standard/54089.html">ISO/IEC 7816 Standard</a></li>
</ul>
</div>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.novelbiz.co.th/programming-smart-card-reader-thai-id-card/">การเขียน Program เชื่อมต่อ Smart Card Reader และอ่านบัตรประชาชนไทย</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>การเขียน Program เชื่อมต่อ Smart Card Reader พร้อมการตรวจสอบสถานะต่างๆ</title>
		<link>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99-program-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad-smart-card-reader-%e0%b8%9e%e0%b8%a3/</link>
					<comments>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99-program-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad-smart-card-reader-%e0%b8%9e%e0%b8%a3/#respond</comments>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Mon, 11 Nov 2024 04:00:00 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=59795</guid>

					<description><![CDATA[<p>การเขียน Program เชื่อมต่อ Smart Card Reader พร้อมการตร&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99-program-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad-smart-card-reader-%e0%b8%9e%e0%b8%a3/">การเขียน Program เชื่อมต่อ Smart Card Reader พร้อมการตรวจสอบสถานะต่างๆ</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading"><strong>การเขียน Program เชื่อมต่อ Smart Card Reader พร้อมการตรวจสอบสถานะต่างๆ</strong></h2>



<p class="wp-block-paragraph">ในการเขียนโปรแกรมเชื่อมต่อ Smart Card Reader และตรวจสอบสถานะต่าง ๆ ของอุปกรณ์ด้วย Python สามารถทำได้โดยใช้ไลบรารีที่ชื่อว่า pyscard ซึ่งเป็นไลบรารีที่รองรับการทำงานกับ Smart Card และ Smart Card Reader ในระบบต่าง ๆ โดยละเอียดสามารถทำตามขั้นตอนดังนี้:</p>



<p class="wp-block-paragraph"><br></p>


<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1500" height="1500" src="https://www.novelbiz.co.th/wp-content/uploads/2024/11/12893-images-acr39u-nf.png" alt="" class="wp-image-59819" style="object-fit:cover;width:500px;height:500px" srcset="https://www.novelbiz.co.th/wp-content/uploads/2024/11/12893-images-acr39u-nf.png 1500w, https://www.novelbiz.co.th/wp-content/uploads/2024/11/12893-images-acr39u-nf-768x768.png 768w" sizes="auto, (max-width: 1500px) 100vw, 1500px" /></figure>
</div>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">ขั้นตอนที่ 1: การติดตั้ง&nbsp;<code>pyscard</code></h3>



<p class="wp-block-paragraph">ก่อนอื่นให้ติดตั้งไลบรารี&nbsp;<code>pyscard</code>&nbsp;โดยใช้คำสั่งด้านล่าง:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span>pip install pyscard
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">ขั้นตอนที่ 2: การเขียนโปรแกรมเชื่อมต่อ Smart Card Reader</h3>



<p class="wp-block-paragraph">เมื่อทำการติดตั้งเสร็จแล้ว คุณสามารถใช้โค้ดนี้เพื่อเชื่อมต่อกับ Smart Card Reader และตรวจสอบสถานะของอุปกรณ์ได้:</p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">from</span> smartcard.System <span class="hljs-keyword">import</span> readers
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">from</span> smartcard.Exceptions <span class="hljs-keyword">import</span> NoCardException
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">from</span> smartcard.util <span class="hljs-keyword">import</span> toHexString
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ตรวจสอบว่ามี Smart Card Reader เชื่อมต่ออยู่หรือไม่</span>
</span></span><span class='shcb-loc'><span><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">connect_reader</span><span class="hljs-params">()</span>:</span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">try</span>:
</span></span><span class='shcb-loc'><span>        reader_list = readers()
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> reader_list:
</span></span><span class='shcb-loc'><span>            print(<span class="hljs-string">"ไม่พบ Smart Card Reader ที่เชื่อมต่ออยู่"</span>)
</span></span><span class='shcb-loc'><span>            <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">f"พบ Reader: <span class="hljs-subst">{reader_list&#91;<span class="hljs-number">0</span>]}</span>"</span>)
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">return</span> reader_list&#91;<span class="hljs-number">0</span>]
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">f"เกิดข้อผิดพลาดในการเชื่อมต่อ: <span class="hljs-subst">{e}</span>"</span>)
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">return</span> <span class="hljs-literal">None</span>
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ฟังก์ชันสำหรับอ่านข้อมูลจากการ์ด</span>
</span></span><span class='shcb-loc'><span><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">read_card</span><span class="hljs-params">(reader)</span>:</span>
</span></span><span class='shcb-loc'><span>    connection = reader.createConnection()
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">try</span>:
</span></span><span class='shcb-loc'><span>        connection.connect()
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">"เชื่อมต่อกับ Smart Card สำเร็จ"</span>)
</span></span><span class='shcb-loc'><span>        
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment"># ส่งคำสั่ง APDU ไปยังการ์ดเพื่ออ่านข้อมูล (ตัวอย่าง)</span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment"># คำสั่งนี้ขึ้นอยู่กับชนิดของการ์ดที่ใช้และการอ่านข้อมูลที่ต้องการ</span>
</span></span><span class='shcb-loc'><span>        apdu_command = &#91;<span class="hljs-number">0x00</span>, <span class="hljs-number">0xA4</span>, <span class="hljs-number">0x04</span>, <span class="hljs-number">0x00</span>, <span class="hljs-number">0x00</span>]  <span class="hljs-comment"># APDU Command ตัวอย่าง</span>
</span></span><span class='shcb-loc'><span>        data, sw1, sw2 = connection.transmit(apdu_command)
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">"ข้อมูลที่อ่านได้:"</span>, toHexString(data))
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">f"สถานะการ์ด: <span class="hljs-subst">{hex(sw1)}</span> <span class="hljs-subst">{hex(sw2)}</span>"</span>)
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">except</span> NoCardException:
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">"ไม่มีการ์ดใน Reader"</span>)
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">f"เกิดข้อผิดพลาดในการอ่านข้อมูลจากการ์ด: <span class="hljs-subst">{e}</span>"</span>)
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">finally</span>:
</span></span><span class='shcb-loc'><span>        connection.disconnect()
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ตัวอย่างการใช้งาน</span>
</span></span><span class='shcb-loc'><span>reader = connect_reader()
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">if</span> reader:
</span></span><span class='shcb-loc'><span>    read_card(reader)
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<h3 class="wp-block-heading">อธิบายโค้ดทีละขั้นตอน</h3>



<ol class="wp-block-list">
<li><strong>ฟังก์ชัน&nbsp;<code>connect_reader()</code></strong>: ฟังก์ชันนี้จะตรวจสอบว่า Smart Card Reader เชื่อมต่ออยู่หรือไม่ หากเชื่อมต่ออยู่ จะคืนค่าตัวอ่าน (reader) ที่พบตัวแรก</li>



<li><strong>ฟังก์ชัน&nbsp;<code>read_card(reader)</code></strong>: ฟังก์ชันนี้ใช้เชื่อมต่อกับการ์ด หากมีการ์ดอยู่ใน Reader จะส่งคำสั่ง APDU เพื่ออ่านข้อมูลจากการ์ด ตัวอย่างนี้ใช้คำสั่ง&nbsp;<code>APDU</code>&nbsp;ที่เป็นค่าทั่วไป ซึ่งอาจต้องปรับแต่งตามรูปแบบของการ์ดและข้อมูลที่ต้องการอ่าน</li>



<li><strong>การจัดการข้อผิดพลาด</strong>: มีการตรวจสอบข้อผิดพลาดเช่น ไม่มี Reader หรือไม่มีการ์ดอยู่ใน Reader เป็นต้น เพื่อให้โปรแกรมทำงานได้ราบรื่นขึ้น</li>
</ol><p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99-program-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad-smart-card-reader-%e0%b8%9e%e0%b8%a3/">การเขียน Program เชื่อมต่อ Smart Card Reader พร้อมการตรวจสอบสถานะต่างๆ</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99-program-%e0%b9%80%e0%b8%8a%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%a1%e0%b8%95%e0%b9%88%e0%b8%ad-smart-card-reader-%e0%b8%9e%e0%b8%a3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>การเขียนโปรแกรมเพื่อเชื่อมต่อ Smart Card Reader</title>
		<link>https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b9%80%e0%b8%9e%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b9%80%e0%b8%8a/</link>
		
		<dc:creator><![CDATA[novelbi1]]></dc:creator>
		<pubDate>Mon, 04 Nov 2024 04:06:54 +0000</pubDate>
				<category><![CDATA[Learning_compete]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[Technology]]></category>
		<guid isPermaLink="false">https://www.novelbiz.co.th/?p=59774</guid>

					<description><![CDATA[<p>การเขียนโปรแกรมเพื่อเชื่อมต่อ Smart Card Reader การเขีย&#8230;</p>
<p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b9%80%e0%b8%9e%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b9%80%e0%b8%8a/">การเขียนโปรแกรมเพื่อเชื่อมต่อ Smart Card Reader</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></description>
										<content:encoded><![CDATA[<h2 class="wp-block-heading">การเขียนโปรแกรมเพื่อเชื่อมต่อ Smart Card Reader</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="533" height="410" src="https://www.novelbiz.co.th/wp-content/uploads/2024/11/39U4.webp" alt="" class="wp-image-59775"/></figure>
</div>


<p class="wp-block-paragraph">การเขียนโปรแกรมเพื่อเชื่อมต่อ Smart Card Reader และตรวจสอบสถานะด้วย Python สามารถทำได้โดยใช้ไลบรารี pyscard ซึ่งเป็นไลบรารีที่ช่วยในการเชื่อมต่อและทำงานกับ Smart Card Reader ผ่านโปรโตคอล PC/SC (Personal Computer/Smart Card). โดยขั้นตอนพื้นฐานมีดังนี้:</p>



<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>ขั้นตอนการติดตั้ง</strong></p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-8f761849 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:100%">
<ol class="wp-block-list">
<li>ติดตั้งไลบรารี pyscard โดยใช้คำสั่ง</li>
</ol>
</div>
</div>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span>pip install pyscard
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>โค้ดตัวอย่างสำหรับการเชื่อมต่อและตรวจสอบสถานะ</strong></p>



<p class="wp-block-paragraph"><br></p>


<pre class="wp-block-code"><span><code class="hljs language-python shcb-code-table shcb-line-numbers shcb-wrap-lines"><span class='shcb-loc'><span><span class="hljs-keyword">from</span> smartcard.System <span class="hljs-keyword">import</span> readers
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">from</span> smartcard.util <span class="hljs-keyword">import</span> toHexString
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span><span class="hljs-comment"># ค้นหา Reader ที่เชื่อมต่ออยู่</span>
</span></span><span class='shcb-loc'><span>reader_list = readers()
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> reader_list:
</span></span><span class='shcb-loc'><span>    print(<span class="hljs-string">"ไม่พบ Smart Card Reader ที่เชื่อมต่ออยู่"</span>)
</span></span><span class='shcb-loc'><span><span class="hljs-keyword">else</span>:
</span></span><span class='shcb-loc'><span>    <span class="hljs-comment"># เลือก Reader ตัวแรก</span>
</span></span><span class='shcb-loc'><span>    reader = reader_list&#91;<span class="hljs-number">0</span>]
</span></span><span class='shcb-loc'><span>    print(<span class="hljs-string">f"กำลังใช้ Reader: <span class="hljs-subst">{reader}</span>"</span>)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-comment"># เริ่มการเชื่อมต่อกับ Smart Card</span>
</span></span><span class='shcb-loc'><span>    connection = reader.createConnection()
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">try</span>:
</span></span><span class='shcb-loc'><span>        connection.connect()
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">"เชื่อมต่อกับ Smart Card สำเร็จแล้ว"</span>)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment"># ส่งคำสั่ง APDU เพื่ออ่านข้อมูลเบื้องต้น (ตัวอย่างเช่น Select File หรือ Get Response)</span>
</span></span><span class='shcb-loc'><span>        command = &#91;<span class="hljs-number">0x00</span>, <span class="hljs-number">0xA4</span>, <span class="hljs-number">0x04</span>, <span class="hljs-number">0x00</span>, <span class="hljs-number">0x00</span>]  <span class="hljs-comment"># ตัวอย่างคำสั่ง APDU</span>
</span></span><span class='shcb-loc'><span>        data, sw1, sw2 = connection.transmit(command)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-comment"># ตรวจสอบสถานะการส่งคำสั่ง</span>
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">if</span> sw1 == <span class="hljs-number">0x90</span> <span class="hljs-keyword">and</span> sw2 == <span class="hljs-number">0x00</span>:
</span></span><span class='shcb-loc'><span>            print(<span class="hljs-string">"คำสั่งสำเร็จ"</span>)
</span></span><span class='shcb-loc'><span>            print(<span class="hljs-string">"ข้อมูลที่ได้:"</span>, toHexString(data))
</span></span><span class='shcb-loc'><span>        <span class="hljs-keyword">else</span>:
</span></span><span class='shcb-loc'><span>            print(<span class="hljs-string">f"คำสั่งล้มเหลว, สถานะ: <span class="hljs-subst">{sw1:X}</span> <span class="hljs-subst">{sw2:X}</span>"</span>)
</span></span><span class='shcb-loc'><span>
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">except</span> Exception <span class="hljs-keyword">as</span> e:
</span></span><span class='shcb-loc'><span>        print(<span class="hljs-string">"ไม่สามารถเชื่อมต่อกับ Smart Card:"</span>, e)
</span></span><span class='shcb-loc'><span>    <span class="hljs-keyword">finally</span>:
</span></span><span class='shcb-loc'><span>        connection.disconnect()
</span></span><span class='shcb-loc'><span>
</span></span></code></span></pre>


<p class="wp-block-paragraph"><br></p>



<p class="wp-block-paragraph"><strong>คำอธิบาย</strong></p>



<ul class="wp-block-list">
<li>เราใช้&nbsp;<code>readers()</code>&nbsp;เพื่อค้นหา Reader ที่เชื่อมต่ออยู่ และใช้ตัวแรกในรายการนี้</li>



<li><code>createConnection()</code>&nbsp;สร้างการเชื่อมต่อกับ Smart Card ที่มีการใส่เข้าไปใน Reader</li>



<li>ใช้&nbsp;<code>transmit()</code>&nbsp;ส่งคำสั่ง APDU เพื่อโต้ตอบกับการ์ด เช่น การอ่านข้อมูลพื้นฐาน</li>



<li>ตรวจสอบรหัสสถานะ (<code>sw1</code>,&nbsp;<code>sw2</code>) เพื่อดูว่าการส่งคำสั่งสำเร็จหรือไม่ (สถานะ&nbsp;<code>0x9000</code>&nbsp;หมายถึงสำเร็จ)</li>
</ul><p>The post <a href="https://www.novelbiz.co.th/%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b9%80%e0%b8%82%e0%b8%b5%e0%b8%a2%e0%b8%99%e0%b9%82%e0%b8%9b%e0%b8%a3%e0%b9%81%e0%b8%81%e0%b8%a3%e0%b8%a1%e0%b9%80%e0%b8%9e%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b9%80%e0%b8%8a/">การเขียนโปรแกรมเพื่อเชื่อมต่อ Smart Card Reader</a> first appeared on <a href="https://www.novelbiz.co.th">NOVELBIZ</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
