package com.rfidsoftwares.demo.zebra import android.content.Context import android.util.Log import com.zebra.rfid.api3.* /** * Minimal Standalone Zebra RFID API3 Integration Service * * Supports: * - Zebra MC3300R / MC3390R Handheld Terminals * - Zebra TC20 / TC25 with RFD2000 Sled * - Zebra RFD8500 / RFD40 / RFD90 Bluetooth/eConnex Sleds */ class ZebraRfidService(private val context: Context) : RfidEventsListener { private var readers: Readers? = null private var availableRFIDReaderList: ArrayList? = null private var readerDevice: ReaderDevice? = null private var rfidReader: RFIDReader? = null private var isConnected = false fun initialize() { Thread { try { readers = Readers(context, ENUM_TRANSPORT.ALL) availableRFIDReaderList = readers?.GetAvailableRFIDReaderList() if (!availableRFIDReaderList.isNullOrEmpty()) { // Pick the first available connected reader readerDevice = availableRFIDReaderList?.get(0) rfidReader = readerDevice?.rfidReader rfidReader?.connect() isConnected = true Log.i(TAG, "Connected to Zebra RFID reader: ${rfidReader?.hostName}") configureReader() } else { Log.w(TAG, "No Zebra RFID readers detected.") } } catch (e: InvalidUsageException) { Log.e(TAG, "Invalid usage exception", e) } catch (e: OperationFailureException) { Log.e(TAG, "Operation failure: ${e.vendorMessage}", e) } }.start() } private fun configureReader() { try { // Subscribe to inventory read events rfidReader?.Events?.addEventsListener(this) rfidReader?.Events?.setHandheldEvent(true) rfidReader?.Events?.setTagReadEvent(true) rfidReader?.Events?.setAttachTagDataWithReadEvent(true) // Configure Antenna RF Power to 270 (27.0 dBm) val rfConfig = rfidReader?.Config?.Antennas?.getAntennaRfConfig(1) rfConfig?.transmitPowerIndex = 270 rfidReader?.Config?.Antennas?.setAntennaRfConfig(1, rfConfig) } catch (e: Exception) { Log.e(TAG, "Error configuring antenna settings", e) } } fun startInventory() { if (!isConnected || rfidReader == null) return try { rfidReader?.Actions?.Inventory?.perform() Log.i(TAG, "Zebra inventory sweep active.") } catch (e: Exception) { Log.e(TAG, "Failed to start inventory", e) } } fun stopInventory() { if (!isConnected || rfidReader == null) return try { rfidReader?.Actions?.Inventory?.stop() Log.i(TAG, "Zebra inventory sweep stopped.") } catch (e: Exception) { Log.e(TAG, "Failed to stop inventory", e) } } // Callbacks from Zebra RFID API3 override fun eventReadNotify(e: RfidReadEvents?) { val myTags = rfidReader?.Actions?.getReadTags(100) if (myTags != null) { for (tag in myTags) { val epc = tag.tagID val rssi = tag.peakRSSI Log.d(TAG, "Zebra Tag Read: EPC=$epc | PeakRSSI=$rssi") } } } override fun eventStatusNotify(rfidStatusEvents: RfidStatusEvents?) { Log.d(TAG, "Status notification: ${rfidStatusEvents?.statusEventType}") } fun disconnect() { try { if (isConnected) { rfidReader?.Events?.removeEventsListener(this) rfidReader?.disconnect() isConnected = false Log.i(TAG, "Zebra reader disconnected.") } } catch (e: Exception) { Log.e(TAG, "Error disconnecting Zebra reader", e) } } companion object { private const val TAG = "ZebraRfidService" } }