对接打印机

This commit is contained in:
mi9688 2024-12-10 17:51:32 +08:00
parent 81e5429ee9
commit 5e76aa6305
12 changed files with 346 additions and 50 deletions

View File

@ -238,9 +238,19 @@
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<!--二维码生成-->
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.4.1</version>
</dependency>
</dependencies>
</project>

View File

@ -66,6 +66,10 @@ public interface FastBeeConstant {
* 设备其他消息处理
*/
String DEVICE_OTHER_TASK = "deviceOtherMsgTask";
/**
* 水电设备数据上报处理
*/
String DEVICE_WATER_ELECTRIC_TASK = "deviceWaterElectricMsgTask";
/**
* 数据调试任务
*/

View File

@ -1,17 +1,12 @@
package com.fastbee.mq.redischannel.consumer;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fastbee.common.constant.FastBeeConstant;
import com.fastbee.common.core.mq.DeviceReportBo;
import com.fastbee.mq.service.impl.DeviceOtherMsgHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Arrays;
/**
* @author gsb
@ -31,48 +26,57 @@ public class DeviceOtherMsgConsumer {
String serialNumber;//设备序列号
Long packetId;//包号
byte[] data = bo.getData();//数据
String topic;//主题
System.err.println("接收到数据:"+ new String(data));
//解析
String jsonString = "{\"type\": \"waterEleData\", \"pakSn\": 123, \"data\": {\"workState\": 1, \"action\": \"startPump\", \"mcuSn\": \"MCU123456\", \"sumEle\": 5000, \"sumFlow\": 3000, \"insFlow\": 2.5, \"userSumFlow\": 1500, \"areaCode\": \"010\", \"cardId\": \"CARD12345678\", \"userBalance\": 100.0, \"userSumEle\": 3000, \"curEle\": 50, \"curFlow\": 200, \"insPower\": 2300}}";
JSONObject entries = JSONUtil.parseObj(jsonString);
System.err.println("解析后:"+entries);
//获取帧标识
String type = entries.getStr("type");
//获取帧号
Long pakSn = entries.getLong("pakSn");
//获取数据
JSONObject dataObj = entries.getJSONObject("data");
//获取水泵状态0=关泵,1=开泵
Integer workState = dataObj.getInt("workState");
//获取动作
String action = dataObj.getStr("action");
//获取单片机编码
String mcuSn = dataObj.getStr("mcuSn");
//获取累计用电量
Integer sumEle = dataObj.getInt("sumEle");
//获取累计用水量
Integer sumFlow = dataObj.getInt("sumFlow");
//获取瞬时流量
Double insFlow = dataObj.getDouble("insFlow");
//当前用户累计用水量
Integer userSumFlow = dataObj.getInt("userSumFlow");
//获取区域号
String areaCode = dataObj.getStr("areaCode");
//获取卡号
String cardId = dataObj.getStr("cardId");
//获取用户余额
Double userBalance = dataObj.getDouble("userBalance");
//获取用户累计用电量
Integer userSumEle = dataObj.getInt("userSumEle");
//获取本次用电量
Integer curEle = dataObj.getInt("curEle");
//获取本次用水量
Integer curFlow = dataObj.getInt("curFlow");
//获取瞬时功率
Integer insPower = dataObj.getInt("insPower");
String topic=bo.getTopicName();//主题
//设备上报数据消息
if(topic.endsWith("/info/up")){
System.err.println("mqtt接收到设备上报数据"+ new String(data));
} else if ( topic.endsWith("/info/reply")) {
System.err.println("mqtt回应收到设备上报数据"+ new String(data));
} else if (topic.endsWith("cmd/down")) {
System.err.println("mqtt收到设备下发命令"+ new String(data));
} else if (topic.endsWith("cmd/reply")) {
System.err.println("mqtt回应收到设备下发命令"+ new String(data));
}
// //解析
// String jsonString = "{\"type\": \"waterEleData\", \"pakSn\": 123, \"data\": {\"workState\": 1, \"action\": \"startPump\", \"mcuSn\": \"MCU123456\", \"sumEle\": 5000, \"sumFlow\": 3000, \"insFlow\": 2.5, \"userSumFlow\": 1500, \"areaCode\": \"010\", \"cardId\": \"CARD12345678\", \"userBalance\": 100.0, \"userSumEle\": 3000, \"curEle\": 50, \"curFlow\": 200, \"insPower\": 2300}}";
// JSONObject entries = JSONUtil.parseObj(jsonString);
// System.err.println("解析后:"+entries);
// //获取帧标识
// String type = entries.getStr("type");
// //获取帧号
// Long pakSn = entries.getLong("pakSn");
// //获取数据
// JSONObject dataObj = entries.getJSONObject("data");
// //获取水泵状态0=关泵,1=开泵
// Integer workState = dataObj.getInt("workState");
// //获取动作
// String action = dataObj.getStr("action");
// //获取单片机编码
// String mcuSn = dataObj.getStr("mcuSn");
// //获取累计用电量
// Integer sumEle = dataObj.getInt("sumEle");
// //获取累计用水量
// Integer sumFlow = dataObj.getInt("sumFlow");
// //获取瞬时流量
// Double insFlow = dataObj.getDouble("insFlow");
// //当前用户累计用水量
// Integer userSumFlow = dataObj.getInt("userSumFlow");
// //获取区域号
// String areaCode = dataObj.getStr("areaCode");
// //获取卡号
// String cardId = dataObj.getStr("cardId");
// //获取用户余额
// Double userBalance = dataObj.getDouble("userBalance");
// //获取用户累计用电量
// Integer userSumEle = dataObj.getInt("userSumEle");
// //获取本次用电量
// Integer curEle = dataObj.getInt("curEle");
// //获取本次用水量
// Integer curFlow = dataObj.getInt("curFlow");
// //获取瞬时功率
// Integer insPower = dataObj.getInt("insPower");
// otherMsgHandler.messageHandler(bo);
}catch (Exception e){

View File

@ -0,0 +1,69 @@
package com.fastbee.mq.redischannel.consumer;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fastbee.common.constant.FastBeeConstant;
import com.fastbee.common.core.mq.DeviceReportBo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class HydropowerDeviceReportMsgConsumer {
@Async(FastBeeConstant.TASK.DEVICE_WATER_ELECTRIC_TASK)
public void consume(DeviceReportBo bo){
try {
//处理emq订阅的非 property/post 属性上报的消息 因为其他消息量小放在一起处理
String serialNumber;//设备序列号
Long packetId;//包号
byte[] data = bo.getData();//数据
String topic;//主题
System.err.println("mqtt接收到数据"+ new String(data));
//解析
String jsonString = "{\"type\": \"waterEleData\", \"pakSn\": 123, \"data\": {\"workState\": 1, \"action\": \"startPump\", \"mcuSn\": \"MCU123456\", \"sumEle\": 5000, \"sumFlow\": 3000, \"insFlow\": 2.5, \"userSumFlow\": 1500, \"areaCode\": \"010\", \"cardId\": \"CARD12345678\", \"userBalance\": 100.0, \"userSumEle\": 3000, \"curEle\": 50, \"curFlow\": 200, \"insPower\": 2300}}";
JSONObject entries = JSONUtil.parseObj(jsonString);
System.err.println("解析后:"+entries);
//获取帧标识
String type = entries.getStr("type");
//获取帧号
Long pakSn = entries.getLong("pakSn");
//获取数据
JSONObject dataObj = entries.getJSONObject("data");
//获取水泵状态0=关泵,1=开泵
Integer workState = dataObj.getInt("workState");
//获取动作
String action = dataObj.getStr("action");
//获取单片机编码
String mcuSn = dataObj.getStr("mcuSn");
//获取累计用电量
Integer sumEle = dataObj.getInt("sumEle");
//获取累计用水量
Integer sumFlow = dataObj.getInt("sumFlow");
//获取瞬时流量
Double insFlow = dataObj.getDouble("insFlow");
//当前用户累计用水量
Integer userSumFlow = dataObj.getInt("userSumFlow");
//获取区域号
String areaCode = dataObj.getStr("areaCode");
//获取卡号
String cardId = dataObj.getStr("cardId");
//获取用户余额
Double userBalance = dataObj.getDouble("userBalance");
//获取用户累计用电量
Integer userSumEle = dataObj.getInt("userSumEle");
//获取本次用电量
Integer curEle = dataObj.getInt("curEle");
//获取本次用水量
Integer curFlow = dataObj.getInt("curFlow");
//获取瞬时功率
Integer insPower = dataObj.getInt("insPower");
// otherMsgHandler.messageHandler(bo);
}catch (Exception e){
log.error("=>设备其他消息处理出错",e);
}
}
}

View File

@ -22,9 +22,10 @@ public class MqttTest {
*/
@GetMapping("/publish")
public String test(){
pubMqttClient.publish(1,true,"/topic/test","mqtt测试主题发布消息");
pubMqttClient.publish(1,true,"/10086/155/cmd/down","mqtt测试主题发布消息");
return "test";
}
/**
* 测试创建mqtt客户端
*/

View File

@ -0,0 +1,33 @@
package com.fastbee.data.controller.printer;
import com.fastbee.common.core.domain.AjaxResultPro;
import com.fastbee.data.controller.printer.yilianyun.YiLianYunPrintService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/printer")
public class PrinterController {
@Autowired
private YiLianYunPrintService printerService;
/**
* 文本内容打印
*/
@PostMapping("/text/do")
public AjaxResultPro textPrint(@RequestBody String content){
printerService.textPrint(content);
return AjaxResultPro.success();
}
/**
* 图片打印
*/
@PostMapping("/image/do")
public AjaxResultPro imagePrint(@RequestBody String imageUrl){
printerService.imagePrint(imageUrl);
return AjaxResultPro.success();
}
}

View File

@ -0,0 +1,70 @@
package com.fastbee.data.controller.printer.yilianyun;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@Component
public class YiLianYunAuthorizationService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private String clientId = "1044721086";
private String clientSecret = "dfb761fb75768df0066f9614dc507531";
private String grantType = "client_credentials";
private String sign;
private String scope = "all";
private Long timestamp;
private String id = "550e8400-e29b-41d4-a716-446655440000";
private String endpoint = "https://open-api.10ss.net/v2/oauth/oauth";
public String getAccessToken() {
String cacheToken = stringRedisTemplate.opsForValue().get("yilianyun:user:token");
if (!Objects.isNull(cacheToken)){
System.err.println("缓存中获取token:"+cacheToken);
return cacheToken;
}
String token = getAuth();
// System.err.println("从服务器获取token:"+token);
// return token;
stringRedisTemplate.opsForValue().set("yilianyun:user:token",token,3600*24*20, TimeUnit.MILLISECONDS);
return stringRedisTemplate.opsForValue().get("yilianyun:access_token");
}
public String getAuth() {
timestamp = System.currentTimeMillis();
sign=YiLianYunUtil.getSign(timestamp);
//构建请求体
Map<String,Object> param= new HashMap<>();
param.put("client_id",clientId);
param.put("grant_type",grantType);
param.put("sign",sign);
param.put("scope",scope);
param.put("timestamp",timestamp);
param.put("id",id);
YiLianYunBaseService yiLianYunBaseService = new YiLianYunBaseService();
JSONObject resp = yiLianYunBaseService.baseRequest(endpoint, param);
System.err.println(resp);
return resp.getStr("access_token");
}
public static void main(String[] args) {
YiLianYunPrintService yiLianYunPrintService = new YiLianYunPrintService();
// yiLianYunPrintService.print("<FS2>您好</FS2>");
}
}

