测试工具具体用到:

1、58热敏打印机

2、钱箱

3、Android Studio 2.2.2

4、测试平板一台

端口号打印机一般都是9100

首先把打印机固定IP设置好,然后所有设备连接到同一网络(不在同一网络连接不上)

钱箱看需求,直接插在打印机上就行了

布局就很简单写一个Button按钮就行,其他随意

代码:

/**
 * Created by zhaomingming on 2017/2/6.
 */

public class Pos {//定义编码方式
    private static String encoding = null;private Socket sock = null;// 通过socket流进行读写
    private OutputStream socketOut = null;private OutputStreamWriter writer = null;/**
     * 初始化Pos实例
     *
     * @param ip 打印机IP
     * @param port  打印机端口号
     * @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);}/**
     * 关闭IO流和Socket
     *
     * @throws IOException
     */
    protected void closeIOAndSocket() throws IOException {writer.close();socketOut.close();sock.close();}/**
     * 打印二维码
     *
     * @param qrData 二维码的内容
     * @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();}/**
     * 进纸并全部切割
     *
     * @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 需要打印的空行数
     * @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();}/**
     * 打印位置调整
     *
     * @param position 打印位置  0:居左(默认) 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();}/**
     * 初始化打印机
     *
     * @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) {//常规粗细
            writer.write(0x1B);writer.write(69);writer.write(0xF);writer.flush();} else {//加粗
            writer.write(0x1B);writer.write(69);writer.write(0);writer.flush();}}
}
钱箱代码,放到打印前或者打印后都可以
//十六进制开钱箱
        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");    //第一个参数是打印机网口IP

                            //初始化打印机
                            pos.initPos();//初始化订单数据
                            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("订单状态:订单已确认");pos.printTextNewLine("订单日期:2017/2/6 10:36:53");pos.printTextNewLine("付 款 人:线下支付(服务员:高策)");pos.printTextNewLine("服 务 员:1001");pos.printTextNewLine("订单备注:不要辣,少盐");pos.printLine(2);pos.printText("品项");pos.printLocation(20, 1);pos.printText("单价");pos.printLocation(99, 1);pos.printWordSpace(1);pos.printText("数量");pos.printWordSpace(3);pos.printText("小计");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);}}}

安卓连接pos小票机和钱箱相关推荐

  1. android 打印小票格式,安卓端小票机设置

    安卓收银机外接USB小票机 准备工作:首先连接好打印机电源线,查看指示灯是否正常,小票纸是否安装正确,确定打印机本身没有问题,完成准备工作.(安卓机先不连接打印机的usb线) 操作步骤: 1.打开外部 ...

  2. IT民工系列——c#驱动任意COM接口的小票机(POS热敏打印机)

    前言: 我是一名IT民工,热爱计算机 热爱软件.我从事.net平台开发也有几年了,专注c#.熟悉: ORM/RBAC/AOP/OO/持久层/数据流/工作流/信息流/企业系统开发/Excel等解密等. ...

  3. PDA手持移动POS销售开单软件(网络版)、PDA手持设备小票机

    背景描述: 一家大中型批发及门店销售企业,经销多种冻食品,业务范围覆盖周边众多区域和城市.成立以来,随着业务量的扩大,产品销售分两大渠道:多门店销售和仓库批发,各门店每天都有大量的零散客户和老客户进行 ...

  4. winapi编程获取文件版本信息的代码_.Net调用WinAPI轻松实现POS小票并口打印

    今天为大家介绍.Net下POS机小票打印功能的实现,在实际生产环境下,我们的门店使用的小票机大部分是LPT接口,但是也有一部分新的小票机采用的是USB接口的.我们在开发门店零售管理系统时,在小票打印模 ...

  5. 安卓2.3刷机包_红米K20Pro 安卓Q刷机包下载+刷机教程

    继小米9和小米MIX3 5G版之后,小米旗下子品牌,红米K20Pro也支持刷入安卓Q版本刷机包了 这是小米旗下第三款可以快速升级安卓Q的机型,也足以说明这块产品在小米的重要性 我们也已经整理了Redm ...

  6. 刷机提示图像和设备不匹配_安卓5.0升级失败如何解决 安卓5.0刷机失败解决方法介绍【教程】...

    安卓5.0升级失败怎么办?安卓5.0刷机失败急救方法?谷歌发布了适用于Nexus系列的Android 5.0系统,但是,刷安卓5.0系统时遇到system.img系统镜像找不到的错误提示是怎么回事? ...

  7. Web 前端通过调用ActiveX实现LPT1端口小票机打印功能。

    最近项目中发现Web前端通过javascript是无法实现调用LPT1端口进行特定格式的打印的.而直接采用浏览器的打印会导致打印的全部为乱码. 后经查阅各方资料可以采用调用ActiveX方法实现小票机 ...

  8. 安卓APP蓝牙上位机的编写二——搜索附近蓝牙设备

    安卓APP蓝牙上位机的编写二--搜索附近蓝牙设备 前言 搜索已经配对的蓝牙 搜索附近所有的蓝牙设备 安卓APP蓝牙上位机的编写一--APP结构 前言 传统蓝牙即蓝牙2.0以及之前的版本,功耗较高不能满 ...

  9. android刷机知识大全,安卓主流机型刷机基础科普 教你刷机不求人

    花火网讯 你知道什么是刷机吗?今天小编就要给大家科普一下刷机.包你刷机不求人,安卓主流机型刷机基础都在这里. 1. 概念:相当于电脑"重装系统". 2. 方式:卡刷.线刷.厂刷.O ...

最新文章

  1. UA OPTI501 电磁波 Lorentz Oscillator Model 4 Hilbet变换与Kramers-Konig关系式
  2. mysql分区有好处吗_mysql 分区有实用价值吗?
  3. typescript利用接口类型声明变量_TypeScript入门指南(基础篇)
  4. python%20开发工具_20招让你的Python飞起来!
  5. 用xargs处理带空格文件名
  6. 用python编写密码安全性_密码安全性
  7. sock 文件方式控制宿主机_docker的容器可视化工具portainer
  8. vgextend 扩容卷组,即把物理卷加入卷组
  9. 湖南大学操作系统期末考试之英文PPT复习提纲
  10. 组策略锁定计算机时间,Win7电脑怎么禁止修改系统时间?两种禁止方法全教给你!...
  11. 悉尼大学计算机专业本科2019,2019悉尼大学申请条件
  12. HTML超链接怎么设置下拉菜单,html超链接怎么设置
  13. c语言coin函数库,Coin Test | C/C++程序员之家
  14. WR | 西湖大学鞠峰组微纳塑料污染对人工湿地菌群与脱氮功能的影响
  15. C# WinForm 界面控件
  16. [旧博客]QQ旋风加速漏洞
  17. chrome捕获大响应失败:Failed to load response data: request content was evicted from inspector cache
  18. mPEG-HSA;甲氧基聚乙二醇人血清白蛋白;HSA-PEG简介
  19. WebServer代码解读(3)【最小堆定时器与队列】
  20. BERT预训练模型简单应用(中文句子向量相关性分析)

热门文章

  1. FAT32转NTFS文件全部丢失怎么恢复
  2. 机器人程序设计课程配套系统镜像使用说明( Ubuntu 14.04.5 + ROS indigo )
  3. 七、行锁功过:怎么减少行锁对性能的影响?
  4. 贪心算法 - 挤奶问题
  5. 在Raspberry Pi上安装HDMI-CEC
  6. webpack中将打包文件自动复制到发布路径
  7. 搜狗浏览器如何下载安装 安装搜狗浏览器的详细步骤
  8. 易语言+精易模块 访问百度api案例
  9. uniapp之封装公共的搜索控件
  10. 软件产品登记前需要准备什么