測試工具具體用到:
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)
疑難解答