基于Python的QR二维码的生成与识别程序

Hostess

发布日期: 2019-02-11 08:34:54 浏览量: 483
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

摘 要

进入二十一世纪之后,高新技术产业得到了极其迅速的发展。计算机、互联网、物联网、云计算等领域的发展,使得整个社会的信息化程度极大提高。随着技术的不断成熟,目前的一维条形码已逐渐向二维码过渡。本课题即是南京苏宁易购电子商务有限公司为方便进行固定资产管理和提高资产清点速度而进行的。

本文详细阐述了一种使用QR二维码协助进行资产管理的Python程序设计开发过程。通过本程序,用户可对需要编码或解码的资产信息执行编、解码操作,并生成相应的QR二维码图像或获得原始编码信息,所有生成的QR二维码图像以PNG文件格式进行储存。在用户界面方面,本课题通过Web.py框架实现了二维码的在线编解码功能,用户可通过网页进行相关操作。

本课题另外提供了单笔资料编码及批量资料编码功能,方便用户针对不同的使用情况进行编码操作,所生成的QR二维码可以应用于Android和IOS系统,使用手机软件扫描即可获得原始编码的资产信息。

关键词:QR二维码 Python 资产管理 网页

Abstract

When entering 21 Century, the high-tech industry has developed rapidly. With the development of computer sciences, internet, internet of things, cloud computing, etc., the informatization level of our society is greatly improved. Now, the trend of replacement of traditional 1D bar code with 2D code is becoming increasingly evident. This project is for asset management and speeding up asset inventory implemented by Suning Yigou Ecommerce Ltd.

This paper describes a development process which uses QR two-dimensional code to assist asset management by Python. Through this program, a user can perform coding, decoding operation on his needs to encode or decode the asset information, and generate the corresponding QR two-dimensional code image or obtain the original code information, all QR code image which is generated by the program is stored with PNG file format. In the user interface, this project uses the Web.py framework to complete the online two-dimensional code encoding and decoding feature, users can manipulate on the Webpage.

This task provides mass generation and one time generation. The generated QR code image is accussable on Android and IOS system. When scanned by mobile phone apps, then the asset information will show up.

Key Words: QR code; Python; Assets management; Web site

第一章 绪论

1.1 课题背景

在公司企业的管理中,除了员工管理,公司的资产管理业非常重要。良好的资产管理,可以有效地降低企业成本,准确反映企业的经营成果和业绩,杜绝腐败现象;反之,则会造成资源利用率低,甚至资产丢失,给公司和企业造成经济损失。

本人在南京苏宁易购电子商务有限公司IT运营总部实习期间,需要处理关于IDC机房资产的管理问题。为防止资产丢失和损坏,提高资产的使用率,部门领导要求每月进行一次资产清点,以便及时掌握机房的资产信息,为购买新设备、淘汰旧设备和资源调度提供依据。每月资产清点时,都要到机房里查看每个设备的铭牌,登记信息,任务相当繁琐,尤其是对于大型的设备,非常不便。因此领导考虑以后逐渐采用二维码方式进行资产管理,以提高清点的速度,减轻人工劳动强度。拟将资产数据库中的资产记录编入二维码,贴于设备的易见位置。这样,在进行资产清点的时候,可以使用带存储功能的扫码枪,将机房中的需要清点的资产全部扫描一遍,就可以很容易地得到所有的资产信息,并且可以将采集到的信息直接数字化,方便与资产管理数据库进行核对。这样一来,既可以快速、有效地了解到资产动态,又减轻了工作人员的负担。

本课题的主要任务就是编写生成QR二维码的程序,将IDC机房内的服务器、路由器等资产信息生成QR二维码,并设计网页,通过网页的形式提供生成QR二维码的功能。网页上提供两种生成QR二维码的方式:单次录入和批量生成,以及解码功能:上传QR二维码图像,解码后显示其中包含的信息。本课题可以使得资产清点工作变得更加方便快捷,提高资产管理的效率。

1.2 研究现状

进入二十一世纪之后,高新技术产业得到了极其迅速的发展。计算机、互联网、物联网、云计算等领域的发展,使得整个社会的信息化程度极大提高。在计算机还未普及的时候,公司对于资产的管理主要通过纸质媒介记录,既不方便查阅,也不方便保存和更改。后来,计算机走进人们的生活,公司也开始使用相应的数据库之类的软件进行资产管理,但对于资产的频繁变动和更改等问题,仍显乏力。

