毛 林, 程 濤, 成維莉, 劉 凱, 王清輝
(1.江蘇省泰州市農業物聯網工程技術中心,江蘇 泰州225300;2.江蘇農牧科技職業學院,江蘇 泰州225300)
食品安全問題是全社會關注的焦點,農產品質量安全為食品安全的基礎,可追溯制度建立是農產品質量安全管理的最有力手段。可追溯系統強調農產品生產、儲運和銷售整個過程的質量溯源與全程監管,建立和實行農產品追溯制度,及時發現并召回危害健康的農產品,實施整改、懲罰措施,強化產業鏈上各企業責任,保障食品安全性[1]。在國外,歐盟、美國等相繼頒布食品安全相關法案并建立主要應用于畜牧產品的可追溯系統,強制實施畜禽、肉制品追溯制度[1-2]。國內,自頒布《食品安全法》、《農產品質量安全法》等食品安全法律法規以來,強化了食品安全監管力度,確保了安全監管整體效能[3]。中國標準化研究院中國物品編碼中心多年致力于“中國條碼推進工程”在食品溯源中的應用[4]。國內開展可追溯系統研究至今,各省市相繼開發了本區域應用的農產品質量安全追溯系統[5-11],對農產品信息獲知、農產品產地源頭的定位更加快速和便利,同時可準確追溯到危害發生的根源[1]。其中,國內最具影響的可追溯系統包括北京市農業局的食用農產品質量安全追溯系統、農業部的肉牛生產全程質量安全可追溯體系等[4],主要實現了以網站、短信、電話、觸摸屏方式進行的查詢追溯,但針對智能手機的查詢追溯系統的研究甚少[12]。然而消費者購買農產品時,希望能以最快捷方式通過隨身智能手機掃描一下產品條碼,在第一時間查詢獲知農產品信息,完成快速追溯,及時避免危害事件發生。因此,農產品質量追溯智能終端系統的構建和應用具有重要的研究意義。本研究結合農產品質量安全追溯管理體系研究與試點項目——農產品質量安全追溯平臺JS_APQT,對智能終端追溯業務流程與系統架構進行設計,重點研究手機端QR 二維碼識讀、譯碼、通信端口與服務端數據交換接口關鍵技術的實現方法,提出基于Android 手機的農產品質量追溯智能終端解決方案。
JS_APQT 平臺包括:公共服務平臺、數據管理中心、系統管理中心、政府監管中心、農產品基地追溯系統、質量安全檢測系統(第三方系統)及農藥殘留檢測設備集成模塊、智能終端數據交換接口與基礎設施(硬件、軟件支撐)業務模塊,如圖1 所示。JS_APQT核心業務流程為生產經營主體備案、生產檔案填寫、產地準出檢測、追溯標識打印與張貼、生產檔案完善、動態監管。JS_APQT 通過業務流程,完成生產記錄存儲,實現產品流向追蹤及儲運信息查詢,實施對農產品生產、加工、流通、銷售全過程質量安全的全程可追溯監管(圖2)。在任何時刻、任何地點,任何用戶可通過網絡登錄平臺查詢產品信息,進行農產品質量溯源,行使消費者知情權;監管機構能準確掌握實時的農產品質量安全狀況,獲取相關信息,對問題產品可及時召回、采取處罰措施[2]。

圖1 JS_APQT 平臺業務模塊Fig.1 JS_APQT platform business modules
農產品追溯碼是農產品終端銷售時承載追溯信息、直接面對展現給消費者的統一代碼[13]。JS_APQT 平臺中,農產品追溯碼按類別分成種植業追溯碼、養殖業追溯碼兩大類。以種植業為例,農產品追溯碼由產地碼、產品信息碼兩部分構成,共29 位數字(圖3)。產地編碼為農產品生產基地歸屬地的身份編碼,由行政區劃+鄉鎮(街道)+村(社區)+產地分類+產地代碼構成。根據農業部NY/T 1430-2007《農產品產地編碼規則》標準[14],行政區劃為6位數字,鄉鎮(街道)為3 位,村(社區)為3 位,產地分類為5 位,產地代碼為3 位,共計20 位;產品信息碼為9 位,由產品生產檔案號+采收批次號組成。生產檔案號包括產品備案號3 位,年份2 位與生產批次1 位,共6 位,采收批次號可按3 位的順序號或時間間隔數來表示,其中,產品備案號第1 位代表大類標識,0 ~2 為種植業農產品。
農產品標識碼是農產品質量追溯成功的關鍵,分一維碼和二維碼。JS_APQT 平臺采用QR 條碼數字編碼規則,QR 條碼承載信息量大、存儲空間小、容錯強、可靠性高、高速全方位識讀,支持多種符號、漢字的編碼,即使局部受損仍可識讀完整信息,最適合農產品追溯系統[15]。

