Android进阶——安卓调用ESC/POS打印机打印
生活随笔
收集整理的這篇文章主要介紹了
Android进阶——安卓调用ESC/POS打印机打印
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前言
前一段時(shí)間由于工作需要,要研究一下安卓程序調(diào)用打印機(jī)打印小票,并且要求不能使用藍(lán)牙調(diào)用,研究了一下,可以利用socket連接,來實(shí)現(xiàn)打印功能。寫了個(gè)Demo,分享一下。
工具:一臺(tái)打印機(jī)(芯燁XP-80XX),一臺(tái)安卓測(cè)試機(jī)
開發(fā)環(huán)境:Android Studio 1.5
需求:點(diǎn)擊按鈕,實(shí)現(xiàn)打印小票功能,小票上除必要文字外,還要有二維碼。
封裝了一個(gè)Pos打印工具類:
package com.example.haoguibao.myapplication;import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket;/*** Created by haoguibao on 16/2/18.* Description : 封裝Pos機(jī)打印工具類* Revision :*/ public class Pos {//定義編碼方式private static String encoding = null;private Socket sock = null;// 通過socket流進(jìn)行讀寫private OutputStream socketOut = null;private OutputStreamWriter writer = null;/*** 初始化Pos實(shí)例** @param ip 打印機(jī)IP* @param port 打印機(jī)端口號(hào)* @param encoding 編碼* @throws IOException*/public Pos(String ip, int port, String encoding) throws IOException {sock = new Socket(ip, port);socketOut = new DataOutputStream(sock.getOutputStream());this.encoding = encoding;writer = new OutputStreamWriter(socketOut, encoding);}/*** 關(guān)閉IO流和Socket** @throws IOException*/protected void closeIOAndSocket() throws IOException {writer.close();socketOut.close();sock.close();}/*** 打印二維碼** @param qrData 二維碼的內(nèi)容* @throws IOException*/protected void qrCode(String qrData) throws IOException {int moduleSize = 8;int length = qrData.getBytes(encoding).length;//打印二維碼矩陣writer.write(0x1D);// initwriter.write("(k");// adjust height of barcodewriter.write(length + 3); // plwriter.write(0); // phwriter.write(49); // cnwriter.write(80); // fnwriter.write(48); //writer.write(qrData);writer.write(0x1D);writer.write("(k");writer.write(3);writer.write(0);writer.write(49);writer.write(69);writer.write(48);writer.write(0x1D);writer.write("(k");writer.write(3);writer.write(0);writer.write(49);writer.write(67);writer.write(moduleSize);writer.write(0x1D);writer.write("(k");writer.write(3); // plwriter.write(0); // phwriter.write(49); // cnwriter.write(81); // fnwriter.write(48); // mwriter.flush();}/*** 進(jìn)紙并全部切割** @return* @throws IOException*/protected void feedAndCut() throws IOException {writer.write(0x1D);writer.write(86);writer.write(65);// writer.write(0);//切紙前走紙多少writer.write(100);writer.flush();//另外一種切紙的方式// byte[] bytes = {29, 86, 0};// socketOut.write(bytes);}/*** 打印換行** @return length 需要打印的空行數(shù)* @throws IOException*/protected void printLine(int lineNum) throws IOException {for (int i = 0; i < lineNum; i++) {writer.write("\n");}writer.flush();}/*** 打印換行(只換一行)** @throws IOException*/protected void printLine() throws IOException {writer.write("\n");writer.flush();}/*** 打印空白(一個(gè)Tab的位置,約4個(gè)漢字)** @param length 需要打印空白的長(zhǎng)度,* @throws IOException*/protected void printTabSpace(int length) throws IOException {for (int i = 0; i < length; i++) {writer.write("\t");}writer.flush();}/*** 打印空白(一個(gè)漢字的位置)** @param length 需要打印空白的長(zhǎng)度,* @throws IOException*/protected void printWordSpace(int length) throws IOException {for (int i = 0; i < length; i++) {writer.write(" ");}writer.flush();}/*** 打印位置調(diào)整** @param position 打印位置 0:居左(默認(rèn)) 1:居中 2:居右* @throws IOException*/protected void printLocation(int position) throws IOException {writer.write(0x1B);writer.write(97);writer.write(position);writer.flush();}/*** 絕對(duì)打印位置** @throws IOException*/protected void printLocation(int light, int weight) throws IOException {writer.write(0x1B);writer.write(0x24);writer.write(light);writer.write(weight);writer.flush();}/*** 打印文字** @param text* @throws IOException*/protected void printText(String text) throws IOException {String s = text;byte[] content = s.getBytes("gbk");socketOut.write(content);socketOut.flush();}/*** 新起一行,打印文字** @param text* @throws IOException*/protected void printTextNewLine(String text) throws IOException {//換行writer.write("\n");writer.flush();String s = text;byte[] content = s.getBytes("gbk");socketOut.write(content);socketOut.flush();}/*** 初始化打印機(jī)** @throws IOException*/protected void initPos() throws IOException {writer.write(0x1B);writer.write(0x40);writer.flush();}/*** 加粗** @param flag false為不加粗* @return* @throws IOException*/protected void bold(boolean flag) throws IOException {if (flag) {//常規(guī)粗細(xì)writer.write(0x1B);writer.write(69);writer.write(0xF);writer.flush();} else {//加粗writer.write(0x1B);writer.write(69);writer.write(0);writer.flush();}} } 其中,打印機(jī)的IP和端口號(hào)從打印機(jī)的屬性設(shè)置處可查。MainActivity中進(jìn)行調(diào)用:
package com.example.haoguibao.myapplication;import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button;import java.io.IOException; import java.net.UnknownHostException; import java.util.ArrayList; import java.util.List;public class MainActivity extends AppCompatActivity {//訂單菜品集合private List<FoodsBean> foodsBean;private Pos pos;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button bt_print = (Button) findViewById(R.id.button);bt_print.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 開啟一個(gè)子線程new Thread() {public void run() {try {pos = new Pos("IP", 9100, "GBK"); //第一個(gè)參數(shù)是打印機(jī)網(wǎng)口IP//初始化打印機(jī)pos.initPos();//初始化訂單數(shù)據(jù)initData();pos.bold(true);pos.printTabSpace(2);pos.printWordSpace(1);pos.printText("**測(cè)試店鋪");pos.printLocation(0);pos.printTextNewLine("----------------------------------------------");pos.bold(false);pos.printTextNewLine("訂 單 號(hào):1005199");pos.printTextNewLine("用 戶 名:15712937281");pos.printTextNewLine("桌 號(hào):3號(hào)桌");pos.printTextNewLine("訂單狀態(tài):訂單已確認(rèn)");pos.printTextNewLine("訂單日期:2016/2/19 12:34:53");pos.printTextNewLine("付 款 人:線下支付(服務(wù)員:寶哥)");pos.printTextNewLine("服 務(wù) 員:1001");pos.printTextNewLine("訂單備注:不要辣,少鹽");pos.printLine(2);pos.printText("品項(xiàng)");pos.printLocation(20, 1);pos.printText("單價(jià)");pos.printLocation(99, 1);pos.printWordSpace(1);pos.printText("數(shù)量");pos.printWordSpace(3);pos.printText("小計(jì)");pos.printTextNewLine("----------------------------------------------");for (FoodsBean foods : foodsBean) {pos.printTextNewLine(foods.getName());pos.printLocation(20, 1);pos.printText(foods.getPrice());pos.printLocation(99, 1);pos.printWordSpace(1);pos.printText(foods.getNumber());pos.printWordSpace(3);pos.printText(foods.getSum());}pos.printTextNewLine("----------------------------------------------");pos.printLocation(1);pos.printLine(2);//打印二維碼pos.qrCode("http://blog.csdn.net/haovip123");//切紙pos.feedAndCut();pos.closeIOAndSocket();pos = null;} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}.start();}});}private void initData() {foodsBean = new ArrayList<>();for (int i = 0; i < 4; i++) {FoodsBean fb = new FoodsBean();fb.setName("測(cè)試菜品" + i);fb.setPrice("90.00");fb.setNumber("1" + i);fb.setSum("10" + i + ".00");foodsBean.add(fb);}} }附:小票中菜品的Bean類
public class FoodsBean {private String name;private String price;private String number;private String sum;public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getSum() {return sum;}public void setSum(String sum) {this.sum = sum;} }打印小票樣品如圖:
? ? ? ??
小結(jié):
對(duì)于調(diào)用打印機(jī),不論使用Java語(yǔ)言還是其他語(yǔ)言,思路都是一樣的,利用Socket連接上打印機(jī)以后,通過IO流進(jìn)行輸出打印,它們的打印指令都是一樣的,可以下載打印手冊(cè),針對(duì)不同的設(shè)置,使用不同的打印指令即可。
某打印指令文檔,僅供參考 : http://download.csdn.net/detail/haovip123/9702573
吐槽一下,資源下載積分,不是我設(shè)置的,csdn什么積分計(jì)算算法給運(yùn)算出來的,我都沒有權(quán)限更改,無語(yǔ)...
總結(jié)
以上是生活随笔為你收集整理的Android进阶——安卓调用ESC/POS打印机打印的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARMA 时间序列模型
- 下一篇: 查询空气质量实时数据的API