Tarjeta Presente
SDK SmartPOS
44 min
d ispositivos soportados 248,248,248 0,1,2,3 true true 0,1,2 unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type versionado 72,106,566 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type requerimientos para la conexión con smartpos a) permisos de acceso en la aplicación android no será necesario agregar permisos en el androidmanifest xml de manera previa lo que sí será necesario, es agregar dentro del tag \<application siguiente atributo android\ requestlegacyexternalstorage="true" cardreaderlistener interfaz principal de comunicación entre la aplicación android y toda respuesta de información o notificación del sdk al interactuar con el sdk, las respuestas son devueltas a través de la emisión de eventos en distintas funciones estas funciones son onconnection , oncard , onstatus y onprinter onconnection la función onconnection , recibe todo evento event type de tipo connection se utiliza para indicar los cambios en el estado de la conexión con el dispositivo smartpos, ya sea que se haya realizado la conexión, se desconectó o se produjo algún error esta función recibe un objeto event de tipo sgwjson que tiene las siguientes propiedades 110,145,230,133 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type valores posibles de type en el evento connection 330,331 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type oncard la función oncard , recibe todo evento event type de tipo card se utiliza para indicar cuando el dispositivo está listo para leer la tarjeta o para cuando ha finalizado de leerla, ya sea que la lectura haya sido exitosa o errónea también indica si el procesamiento de la transacción está a la espera, en curso o finalizada esta función recibe un objeto event de tipo sgwjson que tiene las siguientes propiedades 94,140,324,133 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type valores posibles de type en el evento card 330,331 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type onstatus la función onstatus , recibe todo evento event type de tipo info se utiliza para retornar información del dispositivo esta función recibe un objeto event de tipo sgwjson que tiene las siguientes propiedades 92,267,165,134 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type valores posibles de type en el evento info 330,331 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type onprinter la función onprinter , recibe todo evento event type de tipo printer se utiliza para indicar resultados de inicialización del printer y cambios de estado en la ejecución de la impresión esta función recibe un objeto event de tipo mbbxjson que tiene las siguientes propiedades 165,165,165,166 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type valores posibles de type en el evento printer 330,331 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type cardreader clase utilizada para toda lógica de conexión y funcionamiento del sdk en los smartpos métodos la siguiente tabla indica los distintos métodos de la clase 283,368,92 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type enums los siguientes enums existen en el sdk mobbex permiten verificar eventos o configurar distintos parámetros según corresponda 220,220,221 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type parámetros del printer las distintas opciones que puede recibir el parámetro opcional paramaters de tipo mbbxjson dentro de los distintos método del printer , son los que se muestran a continuación toda key es de tipo string 131,221,132,156,101 true unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type unhandled content type respuesta de lectura la respuesta exitosa de una lectura, sea masgtripe , chip o contactless retorna dentro del objeto data del evento, el siguiente objeto source { type "", sourcedata { bin "", last4 "", length 16, cvvrequired false } } lo cual explicamos a continuación cada propiedad 146,471,125 true left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type valores posibles de type 244,499 trueleft unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type left unhandled content type para ver un ejemplos de este objeto, ir a ejemplos de respuesta > evento lectura > read success implementaciones importación de la librería sdk mobbex todo sdk de mobbex será un archivo de extensión aar de nombre con formato mobbex card reader sdk v ${version} aar a este archivo será necesario agregarlo dentro de la carpeta /libs y luego agregarlo en las dependencias de la aplicación project structure > dependencies > add > jar/aar dependency verificar que en el archivo “build gradle” de la aplicación, se haya agregado la implementación implementación cardreader se realizará una explicación específica de cómo implementar las distintas clases, funciones y eventos que permitan una correcta inicialización del sdk mobbex importar la clase cardreader y cardreaderlistener import com mobbex cardreader cardreader; import com mobbex cardreader interfaces cardreaderlistener; crear un objeto de clase cardreader , inicializar una nueva instancia y configurar el objeto cardreaderlistener cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //el objeto jsonobject del evento de conexión debería ser //jsonobject { // "type" reader event reader connected, // "message" "cardreader is connected " //} } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); la conexión completa de la nueva instancia, se notificará mediante un evento de tipo connection (dentro de onconnection ), el cual tendrá un type de tipo reader connected luego de recibir este evento, la instancia cardreader estará lista para ejecutar los demás métodos de la clase información del lector para conocer y poder ejecutar el método getdeviceinfo() , será necesario inicializar la instancia de cardreader , esperar su conexión exitosa, ejecutar el método y esperar el evento con la respuesta cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader getdeviceinfo(); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { //el objeto jsonobject del evento de información debería ser //jsonobject { // "type" reader event device info, // "message" "returning device info " // "data" json with device data //} } @override public void onprinter(mbbxjson jsonobject) { } }); la respuesta de la información, se recibe en un evento de tipo info (dentro de onstatus ), el cual tendrá un type de tipo device info lectura y procesamiento de tarjeta el sdk mobbex posee dos métodos o flujos de lectura y procesamiento de tarjeta por un lado, la lectura y el procesamiento se pueden realizar de manera consecutiva, y por otro lado, la lectura y el procesamiento se realizan en métodos y lógicas separados para ambos casos, será necesario inicializar la instancia de cardreader , esperar su conexión exitosa, ejecutar el/los método/s y esperar el evento con la respuesta a continuación, explicamos ambos flujos lectura y procesamiento unificado este flujo permite realizar el procesamiento de una transacción automática y consecutivamente luego de la detección exitosa de una tarjeta para este flujo, es necesario poseer/crear la intención de pago ( intent token ) y cantidad de cuotas ( installment ) de manera previa el método utilizado para realizar este flujo, es readandprocess(int amount, int otheramount, transaction type trxtype, int intenttoken, int installments) cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método startreadprocess(); } @override public void oncard(mbbxjson jsonobject) { //aquí dentro se recibirá todo evento intermedio durante la //detección y lectura de la tarjeta, y el procesamiento de //la transacción } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); private void startreadprocess() { //(opcional) se configura la cantidad de reintentos automáticos setreadretries(1); //solo un reintento setreadretries(4); //4 reintentos setreadretries(0); //sin reintentos (manejo manual) int amount = getamount(); int otheramount = getotheramount(); //opcional transaction type trxtype = gettrxtype(); //opcional string intenttoken = createintenttoken(); int installments = getinstallments(); //comienza el proceso de lectura y procesamiento cardreader readandprocess(amount, otheramount, trxtype, intenttoken, installments); //otra manera de ejecutar el método, sin parámetros opcionales cardreader readandprocess(amount, intenttoken, installments); } en resumen, se debe inicializar instancia cardreader y esperar su conexión exitosa; configurar parámetros de lectura, obtener/crear intent token, monto a procesar, monto de retiro, tipo de transacción y cantidad de cuotas ejecutar método readandprocess toda respuesta de información, error, lectura y/o procesamiento de este último evento, se reciben en eventos de tipo card (dentro de la función oncard ) lectura y procesamiento en paralelo si la necesidad del caso de uso, es primero detectar y leer una tarjeta, luego realizar procesos como detección de bines, selección de cuotas personalizadas u otros procesos específicos, se pueden realizar de la siguiente manera los métodos utilizados para realizar este flujo, son read(int amount, int otheramount, transaction type trxtype) y processtrx(int amount, int intenttoken, int installments) o processtrx(int amount, int intenttoken, string installmentsreference) import com mobbex cardreader enums reader event; cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método startreadprocess(); } @override public void oncard(mbbxjson jsonobject) { reader event type = (reader event) jsonobject get("type"); if (type == reader event reading) { //el procesamiento de lectura ha comenzado y //espera tarjeta a detectar } else if (type == reader event card detected) { //la tarjeta fue detectada! podrás ver el tipo de método detectado //(read type) dentro del objeto del evento } else if (type == reader event read success) { //la lectura y detección finalizó con éxito //podrás ver los datos brindados en los datos del evento //todo aquí se deberá hacer los distintos procesos que el //flujo de la app requiera // detección de bin // selección de cuotas // interacción pertinente con el usuario // creación del intenttoken string intenttoken = createintenttoken(); int installments = getinstallments(); // una vez finalizados los procesos necesarios, comenzar el procesamiento // de ser necesario, se debe brindar el código de seguridad // de la tarjeta string cvv = getsecuritycode(); //cuando sea necesario cardreader processtrx(intenttoken, installments, cvv); } } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); private void startreadprocess() { //(opcional) se configura la cantidad de reintentos automáticos setreadretries(1); //solo un reintento setreadretries(4); //4 reintentos setreadretries(0); //sin reintentos (manejo manual) int amount = getamount(); int otheramount = getotheramount() //opcional //comienza el proceso de detección y lectura de la tarjeta cardreader read(amount, otheramount); //otra manera de ejecutar el método, sin parámetros opcionales cardreader read(amount); } impresión de ticket el sdk de mobbex permite realizar impresiones de tickets customizados, de manera simple y rápida será necesario inicializar la instancia de cardreader , esperar su conexión exitosa, configurar su contenido y ejecutar el método print() cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { //si lainicialización del printer fue exitosa, ejecutar el método //(acá debería haber un manejo/condición de eventos para evitar //reimpresiones involuntarias) createprinterticket(); cardreader print(); } }); private void createprinterticket() { //customizo y agrego texto a la memoria del printer mbbxjson textparams = new mbbxjson(); textparams put("textsize", text size large); textparams put("isbold", true); textparams put("alignment", alignment center); textparams put("isitalic", true); textparams put("isunderline", false); cardreader setprintertext("mobbex", textparams)); //agrego espacio en blanco en el printer cardreader setprinterfeed(10); //customizo y agrego imágen qr a la memoria del printer mbbxjson qrparams = new mbbxjson(); textparams put("alignment", alignemnt center); textparams put("qrsize", 300); cardreader setprinterqr(qrcode, qrparams); cardreader setprinterfeed(10); //agrego imágen de código de barras en la memoria del printer cardreader setprinterbarcode(barcode); } detener tareas del lector es recomendable utilizar la función stoptask() siempre que sea necesario tanto el proceso de lectura de tarjetas, como la obtención de datos del lector y la impresión del ticket, inicializan procesos internos entre el sdk de mobbex y el lector, que deben de finalizarse o cancelarse para su correcto uso y evitar mal funcionamiento modo debug el sdk de mobbex posee un modo de uso que permite imprimir por consola más información que faciliten su implementación y depuración además, esta sección permite simular ciertos escenarios como tarjetas dual o procesos de verificación del tarjeta habiente, para poder desarrollar y soportar los eventos sin la necesidad de contar con las tarjetas especiales activación modo debug este modo por defecto es false y podrá activarse únicamente luego de finalizada la inicialización del cardreader cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader setdebugmode(true); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); activación modo debug múltiple aplicaciones en detección de tarjetas por el método chip , es necesario dar soporte a tarjetas duales esto significa, que el sdk de mobbex identificará si la tarjeta posee múltiples aplicaciones, y solicitará la selección de alguna aplicaciones posibles este escenario, emite eventos de tipo reader event con type waiting aid puedes ver un ejemplo de respuesta de este evento que posee el array con las distintas aplicaciones posibles, en la sección de ejemplos de respuesta > evento lectura el modo debug de múltiples aplicaciones, permite forzar el lanzamiento de este evento, por más que la tarjeta posea una única aplicación habilitada para activarlo, es necesario haber activado el modo debug previamente la forma de activar el sdk de mobbex en modo debug de múltiples aplicaciones, es la siguiente cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader setdebugmode(true); cardreader setdebugmultipleapplicationmode(true); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); activación modo debug de método de verificación tarjeta habiente en detección de tarjetas por el método contactless , es necesario dar soporte a tarjetas en donde el tarjeta habiente requiera realizar una verificación requerida por el emisor esto significa, que el sdk de mobbex identificará si la tarjeta requiere de dicha verificación este escenario, emite eventos de tipo reader event con los types cdcvm required de y cdcvm verification ready el modo debug de método de verificación tarjeta habiente, permite forzar el lanzamiento de estos eventos, por más que la tarjeta no lo requiera para activarlo, es necesario haber activado el modo debug previamente la forma de activar el sdk de mobbex de método de verificación tarjeta habiente, es la siguiente cardreader cardreader; cardreader = new cardreader(context); cardreader setcardreaderlistener(new cardreaderlistener() { @override public void onconnection(mbbxjson jsonobject) { //si la conexión es exitosa, ejecutar el siguiente método cardreader setdebugmode(true); cardreader setdebugcvmverificationmode(true); } @override public void oncard(mbbxjson jsonobject) { } @override public void onstatus(mbbxjson jsonobject) { } @override public void onprinter(mbbxjson jsonobject) { } }); a tener en cuenta en la activación modo debug los modos múltiples aplicaciones y verificación tarjeta habiente, solo funcionan si el modo debug está activado al desactivar el modo debug, se desactivarán también cualquier otro modo debug activado sólo un modo debug especial podrá estar activo al mismo tiempo, es decir, al activar el modo múltiples aplicaciones, se desactivará el modo verificación tarjeta habiente, y viceversa estos modos estarán prohibidos en lectores productivos ejemplos de respuestas a modo de entender el formato y posibilidades, se presentan algunos ejemplos de respuesta en los distintos eventos evento connexión //reader event reader connected jsonobject = { type reader connected, message "card reader is connected " } //reader event reader error jsonobject = { type reader error, message "getdeviceinfo() function not able cardreader is disconnected or not fully connected " } evento lectura //reader event reading jsonobject = { type reading, message "card reader is ready to read card " } //reader event card detected jsonobject = { type card detected, message "card detected ", data { type "emv chip" //read type enum } } //reader event read restart jsonobject = { type read restart, message "restarting read process method use has low priority try using other card reader method ", error { type low priority method, //reader error enum message "try using other card reader method " } } //reader event read success jsonobject = { type read success, message "card reader is ready to read card " data { source { type "emv contactless", sourcedata { bin "123456", last4 "6789", length 16, cvvrequired false } } } } //reader event read fail jsonobject = { type read fail, message "reading card failed moving to fast or bad swipe, try again ", data {}, error { type show card again, //reader error enum message "moving to fast or bad swipe, try again " } } //reader event waiting aid jsonobject = { type waiting aid, message "waiting application to be selected ", data \["visa debito", "visa crédito"] } //reader event processing jsonobject = { type processing, message "start processing transaction ", } //reader event process success jsonobject = { type process success, message "process transaction finished successfully!", data { 	 view "default", 	 options {}, 	 id "cw2dxgptcvza3qqz5tcgg1", 	 status { 	 code "415", 	 text "denegada, método de pago inválido", 	 message "denegada ( cod 5 )", 	 data {}, 	 view "default", 	 }, 	 total 200, 	 currency { 	 value "ars", 	 label "peso argentino", 	 symbol "$", 	 locale "es ar", 	 hidden false, 	 }, 	 data \[ 	 { 	 type "item", 	 key "transactionid", 	 label "transacción nro", 	 value "cw2dxgptcvza3qqz5tcgg1", 	 priority 2, 	 visibility "visible", 	 }, 	 { 	 type "item", 	 key "cardnumber", 	 label "tarjeta", 	 value "466057 7851", 	 priority 99, 	 visibility "hidden", 	 }, 	 { 	 type "item", 	 key "authorizationcode", 	 label "código de autorización", 	 value "", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "batchno", 	 label "lote", 	 value "21", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "ticketno", 	 label "ticket", 	 value "80", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "resultcode", 	 label "resultado del emisor", 	 value "5", 	 priority 99, 	 visibility "none", 	 }, 	 { 	 type "item", 	 key "retrievalreferenceno", 	 label "referencia del emisor", 	 value "", 	 priority 99, 	 visibility "none", 	 }, 	 ], 	 actions \[ 	 { 	 label "imprimir", 	 key "print", 	 type "default", 	 action { 	 type "print", 	 data { 	 url "https //ms mobbex com/prod/reports", 	 path "/v2/coupon/", 	 id "cw2dxgptcvza3qqz5tcgg1", 	 schema "card", 	 }, 	 }, 	 }, 	 { 	 label "firmar", 	 key "sign", 	 type "primary", 	 action { 	 type "signature", 	 data { url "/p/pos/coupon/signature/cw2dxgptcvza3qqz5tcgg1" }, 	 }, 	 }, 	 { 	 label "enviar ticket", 	 key "send coupon", 	 type "primary", 	 action { 	 type "notification", 	 data { url "/p/pos/coupon/notification/cw2dxgptcvza3qqz5tcgg1" }, 	 }, 	 }, 	 { label "reintentar", key "retry", type "primary", action { type "reload" } }, 	 ], 	} } //reader event process fail (1) jsonobject = { type process fail, error { type request, // reader error enum error "execution failed please contact support with the case id id 221985c9 78b2 49b6 929c e39cc0d28b18", code "generic\ efcs" } } //reader event process fail (2) jsonobject = { type process fail, error { type request, // reader error enum error "no se encontraron datos para la entidad solicitada", code "dnefre" } } //reader event process security code required jsonobject = { type process security code required, message "security code in this transaction is required " } evento info //reader event device info jsonobject = { type device info, message "returning device info ", data { paycomponentversion "0", romversion "0 2 0rh", productname "dx8000", processorinfo "qualcomm technologies, inc qcm2150", hardwareserialnumber "s6dx800075 2q95b<214ucd815316000", androidkernelversion "4 9 217", bootversion "1 1 2 2021 04 15 18 10", imsi null, csn "", iccid null, secfwversion "01 04 01 00003", mode "3 mockup state", imei "868735050034844", basebandversion "19080 4000 00 03 01 59,19080 4000 00 03 01 59", hardwareversion "0", firmwareversion "and q4 alpha", extdeviceversion null, isovsterm true, buildnumber "0 2 0rh", terminaltype "dx8000", serialnumber "214ucd815316", model "dx8000", manufacture "landi", androidosversion "10", pn "twt52011869a" } } evento printer //reader event printing jsonobject = { type printing, message "printer start printing " } //reader event printer success jsonobject = { type printer success, message "printer print finished successfully!" } //reader event printer fail jsonobject = { type printer fail, message "printer print failed " }