14° : สิบสี่องศา Programmer's Blog

พฤษภาคม 8, 2017

MQTT + Silk

Filed under: Arduino,Development,Embedded,ESP8266,hardware,javascript,NodeMCU,Programming Langauge,Qt,Web Application — ป้ายกำกับ:, , , — สี่สิบดีกรี @ 2:13 pm

Silk เป็น web framework อีกตัวหนึ่งครับ แต่ไอเดียจะแตกต่างจากตัวอื่นๆที่เคยเขียนถึงไป ตัวนี้ค่อนข้างถูกจริตกับผมมากกว่าตัวอื่นๆ เนื่องจากมันคือการเขียน HTML document ด้วย QML

การที่มันยังสามารถใช้ model/view ของ QML ได้นั้น ทำให้เราสามาารถดึงข้อมูลจาก C++ model ไปแสดงใน HTML table ได้อย่างง่ายดาย

การที่มันยังเขียน web ได้ในแบบเดิมๆ ใช้ javascript ได้ ก็ทำให้ไม่ต้องเปลี่ยนแปลงวิธีการเขียนในส่วนนี้ไป

และด้วยความที่มันเป็น C++ web server โดยตัวมันเอง มันน่าจะเหมาะกับโปรเจ็คเล็กๆ อย่างพวก IoT ที่ไม่ได้ต้องการรองรับ client จำนวนมาก

จากที่ว่ามา ผมจึงเอามันมาลองกับ MQTT โดยมี hardware คือ nodemcu เอามาต่อกับ sensor DS18B20 เขียนโปรแกรมด้วย Arduino IDE โดย ก็ต้องลง library ESP8266, OneWire, PubSubClient (MQTT), DallasTemperature เพื่อให้ใช้อ่านค่าอุณหภูมิและส่งข้อมูลไปให้ MQTT server ผ่าน wifi ได้

 

ตัว server ก็เป็น linux รัน mosquitto ที่รองรับ websocket และ รัน silk webserver โดยเขียน web app ให้ subscribe MQTT message ผ่าน websocket ได้โดยใช้ paho javascipt client และใช้ justgage แสดงผลข้อมูลที่ได้ในแบบ graphics

กุมภาพันธ์ 27, 2017

การเล่นไฟล์เสียงต่อเนื่องกัน

Filed under: Development,Microsoft,multimedia — ป้ายกำกับ:, , — สี่สิบดีกรี @ 5:43 pm

เวลาทำระบบคิว เราจะเห็นได้ว่า จะมีเสียงเรียกคิวตามหมายเลขและเคาท์เตอร์ที่กำหนดได้ คงไม่มีใครทำรอไว้ทุกแบบ ก็น่าจะใช้วิธีการเล่นไฟล์ที่ต้องการแบบต่อเนื่องกันไป

ผมก็ลองอัดเสียงหล่อๆของตัวเอง (แหวะ ฮ่าๆ) แล้วก็ตัดมันออกเป็นหลายๆไฟล์ แล้วก็หาวิธีเล่นมันอย่างต่อเนื่อง ตัวโปรแกรมที่สามารถเล่นได้ก็มีหลายตัว ที่ผมลองแล้วก็มี gstreamer และ sox ครับ

จากการลองใช้งานทั้งคู่ ซึ่งเป็น command line ดู sox จะให้คุณภาพเสียงที่ดีกว่า แต่ทั้งนี้ทั้งนั้น ผมใช้ค่า default ในการเล่นนะ ไม่ได้ปรับแต่งค่าใดๆ

มกราคม 23, 2017

gstreamer บน Windows

Filed under: Development,Image Processing,Microsoft,Programming Notes,Qt — สี่สิบดีกรี @ 8:53 am

qtgst-win

จริงๆเขียนโปรแกรมแบบนี้มาหลายปีแล้ว แต่วิธีการก็ต่างกันไปเรื่อยๆครับ คราวนี้มาเขียนบน Windows เพราะเริ่มจะกลับมา deploy งานบน x86 และ win10 บ้าง