圖2 JS_APQT 平臺追溯業務流程Fig.2 Tracing business processes of JS_APQT platform

圖3 農產品追溯碼結構Fig.3 Tracing code structure of agricultural product
Android 嵌入式系統為智能終端主流操作系統之一,是一個基于Linux 的半開放原始碼作業系統,主要用于智能手機,因其開放性、便于開發的優勢廣受歡迎,Android 手機是目前主流的、應用最廣的智能手機之一。本研究構建基于Android 手機追溯的智能終端系統。
手機客戶端的數據來源由服務器接口提供,客戶端發送農產品追溯碼,查詢產品信息、追溯的訪問請求經運營商網絡提交至服務器端,業務流程見圖4。本系統中,農產品二維碼是關聯到服務端后臺數據庫的。當手機手動輸入追溯碼或掃描產品二維碼經譯碼獲得追溯碼時,首先在Android 智能端通信接口測試系統服務端相連接,若連接成功,訪問系統服務端,將追溯碼發送到系統服務端,并通過數據交換接口接受追溯碼,通過相關業務邏輯到數據庫中查詢相關的農產品控制信息,再將這些信息轉換成一種特定數據交換格式的數據發回到手機端。手機端驗證來自系統服務端的連接,若連接成功,將接受數據解析成手機支持的數據格式,通過操作系統適配器將信息顯示到手機頁面上[16]。
系統架構是基于C/S 的三層結構,即Android 手機客戶層、服務層以及通信鏈路層(無線網絡)(圖5)。手機端內置的Android 系統、移動網絡、工具軟件是手機應用的支撐平臺,手機系統因受到硬件資源的限制[17],僅適合滿足輕量級的應用需求,在Android 手機端直接進行條碼識讀、譯碼,占用資源小、計算要求低,可完全滿足手機性能要求,無需通過訪問遠程服務器。服務層(JS_APQT 平臺)有強大的數據處理、復雜運算、存儲能力等硬件資源條件,承擔海量的農產品控制信息存儲和復雜的數據訪問業務處理,在服務端部署數據交換接口,滿足手機應用需求。

圖4 系統業務流程Fig.4 System work flow