一维条形码的出现使得这种状况得到了改善。一维条形码是将宽度不等的多个黑条和白条,按照一定的编码规则排列,用以表达一组信息的图形标识符[1]。一维条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到了广泛的应用。当公司企业使用一维条形码进行资产管理时,只需将资产进行编号,把资产编号编码进条形码,打印成标签贴于资产上即可。在清点资产时,使用扫码枪扫描一维条形码标签后就可以得到条形码中的资产编号,然后根据该资产编号就能在公司的资产数据库中查询到该资产的详细信息。

随着社会的发展,信息量的暴增,人们的需求激增,一维条码已经无法满足需求,因此出现了二维码。相比于一维条码,二维码能存储更多的信息,可以记载更复杂的数据,比如图片、网络链接等。二维码分为堆叠式二维码和矩阵式二维码两种。堆叠式二维码是在一维条形码的基础上发展而来的,堆叠式二维码是通过将多个一维码在纵向进行堆叠而产生的,代表码制为:Code 16K、Code 49、PDF417等。矩阵式二维码是在一个矩形空间内通过在不同位置放置黑、白像素进行编码,代表码制有: Aztec、Maxi Code、QR Code、 Data Matrix等。在二维条码的众多码制中,目前应用最广泛,最常见的是Quick Response Code,即众所周知的QR二维码。

在我国,QR二维码的使用正处于发展阶段,在工业、媒体、营销、物联网等领域,都得到了较为广泛的应用。

QR二维码是由日本丰田子公司DENSO WAVE公司于1994年发明的一种二维条形码[2]。QR是Quick Response的简称,意为快速响应。由此可见QR码的特性之一就是扫描读取速度快。DENSO WAVE公司开发QR二维码的最初目的是为了对生产车间中的汽车零配件进行管理和跟踪,这也是对资产进行管理的一种形式,因此,使用QR二维码进行资产管理是有历史依据的。

图1.1展示了一个包含“hello world!”的QR二维码图形:

1.3 工作环境和背景

在苏宁云商集团股份有限公司旗下的购物平台南京苏宁易购电子商务有限公司实习期间,隶属IT基础运维部门的IDC机房监控组,领导就安排部门的实习生相互合作,完成相关任务。因为考虑到使用的便捷性,还要求整个项目要能以网页的形式提供服务,要具有批量生成和单次生成两个功能,如果有可能的话再加上一个简单的用于测试的解码功能。我主要负责将信息编入二维码并存储二维码图像的功能,其他部分,例如,与资产数据库交互,发布到服务器上运行等任务,交由其他同事负责。

程序的编写需要有特定的开发环境,包括操作系统环境和编程语言环境和编程工具。因此,在编写程序之前需要首先确定课题的开发环境。

1.3.1 操作系统

由于运维部门的日常工作是负责维护服务器的正常运行,平时的工作环境都是Linux操作系统,而且我个人也比较喜欢Linux操作系统,希望能在这方面学得一技之长,平时一直使用Linux的Ubuntu Kylin14.04 64Bit发行版操作系统作为主用系统。因此,本课题的所有程序代码均在Ubuntu Kylin14.04 64位操作系统下编写完成。

1.3.2 编程语言

网页采用Html(HyperText Markup Language)语言编写,版本Html 5。

由于整个运维部门的运维脚本正在准备使用Python语言进行改写,以后的主用脚本也将是Python。Python是一种面向对象的脚本语言,1991年由荷兰人Guido van Rossum首次公开发行。Python具有简洁的语法规则,易读易改,扩展性很好。并且我之前也学习过一些Python语言,对Python有一些基础,因此,综合考虑,决定选用Python语言来编写程序。在本课题中,使用的Python版本为2.7.6,Ubuntu Kylin14.04 64位操作系统自带,无需额外安装。

1.3.3 编码库和解码库

本课题由于侧重于应用层次,因此决定选择已有的QR二维码的编码库和解码库。Python语言具有非常良好的扩展性,有非常丰富的库可以利用。在Python的官方包管理网站,https://pypi.python.org/pypi 上可以找到各种各样的库。经过查找和了解,确定使用qrcode和zbar两个Python库完成QR二维码的编码和解码工作。课题中使用到的Qrcode版本为4.0.4,zbar版本为0.10 。由于系统默认不带有这两个库,因此需要自行安装。

库模块的安装步骤为:

  • 先安装Python的包管理程序pip。在终端命令行下键入命令进行安装:
  1. $ sudo apt-get install python-pip
  • 通过pip安装qrcode和zbar:
  1. $ sudo pip install qrcode zbar
  • 安装好包之后,在python程序中使用时只需import qrcode zbar即可

1.3.4 网页web框架

