最近一个礼拜调研了下斑马打印机怎样实现网络打印。

  缘起:

    之前实现打印方式是直接使用USB接口连接PC,使用串口通讯提供一套打印服务,在系统界面配置相关参数,即可调用打印服务;

    后来业务需求变化,现场实施并没有PC提供给打印机使用USB连接方式,因此,就开始做了这件事。

  调研后方案:

  硬件:一台Zebra ZT210斑马打印机、一个USR W610模块、一根网线

  方案一:

    后端发送ZPL指令到打印机,封装统一调用

  方案二(舍弃):

    使用本地斑马打印机驱动调用打印机,普通打印Ctrl + P调起的界面(前端实现,此种方式有几个难点:1.格式调整;2.二维码或者条码的生成,但这对于前端也不是什么难点,有实现的,相比下后端实现简单)

  方案一实现过程:

  

  打印流程:

  有人的USR W610模块实物(天线可以忽略,本次使用的网线,网口在电源线旁边):

  USR W610:充当一个TCP Server,上电后,插上网线,输入模块后面的ip(账号密码:admin/admin)就可以访问它的管理界面。若之前设置过ip,找根笔戳一下重置按钮。设置ip和端口,后端使用socket进行连接时会使用。

  USR W610后台界面:

·     后端核心代码:

    def post(self, request):
"""新增对象 Args:
request (rest_framework.request.Request): HTTP request Returns:
response(rest_framework.response.Response): HTTP response.
error_response(rest_framework.response.error_response): error_response """
request_data = request.data
template_name = request_data.get('template_name', '')
if not template_name:
return error_response(reason='模板名称不能为空',
info='template_name is required',
state=status.HTTP_400_BAD_REQUEST) function_name = request_data.get('function_name', '')
if not function_name:
return error_response(reason='功能模块名称不能为空',
info='function_name is required',
state=status.HTTP_400_BAD_REQUEST) is_function_name_exist = PrinterConfig.objects.filter(function_name=function_name).exists()
if not is_function_name_exist:
return error_response(reason='功能模块名称不存在',
info='function_name is not exist',
state=status.HTTP_400_BAD_REQUEST) is_template_name_exist = PrinterConfig.objects.filter(template_name=template_name).exists()
current_dir = os.path.join(settings.BASE_DIR, 'print_template')
is_template_name_in = template_name in os.listdir(current_dir)
if not any([is_template_name_in, is_template_name_exist]):
return error_response(reason='模板名称不存在',
info='template_name is not exist',
state=status.HTTP_400_BAD_REQUEST) file_path = os.path.join(current_dir, template_name)
qr_code_file = open(file_path, 'r', encoding='utf-8')
template_data = qr_code_file.read()
template = Template(template_data)
zpl = template.render(Context(request_data)) # 携带ZPL指令向打印机发送http请求
ip_port = PrinterConfig.objects.filter(template_name=template_name).values_list('printer_ip', 'printer_port')
ip, port = ip_port[0][0], ip_port[0][1]
if not all([ip, port]):
return error_response(reason='打印配置的IP或端口未配置',
info='printer ip and port must be configured',
state=status.HTTP_400_BAD_REQUEST) # print_server = 'http://' + str(ip) + ':' + str(port)
client = None
try:
# requests.post(print_server, data=zpl.encode('utf-8'))
client = socket.socket(socket.AF_INET, type=socket.SOCK_STREAM)
client.connect((ip, port))
client.send(zpl.encode('utf-8'))
# 打印机未连接!
except Exception as other_except: # pylint: disable=broad-except
except_info = other_except.args[0]
# except_info = other_except.args[0].args[0]
# if except_info == 'Connection aborted.':
if isinstance(except_info, tuple) and except_info == 'Connection aborted.':
return Response({'result': '打印成功,请确认'})
else:
logger.error(other_except)
return error_response(reason='打印失败,请检查打印配置是否正确',
info=str(other_except),
state=status.HTTP_400_BAD_REQUEST)
finally:
client.close() return Response({'result': 'ok'})

  特殊说明:

  1、正如代码所表现的,打印机不会给模块响应,模块也就不会给后端响应,打印成功会抛Connection aborted.异常,实际已经打印出来。但这里为什么要请确认,是因为在TCP连接正常情况下,即使把耗材取出,比如把标签纸拿出去,也会打印成功,等换上纸后,打印任务队列对接着打印,所以这个就需要现场人员确认了。

  2、模板文件里面的ZPL指令编写,可以参考http://note.youdao.com/noteshare?id=05f00edb5f88cfe16543337f8c7f17aa&sub=77F69DD3BA7E4961A3435E9DFA7D15E5 也可以使用Zebra Designer工具进行设计生成.prn文件,文本打开即可看见ZPL指令。因为自动生成的.prn文件中ZPL指令是经过GFA加密过的,不便于使用模板语法替换,生成的内容也相比自己写的多很多。工具界面如下:

.prn生成的zpl指令示例:

自己参考ZPL指令手册写的指令示例:

^XA
^CI28
^CW1,E:SIMSUN.TTF
^MD20
~SD20
^FO142,105
^BQN,2,10
^FD {{qr_code_print}}
^FS
^XZ

  其他说明:zpl指令中有两个值得注意的:SD   设置暗度:若打印字迹比较淡时设置            PR打印速率:若打印字迹比较稀时设置