ใช้ gstreamer บน Windows ค่อนข้างน่าเวียนหัว โดยเฉพาะเมื่อ อยากใช้ qt-gstreamer และ ms visual studio compiler ทำให้รู้ว่าการมี pkg-config บน linux ช่วยได้เยอะ แต่ลอง pkg-config (win 64) แล้วมัน crash ก็งงๆอยู่ว่าทำไม เดี๋ยวค่อยหาสาเหตุอีกที

gstreamer นี่เอามาใช้ เพื่อ แสดง live preview จาก stream rtsp ของกล้อง IP

ตอนแรกจะใช้ command line ด้วย ffmpeg เพื่อ capture ภาพ ติดตรงต้องเก็บเป็นไฟล์ก่อน แล้วถึงจะดึงภาพมาแสดงได้ พอรู้ว่า OpenCV สามารถดึงภาพจาก stream rtsp ได้ด้วย ก็เลยเปลี่ยนมาใช้ เพราะทำให้สามารถเอามาทำ image processing ต่อและเอาไปแสดงบน Qt/QML Quick control ได้โดยการ copy memory ได้เลย ไม่ต้อง save ก่อน (เอ แต่เดี๋ยวก็ต้อง save อยู่ดีนี่ – – !) ส่วนนี้ต้องให้มันทำงาน แยก thread ออกมาจาก main thread ที่ทำ GUI ไม่งั้น live preview ก็จะกระตุกเวลา capture ภาพ อันนี้เป็นสิ่งที่ผมชอบใช้ Qt เพราะทำให้การใช้ thread เป็นเรื่องง่ายขึ้นเยอะ

ข้อสังเกต คือปัจจุบัน สามารถแยกงานออกแบบ GUI ออกมาได้เกือบสิ้นเชิง ด้วยการใช้ Qt/QML ซึ่งดีต่อการทำงานเป็นทีมมาก

สุดท้าย เอา command line สำหรับ capture ภาพจาก stream rtsp มาฝาก มี 2 วิธี

  1. ใช้ gstreamer แต่คำสั่งนี้ บางทีก็ capture ไม่ได้ ไม่รู้ทำไมเหมือนกัน
    D:\gstreamer\1.0\x86_64\bin>gst-launch-1.0  rtspsrc location=”rtsp://admin:admin@192.168.1.108:554″ latency=10 num_buffers=10 ! decodebin ! videoconvert ! pngenc snapshot=TRUE ! filesink location=img.png
  2. ใช้ ffmpeg อันนี้ ชัวร์ป้าบ
    ffmpeg.exe -i rtsp://192.168.1.xx:554 -y -f image2 -vframes 1 test.jpg

อัพเดต 10 มี.ค. 2560 ไม่รู้มีใครเจอเหมือนกับผมมั้ย การใช้ OpenCV เปิด stream จะมี dalay อยู่พอสมควร เมื่อเทียบกับ gstreamer ที่สามารถกำหนด option เพื่อลด delay ได้ สุดท้ายก็เลยเปลี่ยนมาใช้การ capture frame ด้วย gstreamer ครับ

กรกฎาคม 31, 2016

รีโมทควบคุมหุ่นยนต์

Filed under: Arduino,bluetooth,Development,Embedded,hardware,Raspberry Pi — ป้ายกำกับ:, , , , — สี่สิบดีกรี @ 6:56 pm

2wheels-3

วันก่อนทดลองประกอบโครงรถหุ่นยนต์ที่จำหน่ายในร้าน ioteshop การควบคุมมอเตอร์ก็ใช้ arduino ร่วมกับโมดูล tb6612fng ก็ง่ายดีครับ หากเป็นระบบอัตโนมัติ เช่น หุ่นยนต์เดินตามเส้น ก็ใช้เซนเซอร์อินฟราเรดในการตรวจจับเส้นเพื่อนำทาง แต่พอมาคิดว่าอยากจะมีรีโมทควบคุมมันได้เนี่ยก็มองหา โซลูชั่น หลายๆอันดู เช่น

  1. จอยต่อกับโมดูล nrf24l01
  2. wifi to serial
  3. bluetooth
  4. raspberry pi

