socket实现手机连接网络打印机打印pos单
打印的工具类:
public class PrintLine {
String TAG = "xxl";
static String PRINT_IP = "192.168.1.206";
static int PRINT_PORT = 9100;
OutputStream socketOut = null;
OutputStreamWriter writer = null;
String[] Colum_Name = new String[] { "ID", "菜名", "份数", "小计金额" };// 设定小票列标题
/**
* @throws IOException
*
*/
public PrintLine() throws IOException {
// TODO Auto-generated constructor stub
// 建立打印机连接
//
Socket socket = new Socket( PRINT_IP, PRINT_PORT);
Log.i(TAG, PRINT_PORT+"");
socketOut = socket.getOutputStream();
socket.isClosed();
writer = new OutputStreamWriter(socketOut, "GBK");
}
/**
* @param PRINT_DATA
* 小票主要数据
* @param GS_INFO
* 小票附带信息
* @param CAIDAN_SN
* 小票号码
*/
public void print(List<Map<String, Object>> PRINT_DATA,
Map<String, String> GS_INFO, String CAIDAN_SN) {
/*
* 接收小票页面 公司信息 Map<String,String> map=new HashMap<String,String>();
* map.put("GS_Name", "武汉联兴科技有限公司"); map.put("GS_Address",
* "武汉市解放大道2679号"); map.put("GS_Tel", "13507115045"); map.put("GS_Qq",
* "138027869");
*/
try {
// 条码打印指令
byte[] PRINT_CODE = new byte[9];
PRINT_CODE[0] = 0x1d;
PRINT_CODE[1] = 0x68;
PRINT_CODE[2] = 120;
PRINT_CODE[3] = 0x1d;
PRINT_CODE[4] = 0x48;
PRINT_CODE[5] = 0x10;
PRINT_CODE[6] = 0x1d;
PRINT_CODE[7] = 0x6B;
PRINT_CODE[8] = 0x02;
// 清除字体放大指令
byte[] CLEAR_FONT = new byte[3];
CLEAR_FONT[0] = 0x1c;
CLEAR_FONT[1] = 0x21;
CLEAR_FONT[2] = 1;
// 字体加粗指令
byte[] FONT_B = new byte[3];
FONT_B[0] = 27;
FONT_B[1] = 33;
FONT_B[2] = 8;
// 字体横向放大一倍
byte[] FD_FONT = new byte[3];
FD_FONT[0] = 0x1c;
FD_FONT[1] = 0x21;
FD_FONT[2] = 4;
// 计算合计金额
int price = 0;
// 初始化打印机
socketOut.write(27);
socketOut.write(27);
socketOut.write(FD_FONT);// 字体放大
socketOut.write(FONT_B);// 字体加粗
//公司名称
writer.write(" " + GS_INFO.get("GS_Name") + " \r\n");
writer.flush();// 关键,很重要,不然指令一次性输出,后面指令覆盖前面指令,导致取消放大指令无效
socketOut.write(CLEAR_FONT);
socketOut.write(10);
//编号
writer.write("NO: " + CAIDAN_SN + " \r\n");
writer.write("-------------------------------------\r\n");
writer.write(Fix_String_Lenth(1,Colum_Name[0], 6)
+ Fix_String_Lenth(0,Colum_Name[1], 14)
+ Fix_String_Lenth(1,Colum_Name[2], 4)
+ Fix_String_Lenth(1,Colum_Name[3], 6) + "\r\n");
for (int i = 0; i < PRINT_DATA.size(); i++) {
int b =PRINT_DATA.get(i).get("cai_name").toString().length();
writer.write(Fix_String_Lenth(1,i + 1 + "", 6)
+ Fix_String_Lenth(0,PRINT_DATA.get(i).get("cai_name")
.toString(), 18-b)
+ Fix_String_Lenth(1,1 + "", 6)
+ Fix_String_Lenth(1,PRINT_DATA.get(i).get("cai_price")
.toString(), 6) + "\r\n");
price += Integer.parseInt(PRINT_DATA.get(i).get("cai_price")
.toString());
}
writer.write("-------------------------------------\r\n");
writer.write("本单共 " + PRINT_DATA.size() + " 道菜品,合计费用: " + price
+ "元\r\n");
writer.write("-------------------------------------\r\n");
writer.write("地址: " + GS_INFO.get("GS_Address") + "\r\n");
writer.write("联系电话: " + GS_INFO.get("GS_Tel") + " \r\n");
writer.write("-------------------------------------\r\n");
writer.write(" 欢 迎 品 偿 谢 谢 惠 顾\r\n");
// 下面指令为打印完成后自动走纸
writer.write(27);
writer.write(100);
writer.write(4);
writer.write(10);
writer.close();
socketOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 字符串长度补齐,方便打印时对齐,美化打印页面,不过中文计算好像有点问题
*
* @param strs
* 源字符
* @param len
* 指定字符长度
* @return
* @throws UnsupportedEncodingException
*/
public String Fix_String_Lenth(int type ,String strs, int len) {
String strtemp = strs;
int len1 = strs.length();
switch (type) {
case 0:
while (strtemp.length() < len) {
strtemp += " ";}
break;
case 1:
while (strtemp.length() < len) {
strtemp += " ";}
break;
default:
break;
}
return strtemp;
}
}
调用打印工具类打印的Activity
package com.example.airprint;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity implements OnClickListener{
String TAG = "xxl";
List list;
Map<String,String> map;
Map<String,Object> dishMap;
Map<String,Object> dishMap1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btn = (Button) findViewById(R.id.print);
btn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
list = new ArrayList<Map<String, Object>>();
dishMap = new HashMap<String,Object>();
dishMap1 = new HashMap<String,Object>();
dishMap.put("cai_name", "地三鲜");
dishMap.put("cai_price", "20");
dishMap1.put("cai_name", "长豆角肉末盖浇饭");
dishMap1.put("cai_price", "10");
list.add(dishMap);
list.add(dishMap1);
map =new HashMap<String,String>();
map.put("GS_Name", "杭州友络软件有限公司");
map.put("GS_Address",
"浙江-杭州,滨江区南环路3760号保亿创艺大厦1203室");
map.put("GS_Tel", "13507115045");
map.put("GS_Qq","138027869");
Log.i(TAG, map.get("GS_Address"));
SimpleDateFormat formatter = new SimpleDateFormat ("yyyy年MM月dd日 HH:mm:ss ");
Date curDate = new Date(System.currentTimeMillis());//获取当前时间
final String str = formatter.format(curDate); //可以获取当前的年月时分,也可以分开写:
new Thread(){
@SuppressWarnings("unchecked")
public void run() {
try {
new PrintLine().print(list,map,str);
Log.i(TAG, map.get("GS_Name"));
} catch (IOException e) {
Log.i(TAG, e+"");
e.printStackTrace();
}
};
}.start();
}
}
pos打印机设置字体大小的代码:
- String content = "数据测据测试一下字体的大小\n";
- Socket client = new Socket(ip, port);
- OutputStream os = client.getOutputStream();
- //字体横向放大一倍
- os.write(0x1c);
- os.write(0x21);
- os.write(4);
- os.write(content.getBytes("gbk"));
- //字体纵向放大一倍
- os.write(0x1c);
- os.write(0x21);
- os.write(8);
- os.write(content.getBytes("gbk"));
- //字体横向纵向均放大一倍
- os.write(0x1c);
- os.write(0x21);
- os.write(4);
- os.write(content.getBytes("gbk"));
- os.flush();
由于POS打印机的类型不同,可能支持的EPSON指令也不同。就拿放大字体来说,pos58 打印机和 pos80 打印机指令就不尽相同,那么如何兼容多种打印机呢。
比如说,有的打印机并不是使用 0x1c 作为放大指令,而是使用 0x1b 作为放大指令
- /* 横向放大一倍 */
- os.write(0x1c);
- os.write(0x21);
- os.write(4);
- os.write(0x1b);
- os.write(0x21);
- os.write(4);
- /* 纵向放大一倍 */
- os.write(0x1c);
- os.write(0x21);
- os.write(8);
- os.write(0x1b);
- os.write(0x21);
- os.write(8);
- /* 横向纵向都放大一倍 */
- os.write(0x1c);
- os.write(0x21);
- os.write(12);
- os.write(0x1b);
- os.write(0x21);
- os.write(12);
- .打印符形码
- os.write(0x1d);
- os.write(0x68);
- os.write(120);
- os.write(0x1d);
- os.write(0x48);
- os.write(0x01);
- os.write(0x1d);
- os.write(0x6B);
- os.write(0x02);
- os.write("091955826335".getBytes()); //条形码数字
- os.write(0x00);
- os.write("\n".getBytes());
socket实现手机连接网络打印机打印pos单的更多相关文章
- Android连接网络打印机进行打印
首先这是网络打印工具类,通过Socket实现,多说一句,网络打印机端口号一般默认的是9100 package com.Ieasy.Tool; import android.annotation.Sup ...
- Android连接网络打印机,jSocket连接网络打印机
老大写的一个打印工具类,记录一下. package com.Ieasy.Tool; import android.annotation.SuppressLint; import java.io.IOE ...
- 手持PDA智能条码扫描RFID打印POS机
手持PDA智能条码扫描RFID打印POS机 一.系统稳定性: 1.硬件稳定性: 采用了华为海思(国内唯一可以媲美全球顶级的CPU+射频方案厂商,可以和英伟达等一决高下)手机方案,CPU+射频浑然一 ...
- 手动搭建I/O网络通信框架2:Socket和ServerSocket入门实战,实现单聊
第一章:手动搭建I/O网络通信框架1:Socket和ServerSocket入门实战,实现单聊 在第一章中运用Socket和ServerSocket简单的实现了网络通信.这一章,利用BIO编程模型进行 ...
- <转>Unity3D研究院之C#使用Socket与HTTP连接服务器传输数据包
最近项目中需要使用HTTP与Socket,把自己这段时间学习的资料整理一下.有关Socket与HTTP的基础知识MOMO就不赘述拉,不懂得朋友自己谷歌吧.我们项目的需求是在登录的时候使用HTTP请求, ...
- 手持终端打印POS机(安装移动销售开单订货会软件)无线传输到订货会后台销售管理系统
当今的服装市场是品牌竞争时代,产品能否紧随潮流前线并迅速推出市场抢得先机,是品牌成功与否的关键.而订货会是每个鞋服企业新产品走向市场至关重要的开端,订货会如何演绎.成功与否,与品牌在竞争洪流中的命运息 ...
- 手机连接wifi自动弹窗的原理及其实现方案
一.手机连上wifi后会自动弹窗的原理 生活中,有很多需要认证的路由器,手机连接wifi热点后会自动弹出一个网页,让用户输入账号和密码,比如星巴克,肯地基,麦当劳,甚至是火车站和机场的候车室.其实这是 ...
- C-LODOP设置同一页面 手机电脑都打印
C-Lodop有四种角色,1:客户端本地打印方式客户端访问web,调用客户端本地的打印机进行打印,这时候调用的安装在客户端本地的c-lodop服务,实际调用的是http://Localhost:800 ...
- Unity3D 游戏引擎之C#使用Socket与HTTP连接server数据传输包
近期比較忙.有段时间没写博客拉.近期项目中须要使用HTTP与Socket.雨松MOMO把自己这段时间学习的资料整理一下. 有关Socket与HTTP的基础知识MOMO就不赘述拉,不懂得朋友自己谷歌吧. ...
随机推荐
- html5移动web开发笔记(一)Web 存储
localStorage - 没有时间限制的数据存储 localStorage 方法 localStorage 方法存储的数据没有时间限制.第二天.第二周或下一年之后,数据依然可用. 用户访问页面的次 ...
- 前端:IE兼容性的相关方法
有一段时间做前端的时候,IE下的就兼容性是比较令人头痛的问题,我在这一过程中也是看了很多的资料,然后把一些自己觉得比较普遍的问题进行一下相关的总结. 1.在IE6下,格式为png的图片在IE6上的透明 ...
- 节点操作js jQuery
append() - 在被选元素的结尾插入内容 prepend() - 在被选元素的开头插入内容 after() - 在被选元素之后插入内容 before() - 在被选元素之前插入内容 functi ...
- hdu 1231, dp ,maximum consecutive sum of integers, find the boundaries, possibly all negative, C++ 分类: hdoj 2015-07-12 03:24 87人阅读 评论(0) 收藏
the algorithm of three version below is essentially the same, namely, Kadane's algorithm, which is o ...
- 修改加粗cmd和powershell命令行的中文字体
powershell 传教士 原创文章 2016-06-20 允许转载,但必须保留名字和出处,否则追究法律责任 ---[前言]--- 1 环境: win10 10586 powershell 5.0 ...
- 自定义cell(xib)中button点击事件不能响应的情况
遇到这种问题真的好尴尬,之前从来没有遇到过,以为手到擒来,未曾料到还会遇到问题! 好多年没有找到尴尬的感觉,现在找到了,真的很尴尬 ! *o* 1.首先使用场景: 原本没打算用xib,后来为了快速, ...
- wpf初步-grid布局-连连看棋盘
private void Window_Loaded_1(object sender, RoutedEventArgs e) { //Button btn1 = new Button(); //btn ...
- Disable testSuite and testCase on some environment
def testEnv = context.expand('${#Project#testEnv}') String[] testCases = ["CheckEARouting(ADS)A ...
- jQuery原生框架-----------------dom操作
// 扩展DOM操作方法jQuery.fn.extend({ // 设置或者获取元素的内容 html: function( html ) { /* * 实现思路: * 1.不传参,返回第一个元素的内容 ...
- 移动测试主要使用的测试框架,基于python
1.uiautomator google自己的测试框架,可以跨应用测试, 语言支持java,python也可以在GitHub上找到封装的包,去调用uiautomator. 2.Robotium jav ...