基于产品电子代码(EPC)编码的 农资追溯系统应用研究
2018-07-31成维莉金梦凯
毛 林,成维莉,程 涛,金梦凯,钟 泽,蔡 乐
(江苏农牧科技职业学院,江苏 泰州 225300)
农资是农产品生产过程中使用的农用资料,包括农药、肥料、种子、兽药、渔药、饲料及添加剂、生产调节剂等,农资安全是农产品与食品安全的基础和重要组成部分。农资可追溯制度面向多部门、多主体、多用户,提供农资可信追溯及安全管理的有力手段,为政府、企业、消费者提供优质、持久、高效服务。农资追溯系统是农资供应链质量管理信息化、智能化控制的网络系统,在农资安全管理中扮演重要角色,综合运用物品标识、(移动)互联网、物联网等技术,通过产、储、运、销、用等供应链关键控制点信息的采集、交换和存储,对产品进行快速准确的识别、溯源、跟踪、质量监测及控制,实现产品、质量、责任的追溯目标,保障农资安全。
农资追溯系统由编码系统、识别系统、业务系统、专业数据库构成。编码系统利用编码定量化处理来建立单一物品标识,确立一品一码、一件一码;识别系统对物品标识信息进行采集、传输;业务系统共享数据访问交换功能;专业数据库提供供应链追溯查询数据,解决单一标识制在追溯深度、广度上的局限和不足。其中,追溯码编码、防伪认证、供应链追溯查询等技术方法是系统构建的重点。本研究运用产品电子代码(EPC)对农资追溯码进行设计,提出追溯码编码、加密及防伪追溯方法,研究基于EPC编码的农资追溯系统,结合泰州农资监管信息平台(JSTRP)对系统架构、流程进行设计,重点研究数据访问、数据解析、编码实现、追溯查询等技术实现方法,提供一种轻量级的追溯系统应用解决方案。
1 农资追溯码设计
1.1 追溯码编码
农资追溯码是承载农资销售时为用户呈现产品身份信息的电子标志代码。EPC为国际物品编码协会(GS1)全球标识体系中的新一代编码系统。EPC标识单一物品对象时充当信息引用作用,采用管理域名、对象分类为主要记载信息,替换品类、批号、数量等众多复杂属性信息,编码格式统一、结构精简,使用维护方便,避免线性校验位识读,识别读写速度快[1]。EPC编码系统通过物联网射频识别(FRID)系统,与互联网平台互联互通、共享与交换信息,实现对供应链产品、服务、位置、资产的自动准确识别跟踪,提高贸易透明度、可视性及运作效率[2-3]。
本设计采用EPC 64位结构,按最小信息量编码原则设计[4],由版本号+供应商号(管理域名)+产品类别号+序列号构成(共64位),可为4.6×1018件单一物品提供追溯标识,可满足现实需求。追溯码标签(通常为FRID标签)的实际存储空间有限,因此在设计中除应满足足够的编码数量外,还应尽可能压缩代码长度,同时便于代码读写、处理及网络系统存取。农资追溯码初始码以十进制表示,以缩减代码长度,将64位代码进行编码转换,转换后长度为21位(图1)。该编码中,版本号为1位数字N1(N1=2);供应商号为5位(P1P2P3P4P5),编号按顺序从00001开始至32768;产品类别号4位(T1T2T3T4),由农资大类+农资小类组成,前2位(T1T2)代表农资大类,包括农药、肥料、种子、兽药、渔药、饲料、饲料添加剂、生产调节剂、农膜及其他,编号从01到10,最大编号为81;后2位(T3T4)表示农资小类,包括杀虫剂、除草剂、杀菌剂、生物农药、植物生长调节剂、农药原药、其他农药等,编号从01至92。产品序列号为11位(X1X2X3X4…X11),指示同类产品同一批次的单一物品,按顺序号从00000000001到17179869184表示。初始追溯码如图2所示。
图1 农资追溯码的编码结构
图2 农资追溯码的初始追溯码
1.2 追溯码加密
追溯码存储在EPC标签内部,能够对追溯码实现一定的隐藏功能。EPC标签对外发送明码信息时,编码规则及信息易于被监听、破解,甚至被非法盗用、仿制、篡改,存在较高的安全隐患。为确保追溯码的安全性,利用加密方法对其加密。加密技术是采用对称、非对称等密钥算法,将追溯码明文转换为密文的过程。AES是一种高性能的对称加密算法,运行速度快、效率高,加密后难以破解、安全性高[5-6]。AES加密、解密使用同一密钥,利用动态密钥算法产生“一次一钥”,每次加密使用的密钥都不同,有效解决了密钥安全性问题。AES硬件加密时,在终端设备上根据初始密钥、通过轮密钥算法生成各轮动态密钥、控制执行轮数,进行多轮加密运算,适用于设备存储空间要求不高、计算资源有限的情形[7-8]。
本设计采用软件加密方法,在不具备加密装置的条件下实现加密过程,算法性能高、复杂性低。本方法在用户客户端执行加密操作,远程服务端运行加密程序,这样能够定位加密对象,同时便于通过业务平台数据库实现对供应链信息的防伪追溯查询。该方法中,初始密钥为由域名管理号、时间戳构成的数字序列,由服务端分配和提供。域名管理号为供应商编号,时间戳是服务端标识Internet准确时间的字符序列,精确到ms(毫秒)。初始密钥具有唯一性和不可复制性,保证加密强度与安全性,为单一物品初始码生成不同追溯码,确保追溯码唯一性,达到一件一码的防伪追溯效果。例如,供应商号为1011、Internet时间为20171201036时,初始密钥为101120171201036,对图2的初始码201310020500000001272加密后得到的十进制追溯码长度小于78 bit,可满足EPC标签存储容量需求(1 KB~10 MB)[9]。解密是加密的逆过程,利用密钥验证追溯码真伪及还原初始码。算法流程如图3所示,通过Java语言实现,算法过程如下。
图3 追溯码加密的算法流程
Step1:加密过程
Step1-1输入初始码、初始密钥,创建AES密钥生成器,密钥生成器根据初始密钥产生用于加密的128 bit动态密钥;
Step1-2动态密钥产生一组扩展密钥,创建加密对象,加密对象使用扩展密钥完成一组加密操作,得到byte加密数据;
Step1-3将加密数据转换为十进制表示的追溯码。
Step2:解密过程
Step2-1读取追溯码、初始密钥,由AES密钥生成器根据初始密钥生成128 bit动态密钥用于解密;
Step2-2由动态密钥生成一组扩展密钥,创建cipher对象,cipher利用扩展密钥执行一组解密操作,获得字节码形式的解密数据;
Step2-3将解密结果转换成十进制代码,还原为初始码。
2 系统设计
2.1 系统架构与流程
系统采用基于B/S的3层架构,包含客户端、服务端、Internet网络(通信层)(图4)。Internet网络连接客户端和服务端,提供远程访问与数据传输。客户端包括PC主机、智能读写器、网卡、存储设备等基础设施硬件设备及软件工具,智能读写器通过串口、RJ45方式与PC主机连接,是Web应用服务的软硬件支撑平台,可保证客户端基本功能与性能要求。服务端搭建云计算服务器平台,包括IaaS、PaaS、SaaS三层[10]。IaaS为基础设施服务层,提供多操作系统、虚拟化硬软件资源、资源使用的统一调度管理,承担海量数据存储、计算、复杂业务处理,快速提供用户所需服务。PaaS为组件服务层,提供物品编码、标签认证及系统内部数据存储、加工、转换等功能。SaaS为接口服务层,提供远程访问接口,与JSTRP平台服务器互联互通,实现数据交换,满足客户端数据访问需求。
JSTRP平台(http://tz.jstrp.com)为面向地市级辖区供应链企业、监管与检测机构的三级网格化农资管理平台,JSTRP数据库为系统业务数据的主要来源,提供企业经营档案、监管巡查及质量检测等业务数据,以及供应商域名、产品、类别、批次等基础数据。系统业务流程:1)用户登录客户端系统后,可从产品列表中选择产品进行编码,将追溯码加密后写入标签,并为用户提供密钥,供产品追溯查询使用;2)用户手持标签和密钥进行产品追溯查询,读写装置读取标签追溯码,由客户端通过Internet网络提交至服务端,服务端使用密钥还原追溯码原文,分析、提取出分段码信息,与JSTRP平台建立通信,访问远程数据库,查询域名、分类、批次号信息;3)根据域名、分类、批次号确定指定的产品,远程访问数据库,服务端接收追溯查询数据后进行解析,将解析结果展示在客户端界面,呈现给用户(图5)。
图4 系统的架构
图5 系统的业务流程
2.2 开发工具及方法
本设计选用MyEclipse 8.5+Tomcat 6.0集成开发环境IDE开发系统。MyEclipse 8.5为Genuitec公司开源的Web应用开发工具,Tomcat 6.0是Apache官方提供的服务器系统部署工具。在MyEclipse 8.5中整合Tomcat 6.0,部署SSI(Struts2.0+Spring2.0+iBatis)轻量级J2EE开源框架[11],搭建开发环境,使之与JSTRP平台相一致,消除平台异构化差异。采用MVC设计模式分层设计[12],包括视图层、数据交换层、控制层(Action)、业务层、持久化层。Struts框架使视图层、Web服务层与控制层相分离,控制业务跳转。iBatis充当持久化层组件,完成数据持久化操作。Spring框架组装应用程序、管理全局事务,实现系统服务端与JSTRP平台之间的数据交互。利用SSI框架简化应用程序组装,以即插即用方式管理全局应用程序,降低软件模块耦合度,减少系统开销、提高运行效率。
3 系统实现
系统分为客户端与服务端。客户端位于视图层,提供用户登录、产品编码、追溯查询等用户界面(UI)操作视图界面。界面中安放HTML、Struts等控件,利用DIV+CSS设置界面布局、控件样式,在工程目录CSS、JS文件中定义和编辑[13]。产品编码视图提供从产品列表中选择待编码项,追溯查询界面提供产品身份的查询、供应链追溯。客户端视图界面接收、绑定用户事件或消息,以Form表单、Ajax异步方式提交请求,展示结果数据。服务端包括EPC中间件、业务组件、数据交换接口、数据访问组件,分布于数据交换层、控制层、业务层、持久化层,各层仅含一个组件,组件内包含若干业务方法,避免组件过多引起服务端资源开销过大的问题。EPC中间件为服务端控制层控制组件,接收客户端请求、调用业务层组件进行处理,实现业务逻辑执行、控制和转移,为客户端用户呈现结果数据。业务层组件定义追溯编码、域名和分类查询、追溯查询等业务方法。持久化层组件执行系统用户登录验证SQL操作。数据交换层远程访问接口与JSTRP平台Web服务接口建立通信交互,查询JSTRP数据库。本设计中,服务端远程访问、数据解析、追溯码编码、追溯查询是系统实现的重点与关键。
3.1 远程访问
服务端系统执行追溯码编码、域名查询、产品识别、供应链追溯等业务时,须建立远程通信,通过服务端远程访问接口与JSTRP平台交互、数据交换。运用SOAP、WSDD、XML、UDDI发送基于HTTP协议的互联网访问请求,包括测试通信连接、发送远程请求、建立会话、接收返回结果。
JSTRP平台通过Web服务接口提供点对点访问与JSON数据传输。本设计采用自定义远程访问接口类RemoteAccess,类中定义重载方法getJSONData,被控制层组件所调用,实现与JSTRP平台的通信交换。步骤如下:1)在webservice包下创建RemoteAccess,getJSONData方法中创建HttpURLConnection实例对象与访问标识,根据JSTRP平台提供的Web服务接口,为HttpURLConnection对象设置请求访问地址URL、提交方式GET/POST、时延Timeout、协议头类型Content-Type、缓存UseCaches等特性,设置参数由客户端调用时传入,访问标识指示查询的数据表及数据项,包括域名、产品、分类等;2)将请求参数追加到URL,以POST方式提交,支持UTF-8编码传输,测试连接JSTRP服务端;3)通过getResponseCode获取服务端响应码,判断连接状态,响应码为1时表示建立连接;4)初次连接时,通过HttpURLConnection的getHeaderFields获取JSTRP服务端分配的客户端标识SessionId,存入系统服务端Cookie中;5)连接成功后,getJSONData接收JSTRP平台服务端发送的JSON打包数据,返回给控制层组件(EPC中间件)方法做后续解析处理。
3.2 数据解析
远程访问接口提取来自网络传输的JSON数据、不能直接被应用程序使用或作为视图界面的显示数据(文本、数字、符号等)。数据解析的目标是,将JSON数据转换为封装可视化数据的持久化对象。JSON数据为“键/值对”对象,包括JSONObject对象、JSONArray集合、JSONObject与JSONArray混合对象3种类型(图6)。对于JSONObject,JSON解析时通过JSONObject的getString(key)方法获取“键/值”对,封装成持久化对象VO;对于JSONArray,利用JSONObject和ArrayList将JSON数据转换为ArrayList
图6 数据解析的JSON数据格式
运用Google公司GSON开源库解析、处理JSON数据[14-15]。解析过程如下:1)在工程项目中导入GSON的jar文件,配置GSON解析环境,在action包下创建控制层组件类EPCAction作为EPC中间件,EPCAction内部定义getObjectFromJSON(jsonData)解析方法,jsonData是远程访问接口getJSONData方法获取的JSON参数,在getObjectFromJSON被调用时由控制层组件实际业务方法传入;2)getObjectFromJSON分析JSON类型,通过Gson实例方法fromJson直接转换,JSON参数类型为JSONObject时转换为VO对象,为JSONArray或JSONObject与JSONArray混合类型时,则转换为ArrayList
3.3 编码实现
用户登录客户端后进入编码视图,从视图产品列表中选择产品、提交编码请求,服务端执行编码业务,返回最终追溯码及密钥,读写器将追溯码写入EPC标签,同时将密钥呈现给客户端用户。实现方法如下:1)在控制层EPC中间件类EPCAction中定义getProducts、genTraceCode和encrypt三个方法,getProducts获取待编码产品信息并载入编码视图中,genTraceCode执行初始码编码及加密过程,encrypt执行加密程序,由Struts.xml框架控制执行;2)编码视图界面载入时,首先由getProducts调用RemoteAccess远程访问接口类的getJSONData方法,获取JSTRP平台回传的JSON数据,通过getObjectFromJSON解析方法转换为ArrayList
3.4 追溯查询
客户端追溯查询时提供产品身份查询、供应链追溯2个选择,服务端根据客户端传入读写器识读的标签追溯码,由EPCAction控制类来实现追溯码解密、远程访问查询、数据解析处理过程。具体实现步骤如下:1)在EPCAction类中定义query方法和decrypt方法,check为主控方法,用于接收请求、控制各层组件方法调用,执行追溯查询功能,decrypt被query方法所调用,用于解密追溯码,decrypt采用解密算法,还原初始码original;2)original数据返回给query,query分析数据并提取出供应商号、类别号、序列号3个分段码作为查询条件,调用访问接口getJSONData方法远程查询域名、类别、批次号信息,获得JSON数据;3)query利用3.3节中的getObjectFromJSON方法将JSON数据解析为productVo对象;4)在业务层中创建checkTrace业务方法,checkTrace被query调用时接收productVo参数,利用get方法获得域名domain、类别catagory、批次号batch,并依据选择将productVo转换为JSON格式数据,当选择产品身份查询时转换为{“domain”:domain, “catagory”:catagory, “batch”:batch},选择供应链追溯时,以当前供应商域名supplier作为key值,转换为{“supplier”:[domain, catagory, batch]};5)通过getJSONData访问JSTRP平台数据库、查询经营档案数据,得到JSON数据,JSON封装了追溯链中供应节点产品信息,由checkTrace调用getObjectFromJSON将其解析转换为追溯查询可视化数据,呈现给用户。
4 应用实例
本实例将农资编码及加密算法移植到系统服务端中,以JSTRP平台实际数据为样本,实现追溯码编码、标签生成及防伪追溯查询。图7为泰州市农资追溯查询系统,该系统提供农资追溯码编码和用户追溯查询界面。用户登录系统后进入农资列表界面,选择农资产品进行编码、生成追溯码,读写器与客户端串口连接时追溯码写入标签,实现了追溯码的唯一性和防伪性。读写器连接电脑并读取标签时,输入购买地点(末端追溯查询点)点击确定后,将以表格展示供应链追溯过程,显示品名、规格、检测质量、生产日期、有效期等详细信息。经系统测试,追溯码编码与追溯标签写入平均响应时间为5 s,防伪追溯查询信息准确率在97%以上。
图7 应用示例的界面
5 小结
本文研究并提出了农资编码、追溯码防伪加密方法,综合运用互联网、RFID、SSI框架、中间件等技术,研究数据访问、数据解析、编码实现、追溯查询等技术方法,提出轻量级应用系统解决方案,构建了基于EPC的农资追溯查询系统。经测试,系统能达到产品、质量与责任的追溯目标。该方案为供应链产品识别、流向追踪、防伪查询溯源提供了有效途径,对农资安全管理具有现实意义和参考价值。由于农资安全管理面向多部门、多主体及用户,涉及供应链上下游管理控制点,所需的防伪溯源信息仍难以脱离网络平台数据库,这与降低依赖专业数据库的现实需求相矛盾。利用不同异构业务平台,通过平台相互集成与共享手段方法来为各类用户提供供应链环节实时更新数据,以解决实际应用问题,将是今后研究的着力点。