圖5 系統架構Fig.5 System architecture
系統由手機客戶端子系統與服務端子系統兩大部分構成,客戶端子系統包括QR 條碼識讀功能組件、譯碼功能組件、通信接口組件。QR條碼識讀組件對條碼標簽進行拍碼、生成二維碼圖像文件、存儲二維碼圖像文件。譯碼功能組件讀取符號圖像文件,轉換為數字模塊矩陣,識讀格式信息并檢測糾錯,恢復數據追溯碼。通信接口組件測試手機網絡連接,以主動模式向遠程服務器發送請求,接收服務器返回的數據。服務端子系統包括數據交換接口功能組件、業務邏輯組件、數據訪問組件。數據交換接口接收客戶端請求,調用業務邏輯組件、數據訪問組件,查詢數據庫,返回給客戶端。本研究中,智能終端追溯的關鍵是條碼識讀、譯碼、追溯查詢通信、數據交換的實現。
Android 手機端功能軟件是基于Eclipse 工具、Android 包ADT 與第三方開源庫設計實現的。本研究選擇Eclipse3.6+Android2.3.1+ADT18.0.0+Zxing,在Eclipse 中導入Android2.3.1、ADT18.0.0、Zxing,部署Android 開發環境。Eclipse 為面向Android 的集成開發環境,ADT 為Android 底層支持工具包,提供UI、接口、網絡通信、數據庫、公共工具類服務。Zxing(Horse Crossing)為Google 的一個開源項目半成品框架,支持對QR、Data Matrix、UPC 各種條碼的圖像捕捉、編碼和譯碼[18],便于在此框架進行二次開發。
客戶端子系統運用Android 事件處理機制進行條碼識讀、譯碼、數據通信的業務處理,它包括基于監聽的事件處理和消息處理等方式。事件監聽處理模型通過事件處理器類實現,包含4 個對象:事件源、事件、事件監聽器、事件處理器。監聽處理機制是:手機界面組件作為事件源,手機用戶觸發組件時產生事件對象,事件對象作為參數傳遞到事件源的事件監聽器,事件監聽器調用事件處理器[19],完成一次業務處理。為高效地進行手機端條碼識讀、譯碼與追溯查詢通信業務處理,事件處理器類Activity類中通過onCreate 方法向手機用戶呈現初始操作界面,界面組件(按鈕、菜單項等)作為事件源綁定到事件監聽器OnClickListener,OnClickListener 監聽到用戶操作事件,調用事件處理器onClick 處理事件,實現相關業務操作。可返回呈現結果界面給用戶。不同的Activity 可以完成不同類型的交互,在Activity 定義Intent 對象為用戶呈現下一步應用狀態。Intent 承擔傳遞要啟動下一個Activity 的“信使”,Intent 可避免組件耦合、提高系統響應速度[19]。條碼識讀、譯碼、數據通信的具體實現過程分述如下。
3.2.1 條碼識讀 在Eclipse 工作區中的qr.google.zxing 包下創建CaptureActivity 監聽器類,在此類創建事件監聽器對象和事件處理器方法。條碼識讀步驟是:(1)點擊手機界面上的二維碼掃描按鈕,打開手機攝像頭;(2)對準產品條碼標簽拍照。實現過程如下:
1)在CaptureActivity 中創建并實現onCreate(Bundle savedInstanceState)方法,onCreate 方法中使用CameraManager.init(getApplication())來初始化手機攝像頭,onCreate 調用setContentView()、find-ViewById()方法控制界面布局、加入按鈕等組件。當啟動CaptureActivity 后,onCreate 被回調,呈現手機操作界面。
2)定義事件監聽器OnClickListener,為二維碼掃描按鈕綁定OnClickListener 對象,監聽用戶動作,在方法中創建Intent 對象,Intent 對象啟動譯碼監聽器類QRcoderesult 的意圖,以qrcode 鍵值保存,創建startActivity(intent)方法傳遞給QRcoderesult 啟動執行譯碼業務。用戶按下二維碼掃描按鈕后,觸發on-Click 事件,手機屏幕上呈現攝像鏡頭,鏡頭對準條碼進行拍照,識讀條碼圖像后,呈現條碼圖像,并將啟動信息提交到譯碼監聽器類,通知做好譯碼準備,提高了系統響應速度。
3.2.2 條碼譯碼 譯碼是編碼的逆過程,是將手機端攝取的條碼圖像解析成追溯碼,它是實現提交查詢追溯的前提。本系統采用QR 條碼的數字譯碼方法獲得追溯碼。譯碼步驟[15]是:(1)定位、獲取符號圖像,轉換模塊為0、1 矩陣;(2)識讀格式信息,去除掩模圖形,糾錯格式信息模塊,識別糾錯等級與掩模圖形參考;(3)識讀符號版本;(4)用掩模圖形或編碼區位圖消除掩模;(5)按照模塊排列規則,識讀符號字符,恢復信息的數據與糾錯碼字;(6)用糾錯碼字檢測錯誤糾錯;(7)數據碼字按模式和字符計數指示符分為多個模式段;(8)按照采用模式譯碼獲得以數據字符表示的追溯碼。
譯碼前首先要啟動一個譯碼的監聽器類,獲取啟動譯碼的意圖,依據意圖調用android 譯碼業務類android.os.Bundle.getString 執行并完成譯碼,android.os.Bundle 負責譯碼。實現過程是:(1)創建譯碼監聽器類QRcoderesult,在Qrcoderesult 中定義實現onCreate(Bundle savedInstanceState)方法,監聽啟動意圖。(2)Qrcoderesult 啟動意圖后,讀取Intent 中啟動譯碼意圖的信息,存入Bundle,以便使用譯碼工具android.os.Bundle;(3)調用執行android.os.Bundle 的getString 業務方法,返回產品條碼對應的追溯碼。
3.2.3 手機端通信 手機端通信端口負責與遠程服務器交互,包括測試手機網絡連接、向服務端發送請求、接收返回結果。在Qrcoderesult 的onCreate 中創建getInfoByQrcode()方法,實現手機端通信端口,過程是:(1)調用android.net.ConnectivityManager 測試手機連接網絡,支持WiFi 等網絡;(2)設置訪問服務端網絡資源地址URL,http://IP 地址/mob/prod_castBack.action,檢查URL 是否有效;(3)通過URL 的openConnection()方法測試HttpURLConnection,HttpURLConnection 獲取連接到服務端的響應碼;(4)響應碼有效時,追溯碼參數鍵/值對轉換成網絡傳輸格式HTTP.UTF_8 后,追加到URL,用HttpPost 裝載服務端URL,由HttpClient 提交到服務器;(5)HttpResponse 獲取返回的查詢追溯信息;(6)EntityUtils 經數據轉換后,按照生產環節、農產品認證、監測信息、田間作業進行分類,輸出到手機。主要代碼如下:
private void getInfoByQrcode(){
WebData wd = new WebData();
ConnectionDetector cd = new ConnectionDetector(this);
returnJsonStr = wd.getJsonData(Sysconfig.URL_GET_RETROSPECT_INFO,
Sysconfig.KEY_GET_RETROSPECT_INFO,qr-Code);
HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost(url);
ArrayList<NameValuePair>params = new Array-List<NameValuePair>();
params.add(new BasicNameValuePair(key,value));
post.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
HttpResponse response = httpclient.execute(post);
String inf = EntityUtils.toString(response.getEntity());
}
數據交換接口是服務端與手機端應用進行交互的關鍵組件。采用基于“消息或請求服務發現”的數據交換處理機制,以減輕、消除系統瓶頸,保證通信穩定性與可靠性[20]。Web Service 將服務端應用程序對外發布為開放式服務(接口),通過此服務在網絡上共享開放出來的功能。通過XML、SOAP、WSDL、UDDL 等Web 服務語言來發現、描述和訪問Web Service 服務接口。Web Service 開發服務端交換接口的過程是:
1)首先在JS_APQT 工程包下創建Aprod-CheckService 類,在類中定義、編寫getNodeBase-ByTracId(String aprodTracId)方法,該方法作用是查詢農產品生產基地信息、認證信息、檢測信息、田間農事信息。
2)在WEB-INF 目錄下創建deploy.wsdd 文件,使用wsdd 方法定制發布Web Service,配置如下:service 代表WebService 服務,AprodCheck 為Web-Service 名稱;provider 指明WebService 類型是RPC,parameter 的className 參數值為WebService 的路徑,allowedMethods 指明為外部接口,被客戶端調用。
<deployment xmlns =" http://xml.apache.org/axis/wsdd/" xmlns:java=" http://xml.apache.org/axis/wsdd/providers/java">
<service name="AprodCheck" provider="java:RPC">
<parameter name=" className" value=" com.apqt.pbts.webservice.AprodCheckService"/>
<parameter name =" allowedMethods" value ="* "/>
</service>
</deployment>
3)使用第三方開源包axis 的AdminClient 工具類發布WebService。運行cmd,選擇目錄C:tomcat6.0webappsAxisWebServiceWEB-INF>,運行命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd 后,出現Processing file deploy.wsdd <Admin>Done processing</Admin>,生成server-config.wsdd。
4)在IE 地址欄輸入http://localhost:8080/AxisWebService/servlet/AxisServlet,顯示wsdl 文檔,發布成功。
數據交換接口的getNodeBaseByTracId 方法接受手機端遠程消息請求、做出響應,依據追溯碼內容調用業務邏輯層Biz 和數據層DAO,查詢數據庫服務器中相應農產品信息,將信息轉換成JSON 格式[21]的數據,發送到用戶手機端。JSON(JavaScript Object Notation),是一種輕量級的數據交換格式,能高效地實現數據交互。用jQuery 來解析JSON 數據,屏蔽DOM 解析XML 文件復雜性,縮短追溯數據傳輸時間,優化數據傳輸效率。
本例中,選擇JS_APQT 平臺上實際注冊種植業用戶的產品QR 條碼(圖6),通過手機進行測試,查詢追溯農產品控制信息。過程是:(1)在客戶端界面選擇二維碼掃描;(2)手機攝像鏡頭對準并掃描二維碼;(3)手機端譯碼模塊解析QR 條碼,獲得追溯碼為32092410621082000001101131001;(4)向系統服務端發送經格式轉換后的追溯碼;(5)系統服務器交換接口讀取追溯碼,通過業務邏輯查詢數據庫,獲得農產品質量控制信息,經過處理,返回手機端。(6)手機得到數據后進行解析轉換,顯示在手機端界面上。通過追溯獲得的質量控制信息包括:生產信息、監測信息、認證信息、作業信息。能夠達到主體、產品、過程三個級別的追溯精度[22]。