1 กับ 2 ก็น่าสนใจ ติดตรง ต้องหาจอยมาใช้ร่วมกัน ขอหาก่อน
3 กับ 4 นี่ คิดถึง wiimote ขึ้นมา wiimote เป็น HID device (เหมือนเมาส์ คีย์บอร์ด จอยสติ๊ก) ใช้ bluetooth ในการสื่อสาร มันมีประเด็นขึ้นมาให้เลือกคือ

A. ถ้าเลือกใช้ arduino ต่อ จะคุยกับ HID bluetooth device ได้ ต้องมี USB host shield และ bluetooth USB dongle วิธีนี้โค้ดที่เคยเขียนควบคุมมอเตอร์ไม่ต้องเปลี่ยน

B. ถ้าเลือกใช้ raspberry pi แทน มี usb port ให้เสียบ bluetooth dongle หรือ ถ้าเป็น pi 3 ก็มีให้เลย(แต่แค่ควบคุมหุ่นยนต์ ไม่น่าใช้ น่าจะเปลืองแบตกว่า pi1 หรือ pi2) แต่ ต้องหาทางควบคุมทิศทางและความเร็วของมอเตอร์ ซึ่งถ้าจะใช้ hardware ก็ง่าย มีบอร์ด pwm เช่นของ adafruit เอามาต่อใช้ หรือถ้าจะเป็น software ก็ใช้ pi-blaster ซึ่งใช้ DMA ในการควบคุม เท่าที่ดูก็มีความแม่นยำโอเค

อืม ตกลงว่า ลองข้อ A ก่อนละกัน น่าจะง่ายที่สุด bluetooth usb dongle ก็มีอยู่แล้ว เหลือสั่ง usb host shield มาเท่านั้น

แต่ถ้าของมาช้า ก็อาจจะลอง B ก่อน ไว้จะมาอัพเดต ตอนต่อไป

อัพเดต พอดีไปเจอ joystick shield สามารถใช้ร่วมกับ nrf24l01 และ arduino ทำเป็นรีโมทคอนโทรลได้ ก็เป็นอีกหนึ่งทางเลือกครับ

มิถุนายน 26, 2016

Node.js กับ ARM device และ ubuntu 12.04

Filed under: Development,Linux,pandaboard,ZigBee — ป้ายกำกับ: — สี่สิบดีกรี @ 4:39 pm

zigbee-meshลองเอา z-stack linux gateway ขึ้นมา ด้วยความที่ ไม่มีบอร์ด beaglebone มองซ้ายขวา มี pandaboard เก่าอยู่ cpu พี่น้องกันน่าจะใช้แทนกันได้ ก็ปรากฏว่า ได้จริงๆ แต่ดันมาเจอปัญหาใหม่

พยายามลง node.js เพื่อใช้งานทำ web server app สำหรับ IoT อย่างที่เค้านิยมทำกัน เลยลองลงจาก repository ปกติ แต่ไม่สามารถทำงานได้ cpu 100% ตลอดเวลา พยายามลง ppa ที่เค้าแนะนำกัน ก็ไม่ได้อีก หาจนเจอว่า เวอร์ชั่นใหม่ๆนั้น ไม่สามารถทำงานได้กับ ubuntu version เก่าๆ สืบเนื่องจาก javascript V8

ก็ต้องเอา version เก่าที่ support ARMV7 มาลงถึงจะใช้งานได้ ต่อมาก็มาติดปัญหาเรื่อง cyclic dependencies อีก (ด้วยความที่ลองแก้ปัญหาหลายวิธีมาก เลยสรุปไม่ได้ว่า สุดท้ายแล้วแก้ได้อย่างไร ทำทั้ง clear cache ลบ module ออกไปทั้ง folder เองเลยก็ทำ) แต่เรียกได้ว่า ลองใช้งาน node.js ครั้งแรก ก็เจอสารพัดปัญหา

