Public Member Functions | |
int | parsePacket (FND_Datagram fndDatagram, byte[] data) throws Exception |
J. Seitter
Philipp Haeuser
|
Parse the raw data into the supplied FND_Datagram.
00047 { 00048 00049 // Check if first incoming byte is 0xF0 (FND-Datagram signature) 00050 00051 00052 if (data[0] == (byte) 0xF0) { 00053 logger.debug("UDP Size: "+data.length); 00054 logger.debug("Datagram type: FND 1.0"); 00055 logger.debug("Datagram size: " + data[1]); 00056 logger.debug("Datapoint type: " + ((byte) data[26] >>> 4)); 00057 logger.debug("Transport Control: " + Integer.toHexString((int)data[2])); 00058 logger.debug("Segment Nr: " + data[3]); 00059 logger.debug("Invoke ID: " + data[4]); 00060 logger.debug( 00061 "Central Control: " + data[5] + ":" + data[6]); 00062 logger.debug( 00063 "Island Control: " + data[7] + ":" + data[8]); 00064 00065 String dp_id = null; 00066 byte string[] = new byte[16]; 00067 for (int i = 0; i < 16; i++) { 00068 string[i] = data[i + 9]; 00069 } 00070 dp_id = new String(string); // data[9 to 24] 00071 00072 logger.debug("Datapoint ID: " + dp_id); 00073 logger.debug("Operation Code: " + Integer.toHexString((int)data[25])+":"+Integer.toHexString((int)data[26])); 00074 logger.debug("Application Control:" + Integer.toHexString((int)data[27])); 00075 logger.debug("Mask: " + Integer.toHexString((int)data[28])); 00076 logger.debug("Info_Event: " + Integer.toHexString((int)data[29])); 00077 logger.debug("Info_Code: " + Integer.toBinaryString(data[30])+":"+Integer.toBinaryString(data[31])); 00078 logger.debug("Timestamp " + data[34]+"."+data[33]+"."+(data[32]+2000)+" "+ data[35]+":"+data[36]+":"+data[37]); 00079 logger.debug("Data 1: " + data[38]); 00080 logger.debug("Data 2: " + data[39]); 00081 00082 } 00083 00084 00085 if (data[0] != (byte) 0xF0) { 00086 return -1; 00087 } 00088 00089 try { 00090 fndDatagram.setLen(data[1]); // set length of datagram 00091 00092 // transportControl tag extraction example: 00093 // transportControl 1011 0110 00094 // 1011 0110 & 0x30 => 0011 0000 00095 // 0011 0000 >>> 4 => 0000 0011 -> tag = 3 00096 byte transportControl = data[2]; 00097 byte d_r = (byte) (transportControl >>> 6); 00098 // extract d_r - unsigned right shift 00099 byte tag = (byte) ((transportControl & (byte) 0x30) >>> 4); 00100 // extract tag 00101 byte mpr = (byte) ((transportControl & (byte) 0x0C) >>> 2); 00102 // extract mpr 00103 byte seg = (byte) (transportControl & (byte) 0x03); // extract seg 00104 fndDatagram.setTransportControl(d_r, tag, mpr, seg); 00105 fndDatagram.setSegmentNr(data[3]); 00106 fndDatagram.setInvokeID(data[4]); 00107 fndDatagram.setCentralControl(data[5], data[6]); 00108 fndDatagram.setIslandControl(data[7], data[8]); 00109 00110 byte[] dataPointID = new byte[16]; 00111 for (int i = 0; i < dataPointID.length; i++) { 00112 dataPointID[i] = data[i + 9]; // data[9 to 24] 00113 } 00114 fndDatagram.setDataPointID(dataPointID); 00115 00116 byte operationCode = data[25]; 00117 byte fct_id = (byte) (operationCode >>> 4); // unsigned right shift 00118 byte tab_id = (byte) (operationCode & (byte) 0x0F); 00119 operationCode = data[26]; 00120 byte dp_type = (byte) (operationCode >>> 4); 00121 byte dp_subtype = (byte) (operationCode & (byte) 0x0F); 00122 fndDatagram.setOperationsCode(fct_id, tab_id, dp_type, dp_subtype); 00123 00124 byte applicationControl = data[27]; 00125 byte prd = (byte) ((applicationControl & (byte) 0xC0) >>> 6); 00126 // binary: 1100 0000 00127 byte rpr = (byte) ((applicationControl & (byte) 0x30) >>> 4); 00128 // binary: 0011 0000 00129 byte emq = (byte) (applicationControl & (byte) 0x0F); 00130 // binary: 0000 1111 00131 fndDatagram.setApplicationControl(prd, rpr, emq); 00132 00133 byte mask = data[28]; 00134 byte val = (byte) ((mask & (byte) 0xC0) >>> 6); 00135 byte apr = (byte) ((mask & (byte) 0x30) >>> 4); 00136 byte mis = (byte) ((mask & (byte) 0x0C) >>> 2); 00137 byte msk = (byte) (mask & (byte) 0x03); 00138 fndDatagram.setMask(val, apr, mis, msk); 00139 00140 byte infoEvent = data[29]; 00141 byte info = (byte) ((infoEvent & (byte) 0xF0) >>> 4); 00142 byte event = (byte) (infoEvent & (byte) 0x0F); 00143 fndDatagram.setInfoEvent(info, event); 00144 00145 fndDatagram.setInfoCode(data[30], data[31]); 00146 00147 fndDatagram.setDateTime( 00148 data[32], 00149 data[33], 00150 data[34], 00151 data[35], 00152 data[36], 00153 data[37]); 00154 00155 // set data part 00156 byte[] dataPart = new byte[data.length - 38]; 00157 System.arraycopy(data, 38, dataPart, 0, data.length - 38); 00158 // (Object src, int srcPos, Object dest, int destPos, int length) 00159 fndDatagram.setDataPart(dataPart); 00160 } catch (Exception ex) { 00161 logger.error( 00162 "Error while parsing incoming UDP packet on port \n" 00163 + ex.getMessage()); 00164 // TODO handle error 00165 throw ex; 00166 } 00167 return 0; 00168 } |