参考资料:

  https://www.cnblogs.com/chengeng/p/7676046.html

  https://max.book118.com/html/2018/1006/8002046103001125.shtm

  https://www.usr.cn/Down/USR-W610_instructions.pdf

  

python实现斑马打印机网络打印的更多相关文章

  1. 斑马打印机客户端GET和POST,以及后端两种打印方式。

    斑马打印机客户端GET和POST,以及后端两种打印方式. 背景环境:打印机安装在客户端外网.当用户登录时,通过ajax取服务器数据,返回打印机命令,然后客户端通过JS发送给斑马打印机. 1.使用Get ...

  2. 吉特仓库管理系统- 斑马打印机 ZPL语言的腐朽和神奇

    上一篇文章说到了.NET中的打印机,在PrintDocument类也暴露一些本质上上的问题,前面也提到过了,虽然使用PrintDcoument打印很方便.对应条码打印机比如斑马等切刀指令,不依赖打印机 ...

  3. C#调用斑马打印机打印条码标签(支持COM、LPT、USB、TCP连接方式和ZPL、EPL、CPCL指令)【转】

    原文地址:http://blog.csdn.net/ldljlq/article/details/7338772 在批量打印商品标签时一般都要加上条码或图片,而这类应用大多是使用斑马打印机,所以我也遇 ...

  4. 基于C#在WPF中使用斑马打印机进行打印【转】

    原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...

  5. 斑马打印机网卡ZebraNet配置(有线)

    实图: 抽象图: 说明: 1.并口,用于连接斑马打印机一端 2.网络连接状态指示灯 3.打印状态指示灯 4.测试按钮,在连接打印机的情况下,按下此键,会打印出网卡信息. 5.网线接口 按下测试按钮之后 ...

  6. 斑马打印机的安装调试,生成PDF

    1.  我使用的斑马打印机GK888T.有问题打客服,耐心等待.售后电话4006456456得到了解决. 2.  我遇到的问题是打印一张之后指示灯变为红灯,时好时坏.解决方案,长按指示键,待指示灯连续 ...

  7. 斑马打印机和欧姆龙CP1H串口通信打印

    欧姆龙CP1HPLC和斑马打印机通信 1. PLC 1.1PLC型号 CP1H 1.2通信方式 232通信,使用232扩展卡槽CP1W-CIF01. CP1W-CIF01是RS232选件板,通信距离最 ...

  8. 斑马打印机二维码标签制作(.prn文件)基础简单快速上手

    在工厂生产中,经常需要一线员工在电脑上输入订单号的情况.订单号往往很长,手输容易出错,并且浪费时间,所以常常使用扫码枪扫描二维码的方式输入订单号,本篇就是记录斑马打印机.prn标签模板的制作和使用. ...

  9. 斑马打印机ZT410中文打印

    ^XA ^CW1, E:SIMSUN.TTF^CI28^FO50,50^A1N,50,50^FD汉字^FS^XZ ******************************************* ...

随机推荐

  1. vue开发东京买菜,全栈项目,前端django,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等

    因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...

  2. zookper投票机制

    前提:已经搭建好zookper集群 1.先开启编号为01的服务器 2.开启编号为02的服务器,状态为leader,编号为01的变成follower 3.开启编号为03的服务器,状态为follower ...

  3. D - Wireless Network(无线网络)

    题意:给你 N 台坏了的电脑的坐标 ,和一个距离范围 d . (在距离范围内的电脑可以相互通信,每台电脑也可以连接两台不同的电脑,使他们之间能够通信) 输入任意次数操作: O   x        表 ...

  4. HDU6331 Problem M. Walking Plan【Floyd + 矩阵 + 分块】

    HDU6331 Problem M. Walking Plan 题意: 给出一张有\(N\)个点的有向图,有\(q\)次询问,每次询问从\(s\)到\(t\)且最少走\(k\)条边的最短路径是多少 \ ...

  5. Codeforces Round #652 (Div. 2) D. TediousLee(dp)

    题目链接:https://codeforces.com/contest/1369/problem/D 题意 最初有一个结点,衍生规则如下: 如果结点 $u$ 没有子结点,添加 $1$ 个子结点 如果结 ...

  6. Scrambled Polygon POJ - 2007 极角排序

    题意: 给你n个点,这n个点可以构成一个多边形(但是不是按顺序给你的).原点(0,0)为起点,让你按顺序逆序输出所有点 题解: 就是凸包问题的极角排序 用double一直Wa,改了int就可以了 // ...

  7. HDU - 2328 Corporate Identity(kmp+暴力)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2328 题意:多组输入,n==0结束.给出n个字符串,求最长公共子串,长度相等则求字典序最小. 题解:(居 ...

  8. poj 2398Toy Storage

    Toy Storage Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3146   Accepted: 1798 Descr ...

  9. 【noi 2.6_8786】方格取数(DP)

    题意:N*N的方格图每格有一个数值,要求从左上角每步往右或往下走到右下角,问走2次的最大和. 解法:走一次的很好想,而走2次,不可误以为先找到最大和的路,再找剩下的最大和的路就是正解.而应该认清动态规 ...

  10. 牛客编程巅峰赛S1第5场 - 青铜&白银 B.完全平方数的尾巴 (暴力)

    题意:有一个数\(x\),判断其是否能有某个完全平方数$mod$1000得到. 题解:直接写个for判断一下就好了,因为对1000取模,所以枚举到1000即可. 代码: class Solution ...