课题使用网页形式来表现程序的功能,那么HTTP服务器是不可少的。由于本课题规模较小,处于开发阶段,离真正放到服务器上运行还有一段距离,因此决定选用Web框架自带的开发服务器运行和调试,就不再安装Apache、Nginx等专业的HTTP服务器了。

在Web框架的选择上,我选用了web.py框架。Web.py是一个基于Python语言的轻量级框架,相比于其他框架具有简单易用,扩展简单的优点。课题中使用的web.py版本为0.37。由于该框架系统默认不安装,因此需要另外安装。安装过程类似于qrcode和zbar,在命令行键入命令:

  1. $ sudo pip install web.py

即可成功安装web.py模块,当需要在程序中使用时,只需import web即可使用web.py模块的相关功能。

1.4 主要工作和内容安排

本文的主要内容包括:

  • QR二维码的由来和优点

    介绍QR二维码的由来,发展过程以及相比于其他二维码的优点等。

  • QR二维码的结构

    介绍QR二维码的图形构成,包含的内容,特性和规范标准。

  • 建立网页

    以网页的形式提供将资产信息生成QR二维码的功能,用户在网页上提交资产信息并提交,网页将信息交给后台程序处理并返回结果。

  • Python后台程序

    用户通过网页提交的信息从前端传递给后台处理程序,后台程序根据资产信息生成对应的二维码并保存到指定位置。

    本文的内容安排:

    • 第二章主要简介QR二维码的特点和格式规范等内容

    • 第三章主要进程程序设计,包括前端网页和后台程序的功能,以及整个程序的运行流程

    • 第四章主要是对整个程序的分析,展示程序的运行结果,对过程中出现的错误进行分析和总结

    • 第五章是总结与展望,主要对全文所做的工作进行了总结

第二章 QR二维码概述

QR二维码专利的持有者,DENSO WAVE公司公开了QR二维码的规格,允许所有人免费使用QR二维码,持有专利权但并不执行。这是使得QR二维码得到广泛应用的一大前提,使得使用者节省了许多专利使用费用。

2.1 QR二维码的结构

2.1.1 相关名词概念

QR二维码呈正方形,通常由许多更小的黑色和白色的正方形组成,正方形的最小单位叫一个Module。

QR二维码本身有两个相关的指标:版本(Version)和纠错等级(Error Correction Code Level)。

版本是指QR二维码的尺寸,由多少Module组成。版本1是21*21的正方形(单位Module),每增加一个版本,正方形的边长就会增加4个Module,公式是:

其中,S表示QR二维码的边长,单位为Module,V为版本数。

根据QR二维码的ISO国际标准,最高版本为40,所以QR二维码的最大尺寸是177*177的正方形。

QR二维码具有一定的纠错能力,当QR二维码图像被部分遮挡时,仍然能够被正确地读取。因此,在营销行业,经常能见到有些QR二维码被图标遮挡住,但被扫描时仍然能够被正确识别。纠错等级就是用来表征QR二维码可被遮挡的最大面积的指标。QR二维码有四种纠错等级:

  • L水平:约7%的字码可被修正

  • M水平:约15%的字码可被修正

  • Q水平:约25%的字码可被修正

  • H水平:约30%的字码可被修正

2.1.2 图像结构

QR二维码的图像结构分为两部分:功能图形和编码区域。功能图形包含:位置探测图形、位置探测图形分隔符、定位图形和校正图形[3]。编码区域包含:格式信息、版本信息、数据和纠错码。

位置探测图形分隔符用于将位置探测图形与其他区域分隔开来,使得扫描时便于检测。位置探测图形、定位图形、校正图形都是用来在扫描时确定编码区域位置的。位置探测图形是3个形似中文的“回”字的图形,位于整个QR二维码图形的左上角、右上角和左下角。位置探测图形的规格是确定的,在任何版本,任何大小的QR二维码中,都是7*7的正方形。

定位图形是临近二维码矩阵的上边和左边的两条由黑色和白色的module交叉排成的两条线,与位置探测图形最外层的黑边平齐。定位图形是为了防止在扫描二维码时,由于角度问题或者二维码表面不平时,扫描图形时发生读取错位。

校正图形形似位置探测图形,只是形状小了一号,中间的黑色区域是1*1的module。校正图形存在于version 2及更高版本,version 1中不存在,随着版本的增加,校正图形的数量也会相应地增加。校正图形和定位图形都是为了提高识别和读取精度的,防止在版本较大的时候无法读取识别二维码。

格式信息是15bit的二进制信息,分为2组存储,相互冗余。格式信息中的15位二进制信息中5bits是数据位,10bits是纠错码位。数据位中,前2个bits代表使用哪种纠错等级,后3个bits表示使用何种掩码。纠错等级分为L、M、Q、H,四种,正好可以由2位二进制数表示,同样,8种掩码使用3位二进制数代表。10个bits的纠错码是通过前5位的数据位进行BCH算法得到的BCH纠错码。

