001package gu.dtalk; 002 003import com.google.common.base.Preconditions; 004import com.google.common.base.Strings; 005 006/** 007 * 设备命令响应对象<br> 008 * 此类对象将做为设备命令响应经redis服务器发送到命令发送端, 009 * 数据发到redis服务器以及设备端从redis服务器收到数据的过程要经过JSON序列化和反序列化<br> 010 * @author guyadong 011 * 012 * @param <T> 设备命令执行返回结果类型 013 */ 014public class Ack<T> { 015 private long cmdSn; 016 private int deviceId; 017 private T value; 018 private Status status; 019 private String errorMessage; 020 /** 设备命令执行状态 */ 021 public enum Status{ 022 /** 调用正常返回 */ 023 OK, 024 /** 设备端不支持的操作 */ 025 UNSUPPORTED, 026 /** 调用出错 */ 027 ERROR, 028 /** 029 * 响应超时,此错误不是由设备端发送, 030 * 是由命令发送端(本机)在指定的时间内没有收到任何响应而取消频道订阅时产生 031 */ 032 TIMEOUT 033 } 034 public Ack() { 035 } 036 /** 037 * 返回状态信息 038 * @return 039 */ 040 public String message(){ 041 Preconditions.checkArgument(null != status,"status field is null"); 042 StringBuffer buffer = new StringBuffer(String.format("device%d@%d:%s", deviceId,cmdSn,status.name())); 043 switch(status){ 044 case ERROR: 045 if(!Strings.isNullOrEmpty(errorMessage)){ 046 buffer.append(":").append(errorMessage); 047 } 048 break; 049 case TIMEOUT: 050 case UNSUPPORTED: 051 case OK: 052 default: 053 break; 054 } 055 return buffer.toString(); 056 } 057 /** 返回设备命令序列号 */ 058 public long getCmdSn() { 059 return cmdSn; 060 } 061 public Ack<T> setCmdSn(long cmdSn) { 062 this.cmdSn = cmdSn; 063 return this; 064 } 065 /** 返回执行设备命令的设备ID */ 066 public int getDeviceId() { 067 return deviceId; 068 } 069 070 public Ack<T> setDeviceId(int deviceId) { 071 this.deviceId = deviceId; 072 return this; 073 } 074 /** 返回设备命令执行结果对象 */ 075 public T getValue() { 076 return value; 077 } 078 public Ack<T> setValue(T value) { 079 this.value = value; 080 return this; 081 } 082 /** 返回设备命令执行状态 */ 083 public Status getStatus() { 084 return status; 085 } 086 public Ack<T> setStatus(Status status) { 087 this.status = status; 088 return this; 089 } 090 /** 返回设备命令执行错误信息 */ 091 public String getErrorMessage() { 092 return errorMessage; 093 } 094 public Ack<T> setErrorMessage(String errorMessage) { 095 this.errorMessage = errorMessage; 096 return this; 097 } 098 @Override 099 public String toString() { 100 StringBuilder builder = new StringBuilder(); 101 builder.append("Ack [cmdSn="); 102 builder.append(cmdSn); 103 builder.append(", deviceId="); 104 builder.append(deviceId); 105 builder.append(", value="); 106 builder.append(value); 107 builder.append(", status="); 108 builder.append(status); 109 builder.append(", errorMessage="); 110 builder.append(errorMessage); 111 builder.append("]"); 112 return builder.toString(); 113 } 114}