นี่ก็เป็นอย่างนึง ที่คิดว่า ถ้าเราเอาสารพัดเทคนิคมายำรวมๆกัน ให้เป็น solution ขึ้นมา ก็จะสร้าง dependency problem ขึ้นมาเยอะมาก ไม่สนุกที่ต้องมานั่งหา root cause และจัดการกับผลกระทบที่เกิดกับส่วนอื่นๆ

C++ อย่างเดียวจบเลยดีกว่ามั้ย อย่างที่นำเสนอในตอนที่ผ่านๆมา

พฤษภาคม 27, 2016

ทดลองเล่น ZigBee

Filed under: Development,Embedded,hardware,ZigBee — ป้ายกำกับ:, — สี่สิบดีกรี @ 3:11 pm

ผมเริ่มสนใจ ZigBee ตั้งแต่ได้รู้จักและทดลองสินค้า smart home ของ xiaomi จริงๆก็ได้ยินชื่อมานานแล้ว แต่ที่เห็นขายกันเป็นโมดูลสำหรับนักพัฒนา จะเป็น xbee ซะมาก ราคาค่อนข้างสูง และผมก็ไม่ใช่นักอิเล็กทรอนิกส์จ๋าซะด้วย เลยไม่กล้าซื้อมาเล่น ผ่านมาหลายปี ตอนนี้พี่จีนทำโมดูลออกมาได้ถูกลงมาก (ที่พูดถึงนี่คือโมดูลที่ใช้ cc2530 ของ TI นะครับ) ประกอบกับยุค internet of things ทำให้ smart things หรืออุปกรณ์ต่างๆ ถูกเชื่อมต่อเข้ามาถึงคอมพิวเตอร์และมือถือได้ง่ายดายขึ้น เพื่อมอนิเตอร์และสั่งงาน ดังนั้นช่วงนี้จีงน่าเอามาศึกษา ผมก็เลยเริ่มเล่นและเขียนถึงมันนี่แหละครับ

สิ่งที่น่าสนใจของ ZigBee สำหรับผมคือการที่มันสามารถสร้างโครงข่ายระหว่างอุปกรณ์ด้วยกันแบบ mesh ได้ และเราไม่ได้ใช้โปรโตคอลระบบเครือข่ายไร้สายเดียวกับ wifi  ซึ่งคาดหวังว่า อุปกรณ์ IoT ของเราจะถูกเข้าถึงจากผู้ไม่พึงประสงค์ได้ยากขึ้นกว่าการเอาอุปกรณ์ทั้งหมดมาต่อ wifi โดยตรง ในเรื่องของระยะทางก็สามารถออกแบบวงจรให้สามารถสื่อสารกันตั้งแต่ไม่กี่สิบเมตรจนถึงหลักเป็นกิโลเมตร ก็นับว่ามีให้เลือกใช้ได้ตามความเหมาะสม

เรื่องหลักการเรื่องอะไร มีคนศึกษาไว้เยอะแล้ว ลองเล่นเลยดีกว่า อิอิ ตัว cc2530 core โปรเซสเซอร์ มันก็คือ 8051 นั่นเอง เริ่มแรกก็หัดเขียนมันเพื่อควบคุม I/O port ต่างๆก่อน และมันมี serial port มาให้ด้วย ก็เริ่มอ่านค่าและสั่งงาน I/O ผ่าน serial port

ขั้นต่อมาเมื่อจะต้องทำให้มันคุยกันเองได้ระหว่างอุปกรณ์ ZigBee ด้วยกัน ทาง TI ก็ให้ framework เรามาเพื่อช่วยให้เราพัฒนา application ต่างๆได้ง่ายดายยิ่งขึ้น มันคือ ZStack นั่นเอง ดูเผินๆเหมือนเป็นระบบปฏิบัติการตัวนึงเลยทีเดียว ดูยุ่งยากมากขึ้นเยอะ แต่หากศึกษาตามตัวอย่างไปเรื่อยๆ ทดลองเล่นไป ก็จะเริ่มคุ้นเคยกับมันมากขึ้นนะครับ