版本信息中存储的是QR二维码的版本号,只有version 7及更高版本才存在版本信息。版本信息由6bits的版本号和12bits的纠错码组成,共18bits。除去功能图形和格式、版本信息,QR二维码中剩下的部分用来放置数据码和纠错码。

在生成最终的QR二维码之前还要进行添加掩码的操作。掩码是为了使得二维码图形中的黑白module能够均匀分布,防止过多的黑色或白色module连在一起导致识别困难。掩码图形与数据区进行XOR异或运算,不影响功能图形。

2.1.3 特点

QR二维码具有超高速识读、360°全方位识读、支持多种编码格式、抗扭曲、可纠错等特点,使得QR二维码优于其他形式的二维条码,并得以广泛地应用。除此之外,QR二维码还可以进行较高程度的美化,非常适合于市场营销,产品推广,使顾客能够得到很好的视觉欣赏感受,使产品更受关注。

2.2 QR二维码的编解码过程简介

2.2.1 编码过程

  • 步骤1:得到需要进行编码的数据Data

  • 步骤2:分析Data的数据长度和字符集,选择需要纠错等级ECL和版本号Version,如果不指定Version,则根据Data的数据长度选择最适合的版本Version

  • 步骤3:将Data按照相应的字符集转换成比特流形式,经过一些细节操作后形成8位一组的数据码字序列Data Stream

  • 步骤4:根据所选择的ECL对Data Stream进行分块,在每一块内应用RS算法(Reed-Solomon error correction,里德-所罗门纠错算法),生成纠错码字序列EC Stream

  • 步骤5:将Data Stream和EC Stream进行穿插放置,得到两者的混合码字序列,就是要写入到QR二维码图形中的数据区的数据

  • 步骤6:根据版本Version选择将功能图形放到空白矩阵中,包括位置探测图形、位置探测图形分隔符、定位图形、校正图形[3]。同时将数据和纠错码字按照黑色为1,白色为0的规则写入到矩阵中

  • 步骤7:为了防止黑色和白色的Module分布不均匀而导致扫描读取的难度增加,还要选择合适的掩码图形,将已经完成的QR矩阵和掩码图形进行异或操作,使得黑色和白色的Module在分布上趋于均匀

  • 步骤8:最后,将格式信息和版本信息放入矩阵中,QR二维码图形就完成了

2.2.2 解码过程

  • 步骤1:扫描图像,通过位置探测图形找到QR二维码的位置

  • 步骤2:读取QR二维码中的格式信息,得到纠错等级和使用的掩码代号

  • 步骤3:读取版本信息,获取该QR二维码所使用的版本

  • 步骤4:通过再次执行异或运算,去除掩码图形

  • 步骤5:在位置探测图形、定位图形、校正图形的帮助下,读取QR二维码数据区的内容,得到二进制的比特流

  • 步骤6:通过纠错算法检查是否有错,如果有错则根据纠错码字进行纠错,恢复真实数据

第三章 程序设计

整个课题的网页应用程序分为两部分,一部分是前端网页代码,第二部分是后端的Python处理代码。

网页应用的整体功能和流程如下图所示:

分为3个功能块,单次录入、批量生成和解码功能。每个功能使用同级的Div标签区分,通过<style>设置每个Div的位置和表现式样等属性。下面依次介绍前端程序和后端代码。

3.1 前端程序

前端的网页内容保存在index.html文件中,网页的式样也写在该文件中使用<style></style>标签对确定,不以单独的CSS文件指定网页元素的式样。前端网页如下图所示:

网页中,用黑色粗斜体表示的“单次录入”、“批量生成”和“解码”分别表示三个功能,每个功能区都是一个Div元素,通过Form表单提交输入的数据。“单次录入”是让使用者手动录入某个资产的相关信息,然后将这些信息编入QR二维码图形中。“批量生成”适用于需要批量生成资产对应的二维码的情况,只需上传资产列表文件,确定尺寸和纠错级别即可。这里的尺寸指的是生成的QR二维码的像素尺寸,html代码中对该选项进行了一些限制,防止由于生成的QR二维码图像太大导致页面崩溃或者响应时间过长等问题。

