从扫描的GS1型条形码中提取信息

时间:2015-07-31 05:14:50

标签: android android-studio barcode zxing

我正在Android Studio上开发一个应用程序,以便在扫描条形码时获取项目的到期日期。





我不希望用户单独安装ZXing条形码应用程序,因此我将ZXing代码嵌入到我的项目中。这样做我已经能够获得产品标识符。





我还希望使用扫描的条形码数据获取产品信息,例如描述,制造商和有效期。我怎么能这样做?




3 个答案:

答案 0 :(得分:10)

获取由GS1类型条形码表示的信息涉及两个过程,该条形码以GS1应用程序标识符标准格式存储数据。

  1. 提取包含在通过扫描符号获得的GS1结构数据中的数据字段(称为应用程序标识符)。这始终包括称为GTIN-14的项目的唯一标识符,可能包括补充信息,如失效日期,LOT编号等。 此过程可以由独立应用程序执行。
  2. 查找数据库中提取的GTIN,无论是应用程序本地还是通过某些公共API,都可以提供原产国,制造商和项目描述的文本表示。 要全面执行此过程,应用程序需要访问外部资源。
  3. 背景:GS1应用程序标识符标准格式组合

    GS1格式的数据由应用程序标识符(AI)和值的连接列表组成,从表示GTIN的AI(01)开始。

    例如,数据“(01)95012345678903(10)000123(17)150801”代表以下信息:

    GTIN:             95012345678903
    BATCH/LOT:        000123
    USE BY OR EXPIRY: 1st August 2015
    

    第3节:{{3>}的 GS1应用程序标识符定义提供了每个应用程序标识符的含义,并且重要的是还说明了AI值是否按照定义可变长度固定长度,在这种情况下提供强制性长度。

    GS1条形码使用特殊的非数据字符(FNC1)来指示数据符合GS1应用程序标识符标准格式,并分隔来自下一个AI的可变长度数据字段的结尾。例如,上述数据可以用代码128符号编码为{FNC1}019501234567890310000123{FNC1}17150801,以生成以下GS1-128符号:

    GS1 General Specifications

    当条形码扫描仪读取此符号时,其解码如下 [†]

    019501234567890310000123{GS}17150801
    

    请注意,已丢弃初始FNC1非数据字符,并且可变长度AI分隔符角色中使用的FNC1已由GS字符(ASCII值29)表示。

    提取(以及可选的验证)

    GTIN的提取和任何补充信息可以直接由您的应用程序执行。

    要从条形码扫描器中解码的GS1符号数据中提取原始应用程序标识符数据,要求您的应用程序包含一个数据结构,我们将其称为AI-TABLE将AI模式映射到其值的长度来自与上述相关的GS1一般规范部分中提供的数据:

    AI     | N (value length)
    -------------------------
    (00)   | 18
    (01)   | 14
    (10)   | variable
    (17)   | 6
    (240)  | variable
    (310n) | 6
    (37)   | variable
    ...
    

    如果有此功能,您可以按照以下步骤从扫描的条形码数据中提取AI值:

    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
    

    在实践中,您可以选择在AI-TABLE中添加一般规范中的更多数据,以允许您的应用程序对每个VALUE的类型和长度执行增强验证。但是,上述内容足以提取给定的数据,例如代表您正在寻找的失效日期的AI(17)。

    <强>查找

    要获取您感兴趣的剩余数据(未在条形码中直接编码),例如项目名称和制造商详细信息,您需要使用外部资源(如本地产品数据库或一个)查找提取的GTIN可用的公共UPC数据库API。

    GTIN本身包含一个原产国(实际上它代表制造商注册的国家GS1成员组织,因此不是原产国),制造商标识符 - 这些被称为GS1前缀,可变-length由GS1分配 - 其余数字代表制造商自由分配的产品代码。

    鉴于GTIN,一些UPC数据库将仅提供与GS1前缀相关的详细信息,例如GS1成员组织和制造商的文本表示。其他人试图保留对普通项目的单独GTIN分配的记录,但是这些数据总是有些不完整和过时,因为没有实时GTIN分配的强制注册。

    GS1-128: (01)95012345678903(10)000123(17)150801的答案提供了一些免费产品信息平台的例子。

    [†]实际上您可能会看到]C1019501234567890310000123{GS}17150801,在这种情况下,可以放弃GS1-128 ]C1的主要符号系统标识符。

答案 1 :(得分:1)

这是使用Javascript编写的解决方案,已在特定客户中得到证明,泛化需要更多工作:

//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);

答案 2 :(得分:-1)

您可以尝试使用UPC Database API。但他们无法保证正常运行时间,并且每天限制为1000次查询。我还能找到this API收取$ 1/1000电话费。祝你好运!