安卓连接pos小票机和钱箱
测试工具具体用到:
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小票机和钱箱相关推荐
- android 打印小票格式,安卓端小票机设置
安卓收银机外接USB小票机 准备工作:首先连接好打印机电源线,查看指示灯是否正常,小票纸是否安装正确,确定打印机本身没有问题,完成准备工作.(安卓机先不连接打印机的usb线) 操作步骤: 1.打开外部 ...
- IT民工系列——c#驱动任意COM接口的小票机(POS热敏打印机)
前言: 我是一名IT民工,热爱计算机 热爱软件.我从事.net平台开发也有几年了,专注c#.熟悉: ORM/RBAC/AOP/OO/持久层/数据流/工作流/信息流/企业系统开发/Excel等解密等. ...
- PDA手持移动POS销售开单软件(网络版)、PDA手持设备小票机
背景描述: 一家大中型批发及门店销售企业,经销多种冻食品,业务范围覆盖周边众多区域和城市.成立以来,随着业务量的扩大,产品销售分两大渠道:多门店销售和仓库批发,各门店每天都有大量的零散客户和老客户进行 ...
- winapi编程获取文件版本信息的代码_.Net调用WinAPI轻松实现POS小票并口打印
今天为大家介绍.Net下POS机小票打印功能的实现,在实际生产环境下,我们的门店使用的小票机大部分是LPT接口,但是也有一部分新的小票机采用的是USB接口的.我们在开发门店零售管理系统时,在小票打印模 ...
- 安卓2.3刷机包_红米K20Pro 安卓Q刷机包下载+刷机教程
继小米9和小米MIX3 5G版之后,小米旗下子品牌,红米K20Pro也支持刷入安卓Q版本刷机包了 这是小米旗下第三款可以快速升级安卓Q的机型,也足以说明这块产品在小米的重要性 我们也已经整理了Redm ...
- 刷机提示图像和设备不匹配_安卓5.0升级失败如何解决 安卓5.0刷机失败解决方法介绍【教程】...
安卓5.0升级失败怎么办?安卓5.0刷机失败急救方法?谷歌发布了适用于Nexus系列的Android 5.0系统,但是,刷安卓5.0系统时遇到system.img系统镜像找不到的错误提示是怎么回事? ...
- Web 前端通过调用ActiveX实现LPT1端口小票机打印功能。
最近项目中发现Web前端通过javascript是无法实现调用LPT1端口进行特定格式的打印的.而直接采用浏览器的打印会导致打印的全部为乱码. 后经查阅各方资料可以采用调用ActiveX方法实现小票机 ...
- 安卓APP蓝牙上位机的编写二——搜索附近蓝牙设备
安卓APP蓝牙上位机的编写二--搜索附近蓝牙设备 前言 搜索已经配对的蓝牙 搜索附近所有的蓝牙设备 安卓APP蓝牙上位机的编写一--APP结构 前言 传统蓝牙即蓝牙2.0以及之前的版本,功耗较高不能满 ...
- android刷机知识大全,安卓主流机型刷机基础科普 教你刷机不求人
花火网讯 你知道什么是刷机吗?今天小编就要给大家科普一下刷机.包你刷机不求人,安卓主流机型刷机基础都在这里. 1. 概念:相当于电脑"重装系统". 2. 方式:卡刷.线刷.厂刷.O ...
最新文章
- UA OPTI501 电磁波 Lorentz Oscillator Model 4 Hilbet变换与Kramers-Konig关系式
- mysql分区有好处吗_mysql 分区有实用价值吗?
- typescript利用接口类型声明变量_TypeScript入门指南(基础篇)
- python%20开发工具_20招让你的Python飞起来!
- 用xargs处理带空格文件名
- 用python编写密码安全性_密码安全性
- sock 文件方式控制宿主机_docker的容器可视化工具portainer
- vgextend 扩容卷组,即把物理卷加入卷组
- 湖南大学操作系统期末考试之英文PPT复习提纲
- 组策略锁定计算机时间,Win7电脑怎么禁止修改系统时间?两种禁止方法全教给你!...
- 悉尼大学计算机专业本科2019,2019悉尼大学申请条件
- HTML超链接怎么设置下拉菜单,html超链接怎么设置
- c语言coin函数库,Coin Test | C/C++程序员之家
- WR | 西湖大学鞠峰组微纳塑料污染对人工湿地菌群与脱氮功能的影响
- C# WinForm 界面控件
- [旧博客]QQ旋风加速漏洞
- chrome捕获大响应失败:Failed to load response data: request content was evicted from inspector cache
- mPEG-HSA;甲氧基聚乙二醇人血清白蛋白;HSA-PEG简介
- WebServer代码解读(3)【最小堆定时器与队列】
- BERT预训练模型简单应用(中文句子向量相关性分析)