圖6 農產品QR 條碼標簽Fig.6 Agricultural product QR code tag
本研究以農產品質量安全追溯智能終端為對象,結合農產品質量追溯平臺JS_APQT 架構和編碼方式,采用Eclipse、Android、Web Service 等技術,提出了面向Android 手機的農產品質量追溯智能終端解決方案。與現有系統的短信、電話、觸摸屏方式相比,本方案以智能終端這種快捷、新穎查詢追溯形式建立了多層次、多角色的質量安全控制追溯體系,查詢精準度高達100%。通過本方案可獲得農產品成長檔案、驗明農產品真實身份,以滿足人們“明白消費、放心消費”的基本需求,提升農產品質量跟蹤溯源的效能,為政府動態監管、企業構筑質量控制信息平臺提供更高效、優質的服務,達到質量可查詢、產品可溯源、事故可預警的目的。目前,條碼標簽成本低廉、印制方便,被廣為接受,但容易被非法復制、偽造,FRID 射頻卡雖不易仿造,但FRID 卡識讀器因成本昂貴而很難被普通消費者所接受,這會增加企業成本、經營風險,因此追溯防偽驗證是下一步研究并解決的問題。
[1] 余 華,吳振華.農產品追溯碼的編碼研究[J].中國農業科學,2011,44(23):4801-4806.
[2] 涂傳清,王愛虎.我國農產品質量安全追溯體系建設中存在的問題與對策[J].農機化研究,2011(3):16-20.
[3] 韓 楊,李成貴.中國食品安全的過去、現在與未來[J].經濟研究參考,2011(45):2-12.
[4] 金海水,劉俊華.農產品質量快速溯源系統的現狀、問題及對策[J].商業時代,2009(25):66-67.
[5] 昝林森,鄭同超,申光磊,等.牛肉安全生產加工全過程質量跟蹤與追溯系統研發[J].中國農業科學,2006,39 (10):2083-2088.
[6] 朱海鵬.糧食龍頭企業質量安全可追溯系統研究與實現[D].北京:中國農業科學院,2007.
[7] 楊信廷,錢建平,孫傳恒,等.蔬菜安全生產管理及質量追溯系統設計與實現[J].農業工程學報,2008,24(3):162-166.
[8] 劉雪梅,章海亮,劉燕德.農產品質量安全可追溯系統建設探析[J].湖北農業科學,2009,48(8):2001-2003.
[9] 姜利紅,潘迎捷,謝 晶.基于HACCP 的豬肉安全生產可追溯系統溯源信息的確定[J].中國食品學報,2009,9(2):87-91.
[10] 張 可,柴 毅,翁道磊,等.豬肉生產加工信息追溯系統的分析和設計[J].農業工程學報,2010,26(4):332-339.
[11] 馬漢武,王善霞.基于食品供應鏈的肉類食品可追溯性技術的研究[J].食品工業科技,2006,27(4):24-26.
[12] 趙 麗,邢 斌,李文勇,等.基于手機二維碼識別的農產品質量安全追溯系統[J].農業機械學報,2012,43(2):124-128.
[13] NY/T 1431-2007 農產品追溯編碼導則[S].[14] NY/T 1430-2007 農產品產地編碼規則[S].
[15] 王永紅.基于農產品質量安全追溯的QR Code 編碼應用與實現[J].湖北農業科學,2012(23):309-313.
[16] 尚明華,秦磊磊,王風云,等.基于Android 智能手機的小麥生產風險信息采集系統[J].農業工程學報,2011(5):178-182.
[17] 朱信忠,許周旺,徐慧英.移動消息中間件MobileMOM 的研究與設計[J].計算機應用研究,2006(3):242-244.
[18] ZXING DISCUSSION GROUP.Zxing ("Zebra Crossing")[EB/OL].(2012-11-23)[2013-05-24].http://code.google.com/p/zxing.
[19] 王向輝,張國印,沈 潔.Android 應用程序開發[M].北京:清華大學出版社,2010:120-209.
[20] 楊西貝.Java 消息服務機制的研究與應用[D].南京:南京理工大學,2012.
[21] 屈 展,李 嬋.JSON 在Ajax 數據交換中的應用研究[J].西安石油大學學報:自然科學版,2011,26(1):96-98.
[22] 陳 松,陳 瓊,陳永峰,等.廈門市農產品質量安全追溯模式研究[J].現代農業科技,2013(2):282-287.