浏览器通过Http协议与服务器通信时,遵循Http协议定义的4种与服务器交互的基本方法,分别是GET,POST,PUT,DELETE。常用的是GET和POST方法,PUT和DELETE很少使用,因此不做讨论。GET方法用于发送请求,并从服务器获得数据,而POST方法用于在服务器上创建数据,即向服务器上传数据。使用GET方法提交的表单数据,请求的数据会附在URL之后,以问好“?”分割URL和传输数据,多个参数用与符号“&”连接。POST方法把提交的数据放置在是HTTP包的包体中,可以提交较大的数据,因此,向服务器上传文件的时候基本都使用POST方法。在网页上提供的三个功能中,由于“单次录入”需要发送的数据长度较短,因此使用GET方法;而“批量生成”和“解码”功能由于需要上传txt文件和图像文件,数据量较大,所以采用POST方法。

资产列表文件是类似于下图所示的结构:

资产列表文件中从左往右的各个字段代表的意思分别为:资产编号、资产名称、品牌、型号、SN(Serial Number)、使用部门、负责人。各字段之间使用制表符table分隔,每条记录对应一个资产。通常资产编号在公司的资产管理系统中,都是唯一的,因此,可以将资产编号作为生成的QR二维码的文件名,并保存。Index.html的代码如下:

  1. $def with(msg)
  2. <!DOCTYPE html>
  3. <html>
  4. <head>
  5. <title>苏宁易购</title>
  6. <meta content="text/html;charset=utf-8" http-equiv="content-type"></meta>
  7. <meta name="description" content="QR code"></meta>
  8. <link href="/static/favicon.ico" rel="shortcut icon" type="image/x-icon" />
  9. </head>
  10. <body>
  11. <div id="main">
  12. <div id="header">
  13. <a href="/"><img src="/static/suning_logo2.gif" alt="logo"></a>
  14. <div >
  15. <p>苏宁易购-IT运营总部</p>
  16. <p>服务器资产标签生成界面</p>
  17. </div>
  18. </div>
  19. <div id="code" >
  20. <div id="bat" >
  21. <label>批量生成</label>
  22. <form method="post" enctype="multipart/form-data" action="/qr" target="a">
  23. <div class="fixed"></div>
  24. <ul class="none">
  25. <li class="first">资产列表文件</li>
  26. <li class="second"><input type="file" name="chl" /></li>
  27. </ul>
  28. <ul class="none">
  29. <li class="first">尺寸</li>
  30. <li class="second">
  31. <select name="chs" class="listbox">
  32. <option value="120x120"></option>
  33. <option value="230x230" selected="selected"></option>
  34. <option value="350x350"></option>
  35. </select>
  36. </li>
  37. </ul>
  38. <div class="fixed"></div>
  39. <ul class="none">
  40. <li class="first">纠错级别</li>
  41. <li class="second">
  42. <select name="chld" class="listbox">
  43. <option value="L">L</option>
  44. <option value="M" selected="selected">M</option>
  45. <option value="Q">Q</option>
  46. <option value="H">H</option>
  47. </select>
  48. </li>
  49. </ul>
  50. <div class="fixed"></div>
  51. <ul class="none">
  52. <li class="first"></li>
  53. <li class="second">
  54. <input type="submit" value="批量生成 →" />
  55. </li>
  56. </ul>
  57. </form>
  58. </div>
  59. <div id="encode">
  60. <label> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;单次录入</label>
  61. <form method="get" action="/qr" target="a">
  62. 资产编号: <input type="text" name="Number" /></p>
  63. 资产名称: <input type="text" name="Name" /></p>
  64. 品牌: <input type="text" name="Brand" /></p>
  65. 型号: <input type="text" name="Type" /></p>
  66. Serial Number: <input type="text" name="SN" /></p>
  67. 使用部门: <input type="text" name="Department" /></p>
  68. 负责人: <input type="text" name="Head" /></p>
  69. <input type="submit" value="生成">
  70. </form>
  71. </div>
  72. <div id="decode">
  73. <label>解码&nbsp;</label>
  74. <form method="post" enctype="multipart/form-data" action="/decode">
  75. <input type="file" name="qrimg" /><br/>
  76. <input type="submit" value="解码"/>
  77. </form>
  78. <p>$msg</p>
  79. </div>
  80. </div>
  81. </div>
  82. </body>
  83. </html>

由于用于式样代码太长,并且不是主要关注点,因此,上述代码中将其省略,完整代码详见附件文件。

3.2 后端程序

后端程序使用Python的web.py框架编写,主程序为main.py,主要内容和类、函数定义如下图所示:

Main.py文件的主要代码如下:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import cStringIO
  4. import urllib
  5. import web
  6. import qrcode
  7. import zbar
  8. try:
  9. from PIL import Image
  10. except ImportError:
  11. import Image
  12. from lib.mime import ImageMIME
  13. from lib import charset
  14. class Index(object):
  15. """首页
  16. """
  17. def GET(self):
  18. class QR(object):
  19. """处理传来的数据并显示 QR Code 二维码图片
  20. """
  21. def handle_parameter(self, chl, chld, chs):
  22. def show_image(self, **args):
  23. def GET(self):
  24. def POST(self):
  25. class Decode(object):
  26. """解码
  27. """
  28. def decodeQR(self, fileName):
  29. def POST(self):
  30. if __name__ == '__main__':
  31. web.config.debug = True
  32. urls = (
  33. '/', 'Index',
  34. '/qr', 'QR',
  35. '/decode', 'Decode',
  36. '/.*', 'Index'
  37. )
  38. # 应用html模板
  39. render = web.template.render('templates')
  40. app = web.application(urls, globals())
  41. app.run()

下面对main.py中的相关代码进行解释。由于程序过长,因此省略了函数的具体定义与函数体的内容,只给出了main.py中的类定义和函数定义以及其他主要内容。

第一行的“ #!/usr/bin/env python ”叫做shebang,用于在Linux/UNIX系统环境中指定使用何种解释器来运行该脚本文件,这里使用Python解释器。

第二行的“ # -*- coding: utf-8 -*- ”用于指定main.py文件所使用的字符集,这里设置成uft-8。后面的“ import ”和“ from … import ”用于导入库文件,功能上类似于C/C++中的#include。qrcode和zbar分别是QR二维码的编码和解码模块,web是wep.py框架的模块名,cStringIO和urllib用于处理网页请求中的一些细节问题。Image模块用于进行图像操作,ImageMIME模块用于确定图片的MIME类型,charset模块用于确定字符串的编码格式。

“ if __name__ == ‘__main__‘: ”表示如果main.py作为主程序运行时,则执行下面的代码块,否则不执行。这是Python语言的特性,使得main.py文件在必要时可以被其他的py文件import,可以在其他的py文件中调用mai.py文件中定义的类和方法,是提高代码复用的一种技术。“ web.config.debug = True ”这条语句用于启用debug模式,开发过程中,如果出现错误,会给出具体的错误信息,方便debug。Urls是一个元组,用于确定网页运行时的URL处理规则,这里可以看出,对根目录’/‘的请求调用’Index’类来处理,对“ /qr ”的请求调用“ QR ”类来处理,对“ /decode ”的请求调用“ Decode ”类来处理,对于不属于这3种url规则的请求,一律使用“ Index ”处理。

  1. urls = (
  2. '/', 'Index',
  3. '/qr', 'QR',
  4. '/decode', 'Decode',
  5. '/.*', 'Index'
  6. )

“ render = web.template.render(‘templates’) ”将index.html文件所在的templates文件夹载入成一个web.template.render()对象并负值给变量render,以便后续调用。

“ app = web.application(urls, globals()) ”调用web.application()函数,产生一个web应用对象,赋给变量app以便后续调用。该函数的调用参数为urls元组和globals()函数,意思是以urls定义的url规则,和在全局名字空间内定义的内容新建web应用对象。这里指之前定义的三个类class Index、class QR和class Decode。

“ app.run() ”表示启动web应用,开始响应页面请求。

Main.py在全局范围内定义了三个类,class Index、class QR和class Decode,每个类中定义了一些方法函数。根据Web.py框架的开发文档,在url规则中指定的类中定义的GET和POST方法用于在浏览器请求对于的url时作出响应。Handle_parameter()函数用于分析和处理所要生成的QR二维码的参数。Show_image()函数用于根据调用参数生成QR二维码。Main.py中的类、函数的调用关系如下图所示:

Main.py程序通过命令行来运行。打开终端Terminal程序,进入到main.py所在的目录下,执行命令:python main.py,即可运行程序,在本机上会运行web.py自带的开发服务器,此时在浏览器中访问 http://0.0.0.0:8080 即可访问前端界面。

生成二维码的直接代码在QR类中的show_image()函数中,通过qrcode模块实现。

  1. qr = qrcode.QRCode(
  2. version=version,
  3. error_correction=error_correction,
  4. box_size=box_size,
  5. border=border,
  6. )

调用qrcode模块,传入相应的版本、纠错等级、module大小和空白区域尺寸四个参数,产生一个QRCode类的对象qr。然后往这个对象qr中加入待编码信息:

  1. qr.add_data(content)
  2. qr.make(fit=True)
  3. im = qr.make_image()

