|  |  |  | 
|---|
|  |  |  | package com.ld.igds.protocol.bhzn.inout; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.JSON; | 
|---|
|  |  |  | import com.alibaba.fastjson.JSONObject; | 
|---|
|  |  |  | import com.ld.igds.common.CoreCommonService; | 
|---|
|  |  |  | import com.ld.igds.constant.FoodVariety; | 
|---|
|  |  |  | import com.ld.igds.inout.ApiInoutService; | 
|---|
|  |  |  | import com.ld.igds.inout.InoutApiConstant; | 
|---|
|  |  |  | import com.ld.igds.inout.InoutConstant; | 
|---|
|  |  |  | import com.ld.igds.inout.dto.ApiInoutData; | 
|---|
|  |  |  | import com.ld.igds.inout.dto.InoutData; | 
|---|
|  |  |  | import com.ld.igds.io.constant.ProtocolEnum; | 
|---|
|  |  |  | import com.ld.igds.models.Depot; | 
|---|
|  |  |  | import com.ld.igds.protocol.bhzn.inout.client.BHZNClientEngine; | 
|---|
|  |  |  | import com.ld.igds.protocol.bhzn.utils.CRC16; | 
|---|
|  |  |  | import com.ld.igds.protocol.bhzn.verb.dto.IoMessage; | 
|---|
|  |  |  | import com.ld.igds.util.BytesUtil; | 
|---|
|  |  |  | import com.ld.io.api.InvokeResult; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import org.apache.commons.lang3.StringUtils; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.stereotype.Component; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.xml.ws.soap.Addressing; | 
|---|
|  |  |  | import java.io.UnsupportedEncodingException; | 
|---|
|  |  |  | import java.util.HashMap; | 
|---|
|  |  |  | import java.util.Map; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @Desc: 地磅主控协议实现,出入库相关接口 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //    @Autowired | 
|---|
|  |  |  | //    private Inoutservice inoutservice; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private CoreCommonService coreCommonService; | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String getProtocol() { | 
|---|
|  |  |  | return ProtocolEnum.TCP_BHZH_INOUT_V1.getCode(); | 
|---|
|  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String gateControl(ApiInoutData param) { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | //           ReqGate reqGate = new ReqGate(); | 
|---|
|  |  |  | log.info("BHZN出入库控制器控制道闸开始"); | 
|---|
|  |  |  | String actionCode = param.getActionCode(); | 
|---|
|  |  |  | BHZNClientEngine test = new BHZNClientEngine( | 
|---|
|  |  |  | param.getIp(), param.getPort()); | 
|---|
|  |  |  | test.start(); | 
|---|
|  |  |  | String msg = "<BHZN>{\"cmd\":226,\"content\":{" + | 
|---|
|  |  |  | "\"value\":[1,1]," + | 
|---|
|  |  |  | "\"LEDValue\":[1,1]" + | 
|---|
|  |  |  | "},\"orderId\":\"5009\",\"result\":\"\",\"sign\":\"0000\",\"stNum\":1,\"version\":\"V1.0000000\"}<END>"; | 
|---|
|  |  |  | Integer[] value = new Integer[]{0,0}; | 
|---|
|  |  |  | Map<String,Object> message = new HashMap<>(); | 
|---|
|  |  |  | message.put("Cmd",226); | 
|---|
|  |  |  | message.put("orderId","5009"); | 
|---|
|  |  |  | message.put("result","0"); | 
|---|
|  |  |  | message.put("sign","0000"); | 
|---|
|  |  |  | message.put("stNum",100); | 
|---|
|  |  |  | message.put("version","V1.0000000"); | 
|---|
|  |  |  | message.put("sn","1000000001"); | 
|---|
|  |  |  | Map<String,Object> content = new HashMap<>(); | 
|---|
|  |  |  | //            String msg = "<BHZN>{\"cmd\":226,\"content\":{" ; | 
|---|
|  |  |  | if(InoutApiConstant.DEVICE_CODE_2002 == param.getDeviceCode()){ | 
|---|
|  |  |  | content.put("value",new Integer[]{1,0}); | 
|---|
|  |  |  | content.put("LEDValue",new Integer[]{1,0}); | 
|---|
|  |  |  | //                msg +=  "\"value\":[1,0]," ; | 
|---|
|  |  |  | //                msg+= "\"LEDValue\":[1,0]" ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(InoutApiConstant.DEVICE_CODE_2003 == param.getDeviceCode()){ | 
|---|
|  |  |  | content.put("value",new Integer[]{0,1}); | 
|---|
|  |  |  | content.put("LEDValue",new Integer[]{0,1}); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | message.put("content", content); | 
|---|
|  |  |  | //            msg+=      "},\"orderId\":\"5009\",\"result\":\"\",\"sign\":\"0000\",\"stNum\":100,\"version\":\"V1.0000000\"}<END>"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // Thread.sleep(3000L); | 
|---|
|  |  |  | Thread.sleep(3000L); | 
|---|
|  |  |  | String msg = "<BHZN>" + JSON.toJSONString(message) + "<END>" ; | 
|---|
|  |  |  | InvokeResult result = test.send(msg.getBytes()); | 
|---|
|  |  |  | log.info("BHZN出入库控制器控制道闸结束,MSG=" +msg); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error(e.getMessage(),e); | 
|---|
|  |  |  | return "ERROR"; | 
|---|
|  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String noticeLed(ApiInoutData param, InoutData data) { | 
|---|
|  |  |  | // todo | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | log.info("BHZN控制LED开始"); | 
|---|
|  |  |  | BHZNClientEngine test = new BHZNClientEngine( | 
|---|
|  |  |  | "12.10.0.187", 58258); | 
|---|
|  |  |  | test.start(); | 
|---|
|  |  |  | Thread.sleep(3000L); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | // 姓名 | 
|---|
|  |  |  | String msg =  getMsg(StringUtils.isEmpty(data.getUserName())?"  ":data.getUserName(),"0B00"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | InvokeResult result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  | //车牌 | 
|---|
|  |  |  | msg =  getMsg(StringUtils.isEmpty(data.getPlateNum())?"  ":data.getPlateNum(),"0C00"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  | //仓库 | 
|---|
|  |  |  | Depot depot =coreCommonService.getDepotById(data.getCompanyId(),data.getDepotId()); | 
|---|
|  |  |  | String depotName ="  "; | 
|---|
|  |  |  | if(depot != null) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | depotName = depot.getName(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | msg =  getMsg(StringUtils.isEmpty(depotName)?"  ":depotName,"0D00"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //品种 | 
|---|
|  |  |  | String foodvariety =  FoodVariety.getMsg(data.getFoodVariety()); | 
|---|
|  |  |  | msg =  getMsg(StringUtils.isEmpty(foodvariety)?"  ":foodvariety,"0E00"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  | //毛重 | 
|---|
|  |  |  | msg =  getMsg((data.getFullWeight() == null )?"  ":data.getFullWeight().toString(),"0F00"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  | //皮重 | 
|---|
|  |  |  | msg =  getMsg((data.getEmptyWeight() == null )?"  ":data.getEmptyWeight().toString(),"1000"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  | //化验结果 | 
|---|
|  |  |  | msg =  getMsg("合格","1100"); | 
|---|
|  |  |  | log.info("msg=" + msg); | 
|---|
|  |  |  | result = test.send(BytesUtil.hexStrToBytes(msg)); | 
|---|
|  |  |  | log.info("result=" +result.getMessage()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | log.info("BHZN控制LED结束"); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return result.getMessage(); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | log.error(e.getMessage(),e); | 
|---|
|  |  |  | return "ERROR"; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static void main(String[] args) { | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | String str1 = "许彬",str2="粤A123456",str3 = "3号仓" ,str4 = "小麦",str5="286000",str6 = "30000",str7 ="合格"; | 
|---|
|  |  |  | String test = "我爱中航软件"; | 
|---|
|  |  |  | //78340100290000000000000000 1400 0B00 01 02 00 01 0C 00 | 
|---|
|  |  |  | //            String str1 = "许彬",str2="粤A123456",str3 = "3号仓" ,str4 = "小麦",str5="286000",str6 = "30000",str7 ="合格"; | 
|---|
|  |  |  | //            String test = "120000.0"; | 
|---|
|  |  |  | //            //FF FF FF FF FF FF 00 00 00 00 78 34 01 00 29 BC FD 00 00 00 00 00 00 14 00 11 00 01 02 06 01 0C 00 CE D2 B0 AE D6 D0 BA BD C8 ED BC FE 87 1F A5 | 
|---|
|  |  |  | //            String start = "FFFFFFFFFFFF00000000"; | 
|---|
|  |  |  | //            String lengh = BytesUtil.tran_LH(BytesUtil.intToHexStr(8+(test.length() * 2))); | 
|---|
|  |  |  | //            String lengh2 = BytesUtil.tran_LH(BytesUtil.intToHexStr((test.length() * 2))); | 
|---|
|  |  |  | //            String msg = "78340100290000000000000000" + lengh+ "100001020101" + lengh2; | 
|---|
|  |  |  | //            msg = msg + convertStr(test); | 
|---|
|  |  |  | //            msg = msg.toUpperCase(); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | ////        String t = "78 34 01 00 29 BC FD 00 00 00 00 00 00 14 00 01 00 01 02 06 01 0C 00 CE D2 B0 AE D6 D0 BA BD C8 ED BC FE"; | 
|---|
|  |  |  | ////         t =   t.replaceAll(" ",""); | 
|---|
|  |  |  | //            String check = BytesUtil.tran_LH(BytesUtil.intToHexStr(CRC16.calcCrc16(BytesUtil.hexStrToBytes(msg)))); | 
|---|
|  |  |  | //            System.out.println(check); | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //            msg+=check; | 
|---|
|  |  |  | //            msg += "A5"; | 
|---|
|  |  |  | //            msg = start +msg; | 
|---|
|  |  |  | //            System.out.println(msg); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String lengh = BytesUtil.tran_LH(BytesUtil.intToHexStr(8+test.length())); | 
|---|
|  |  |  | String msg = "78340100290000000000000000 " + lengh+ "0B00010200010C00"; | 
|---|
|  |  |  | //        Map<String,Object> message = new HashMap<>(); | 
|---|
|  |  |  | //        message.put("cmd",226); | 
|---|
|  |  |  | //        message.put("orderId","5009"); | 
|---|
|  |  |  | //        message.put("result","0"); | 
|---|
|  |  |  | //        message.put("sign","0000"); | 
|---|
|  |  |  | //        message.put("stNum",100); | 
|---|
|  |  |  | //        message.put("version","V1.0000000"); | 
|---|
|  |  |  | //        Map<String,Object> content = new HashMap<>(); | 
|---|
|  |  |  | //            content.put("value",new Integer[]{0,1}); | 
|---|
|  |  |  | //            content.put("LEDValue",new Integer[]{0,1}); | 
|---|
|  |  |  | //        message.put("content", content); | 
|---|
|  |  |  | //        System.out.println(JSON.toJSONString(message)); | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | IoMessage message = JSON.parseObject("{Cmd:120}",IoMessage.class); | 
|---|
|  |  |  | System.out.println(message.getCmd()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param s 字符串 | 
|---|
|  |  |  | * @param id 0B00 字符ID | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public static String getMsg(String s ,String id){ | 
|---|
|  |  |  | try{ | 
|---|
|  |  |  | // String str1 = "许彬",str2="粤A123456",str3 = "3号仓" ,str4 = "小麦",str5="286000",str6 = "30000",str7 ="合格"; | 
|---|
|  |  |  | String test = s; | 
|---|
|  |  |  | //FF FF FF FF FF FF 00 00 00 00 78 34 01 00 29 BC FD 00 00 00 00 00 00 14 00 11 00 01 02 06 01 0C 00 CE D2 B0 AE D6 D0 BA BD C8 ED BC FE 87 1F A5 | 
|---|
|  |  |  | String start = "FFFFFFFFFFFF00000000"; | 
|---|
|  |  |  | String lengh = BytesUtil.tran_LH(BytesUtil.intToHexStr(8+(test.length() * 2))); | 
|---|
|  |  |  | String lengh2 = BytesUtil.tran_LH(BytesUtil.intToHexStr((test.length() * 2))); | 
|---|
|  |  |  | String msg = "78340100290000000000000000" + lengh+ id+"01020101" + lengh2; | 
|---|
|  |  |  | msg = msg + convertStr(test); | 
|---|
|  |  |  | msg = msg.toUpperCase(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | //         t =   t.replaceAll(" ",""); | 
|---|
|  |  |  | String check = BytesUtil.tran_LH(BytesUtil.intToHexStr(CRC16.calcCrc16(BytesUtil.hexStrToBytes(msg)))); | 
|---|
|  |  |  | System.out.println(check); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | msg+=check; | 
|---|
|  |  |  | msg += "A5"; | 
|---|
|  |  |  | msg = start +msg; | 
|---|
|  |  |  | //log.info(msg); | 
|---|
|  |  |  | return msg; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | System.out.println(msg); | 
|---|
|  |  |  | }catch (Exception e){ | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | log.error(e.getMessage(),e); | 
|---|
|  |  |  | return "  "; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //hexToBytes方法:十六进制字符串转byte[],网上很多 | 
|---|
|  |  |  | //getRepair0方法:补0的,很简单,自己实现吧 | 
|---|
|  |  |  | 
|---|
|  |  |  | * @throws UnsupportedEncodingException | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public static String convertStr(String msg) throws Exception { | 
|---|
|  |  |  | //先把字符串按gb2312转成byte数组 | 
|---|
|  |  |  | byte[] bytes = msg.getBytes("gb2312"); | 
|---|
|  |  |  | StringBuilder gbString = new StringBuilder(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (byte b : bytes) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | // 再用Integer中的方法,把每个byte转换成16进制输出 | 
|---|
|  |  |  | String temp = Integer.toHexString(b); | 
|---|
|  |  |  | //判断进行截取 | 
|---|
|  |  |  | if(temp.length()>=8){ | 
|---|
|  |  |  | temp = temp.substring(6, 8); | 
|---|
|  |  |  | String t = null; | 
|---|
|  |  |  | char[] chars = msg.toCharArray(); | 
|---|
|  |  |  | String s= ""; | 
|---|
|  |  |  | for(int i=0;i<chars.length;i++){ | 
|---|
|  |  |  | t = ""; | 
|---|
|  |  |  | s = msg.substring(i,i+1); | 
|---|
|  |  |  | //先把字符串按gb2312转成byte数组 | 
|---|
|  |  |  | byte[] bytes = s.getBytes("gb2312"); | 
|---|
|  |  |  | for (byte b : bytes) | 
|---|
|  |  |  | { | 
|---|
|  |  |  | // 再用Integer中的方法,把每个byte转换成16进制输出 | 
|---|
|  |  |  | String temp = Integer.toHexString(b); | 
|---|
|  |  |  | //判断进行截取 | 
|---|
|  |  |  | if(temp.length()>=8){ | 
|---|
|  |  |  | temp = temp.substring(6, 8); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | t +=(temp); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | gbString.append(temp); | 
|---|
|  |  |  | if(t.length()<4){ | 
|---|
|  |  |  | for (int k =0;k<4;k++){ | 
|---|
|  |  |  | if(t.length()<4){ | 
|---|
|  |  |  | t = "0"+t; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | gbString.append(t); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return gbString.toString(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|