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 }
|
1.3.3