content代表需要被编码进QR二维码的信息,qr.make(fit=True)表示将content信息编入QR二维码,参数fit=True表示对content内容进行判断,如果content中的数据超出qrcode.QRCode()中传入的version参数所能支持的最大数据量的话,则根据content内容的长度和纠错等级选择最合适的version版本。qr.make_image()用于将qr对象生成图片对象,即最终的QR二维码图形。

3.3 程序运行流程

整个程序运行时,从网页上接受用户输入,将输入信息编码成相应的QR二维码图形,并在后台将图像保存到指定的目录下。下面分别介绍“单次录入”、“批量生成”和“解码”三个功能的程序工作过程。

3.3.1 单次录入

当用户使用单次录入方式时,工作过程为:

输入资产信息,如下图所示:

点击‘生成’按钮,将在浏览器中打开一个新的标签页,显示生成的相应QR二维码:

在生成的过程中,后台程序会在main.py所在目录下的tags目录下保存一个QR二维码的文件,文件名为输入信息中的资产编号,保存为png格式的图片。

3.3.2 批量生成

使用批量生成功能时:

选择txt格式的资产列表文件,选择生成的QR二维码的尺寸和需要的纠错等级。默认为中等大小和M级别的纠错等级。

点击‘批量生成’按钮,根据文件中的每条资产记录,后台在main.py所在目录下的tags目录下生成相应的QR二维码图片,文件名为资产编号,png格式的图片。资产列表.txt文件中有20条资产记录,对应地生成了20个QR二维码图片,最后一个201405291535.png是上一小节中演示时生成的。

3.3.3 解码

使用解码功能时,选择需要进行解码的QR二维码文件,然后上传即可。这里选择4.3.1中单次录入信息生成的那个QR二维码文件201405291535.png。

解码结果中,可以发现,每个字段之间使用冒号隔开,这样分隔的好处是将数据格式化,使得在实际使用时,只需用扫码枪扫描即可得到格式化的数据,方便后续对数据操作。

解码时,程序会在main.py所在目录下的uploads目录下保存上传的QR二维码图像。

第四章 结果与分析

4.1 可用性验证

对于使用单次录入和批量生成的QR二维码,用手机软件进行扫描,测试是否可以被正常扫描,得到资产信息。以201405291535.png和2014010105.png为例,进行测试。

4.2 测试过程与结果

为了保证夸平台性,测试时使用基于android和iOS两种手机系统的手机进行测试,使用的具体型号为小米3和iPhone 5S。为了提高准确度和可行度,在两款手机上分别使用手机QQ和微信进行扫描,读取信息。

读取结果如下所示,其中黑色背景的截屏是微信,白色背景的截图是手机QQ:

a b c d
e f g h

在验证结果图中,(a)(b)(c)(d)四张图是在基于iOS系统的iPhone 5s 手机上分别使用微信和手机QQ进行扫描201405291535.png和2014010105.png时的结果,(e)(f)(g)(h)则是在基于Android系统的小米3手机上分别使用微信和手机QQ扫描201405291535.png和2014010105.png的结果。

4.3 分析

从测试结果来看,单次录入的资产信息和批量导入的资产信息都能成功地写入QR二维码,生成对应的二维码图像。使用不同手机平台的不同扫码软件都成功地扫描识别程序所生成QR二维码图形,并成功解码出其中包含的信息,且成功率较高。

功能上还有些欠缺,如果能做成在网页上提交资产信息之后,能返回生成的QR二维码图形的下载链接的话,用户体验会更好。

第五章 总结与展望

5.1 总结

本课题简要的了解了QR二维码的相关内容,大致学习了QR二维码的编码和解码过程。并且依赖qrcode和zbar模块实现了一个较为基础的,用于提高企业资产管理效率的QR二维码生成程序。通过网页形式提供服务,实现三个功能,单次录入,批量生成和解码。

在课题过程中,遇到不少的问题,经过自己查找文献和想知道教师求教,都已基本解决。在所遇的问题中,我觉得最困难的就是乱码问题。在单次录入资产信息进行编码时,生成的QR二维码可以被手机软件扫描解码出正确的资产信息,但是当使用解码功能进行解码时,会发生乱码的情况,无法得到正常的中文资产信息。仔细观察后发现,资产信息中的数字和字母部分的信息在乱码中存在,因此猜测是由于中文字符导致的乱码。经过查阅资料,向导师求教,了解到乱码的原因在于,在解码后,从QR二维码中得到的字符串没能与网页显示时定义的UTF-8字符集相匹配,因此导致在网页上显示时发生乱码。因此,要想解决该问题,只需将解码出的字符串转换成UTF-8编码即可在网页上显示出正常的资产信息。

5.2 展望

