DirectiveCreator.java 5.87 KB
package com.bsth.data.directive;

import com.alibaba.fastjson.JSON;
import com.bsth.data.BasicData;
import com.bsth.entity.directive.D60;
import com.bsth.entity.directive.D60.D60Data;
import com.bsth.entity.directive.D64;
import com.bsth.entity.directive.D64.D64Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 
 * @ClassName: DirectiveCreator 
 * @Description: TODO(指令数据生成) 
 * @author PanZhao
 * @date 2016年8月14日 下午9:57:07 
 *
 */
public class DirectiveCreator {

	// 城市代码
	static final short cityCode = 22;
	
	static Logger logger = LoggerFactory.getLogger(DirectiveCreator.class);
	
	/**
	 * 
	 * @Title: createDirective60 
	 * @Description: TODO(创建60数据包) 
	 * @param @param nbbm 车辆内部编码
	 * @param @param text 文本
	 * @param @param dispatchInstruct 指令类型(0X00表示信息短语,0X01表示取消上次指令+调度指令(闹钟有效),0x02表示为调度指令(闹钟有效); 0x03表示运营状态指令(闹钟无效);0x04表示其他指令)
	 * @param @param upDown 上下行(0 上行  1 下行)
	 * @param @param state 营运状态(0 营运 1 非营运)
	 * @param @return    设定文件 
	 * @return Directive60    返回类型 
	 * @throws
	 */
	public D60 createD60(String nbbm, String text, Short dispatchInstruct, int upDown, int state,String lineCode) {
		Long timestamp = System.currentTimeMillis();

		Short company = Short.parseShort(BasicData.nbbm2CompanyCodeMap.get(nbbm));
		String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);

		int msgId = MsgIdGenerator.getMsgId();

		D60 directive = new D60();
		D60Data data = new D60Data();
		// 一级协议
		directive.setOperCode((short) 0x60);
		// 设备号
		directive.setDeviceId(deviceId);
		// 时间戳
		directive.setTimestamp(timestamp);
		directive.setMsgId(msgId);
		// 构造数据
		data.setDeviceId(deviceId);
		data.setDispatchInstruct(dispatchInstruct);
		data.setTimestamp(timestamp);
		data.setCompanyCode(company);
		data.setMsgId(msgId);
		directive.setData(data);
		directive.setLineCode(lineCode);
		long serviceState;
		try {
			serviceState = Consts.SERVICE_STATE[upDown][state];
		} catch (IndexOutOfBoundsException e) {
			// 未知营运状态的直接默认为上行非营运
			serviceState = Consts.SERVICE_STATE[0][1];
		}
		data.setServiceState(serviceState);
		data.setTxtContent(text);
		
		return directive;
	}
	
	
	public D60 createD60_01(String nbbm, String text, int upDown, int state, Date alarmTime){
		SimpleDateFormat sdfMMddHHmm = new SimpleDateFormat("MMddHHmm");
		
		Long timestamp = System.currentTimeMillis();

		Short company = Short.parseShort(BasicData.nbbm2CompanyCodeMap.get(nbbm));
		String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);

		int msgId = MsgIdGenerator.getMsgId();

		D60 directive = new D60();
		D60Data data = new D60Data();
		// 一级协议
		directive.setOperCode((short) 0x60);
		// 设备号
		directive.setDeviceId(deviceId);
		// 时间戳
		directive.setTimestamp(timestamp);
		directive.setMsgId(msgId);
		// 构造数据
		data.setDeviceId(deviceId);
		data.setDispatchInstruct((short) 0x01);
		data.setTimestamp(timestamp);
		data.setCompanyCode(company);
		data.setMsgId(msgId);
		data.setAlarmTime(Long.parseLong(sdfMMddHHmm.format(alarmTime)));
		directive.setData(data);
		long serviceState;
		try {
			serviceState = Consts.SERVICE_STATE[upDown][state];
		} catch (IndexOutOfBoundsException e) {
			// 未知营运状态的直接默认为上行非营运
			serviceState = Consts.SERVICE_STATE[0][1];
		}
		data.setServiceState(serviceState);
		data.setTxtContent(text);
		return directive;
	}
	
	/**
	 * 
	 * @Title: createD64
	 * @Description: TODO(创建线路切换指令 64) 
	 * @param @param nbbm 车辆内部编码
	 * @param @param lineId 线路编码
	 * @param @param t 时间戳
	 * @throws

	public D64 createD64(String nbbm, String lineCode, long t){
		String deviceId = BasicData.deviceId2NbbmMap.inverse().get(nbbm);
		return create64(deviceId, lineCode, t);
	}*/

	public D64 create64(String deviceId, String lineCode, long t){
		D64 change = new D64();
		D64Data data = new D64Data();
		data.setCityCode(cityCode);
		data.setDeviceId(deviceId);

		//线路编码补满6位数
		String lineCodeStr = padLeft(lineCode, 6, '0');
		data.setLineId(lineCodeStr);

		change.setDeviceId(deviceId);
		change.setOperCode((short) 0X64);
		change.setTimestamp(t);
		change.setData(data);

		return change;
	}
	
	/**
	 * 
	 * @Title: createDeviceRefreshData 
	 * @Description: TODO(线路刷新指令(用于切换线路后,要求设置重新下载线路文件)) 
	 * @param @param deviceId 设备编号
	 * @param @param lineId  线路ID
	 * @throws
	 */
	public String createDeviceRefreshData(String deviceId, String lineCode) {
		Long t = System.currentTimeMillis();
		Map<String, Object> param = new HashMap<>();
		param.put("deviceId", deviceId);
		param.put("timestamp", t);
		param.put("operCode", 0Xc0);

		Map<String, Object> data = new HashMap<>();
		data.put("operCode2", 0xa1);
		data.put("cityCode", cityCode);
		data.put("deviceId", deviceId);
		data.put("timestamp", t);
		data.put("centerId", 1);
		
		//线路编码补满6位数
		String lineCodeStr = padLeft(lineCode, 6, '0');
		
		data.put("lineId", lineCodeStr);
		data.put("lineVersion", 0);
		data.put("carparkDataVersion", 0);
		param.put("data", data);

		return JSON.toJSONString(param);
	}
	
	 public String padLeft(String oriStr,int len,char alexin){
	   String str = "";
	   int strlen = oriStr.length();
	   if(strlen < len){
	   for(int i=0;i<len-strlen;i++){
	    str = str+alexin;
	   }
	  }
	  str = str + oriStr;
	  return str;
	 }
}