測試工具具體用到:
1、58熱敏打印機(jī)
2、錢箱
3、Android Studio 2.2.2
4、測試平板一臺
端口號打印機(jī)一般都是9100
首先把打印機(jī)固定ip設(shè)置好,然后所有設(shè)備連接到同一網(wǎng)絡(luò)(不在同一網(wǎng)絡(luò)連接不上)
錢箱看需求,直接插在打印機(jī)上就行了
布局就很簡單寫一個Button按鈕就行,其他隨意
代碼:
/** * Created by zhaomingming on 2017/2/6. */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ī)端口號 * @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);// init writer.write("(k");// adjust height of barcode writer.write(length + 3); // pl writer.write(0); // ph writer.write(49); // cn writer.write(80); // fn writer.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); // pl writer.write(0); // ph writer.write(49); // cn writer.write(81); // fn writer.write(48); // m writer.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(); } /** * 打印空白(一個Tab的位置,約4個漢字) * * @param length 需要打印空白的長度, * @throws IOException */ protected void printTabSpace(int length) throws IOException { for (int i = 0; i < length; i++) { writer.write("/t"); } writer.flush(); } /** * 打印空白(一個漢字的位置) * * @param length 需要打印空白的長度, * @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(); } /** * 絕對打印位置 * * @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ìn)制開錢箱 writer.write(0x1B); writer.write(0x70); writer.write(0x0); writer.write(0x3C); writer.write(0xFF);再定義一個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; }}主頁面代碼: public class MainActivity extends AppCompatActivity { private List<FoodsBean> foodsBean; private Pos pos; @Override protected 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() { @Override public void onClick(View v) { // 開啟一個子線程 new Thread() { public void run() { try { pos = new Pos("192.168.110.100", 9100, "GBK"); //第一個參數(shù)是打印機(jī)網(wǎng)口IP //初始化打印機(jī) pos.initPos(); //初始化訂單數(shù)據(jù) initData(); pos.bold(true); pos.printTabSpace(2); pos.printWordSpace(1); pos.printText("**測試店鋪"); pos.printLocation(0); pos.printTextNewLine("----------------------------------------------"); pos.bold(false); pos.printTextNewLine("訂 單 號:1005199"); pos.printTextNewLine("用 戶 名:15712937281"); pos.printTextNewLine("桌 號:3號桌"); pos.printTextNewLine("訂單狀態(tài):訂單已確認(rèn)"); pos.printTextNewLine("訂單日期:2017/2/6 10:36:53"); pos.printTextNewLine("付 款 人:線下支付(服務(wù)員:高策)"); pos.printTextNewLine("服 務(wù) 員:1001"); pos.printTextNewLine("訂單備注:不要辣,少鹽"); pos.printLine(2); pos.printText("品項(xiàng)"); pos.printLocation(20, 1); pos.printText("單價"); 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://www.qingcanbang.com/"); //切紙 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("測試菜品" + i); fb.setPrice("90.00"); fb.setNumber("1" + i); fb.setSum("10" + i + ".00"); foodsBean.add(fb); } }}
新聞熱點(diǎn)
疑難解答