ข้ามไปยังเนื้อหาหลัก

Telpo C9D Cash Drawer

This page records the hardware details found on the Android POS terminal used for cash drawer integration.

Verified device

Checked over ADB on 2026-07-08.

FieldValue
ADB serialA65C009P00400034
ManufacturerTelpo
Android modelC9D
Android version14
Build display idC9D_A14_V1.1.3_202603250221

The device may be referred to operationally as CPOS TH C9PD, but Android reports the hardware as Telpo C9D.

Installed helper packages

Relevant packages found on the terminal:

PackageNotes
com.cpos.helperInstalled helper app. APK strings identify it as Telpo Drawer Helper.
com.telpo.omcserviceTelpo privileged system service.
th.co.boonsiri.posterminalPOS terminal app.
com.boonsiri.printerconfigPrinter configuration app/package with Android PrintService and PrinterContentProvider.

com.cpos.helper was installed from Files (com.google.android.apps.nbu.files) and reports version 1.1.1.

com.boonsiri.printerconfig reports version 1.0.0, declares com.boonsiri.printerconfig.READ_PRINTERS, and exposes:

  • com.boonsiri.printerconfig/.print.BoonsiriPrintService
  • com.boonsiri.printerconfig/.provider.PrinterContentProvider
  • provider authority com.boonsiri.printerconfig.provider

Verified USB peripherals

adb -s A65C009P00400034 shell dumpsys usb found two USB peripherals.

Receipt printer

FieldValue
USB path/dev/bus/usb/001/005
ManufacturerICOD
ProductICOD_Thermal_Printer
Vendor ID1155
Product ID30016
USB class7 (Printer)
Interface class7
Interface subclass1
Interface protocol2
Serial number000000000005920ca2
OUT endpointaddress 3, max packet size 64
IN endpointaddress 129, max packet size 64

The USB settings also register com.cpos.helper/.MainActivity for attached USB devices with class 7, so the Telpo drawer helper is expected to handle USB printer attach events.

Scanner / keyboard wedge

FieldValue
USB path/dev/bus/usb/001/003
ManufacturerHID .
ProductDECODER-KEYBOARD
Vendor ID7554
Product ID23712
USB classHID class 3

This device appears as a keyboard-style scanner and should not be treated as the receipt printer.

Drawer capabilities found

The helper APK contains cash drawer specific code and text, including:

  • Telpo Drawer Helper
  • com.cpos.helper.Drawer
  • com.cpos.helper.PrinterProxyService
  • com.cpos.helper.TEST_DRAWER
  • ACTION_TEST_DRAWER
  • Drawer Proxy
  • Drawer Mode
  • MODE_TELPO
  • MODE_USB
  • MODE_PRINTER
  • Telpo only (GPIO/SDK)
  • USB only (drawer on printer)
  • Auto (printer + Telpo)
  • Standard printer (drawer connected to printer)

The APK also includes Telpo SDK classes relevant to direct drawer control:

  • com.telpo.tps550.api.moneybox.MoneyBox
  • com.common.apiutil.moneybox.MoneyBox
  • com.common.apiutil.util.TelpoLib

Native libraries found in the helper APK:

  • libtelpo-lib.so
  • libserial-util.so
  • libusb-util.so

libtelpo-lib.so references /dev/telpo_gpio and exposes JNI symbol Java_com_common_apiutil_util_TelpoLib_ioctlControlJNI, which suggests the Telpo SDK can drive GPIO-level drawer control.

Printer drawer kick command

The helper APK also contains an ESC/POS drawer kick path for drawers connected through a receipt printer.

Command bytes found:

1B 70 00 19 FA

Equivalent byte array:

[0x1b, 0x70, 0x00, 0x19, 0xfa]

Use this only when the cash drawer is connected to the receipt printer drawer port, usually RJ11/RJ12.

For the verified ICOD USB thermal printer, raw USB ESC/POS output should target the printer device, not the scanner:

  • expected target product: ICOD_Thermal_Printer
  • expected USB path at time of inspection: /dev/bus/usb/001/005
  • expected OUT endpoint: address 3

Add an Android native module in apps/pos-terminal for cash drawer control.

Recommended behavior:

  1. Prefer Telpo direct drawer control through MoneyBox or the Telpo GPIO SDK.
  2. Fall back to ESC/POS drawer kick when the drawer is connected through a USB, LAN, or Bluetooth receipt printer.
  3. For the current terminal, identify the printer by USB product name ICOD_Thermal_Printer or vendor/product id 1155:30016.
  4. Expose a React Native API such as CashDrawer.open() for UI and payment flows.
  5. Add a manual operator button such as เปิดลิ้นชัก.
  6. Optionally call the same API after successful cash payment.
  7. Log failures with enough detail to distinguish Telpo SDK failure from printer fallback failure.

Suggested TypeScript boundary:

type CashDrawerOpenMode = "auto" | "telpo" | "printer";

type CashDrawerNativeModule = {
open(mode?: CashDrawerOpenMode): Promise<void>;
isSupported(): Promise<boolean>;
};

Suggested Android behavior:

open("auto")
-> try Telpo MoneyBox / GPIO
-> if not available, try configured printer ESC/POS kick
-> throw a clear error if both fail

Safety notes

  • Testing the command can physically open the drawer.
  • Ask the operator before running drawer tests on a live terminal.
  • Avoid repeated rapid pulses. Add debounce/rate limiting in app code.
  • Do not assume every POS terminal has the same helper app or GPIO path. Check the Android model and installed packages before enabling direct Telpo mode.

Useful ADB commands

Identify the connected POS device:

adb devices
adb -s A65C009P00400034 shell getprop ro.product.manufacturer
adb -s A65C009P00400034 shell getprop ro.product.model
adb -s A65C009P00400034 shell getprop ro.build.display.id
adb -s A65C009P00400034 shell getprop ro.build.version.release

Inspect helper packages:

adb -s A65C009P00400034 shell pm list packages
adb -s A65C009P00400034 shell dumpsys package com.cpos.helper
adb -s A65C009P00400034 shell pm path com.cpos.helper

Inspect printer and scanner USB devices:

adb -s A65C009P00400034 shell dumpsys usb
adb -s A65C009P00400034 shell dumpsys package com.boonsiri.printerconfig