ขั้นต่อไปก็คือ การที่เราต้องการติดต่อ ZigBee ผ่านทาง TCP/IP เน็ตเวอร์คได้ โดย TI ก็ได้ให้ Z-Stack Linux gateway มา ซึ่งเป็นโปรแกรม ที่เราสามารถเอามาลงใน ARM embedded board อย่าง BeagleBone ได้ (ก็มันของเจ้าเดียวกันนี่เนาะ) แต่ TI ก็ไม่ได้ใจร้ายขนาดนั้น มันมีทางที่เราสามารถนำ sourcecode มาคอมไพล์และรันบนบอร์ดอื่นได้เหมือนกัน เช่น Raspberry Pi โดยที่อาจจะต้องมีการปรับแก้อะไรนิดหน่อย

ขั้นสุดท้าย หากคิดจะมาทำเป็นโปรดักส์ก็คงเป็นเรื่องของความปลอดภัยในการรับส่งข้อมูล อันนี้ยังไม่ได้เข้าไปดูรายละเอียดเหมือนกัน

เดี๋ยวค่อยว่ากันไปเป็นตอนๆครับ

มีนาคม 25, 2016

Qt5.6/OpenCV compilation on Raspbian Jessie

Filed under: Development,Embedded,hardware,Image Processing,Linux,OpenGL,Qt,Raspberry Pi — สี่สิบดีกรี @ 11:52 am

ยังไม่ได้ลอง Raspberry Pi 3 ตัวใหม่เลยครับ แต่วันนี้จะมาเล่าเรื่องการคอมไพล์ Qt และ OpenCV ให้ฟัง

สืบเนื่องจากการใช้งาน Qt บน Wheezy จากการทำ cross compilation ตาม http://www.ics.com/blog/building-qt-5-raspberry-pi ไปใช้งานคราวก่อน มีปัญหากับ qml/UI ไม่ทราบว่าเป็นเพราะอะไรเหมือนกัน พอต้องพัฒนาโปรแกรมต่อก็เลยตัดสินใจย้ายมา Jessie ตัวล่าสุด นี่อาจเป็นการตัดสินใจที่พลาดอีกครั้ง อย่างไรก็ดี ปัญหามีไว้ให้แก้ครับ ก็เลยตัดสินใจเปลี่ยนมาใช้ Qt5.6 ซะเลย ซึ่งก็นั่งคอมไพล์ใหม่เนื่องจาก ไม่อยากใช้งานแพคเกจ Qt/x11 ซึ่งทำให้การบูทช้า ก็เลยทำตาม https://wiki.qt.io/RaspberryPi2EGLFS ทำให้ได้ใช้ Qt แบบ cross platform development กะเค้ามั่ง ทดสอบ QML/UI แล้วไม่มีปัญหา

ต่อมาก็มาถึงเรื่องการใช้งาน OpenCV แน่นอนว่าก็ต้องใช้กับ RaspiCam เพื่อดีงภาพจากกล้อง ปัญหามันอยู่ตรงนี้ละฮะท่านผู้ชมฮะ เกิดปัญหาว่า compiler ของ cross กับบน jessie เวอร์ชั่นไม่ตรงกัน ซึ่งของ cross จะเก่ากว่าบน jessie ทำให้การคอมไพล์โปรแกรมไม่สำเร็จ หลังจากที่หาทางแก้อยู่สองวันสองคืน ก็สรุปได้ว่า ต้องกลับไปใช้ gcc4.8 สำหรับ jessie แล้วคอมไพล์ OpenCV ใหม่ รวมถึง dependency หรือ 3rd party ของมันด้วย จึงจะสามารถทำงานต่อได้

Screenshot from 2016-03-25 12:03:22การเขียนโปรแกรมจึงไม่ใช่แค่การเขียนโปรแกรมนะครับ …

กันยายน 7, 2015

ทดลองทำ OCR บน Raspberry Pi 2

Filed under: Development,Embedded,Image Processing,Linux,Qt — ป้ายกำกับ:, , — สี่สิบดีกรี @ 11:35 am