本课题虽然完成了将资产信息编入QR二维码的功能,但是仍然存在一些问题。比如程序的健壮性不高,对异常的处理不够,容易崩溃;对于批量生成方式,生成QR二维码图像后,不能从网页前端获得所有的图像文件,只能看到最后一条资产信息的二维码图形,使用稍显不便。

对于QR二维码将来的发展趋势,我个人认为会逐渐趋于平稳,人们会更多地关注于它的安全方面的问题。因为目前已经有将QR二维码用于金融支付行业,一旦涉及到金融行业,那么它的安全性问题就要接受考验。

因时间和个人编程能力和精力有限,没能在短时间内对程序进行更多完善。希望在以后能有机会继续完善该课题。

参考文献

[1] 宋卫海,宋士银.二维条码PDF417码技术的应用及发展前景[J].山东轻工业学院学报:自然科学版,2001,15(3):19-24.

[2] 潘继财.二维条码技术及应用浅析[J].商场现代化,2009 (9):118-120.

[3] 冯汉禄,黄颖为,牛晓娇,等.QR 码纠错码原理及实现[J].计算机应用,2011,31(A01):40-42.

[4] 吴昊,孙焘,冯林.在手机与PC间收发二维条码的研究与实现[J]. 2007,17(2):178-180.

[5] 杨军,刘艳,杜彦蕊.关于二维码的研究和应用[J].应用科技,2002,2(11):11-13.

[6] 陈荆花,王洁.浅析手机二维码在无联网中的应用及发展[J].电信科学,2010,3(4):39-43.

[7] 董宇晖.基于Python的设计模式研究[J].电子技术与软件工程,2013,21(11):74.

[8] 刘彦伟,王根英,刘云.QR码信息加密的研究与实现[J].铁路计算机应用,2013.21(11):37-41.

[9] 中国物品编码中心.QR Code二维码技术与应用[M].北京:中国标准出版社,2002.

[10] Mark Lutz[美].Python学习手册[M].第4版.李军,刘红伟.北京:机械工业出版社,2011.

[11] 曾子剑.基于QR二维码编解码技术的研究与实现 [D].成都:电子科技大学计算机科学与工程学院,2010.

[12] 张成海,郭卫华.QR Code二维码:一种新型的矩阵符号[M].北京:中国标准出版社,2000.

[13] Jason Briggs[美].趣学Python编程[M].尹哲.北京:人民邮电出版社,2011.

[14] 罗春玲.二维条码QR的纠错改进研究[D].湖北:武汉理工大学,2012.

[15] 周利红,刘书家.QR码图像处理和译码方法研究[J].北京工商大学学报:自然科学版,2008,26(1):63-66.

[16] 王世慧,杜伟.手机QR码在图书馆的应用探析[J].现代情报,2011,31(6):151-154.

[17] 胡孝鹏,董强,于忠清.基于图象处理的QR码识别[J].航空计算技术,2007,37(2):99-102.

[18] 刘宏伟,严妍.快速响应码的识别和解码[J].计算机工程与设计,2005,26(6):1560-1562.

[19] 徐彩虹,刘志,冯晓斐.一种字符二维码的设计与实现[J].浙江工业大学学报,2012,40(5):518-523.

[20] Haworth A, Williams P. Using QR Codes to Aid Accessibility in A Museum[J]. Journal of Assistive Technologies, 2012, 6(4): 285-291.

[21] Massis B E. QR codes in the library [J]. New Library World, 2011, 112(9/10): 466-469.

[22] ISO/IEC, Inc. Information technology - Automatic identification and data capture techniques - QR Code 2005 bar code symbology specification [EB/OL]. http://raidenii.net/files/datasheets/misc/qr_code.pdf, 2014.

[23] Soon T J. QR code[J]. Synthesis Journal, 2008: 59-78.

[24] 陈皓.二维码的生成细节和原理[EB/OL].http://coolshell.cn/articles/10590.html,2013.

[25] Lincolnloop. Pure python QR Code generator [EB/OL]. https://github.com/lincolnloop/python-qrcode, 2013.

[26] Weiser M. Ubiquitous computing[J]. Computer, 1993, 26(10): 71-72.

[27] Sanner M F. Python: A Programming Language for Software Integration and Development[J]. J Mol Graph Model, 1999, 17(1): 57-61.

[28] DiPierro M. Web2py Enterprise Web Framework[M]. Wiley Publishing, 2009.

上传的附件 cloud_download 基于Python的QR二维码的生成与识别程序.rar ( 2.40mb, 16次下载 )
error_outline 下载需要9点积分

发送私信

真正的离开没有告别,悄无声息

15
文章数
10
评论数
最近文章
eject