View File

@ -0,0 +1,26 @@
package com.fastbee.data.controller.printer.yilianyun;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.fastbee.common.exception.ServiceException;
import java.util.Map;
public class YiLianYunBaseService {
/**
* 基本请求
* @param body 请求负载
* @return 请求结果 data
*/
public JSONObject baseRequest(String url, Map<String,Object> body){
String jsonStr = JSONUtil.toJsonStr(body);
String respStr = HttpUtil.post(url, jsonStr);
JSONObject resp = JSONUtil.parseObj(respStr);
System.err.println(resp);
if(!resp.get("error").toString().equals("0")){
throw new ServiceException(resp.get("error_description").toString());
}
return resp.getJSONObject("body");
}
}

View File

@ -0,0 +1,57 @@
package com.fastbee.data.controller.printer.yilianyun;
import cn.hutool.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class YiLianYunPrintService {
@Autowired
private YiLianYunAuthorizationService authorizationService;
private String endpoint = "https://open-api.10ss.net/v2/print/index";
/**
* 文本打印
* @param content 打印内容
*/
public void textPrint(String content){
YiLianYunBaseService yiLianYunBaseService = new YiLianYunBaseService();
//构建请求参数
// 创建一个 HashMap 来存储属性
Map<String, Object> attributes = new HashMap<>();
// 添加属性到 HashMap
Long timestamp = System.currentTimeMillis();
attributes.put("client_id", YiLianYunUtil.clientId);
attributes.put("sign", YiLianYunUtil.getSign(timestamp));
attributes.put("timestamp", timestamp);
attributes.put("id", "550e8400-e29b-41d4-a716-446655440000");
attributes.put("access_token", authorizationService.getAccessToken());
attributes.put("machine_code", "4004899747");
attributes.put("origin_id", "123");
attributes.put("content", content);
JSONObject resp = yiLianYunBaseService.baseRequest(endpoint, attributes);
}
/**
* 图片打印
*/
public void imagePrint(String pictureUrl){
YiLianYunBaseService yiLianYunBaseService = new YiLianYunBaseService();
//构建请求参数
// 创建一个 HashMap 来存储属性
Map<String, Object> attributes = new HashMap<>();
// 添加属性到 HashMap
Long timestamp = System.currentTimeMillis();
attributes.put("client_id", YiLianYunUtil.clientId);
attributes.put("sign", YiLianYunUtil.getSign(timestamp));
attributes.put("timestamp", timestamp);
attributes.put("id", "550e8400-e29b-41d4-a716-446655440000");
attributes.put("access_token", authorizationService.getAccessToken());
attributes.put("machine_code", "4004899747");
attributes.put("origin_id", "123");
attributes.put("picture_url", pictureUrl);
JSONObject resp = yiLianYunBaseService.baseRequest(endpoint, attributes);
}
}

