android - Extracción de información de un código de barras escaneado tipo GS1
android-studio barcode (3)
Estoy desarrollando una aplicación en Android Studio para obtener la fecha de caducidad de los elementos al escanear el código de barras.
No quiero que el usuario instale la aplicación de código de barras ZXing por separado, así que incruste el código ZXing en mi proyecto. Al hacer esto, pude obtener el identificador del producto.
También quiero obtener información del producto, como la descripción, el fabricante y la fecha de vencimiento utilizando los datos escaneados del código de barras. ¿Cómo puedo hacer eso?
Esta es una solución escrita en Javascript probada en un cliente específico, la generalización requiere más trabajo:
//define AI''s, parameter name and, optionally, transformation functions
SapApplicationIdentifiers= [
{ ai: ''00'', regex: /^00(/d{18})/, parameter: ''SSCC''},
{ ai: ''01'', regex: /^01(/d{14})/, parameter: ''EAN''},
{ ai: ''02'', regex: /^02(/d{14})/, parameter: ''EAN''},
{ ai: ''10'', regex: /^10([^/u001D]{1,20})/, parameter: ''LOTE''},
{ ai: ''13'', regex: /^13(/d{6})/},
{ ai: ''15'', regex: /^15(/d{6})/, parameter: ''F_CONS'', transform: function(match){ return ''20''+match[1].substr(0,2)+''-''+match[1].substr(2,2)+''-''+match[1].substr(4,2);}},
{ ai: ''17'', regex: /^17(/d{6})/, parameter: ''F_CONS'', transform: function(match){ return ''20''+match[1].substr(0,2)+''-''+match[1].substr(2,2)+''-''+match[1].substr(4,2);}},
{ ai: ''19'', regex: /^19(/d{6})/, parameter: ''F_CONS'', transform: function(match){ return ''20''+match[1].substr(0,2)+''-''+match[1].substr(2,2)+''-''+match[1].substr(4,2);}},
{ ai: ''21'', regex: /^21([/d/w]{1,20})/}, //numero de serie
{ ai: ''30'', regex: /^30(/d{1,8})/},
{ ai: ''310'', regex: /^310(/d)(/d{6})/, parameter: ''NTGEW'', transform: function(match){ return parseInt( match[2] ) / Math.pow( 10,parseInt( match[1] ) )}},
{ ai: ''320'', regex: /^320(/d)(/d{6})/, parameter: ''NTGEW'', transform: function(match){ return parseInt( match[2] ) / Math.pow( 10,parseInt( match[1] ) )}},
{ ai: ''330'', regex: /^330(/d)(/d{6})/},
{ ai: ''37'', regex: /^37(/d{1,8})/, parameter: ''CANT''}
];
//walks through the code, removing recognized fields
function parseAiByAi(code, mercancia, onError ){
var match;
if(!code)
return;
SapApplicationIdentifiers.forEach(function(AI){
if(code.indexOf(AI.ai)==0 && AI.regex.test(code)){
match= AI.regex.exec( code );
if(AI.parameter){
if(angular.isFunction(AI.transform)){
mercancia[AI.parameter] = AI.transform(match);
}else
mercancia[AI.parameter]= match[1];
if(AI.parameter=="NTGEW"){
mercancia.NTGEW_IA= AI.ai;
}
}
code= code.replace(match[0],'''').replace(/^[/0/u001D]/,'''');
parseAiByAi(code, mercancia, onError);
}
});
}
parseAiByAi(code, mercancia, onError);
Hay dos procesos involucrados en la obtención de la información representada por un código de barras de tipo GS1 que almacena datos en formato estándar de identificador de aplicación GS1.
- Extracción de los campos de datos (denominados identificadores de aplicación) contenidos dentro de los datos estructurados GS1 obtenidos escaneando el símbolo. Esto siempre incluye un identificador único para el artículo llamado GTIN-14 y puede incluir información complementaria, como una fecha de vencimiento, un número de LOTE, etc. Este proceso puede ser realizado por una aplicación independiente.
- Busque el GTIN extraído en una base de datos, ya sea local para su aplicación o mediante alguna API pública, para proporcionar una representación textual del país de origen, el fabricante y posiblemente la descripción del artículo. Para realizar este proceso de manera integral, una aplicación requiere acceso a recursos externos.
Antecedentes: GS1 Aplicación Identificador Formato estándar Composición
Los datos con formato GS1 consisten en una lista concatenada de identificadores de aplicación (AI) y valores, comenzando con AI (01) que representa el GTIN.
Por ejemplo, los datos "(01) 95012345678903 (10) 000123 (17) 150801" representan la siguiente información:
GTIN: 95012345678903
BATCH/LOT: 000123
USE BY OR EXPIRY: 1st August 2015
La Sección 3: Definiciones del identificador de aplicación GS1 de las Especificaciones generales de GS1 proporciona el significado de cada uno de los identificadores de aplicación y, además, establece si los valores de AI son, por definición , de longitud variable o de longitud fija, en cuyo caso se proporciona la longitud obligatoria.
Los códigos de barras GS1 utilizan un carácter especial sin datos (FNC1) para indicar que los datos se ajustan al formato estándar del Identificador de aplicación GS1 y para delimitar el final de un campo de datos de longitud variable de la siguiente AI.
Por ejemplo, los datos anteriores podrían codificarse en un símbolo de Código 128 como
{FNC1}019501234567890310000123{FNC1}17150801
para producir el siguiente símbolo GS1-128:
Cuando un escáner de código de barras lee este símbolo, se decodifica de la siguiente manera [†] :
019501234567890310000123{GS}17150801
Tenga en cuenta que el carácter inicial sin datos FNC1 se ha descartado y el FNC1 utilizado en la función de separador AI de longitud variable se ha representado por un carácter GS (valor ASCII 29).
Extracción (y opcionalmente validación)
La extracción del GTIN y cualquier información complementaria puede ser realizada directamente por su aplicación.
Para extraer los datos del Identificador de aplicación original de los datos del símbolo GS1 decodificado de un escáner de código de barras, es necesario que su aplicación contenga una estructura de datos que denominaremos patrones de AI de mapeo de
AI-TABLE
AI a la longitud de sus valores derivados de los datos proporcionados en la sección de las Especificaciones Generales GS1 vinculadas a lo anterior:
AI | N (value length)
-------------------------
(00) | 18
(01) | 14
(10) | variable
(17) | 6
(240) | variable
(310n) | 6
(37) | variable
...
Con esto disponible, puede proceder con la extracción del valor AI de los datos escaneados del código de barras de la siguiente manera:
while more data:
AI,N = Entry from AI-TABLE matching a prefix of the data, otherwise FAIL.
if N is fixed-length:
VALUE = next N characters
else N is variable length:
VALUE = characters until "GS" or end of data
emit: (AI) VALUE
En la práctica, puede elegir incluir más datos de las Especificaciones Generales en su
AI-TABLE
para permitir que su aplicación realice una validación mejorada del tipo y longitud de cada
VALUE
.
Sin embargo, lo anterior es suficiente para extraer los datos dados, como AI (17) que representa la fecha de vencimiento que está buscando.
Buscar
Para obtener los datos restantes que le interesan (que no están codificados directamente en el código de barras), como el nombre del artículo y los detalles del fabricante, debe buscar el GTIN extraído utilizando recursos externos, como una base de datos de productos local o uno del público API de base de datos UPC que están disponibles.
El GTIN en sí contiene un país de origen (en realidad, representa la Organización Miembro GS1 nacional con la que está registrado el fabricante, por lo que no es exactamente el país de origen), el identificador del fabricante; en conjunto, estos se denominan Prefijo GS1, son de longitud variable y son asignados por GS1 - y el resto de los dígitos representan el código del producto que el fabricante asigna libremente.
Dado un GTIN, algunas bases de datos UPC proporcionarán solo detalles relacionados con el Prefijo GS1, como una representación textual de la Organización Miembro GS1 y el fabricante. Otros intentan mantener un registro de las asignaciones individuales de GTIN a elementos comunes, sin embargo, estos datos siempre estarán algo incompletos y desactualizados ya que no existe un registro obligatorio de las asignaciones de GTIN en tiempo real.
Las respuestas a esta pregunta proporcionan algunos ejemplos de plataformas gratuitas de información de productos.
[†] De hecho, es posible que vea
]C1019501234567890310000123{GS}17150801
en cuyo caso se puede descartar el identificador de simbología líder para GS1-128
]C1
.
Puede intentar usar la API de base de datos UPC . Sin embargo, no tienen garantía de tiempo de actividad y limitan a 1000 consultas por día. También pude encontrar esta API que cobra $ 1/1000 llamadas. ¡Buena suerte!