大趋智能打印机java api
对接飞鹅和易联云后 ,网上几乎没资料对大趋智能打印机java api分享,故此分享一波。
SnParam.java
package com.shanheyongmu.openapi.param; import lombok.Data;
import lombok.NoArgsConstructor; @NoArgsConstructor
@Data
public class SnParam { /**
* 打印机编号
*/
private String sn; public SnParam(String sn) {
this.sn = sn;
} }
PrinterAddParam.java
package com.shanheyongmu.openapi.param; import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range; import javax.validation.constraints.NotBlank; @Data
public class PrinterAddParam { /**
* 打印机编号
*/
@NotBlank
@Length(max = 50)
private String sn; /**
* 设备密钥
*/
@NotBlank
@Length(max = 255)
private String key; /**
* 设备名称或备注
*/
@Length(max = 50)
private String name; @Range(min = 1, max = 16)
private Integer lang; }
PrintStatusQueryParam.java
package com.shanheyongmu.openapi.param; import lombok.Data;
import lombok.EqualsAndHashCode; import javax.validation.constraints.NotNull; @Data
@EqualsAndHashCode(callSuper = true)
public class PrintStatusQueryParam extends SnParam { /**
* 打印请求ID
*/
@NotNull
private Long printId; public PrintStatusQueryParam(@NotNull String sn, @NotNull Long printId) {
super(sn);
this.printId = printId;
}
}
PrintParam.java
package com.shanheyongmu.openapi.param; import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range; /**
* 打印请求
*/
@Data
public class PrintParam extends SnParam { /**
* 打印小票模板内容
*/
@Length(max = 6000)
private String content; /**
* 播报音源
*/
@Length(max = 120)
private String voice; /**
* 播报语音次数,默认播报1次,不能超过3次
*/
@Range(min = 1, max = 5)
private Integer voicePlayTimes; /**
* 多次播报语音时的间隔秒数,默认3秒
*/
private String voicePlayInterval; /**
* 打印小票张数,不传默认1, 取值范围: 1~5
*/
@Range(min = 1, max = 5)
private Integer copies; }
com.shanheyongmu.openapi.result 新建6个类
ResponseResult.java
package com.shanheyongmu.openapi.result; import lombok.Data; import java.io.Serializable; /**
* 标准响应结构体
* @param <T> 响应业务数据
*/
@Data
public class ResponseResult<T> implements Serializable {
private String code;
private String message;
private T data;
}
PrinterAddResultData.java
package com.shanheyongmu.openapi.result; import lombok.Data; import java.util.List; @Data
public class PrinterAddResultData { /**
* 多台设备发生增加失败时返回原因列表,都成功时返回空列表(注意:增加单时失败的原因在message中)
*/
List<AddFailResult> fail; @Data
public static class AddFailResult { private String sn; /**
* 失败原因
*/
private String reason; } }
PrinterUnbindResultData.java
package com.shanheyongmu.openapi.result; import lombok.Data; import java.util.List; /**
* 打印解绑结果
*/
@Data
public class PrinterUnbindResultData { /**
* 多台设备解绑成功时,返回成功的SN列表
*/
List<String> ok; /**
* 多台设备发生解绑失败时返回原因列表
*/
List<UnbindFailResult> fail; @Data
public static class UnbindFailResult { private String sn; /**
* 失败原因
*/
private String reason; }
}
PrinterStatusResultData.java
package com.shanheyongmu.openapi.result; import lombok.Data; @Data
public class PrinterStatusResultData { /**
* 在线状态 0/1
* 0=不在线 1=在线
*/
int onlineStatus; /**
* 设备状态
*
*
* -1=初始化 0=就绪 1=打印中 2=缺纸 3=过温 4=打印故障
*/
int workStatus; /**
* 设备状态说明
*/
String workStatusDesc; }
PrintRequestResultData.java
package com.shanheyongmu.openapi.result; import lombok.Data; /**
* 请求打印结果
*/
@Data
public class PrintRequestResultData { /**
* 打印请求ID
*/
private long printId; /**
* 当前打印机队列长度
*/
private Integer queueSize; }
com.shanheyongmu.openapi.result.callback下
PrintRequestStateCallbackData.java
package com.shanheyongmu.openapi.result.callback; import lombok.Data; /**
* 回调打印结果
*/
@Data
public class PrintRequestStateCallbackData { /**
* 打印ID
*/
private long printId; /**
* 状态
* 0=待打印 1=打印中 2=成功 3=失败 4=已取消
*/
private String status; }
CallbackResult.java
package com.shanheyongmu.openapi.result.callback; import lombok.Data; /**
* 回调结果
*/
@Data
public class CallbackResult { /**
* 回调业务类型
*
* 5=打印请求状态发生改变 6=打印机打印发生改变
*/
private int type; /**
* 回调时间(unix timestamp 秒)
*/
private long rtime; /**
* 业务json string
*/
private String data; }
DaQuApi.java
package com.shanheyongmu.openapi.util; import com.shanheyongmu.openapi.result.PrinterAddResultData;
import com.shanheyongmu.openapi.param.PrintParam;
import com.shanheyongmu.openapi.param.PrintStatusQueryParam;
import com.shanheyongmu.openapi.param.PrinterAddParam;
import com.shanheyongmu.openapi.param.SnParam;
import com.shanheyongmu.openapi.result.*;
import org.springframework.core.ParameterizedTypeReference; import java.util.List; public class DaQuApi { private static String API_PREFIX = "https://printer.juhesaas.com/openapi"; /**
* 批量添加打印机
*/
public static ResponseResult<PrinterAddResultData> addPrinterBatch(List<PrinterAddParam> printerList) {
String url = API_PREFIX + "/addPrinter";
return DaQuRequestUtils.post(url, printerList, new ParameterizedTypeReference<ResponseResult<PrinterAddResultData>>() {
});
} /**
* 查询设备状态
*/
public static ResponseResult<PrinterStatusResultData> getDeviceStatus(String sn) {
return DaQuRequestUtils.post(API_PREFIX + "/getDeviceStatus", new SnParam(sn), new ParameterizedTypeReference<ResponseResult<PrinterStatusResultData>>() {
});
} /**
* 请求打印
*/
public static ResponseResult<PrintRequestResultData> print(PrintParam printParam) {
return DaQuRequestUtils.post(API_PREFIX + "/print", printParam, new ParameterizedTypeReference<ResponseResult<PrintRequestResultData>>() {
});
} /**
* 查询小票打印结果
*/
public static ResponseResult<PrintStatusData> getPrintStatus(PrintStatusQueryParam printStatusQueryParam) {
return DaQuRequestUtils.post(API_PREFIX + "/getPrintStatus", printStatusQueryParam, new ParameterizedTypeReference<ResponseResult<PrintStatusData>>() {
});
} /**
* 解绑打印机
*/
public static ResponseResult<PrinterUnbindResultData> unbind(List<String> snList) {
return DaQuRequestUtils.post(API_PREFIX + "/delPrinter", snList, new ParameterizedTypeReference<ResponseResult<PrinterUnbindResultData>>() {
});
} }
DaQuRequestUtils.java 大趋智能云打印机工具类,大趋智能 TRENDIT P7
package com.shanheyongmu.openapi.util; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.shanheyongmu.openapi.result.ResponseResult;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate; import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.UUID; public class DaQuRequestUtils { private static ObjectMapper objectMapper = new ObjectMapper(); /**
* 发起请求
*
* @param url url
* @param body 请求body对象
* @param typeReference 响应类型
*/
public static <R, P> ResponseResult<R> post(String url, P body, ParameterizedTypeReference<ResponseResult<R>> typeReference) {
HttpHeaders hexSignHeader = getHeader(body);
hexSignHeader.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<P> request = new HttpEntity<>(body, hexSignHeader);
return new RestTemplate().exchange(url, HttpMethod.POST, request, typeReference).getBody();
} /**
* 设备请求头
*/
public static HttpHeaders getHeader(Object requestParam) {
String appId = "{your appid}";
String appSecret = "{your appSecret}";
long stime = LocalDateTime.now().toEpochSecond(ZoneOffset.UTC);
String uid = UUID.randomUUID().toString(); String originContext = uid + appId + stime + appSecret;
if (requestParam != null) {
try {
// 注意:如果有自定义Spring MVC HttpMessageConverter,请注意两边序列化规则保持一至
originContext += objectMapper.writeValueAsString(requestParam);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
} HttpHeaders headers = new HttpHeaders();
String sign = DigestUtils.md5Hex(originContext);
headers.add("appid", appId);
headers.add("uid", uid);
headers.add("stime", String.valueOf(stime));
headers.add("sign", sign);
return headers;
} }
测试用例
package com.shanheyongmu.openapi.util; import com.shanheyongmu.openapi.param.PrintParam;
import com.shanheyongmu.openapi.param.PrintStatusQueryParam;
import com.shanheyongmu.openapi.param.PrinterAddParam;
import com.shanheyongmu.openapi.result.*;
import org.junit.Assert;
import org.junit.Test; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import static org.junit.Assert.*; public class DaQuApiTest { String testSN = "67002004xxxx";
String testKey = "7w4566"; @Test
public void unbindTest() {
ResponseResult<PrinterUnbindResultData> responseResult = DaQuApi.unbind(Arrays.asList(testSN));
System.out.println(responseResult);
Assert.assertEquals("0", responseResult.getCode());
Assert.assertEquals("OK", responseResult.getMessage());
} @Test
public void addPrinterBatchTest() {
List<PrinterAddParam> printerList = new ArrayList<>();
PrinterAddParam printer1 = new PrinterAddParam();
printer1.setSn(testSN);
printer1.setKey(testKey);
printer1.setName("openApiTestSN");
printerList.add(printer1); ResponseResult<PrinterAddResultData> responseResult = DaQuApi.addPrinterBatch(printerList);
System.out.println(responseResult);
Assert.assertEquals("0", responseResult.getCode());
Assert.assertEquals("OK", responseResult.getMessage());
} @Test
public void getDeviceStatusTest() {
ResponseResult<PrinterStatusResultData> responseResult = DaQuApi.getDeviceStatus(testSN);
System.out.println(responseResult);
Assert.assertEquals("0", responseResult.getCode());
Assert.assertEquals("OK", responseResult.getMessage());
} @Test
public void printTest() {
PrintParam printParam = new PrintParam();
printParam.setSn(testSN);
printParam.setContent("test print");
printParam.setVoicePlayTimes(1);
printParam.setVoice("1"); // 模拟美团接单
ResponseResult<PrintRequestResultData> responseResult = DaQuApi.print(printParam);
System.out.println(responseResult);
Assert.assertEquals("0", responseResult.getCode());
Assert.assertEquals("OK", responseResult.getMessage());
Assert.assertNotNull(responseResult.getData());
Assert.assertNotNull(responseResult.getData().getPrintId());
Assert.assertNotNull(responseResult.getData().getQueueSize());
} @Test
public void getPrintStatusTest() {
PrintStatusQueryParam printStatusQueryParam = new PrintStatusQueryParam(testSN, 1045401059247738881L);
ResponseResult<PrintStatusData> responseResult = DaQuApi.getPrintStatus(printStatusQueryParam);
System.out.println(responseResult);
Assert.assertEquals("0", responseResult.getCode());
Assert.assertEquals("OK", responseResult.getMessage());
}
}
大趋智能打印机java api的更多相关文章
- 第08章 ElasticSearch Java API
本章内容 使用客户端对象(client object)连接到本地或远程ElasticSearch集群. 逐条或批量索引文档. 更新文档内容. 使用各种ElasticSearch支持的查询方式. 处理E ...
- Elasticsearch的CRUD:REST与Java API
CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...
- Java API 快速速查宝典
Java API 快速速查宝典 作者:明日科技,陈丹丹,李银龙,王国辉 著 出版社:人民邮电出版社 出版时间:2012年5月 Java编程的最基本要素是方法.属性和事件,掌握这些要素,就掌握了解决实际 ...
- Sample: Write And Read data from HDFS with java API
HDFS: hadoop distributed file system 它抽象了整个集群的存储资源,可以存放大文件. 文件采用分块存储复制的设计.块的默认大小是64M. 流式数据访问,一次写入(现支 ...
- mybatis Java API
既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了. MyBatis 的 Java API 就是你收获你所做的努力的地方.正如你即将看到的,和 JDBC 相比, MyB ...
- HDFS基础和java api操作
1. 概括 适合一次写入多次查询情况,不支持并发写情况 通过hadoop shell 上传的文件存放在DataNode的block中,通过linux shell只能看见block,看不见文件(HDFS ...
- 详解Java API之正则表达式
正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的.在正则表达式中,主要有两种字符,一种描述的是普通的字符,另一种描述的是元字符.其中元字符是整个正则表达式的核 ...
- Elasticsearch java api 基本搜索部分详解
文档是结合几个博客整理出来的,内容大部分为转载内容.在使用过程中,对一些疑问点进行了整理与解析. Elasticsearch java api 基本搜索部分详解 ElasticSearch 常用的查询 ...
- Java数据持久层框架 MyBatis之API学习八(Java API详解)
对于MyBatis的学习而言,最好去MyBatis的官方文档:http://www.mybatis.org/mybatis-3/zh/index.html 对于语言的学习而言,马上上手去编程,多多练习 ...
- Spark Java API 之 CountVectorizer
Spark Java API 之 CountVectorizer 由于在Spark中文本处理与分析的一些机器学习算法的输入并不是文本数据,而是数值型向量.因此,需要进行转换.而将文本数据转换成数值型的 ...
随机推荐
- Python 第五次实验
[1] (程序设计)编写程序,将二维列表数据写入 CSV文件(命名为"out.csv"),用逗号隔开.二维列表如下:[['Name','Age','Gender'], ['Bob' ...
- [LeetCode]-217.存在重复元素-简单
217. 存在重复元素 给定一个整数数组,判断是否存在重复元素. 如果存在一值在数组中出现至少两次,函数返回 true .如果数组中每个元素都不相同,则返回 false . 示例 1: 输入: [1, ...
- SDN实验环境安装配置
- .NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试
.NET 6 EFCore WebApi 使用 JMeter 进行吞吐量测试 开发环境 VS2022 .NET 6 测试环境 测试工具 接口压力测试工具:JMeter 数据库 MySQL 5.7 数据 ...
- Fluentd部署:系统配置
Fluentd的全局配置项,诸如开启RPC.使用多worker模式等.可在配置文件中通过<system>进行配置,或通过命令行进行配置. 参数 workers:指定worker进程数,默认 ...
- Jupyter notebook导入Pycharm项目的.py文件里的模块及方法
Jupyter notebook导入Pycharm项目种的.py文件里的模块及方法 需要在Jupyter notebook里调用自己写的代码,过程如下. 首先在Pycharm里写好一个文件,例如DCC ...
- 使用MVC的实现登录注册功能
文章目录 1.视图层(View)页面的编写: 1.1.登录页面 1.2.注册页面 2.控制层(Controller)的编写 2.1. 注册 2.2 .登录 2.3 .实体类 3.Model层(Mode ...
- 中国制霸生成器「GitHub 热点速览 v.22.42」
火遍推特的中国制霸生成器本周一开源就占据了两天的 GitHub Trending 榜,不知道你的足迹遍布了多少个省份呢?同样记录痕迹的 kanal 用了内存读写方式解决了 Rust 的消息处理问题,P ...
- 1.轮询、长轮询、websocket简介
一.轮询 前端每隔固定时间向后台发送一次请求,询问服务器是否有新数据 缺点: 延迟,需要固定的轮询时间,不一定是实时数据 大量耗费服务器内存和宽带资源,因为不停的请求服务器,很多时候 并没有新的数 ...
- 22.-CSRF攻击
一.CSRF-跨站伪造请求攻击 某些恶意网站上包含链接.表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息视图在你的网站上完成某些操作 这就是跨站请求伪造(CSRF,即Cro ...