วันก่อนได้ทดลองทำงานต้นแบบอ่านตัวเลข  หรือการทำ OCR ด้วย tesseract โดยเริ่มจากขั้นตอนที่ขาดไม่ได้ คือ การปรับปรุงภาพให้สามารถทำการอ่านได้ดีที่สุด โดยการใช้ OpenCV และทำการแสดงผลบนจอ LCD โดยเขียนโปรแกรมบน Qt รันบน Linux และใช้ Raspberry Pi 2

ก็เป็นการหยิบ r-pi 2 มาใช้เป็นครั้งแรกเลย ตอนแรกว่าจะเอามาลอง Windows 10 ซะหน่อย แต่จนแล้วจนรอดก็ยังไม่มีโอกาสเลยครับ เลยเอามาลองกับงานนี้ก่อน ขั้นตอนการทำงานของผม เป็นดังนี้ครับ

1. ทดสอบการเก็บภาพก่อน ว่าต้องใช้แหล่งกำเนิดแสง ช่วยมั้ย ต้องใช้เลนส์ขนาดเท่าไร ระยะติดตั้งควรเป็นเท่าไร เสร็จแล้วก็ลองทำออกมา
2. จากนั้น ก็เริ่มหาขั้นตอนการทำ image processing ตรงนี้โปรแกรมอย่าง gimp ช่วยได้มากเลยครับ ทดลองปรับปรุงภาพด้วย filter แบบต่างๆ จดบันทึกขั้นตอนเอาไว้ แล้วก็ลองเขียนด้วย OpenCV และลองเอาไปทำ OCR ด้วย tesseract เมื่อได้ผลลัพธ์ที่ต้องการแล้วก็ เขียนโปรแกรมด้วย Qt
3. เดี๋ยวนี้ผมไม่ค่อยอยากเขียน UI ด้วย widget ละ ใช้ QML เป็นหลัก ก็เลยใช้ Qt ซึ่งเวลามีน้อย ก็เลยไม่ได้ build Qt เอง ไป download จากคนที่เค้า build มาแล้วเอามาเผยแพร่ แต่ก็เจอปัญหาคือ เค้า build มาแบบ cross platfom ตัว utility ของ Qt เช่น qmake moc ก็จะอยู่บน PC ทางแก้คือ ต้องหัดใช้ cmake เพื่อ build โปรแกรม แทน
4. จากนั้นจึงใส่ sensor และ LED RGB เข้าไปโดยควบคุมผ่าน library ชื่อ WiringPi ซึ่งก็ใช้งานง่ายดีครับ ยกเว้นต้องรัน โปรแกรมด้วย sudo

ก็ประมาณนี้ละครับ ผมไม่ค่อยได้ใส่โค้ดเข้ามาในบล็อก เพราะสามารถหาเอาจากที่อื่นได้อยู่แล้ว ส่วนที่สำคัญคือการเรียนรู้ ไม่ใช่ผลลัพธ์ครับ

สิงหาคม 6, 2015

เกริ่น QML animations & transitions

Filed under: Computer Graphics,Development,Linux,multimedia,Qt,X11 — ป้ายกำกับ:, , , , , — สี่สิบดีกรี @ 11:22 pm

Screenshot from 2015-08-06 23:05:48 Screenshot from 2015-08-06 16:59:47

เคยเขียนไปเมื่อนานมาแล้วว่า สิ่งที่น่าสนใจของ QML อีกอย่างหนึ่งที่สำคัญก็คือ animation & transitions วันนี้ก็ได้มีโอกาสลองเล่นและเรียนรู้ ก็ต้องทำความเข้าใจกับมันพอสมควรเมื่อเริ่มต้น ตอนนี้ผมก็ยังงูๆปลาๆอยู่เลยครับ อิอิ

ด้วยความตั้งใจแต่เริ่มแรกคือ คำถามที่ค้างคาใจมานานว่า ไม่มีอะไรมาแทน flash และ action script เลยเหรอ สำหรับการทำ cg บน tv เพราะโปรแกรมอย่าง CasparCG นั้นก็ใช้ flash ที่นี้ถ้าเราต้องการทำระบบ live streaming เองละ จะใส่กราฟิกและอนิเมชั่นลงไปได้ยังงัย