View File

@ -0,0 +1,12 @@
package com.fastbee.data.controller.printer.yilianyun;
import cn.hutool.crypto.digest.DigestUtil;
public class YiLianYunUtil {
public static String clientId = "1044721086";
public static String clientSecret = "dfb761fb75768df0066f9614dc507531";
public static String getSign(Long timestamp) {
String param = clientId + timestamp + clientSecret;
return DigestUtil.md5Hex(param).toLowerCase();
}
}

View File

@ -13,7 +13,7 @@ import com.fastbee.common.core.domain.BaseEntity;
* 设备上电审核前上报的基础信息对象 iot_device_report_info
*
* @author kerwincui
* @date 2024-12-09
* @date 2024-12-10
*/
@ApiModel(value = "DeviceReportInfo",description = "设备上电审核前上报的基础信息 iot_device_report_info")
@Data
@ -105,4 +105,9 @@ public class DeviceReportInfo extends BaseEntity
@ApiModelProperty("二维码")
private String qrCode;
/** 设备名称 */
@Excel(name = "设备名称")
@ApiModelProperty("设备名称")
private String name;
}

View File

@ -22,10 +22,11 @@
<result property="batchNumber" column="batch_number" />
<result property="serialNumber" column="serial_number" />
<result property="qrCode" column="qr_code" />
<result property="name" column="name" />
</resultMap>
<sql id="selectDeviceReportInfoVo">
select id, imei, iccid, mcu_id, bsp_type, lte_type, mcu_type, mcu_fw, lte_fw, lcd_manufacturer, voice_manufacturer, fram_model, replace_manufacturer, test_record, batch_number, serial_number, qr_code from iot_device_report_info
select id, imei, iccid, mcu_id, bsp_type, lte_type, mcu_type, mcu_fw, lte_fw, lcd_manufacturer, voice_manufacturer, fram_model, replace_manufacturer, test_record, batch_number, serial_number, qr_code, name from iot_device_report_info
</sql>
<select id="selectDeviceReportInfoList" parameterType="DeviceReportInfo" resultMap="DeviceReportInfoResult">
@ -47,6 +48,7 @@
<if test="batchNumber != null "> and batch_number = #{batchNumber}</if>
<if test="serialNumber != null and serialNumber != ''"> and serial_number = #{serialNumber}</if>
<if test="qrCode != null and qrCode != ''"> and qr_code = #{qrCode}</if>
<if test="name != null and name != ''"> and name like concat('%', #{name}, '%')</if>
</where>
</select>
@ -74,6 +76,7 @@
<if test="batchNumber != null">batch_number,</if>
<if test="serialNumber != null">serial_number,</if>
<if test="qrCode != null">qr_code,</if>
<if test="name != null">name,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="imei != null and imei != ''">#{imei},</if>
@ -92,6 +95,7 @@
<if test="batchNumber != null">#{batchNumber},</if>
<if test="serialNumber != null">#{serialNumber},</if>
<if test="qrCode != null">#{qrCode},</if>
<if test="name != null">#{name},</if>
</trim>
</insert>
@ -114,6 +118,7 @@
<if test="batchNumber != null">batch_number = #{batchNumber},</if>
<if test="serialNumber != null">serial_number = #{serialNumber},</if>
<if test="qrCode != null">qr_code = #{qrCode},</if>
<if test="name != null">name = #{name},</if>
</trim>
where id = #{id}
</update>