再谈aardio控制打印机、条码打印机等
编辑时间:2017-09-22 作者:Jacen He 浏览量:5673 来源:aardio公众号

aardio虽然实现很多功能代码较其他语言简洁,但aardio以及aardio生成的软件都非常小,并非象其他的编程语言那样依赖庞大的运行库 - 以体积换取易用性。一个常见的误解时:“增加体积就一定就会有更好的易用性”,这就好象坚持认为胖子一定比瘦子轻便,所以你经常听到很多人宣称:“语言并不重要,只要库够多就行了”,aardio并非如此,并不是你多写库模块多写代码或者写一个更庞大的开发工具就能比aardio方便。


就以调用打印机API而言(或者说调用C语言风格API),我上次给大家列举的代码例子,较之C#这样的巨无霸式的静态语言 - aardio仅仅需要更少的代码,更加的简洁,而且aardio他本身是一个动态语言,如果你用其他动态语言想方便的与C,C++提供的API直接交互 - 那可能非常的麻烦,所以动态语言通常被用来作为“脚本”使用(C,C++组件通常需要复杂的封装成为支持这个语言的接口),但aardio却被用来直接替代C++或C#完成大部分编程的全部代码 - 而很少被用来写脚本。即使你用aardio写网站时那好是像PHP那样在写服务端脚本(其实每种语言理论上都可以用来写脚本),但aardio的CGI.EXE仍然是用aardio编写(而非PHP那样使用C++编写EXE来运行PHP),所以使用aardio让人最愉快的就是,你只要掌握了aardio,你可以比较轻松的写出很多东西。

aardio不仅仅是调用API, 或者说调用C,C++组件非常简单(其实aardio调用Java,C#都同样的简单),我们还可以很方便的把常用的代码封装为“库”模块,所以aardio虽然小,提供的“库”却数量庞大(而很多库的代码都非常少),这次我再给大家演示一下,把上次发给大家的调用打印机的代码整理并放到了一个库里(见新版标准库的 sys.printer),你可以阅读库源码、或者查看新增的示例(aardio范例->操作系统->打印机),这个库的源码仍然非常的少(相对其他语言的各种模块组件的体积而言),而且并非像一些人所说的,我用了任何高深的编程技巧,没有什么编程技巧,就是一些常用的API函数,直接照API文档抄的,因为aardio调用外部API函数的语法是如此简单,所以一切很容易。


在写完 sys.printer 以后,我想试试用 sys.printer 来控制小票打印机,试了网上的一些范例都不成功,然后我找了条码打印机的一些SDK,发现不同厂商的SDK都是提供一个类似的TSCLIB.DLL,导出的接口基本都一样,而这个TSCLIB.DLL不知道出自何处,每个SDK里都没有说明,DLL的版权说明都是空的,好吧有可能是大家都复制了相同一份不知道谁随手写的代码,这个DLL的函数非常简单,用法也很简单,只有几个函数(这个DLL的文档我放到了 /lib/tsclib/.res目录下,引用了这个库就可以自动下载),而其他的函数我看了一下,大概内部的代码是简单的格式化字符串最后都调用 tsclib.sendcommand() 发送指令,我封装了一个tsclib扩展库,测试代码如下:


import console; 
import tsclib;

//这里需要改成你的条码打印机名称
tsclib.openport("Gprinter  GP-3120TU"); 
tsclib.setup("40","30","3","10","0","3","0");

//直接输出TSC-TSPL指令
tsclib.sendcommand("SET CUTTER OFF");
tsclib.sendcommand("DIRECTION 1");
tsclib.clearbuffer();

//打印条码
//tsclib.barcode("100","50","39","96","1","0","2","4","123456789");

//打印二维码
tsclib.qrcode("100","100","H","4","A","0","M2","S7","AABCB03abcN123汉字")
//tsclib.printerfont("100","200","TSS24.BF2","0","2","2","中文字体");

//直接输出TSPL指令
tsclib.sendcommand("BOX 50,10,600,280,5");
//tsclib.windowsfont(100,200,24,0,2,0,"arial","中文 Font 72 pt");
        
tsclib.printlabel("1","1");
tsclib.closeport();

console.pause(true);


用起来非常简单,测试成功,不知道为什么有人跟我说等了好几年在等控制小票打印机的扩展库 - 难道可以花好几年的时间等,却没有几分钟的时间看一下厂家提供的SDK什么的 ?!

TSCLIB使用的是TSPL指令语言,这个TSCLIB估计也是用WritePrinter这个API发送指令(也就是sys.printer里的write函数),理论上不通过TSCLIB组件也可以控制打印机,但没有找到相关资料,经过我的验证这个方法是可行的,只要注意一个规则:TSPL指令必须分行发送,每行指令尾部必须以'\r\n'结束,下面是测试代码:


import console; 
import sys.printer;

var pt = sys.printer("Gprinter  GP-3120TU");
pt.start(
    function(){
    pt.write('SIZE 40 mm,30 mm\r\n')
    pt.write('GAP 2 mm,0 mm\r\n')   
    pt.write('DENSITY 6\r\n')   
    pt.write('SPEED 5\r\n')     
    pt.write('DIRECTION 0\r\n')     
    pt.write('REFERENCE 0\r\n')     
    pt.write('CLS\r\n')     
    pt.write('TEXT 30,40 ,"1",0,2,2,"NO:4872"\r\n')
    pt.write('BARCODE 30,100,"128M",40,1,0,2,1,"69123888"\r\n') 
    pt.write('PRINT 1\r\n') 
    }
);

console.pause(true);


所以你看,一切都很简单,条条大路通罗马!如果不愿意动脑动手,那就只能不停的等待别人。每次我一说这话,就有一些人威胁说我的人品有毛病,其实我真的没有什么恶意。可能有那么一些人,喜欢把简单的代码或者技术说的非常麻烦 - 用于掩饰自己的问题。但aardio非常简单,aardio的“库”也都非常简单,很多人惊讶于aardio库函数的说明通常只有几句话 - 是的,一切都是那么简单。其实编程这个东西 - 90%最难用的东西我们90%的时候根本用不上,所以我在封装库函数的时候,通常只留下  10%最容易使用最常用的东西,就以上面的 sys.printer 为例,也许你去看打印机API的文档会让你吃惊有如此多的参数和用法,但你在使用 sys.printer的时候发现参数是如此的少,很多函数根本不要参数,这也是为什么aardio的库函数的参数说明、用法说明都极其简洁的原因,这也是为什么有人拿起aardio看几下就能用的很爽的原因( 当然我们不能否认,再简单的东西,总会有一堆人一边用一边叫苦,喜欢叫苦的人,无论给他什么他都用不好)。


来说两句吧