ว่าด้วยเรื่องของ smart card reader แบบบัตร EMV เจาะจงลงไปที่ใช้ interface แบบ USB port ด้วย
เคยเขียนโปรแกรมอ่านบัตรประชาชนผ่านเครื่องอ่านแบบ USB บน Windows มาเมื่อหลายปีก่อน ถึงแม้จะใช้ Linux มาอย่างยาวนาน แต่ก็ไม่เคยพอร์ทโค้ดมาลงสักที เนื่องจากไม่เคยมีลูกค้า request มาเลย จนกระทั่งช่วงนี้ ทาง บางกอกเดฟ ได้ทำการขึ้นโมเดลตู้คีออสใหม่ และ ใช้จอ open frame แบบ all-in-one โดยได้ built-in บอร์ดคอมพิวเตอร์เข้าไปด้วย สามารถเลือกได้ทั้ง PC และ Android
เมื่อทำตู้บัตรคิวด้วย Android ได้แบบนี้แล้ว ก็เลยเกิดสงสัยขึ้นมาว่า แล้วจะให้มันอ่านบัตรประชาชนได้ยังงัย จึงเป็นจุดเริ่มต้นของความปวดหัวเรื่องใหม่ จะค่อยๆเหลาให้ฟัง
บน Windows มีไลบราลี่ชื่อ winscard เอาไว้จัดการกับการอ่านบัตร smart card ส่วนบน Linux ก็มีโมดูลที่แทบจะ compatible กับ winscard เลย ชื่อ pcsc (คือมันมีส่วนที่เป็น daemon และ lib สำหรับการทำงาน) ผมก็ลอง port โปรแกรมที่เคยรันบน windows มาทำให้รันบนลินุกส์ได้ ก็ไม่ยากเย็นเท่าใดนัก จากนั้นจึงมาลองศึกษาหาวิธีการเพื่อให้สามารถอ่านบัตรประชาชนด้วยเครื่องอ่านที่มี interface แบบ USB ได้บน Android ดูบ้าง
โดยเริ่มจากวิธีคิดว่า แอนดรอยด์ มันก็คือลินุกส์ น่ะแหละ มันต้องใช้วิธีการคล้ายๆกัน ก็เริ่มไล่ไปจาก interface ก่อนคือ USB อันนี้ผมยังยึดการเขียนโปรแกรมด้วย Qt/C++ ไว้นะ เมื่อลองดู dependencies ของ pcsc ก็จะพบว่ามันใช้ libUSB ด้วย CCID ด้วยรึป่าว ยังไม่แน่ใจ ก็เลยเริ่มด้วยการคอมไพล์ libUSB ก่อนเลย
ผมเป็น android dev มือใหม่ คือว่า ถึงแม้จะเขียนมาหลายที แต่ห่างกันหลายปีจะเขียนสักครั้ง ก็ลืมหมดทุกสิ่งอย่าง เหมือนมาเริ่มต้นใหม่น่ะแหละ ก็ต้องทำการ set up dev env กันใหม่ โดยเฉพาะ NDK ส่วน SDK ก็ได้ตัวช่วยคือ Qt Creator ในการเลือกลงแพคเกจเวอร์ชั่นต่างๆ
ปัญหาคือ pcsc นี่ละ ที่มีทั้ง lib และ deamon จะคอมไพล์ออกมาอย่างไร คอมไพล์ออกมาแล้วจะรันอย่างไร ตรงนี้เสียเวลาไปหลายวันในการหยิบจับโค้ดที่เค้าเคยทำๆกันมาแล้วมาลอง แต่ก็น่าประหลาดใจว่า มันเป็นเรื่องเก่ามาตั้งแต่ 8-9 ปีที่แล้วนู่นเลย ทำให้ประสบปัญหาการคอมไพล์มาก เพราะจาก android 7 มันก็เปลี่ยนเครื่องมือในการคอมไพล์และสร้างแพคเกจไปหมดเลย ไม่รวมถึง lib ที่มีการเปลี่ยนแปลงไปด้วย ไม่ compat กับของเดิม ก็นั่งมั่วนิ่มจนคอมไพล์ผ่านมาได้ จนมาติดกับการสร้าง apk ก็เลยท้อใจ หยุดไว้ก่อน ลองมาหาวิธีอื่นดูบ้าง
จากที่ลองหาข้อมูลดู ก็อาจจะต้อง เขียนขึ้นมาเองใหม่หมด โดยไม่ใช้ pcsc แต่ใช้การรับส่งข้อมูลโดยมองมันเป็น USB device ไปเลย โดยต้องใช้การหา file description หรือ file handle ของ USB deivce ตัวนี้ให้ได้ซะก่อน ตรงนี้อาจจะต้องเขียนด้วย Java แล้วค่อยส่งมาให้โค้ด C++ ต่อ อันนี้ก็เพื่อไม่ต้องเปลี่ยนโค้ด UI ที่เขียนด้วย QML ไว้แล้ว
วิธีนี้ง่ายในการทำงานเพราะใช้ tool เวอร์ชั่นปัจจุบันทั้งหมด แต่ในการเขียนโค้ด ก็ยังไม่รู้จะไปได้จนสุดทางไหม เดี๋ยวถ้ามีอัพเดต ก็จะมาต่อในตอนต่อๆไป