คราวก่อนผมลอง cairo overlay ลงบน gstreamer element แค่ใช้เวลาเอา svg ขึ้นเนี่ยก็นานแล้วครับ และถ้าต้องโหลดเยอะๆ ดูเหมือนก็จะมีผลต่อ performance เหมือนกัน

คราวนี้เลยลองใหม่ ใช้วิธีเขียน QML application เลย แล้วค่อยทำ screencast เฉพาะส่วน ผมลองเอาไปถ่ายทอดสดลงบน youtube ก็ได้ดังที่เห็น

อ่าว หมดแรงเล่าซะละ ต่อคราวหน้าครับ

credit : กราฟิกสนาม Designed by Freepik.com

พฤษภาคม 18, 2015

Barcode scanner hooking

Filed under: Development,hardware,Microsoft,POS/ERP,Windows 7,Windows 8 — ป้ายกำกับ:, , , , , — สี่สิบดีกรี @ 10:17 pm

กลับมาหัดเขียน win32 API อีกครั้ง หลังจากมาเขียน Qt อยู่นาน (เมื่อ 15-16 ปีก่อน บ้ามากถึงขนาดไปสอบจนได้ cer MCSD Visual C++ มา แล้วหลังจากนั้นไม่นานมันก็ออก .net มา ฮือ ฮือ) เป็นโปรแกรมเล็กๆตัวนึง ทำอะไรไปบ้าง จะมาเล่าให้ฟังครับ อิอิ
requirement คือต้องการโปรแกรมที่เอาไปดักจับข้อมูลจากเครื่องสแกนบาร์โค้ด โดยที่ระบบเค้าก็ทำงานไปปกติ โดยข้อมูลจะเอาไปล็อกไว้ผ่านทาง TCP
จริงๆ SI ก็หาโซลูชั่นได้แล้วใช้แอพสองตัวช่วยกันแต่ติดที่ลิขสิทธิ์เพราะต้องไปลงใน POS หลายเครื่องก็หลายเงินอยู่ ก็เลยต้องหาทางเขียนเอา
ปัญหาที่ต้องหาวิธีแก้คือ ดักจับข้อมูลเฉพาะบาร์โค้ด ไม่ไปยุ่งกับการทำงานเดิม และส่งข้อมูลผ่าน TCP
เรื่องแรกก็ต้องหาทางรู้ก่อนว่าจะดักจับ data จาก HID ตัวไหน(ที่มันเป็น barcode scanner)
เรื่องดักจับข้อมูล ตอนแรกว่าจะใช้ hooking ก็เลยหาวิธีที่สะดวกกว่าได้ เพราะ ใช้ hooking คุ้นๆว่าตัว anti ไวรัส มักจะฟ้อง
เรื่องตัวโปรแกรม ก็ทำให้มันไม่มีหน้าตา(GUI) จะได้ไม่ไปเกะกะหน้าจอเค้า รับแต่ windows message ได้อย่างเดียวพอ จะทำเป็น service ก็ยุ่งยากไป
เรื่องสร้าง tcp server คอยส่ง data ให้ client เนื่องจากอยากให้มันเป็น async เลยใช้แบบ WSAASYNCSELECT ไม่ต้องมี thread ให้ยุ่งยาก รองรับ client ตัวเดียว สบายไป
เรื่องปวดหัวสุดท้ายอยู่ที่ data เนี่ยละ มันเข้ามาเป็นแบบเสมือนเรากด keyboard (virtual key) ลองนึกถึงการกด shift หรือ ctrl ตามด้วย key แล้วต้องแปลงข้อมูลเป็น char array ส่งผ่านเน็ตเวอร์ค อันนี้ก็หาทางแปลงไปมั่วๆ ออกมาได้
ทีนี้โปรแกรมตัวมันเล็กทำงานน้อยๆก็เลยจะไม่ใช้ Qt จะได้สะดวกตอนเอาไป install เลยกลับไปเขียน VC++ เพียวๆ ที่ไม่ได้เขียนนานมากแล้ว
เสร็จละครับ โปรแแกรมเล็กๆตัวนึง

Older Posts »

Powered by WordPress