说明
因公司需求,需要实现连接WiFi打印机进行打印,很多年还没有WiFi的时候做过蓝牙打印机,真实难为我了,废话不多说,开始吧!
效果图
实现步骤
1:平台创建账号并认证:https://admin.feieyun.com/index.php 审核通过后就会得到相应的USER和UKEY,后面会用到
2:对接相应API:API官方文档自家看
公共参数
public static final String URL = "http://api.feieyun.cn/Api/Open/";//不需要修改
public static final String USER = "*********";//*必填*:账号名
public static final String UKEY = "*********";//*必填*: 飞鹅云后台注册账号后生成的UKEY 【备注:这不是填打印机的KEY】
public static final String SN = "*********";//*必填*:打印机编号,必须要在管理后台里添加打印机或调用API接口添加之后,才能调用API
//打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填),多台打印机请换行(\n)添加新打印机信息,每次最多100台。
//特别说明:打印机识别码就是打印机底座的key
String snlist="*******# *******# 拼必达打印机 # *******";
添加打印机
/**
* 添加打印机方法
* @param snlist
*/
public void rightDatelist(String snlist){
//获取当前时间戳
String STIME = String.valueOf(System.currentTimeMillis()/1000);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
//以表单形式 post方式提交的数据
FormBody formBody = new FormBody.Builder()
.add("user", USER)//飞鹅云后台注册用户名。
.add("stime", STIME)//当前UNIX时间戳,10位,精确到秒。
.add("sig", getSHA(USER+UKEY+STIME))//对参数 user+UKEY+stime拼接后(+号表示连接符)进行SHA1加密得到签名,加密后签名值为40位小写字符串。
.add("apiname", "Open_printerAddlist")//请求的接口名称:Open_printerAddlist
.add("debug", "0")//debug=1返回非json格式的数据。仅测试时候使用。
.add("printerContent", snlist)//打印机编号(必填) # 打印机识别码(必填) # 备注名称(选填) # 流量卡号码(选填),多台打印机请换行(\n)添加新打印机信息,每次最多100台。
.build();
final Request request = new Request.Builder()
.url(URL)//请求的url
.post(formBody)
.build();
//创建/Call
Call call = okHttpClient.newCall(request);
//加入队列 异步操作
call.enqueue(new Callback() {
//请求错误回调方法
@Override
public void onFailure(Call call, IOException e) {
System.out.println("添加失败"+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.code()==200) {
System.out.println("添加成功"+response.body().string());
}
}
});
}
删除打印机
/**
* 删除打印机
* @param
*/
public void rightDatelistDc(){
//获取当前时间戳
String STIME = String.valueOf(System.currentTimeMillis()/1000);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
//post方式提交的数据
FormBody formBody = new FormBody.Builder()
.add("user", USER)//飞鹅云后台注册用户名。
.add("stime", STIME)//当前UNIX时间戳,10位,精确到秒。
.add("sig", getSHA(USER+UKEY+STIME))//对参数 user+UKEY+stime拼接后(+号表示连接符)进行SHA1加密得到签名,加密后签名值为40位小写字符串。
.add("apiname", "Open_printerDelList")//请求的接口名称:Open_printerAddlist
.add("debug", "0")//debug=1返回非json格式的数据。仅测试时候使用。
.add("snlist", SN)//打印机编号,多台打印机请用减号“-”连接起来。
.build();
final Request request = new Request.Builder()
.url(URL)//请求的url
.post(formBody)
.build();
//创建/Call
Call call = okHttpClient.newCall(request);
//加入队列 异步操作
call.enqueue(new Callback() {
//请求错误回调方法
@Override
public void onFailure(Call call, IOException e) {
System.out.println("删除失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.code()==200) {
System.out.println("删除成功"+response.body().string());
}
}
});
}
打印小票
/**
* 打印机打印订单
* @param
*/
public void rightDatelistDy(){
String content;
content = "<CB>安卓测试打印</CB><BR>";
content += "名称 单价 数量 金额<BR>";
content += "--------------------------------<BR>";
content += "饭 1.0 1 1.0<BR>";
content += "炒饭 10.0 10 10.0<BR>";
content += "蛋炒饭 10.0 10 100.0<BR>";
content += "鸡蛋炒饭 100.0 1 100.0<BR>";
content += "番茄蛋炒饭 1000.0 1 100.0<BR>";
content += "西红柿蛋炒饭 1000.0 1 100.0<BR>";
content += "西红柿鸡蛋炒饭 100.0 10 100.0<BR>";
content += "备注:加辣<BR>";
content += "--------------------------------<BR>";
content += "合计:10000.0元<BR>";
content += "送货地点:贵州易荣德尚<BR>";
content += "联系电话:17385159420<BR>";
content += "订餐时间:2021-08-04 08:08:08<BR>";
// content += "<QR>http://www.dzist.com</QR>";
String STIME = String.valueOf(System.currentTimeMillis()/1000);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.build();
//post方式提交的数据
FormBody formBody = new FormBody.Builder()
.add("user", USER)//飞鹅云后台注册用户名
.add("stime", STIME)//当前UNIX时间戳,10位,精确到秒。
// .add("backurl","http://mini.llskj.cn/feieyun_verify_pWEenZ263Q1BzvXC.txt")//必须先在管理后台设置,回调数据格式详见《订单状态回调》
// .add("expired",zeroMillis+"")//订单失效UNIX时间戳,10位,精确到秒,打印时超过该时间该订单将抛弃不打印,取值范围为:当前时间<订单失效时间≤24小时后。
.add("sig", getSHA(USER+UKEY+STIME))//对参数 user+UKEY+stime拼接后(+号表示连接符)进行SHA1加密得到签名,加密后签名值为40位小写字符串。
.add("apiname", "Open_printMsg")//请求的接口名称
.add("sn", SN)//打印机编号
.add("content", content)//打印内容,不能超过5000字节
.add("times","1")//打印次数
.build();
final Request request = new Request.Builder()
.url(URL)//请求的url
.post(formBody)
.build();
System.out.println("打印机编号:"+SN);
//创建/Call
Call call = okHttpClient.newCall(request);
//加入队列 异步操作
call.enqueue(new Callback() {
//请求错误回调方法
@Override
public void onFailure(Call call, IOException e) {
System.out.println("打印失败");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.code()==200) {
System.out.println("打印成功"+response.body().string());
}
}
});
}
SHA-1加密字符串
/**
* SHA-1加密字符串
*
* @param info
* @return
*/
public static String getSHA(String info) {
byte[] bytesSHA = null;
try {
// 得到一个SHA-1的消息摘要
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
// 添加要进行计算摘要的信息
messageDigest.update(info.getBytes());
// 得到该摘要
bytesSHA = messageDigest.digest();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String strSHA = byteToHex(bytesSHA);
return strSHA;
}
Bytes数组转换为字符串
/**
* Bytes数组转换为字符串
*
* @param bytes
* @return
*/
private static String byteToHex(byte[] bytes) {
String hs = "";
String temp;
for (byte b : bytes) {
temp = (Integer.toHexString(b & 0XFF));
if (temp.length() == 1) {
hs = hs + "0" + temp;
} else {
hs = hs + temp;
}
}
return hs;
}