OpenECHO
 All Classes Namespaces Files Functions Variables
EchoFrame.java
Go to the documentation of this file.
1 /*
2  * Copyright 2012 Sony Computer Science Laboratories, Inc. <info@kadecot.net>
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.sonycsl.echo;
17 
18 import java.io.DataInputStream;
19 import java.io.IOException;
20 import java.io.InputStream;
21 import java.net.InetAddress;
22 import java.nio.ByteBuffer;
23 import java.nio.ByteOrder;
24 import java.util.ArrayList;
25 import java.util.List;
26 
29 
30 
31 
37 public final class EchoFrame {
38 
39  public static final int MIN_FRAME_SIZE = 12;
40 
41  private static final byte EHD1 = 0x10;
42  private static final byte EHD2 = (byte)0x81;
43 
44 
45  public static final byte ESV_SETI = 0x60;
46  public static final byte ESV_SETC = 0x61;
47  public static final byte ESV_GET = 0x62;
48  public static final byte ESV_INF_REQ = 0x63;
49  public static final byte ESV_SET_RES = 0x71;
50  public static final byte ESV_GET_RES = 0x72;
51  public static final byte ESV_INF = 0x73;
52  public static final byte ESV_INFC = 0x74;
53  public static final byte ESV_INFC_RES = 0x7A;
54  public static final byte ESV_SETI_SNA = 0x50;
55  public static final byte ESV_SETC_SNA = 0x51;
56  public static final byte ESV_GET_SNA = 0x52;
57  public static final byte ESV_INF_SNA = 0x53;
58 
59  public static final byte ESV_SET_NO_RES = 0x70;
60 
61  public static final byte ESV_SET_GET = 0x6E;
62  public static final byte ESV_SET_GET_RES = 0x7E;
63  public static final byte ESV_SET_GET_SNA = 0x5E;
64 
65  private short mTID;
66  private byte mESV;
67 
68  private short mSrcEchoClassCode;
69  private byte mSrcEchoInstanceCode;
70  private String mSrcEchoAddress;
71  private short mDstEchoClassCode;
72  private byte mDstEchoInstanceCode;
73  private String mDstEchoAddress;
74 
75  protected List<EchoProperty> mPropertyList;
76 
77 
78 
79 
80  public EchoFrame(short srcEchoClassCode, byte srcEchoInstanceCode
81  , short dstEchoClassCode, byte dstEchoInstanceCode
82  , String dstEchoAddress, byte esv) {
83  // send frame
84  mSrcEchoClassCode = srcEchoClassCode;
85  mSrcEchoInstanceCode = srcEchoInstanceCode;
86 
87  mSrcEchoAddress = EchoSocket.SELF_ADDRESS;
88  mDstEchoClassCode = dstEchoClassCode;
89  mDstEchoInstanceCode = dstEchoInstanceCode;
90  mDstEchoAddress = dstEchoAddress;
91 
92  mESV = esv;
93 
94  mTID = 0;
95 
96  mPropertyList = new ArrayList<EchoProperty>();
97  }
98 
99  public EchoFrame(String srcEchoAddress, byte[] data) {
100  // receive frame
101  mSrcEchoAddress = srcEchoAddress;
102  mDstEchoAddress = EchoSocket.SELF_ADDRESS;
103  if(data.length < MIN_FRAME_SIZE) {return;}
104  if(data[0] != EHD1) return;
105  if(data[1] != EHD2) return;
106  ByteBuffer buffer = ByteBuffer.allocate(2);
107  buffer.order(ByteOrder.BIG_ENDIAN);
108  buffer.put(data[2]);
109  buffer.put(data[3]);
110  mTID = buffer.getShort(0);
111  //Echo.putProxy(address, data[4], data[5], data[6]);
112  //Echo.updateNodeInstance(address, data[4], data[5], data[6]);
113  //mSeoj = Echo.getInstance(address, data[4], data[5], data[6]);
114  //mDeoj = Echo.getInstance(Echo.getNode().getAddress(),
115  // data[7], data[8], data[9]);
116  buffer = ByteBuffer.allocate(2);
117  buffer.order(ByteOrder.BIG_ENDIAN);
118  buffer.put(data[4]);
119  buffer.put(data[5]);
120  mSrcEchoClassCode = buffer.getShort(0);
121  mSrcEchoInstanceCode = data[6];
122  buffer = ByteBuffer.allocate(2);
123  buffer.order(ByteOrder.BIG_ENDIAN);
124  buffer.put(data[7]);
125  buffer.put(data[8]);
126  mDstEchoClassCode = buffer.getShort(0);
127  mDstEchoInstanceCode = data[9];
128  mESV = data[10];
129  int size = data[11] & 0xFF;
130  mPropertyList = new ArrayList<EchoProperty>();
131  for(int i = 0, j = 12; i < size; i++) {
132  if(data.length == j) return;
133  byte epc, pdc;
134  byte[] edt;
135  epc = data[j];
136  j++;
137  if(data.length == j) return;
138  pdc = data[j];
139  j++;
140  if(pdc == 0) {
141  edt = null;
142  } else {
143  if(data.length < j+(pdc & 0xFF)) return;
144  edt = new byte[(int)(pdc & 0xFF)];
145  System.arraycopy(data, j, edt, 0, (int)(pdc & 0xFF));
146  j += (pdc & 0xFF);
147  }
148  mPropertyList.add(new EchoProperty(epc, pdc, edt));
149  }
150 
151  }
152 
153  public static EchoFrame getEchoFrameFromStream(String srcEchoAddress, DataInputStream in) throws IOException, InterruptedException {
154 
155  boolean validHeader = false;
156 
157  byte ehd1 = 0;
158  byte ehd2 = 0;
159  while(!validHeader) {
160  while(in.available() < 11) {
161  Thread.sleep(10);
162  }
163  ehd1 = ehd2;
164  ehd2 = in.readByte();
165  if(ehd1 == EHD1 && ehd2 == EHD2) {
166  validHeader = true;
167  break;
168  } else {
169  continue;
170  }
171  }
172  ArrayList<Byte> data = new ArrayList<Byte>();
173  data.add(EHD1); data.add(EHD2);
174  for(int i = 0; i < 10; i++) {
175  data.add(in.readByte());
176  }
177  int propertyListSize = data.get(11) & 0xFF;
178  for(int i = 0; i < propertyListSize; i++) {
179  data.add(in.readByte()); // epc
180  int pdc = in.readUnsignedByte();
181  data.add((byte)pdc);
182  for(int j = 0; j < pdc; j++) {
183  data.add(in.readByte());
184  }
185  }
186  byte[] b = new byte[data.size()];
187  for(int i = 0; i < data.size(); i++) {
188  b[i] = data.get(i);
189  }
190  EchoFrame frame = new EchoFrame(srcEchoAddress, b);
191  return frame;
192 
193  }
194 
195  protected EchoFrame(short srcEchoClassCode, byte srcEchoInstanceCode,
196  String srcEchoAddress
197  , short dstEchoClassCode, byte dstEchoInstanceCode
198  , String dstEchoAddress, byte esv, short tid, List<EchoProperty> propertyList) {
199 
200  // copy
201 
202  mSrcEchoClassCode = srcEchoClassCode;
203  mSrcEchoInstanceCode = srcEchoInstanceCode;
204  mSrcEchoAddress = srcEchoAddress;
205  mDstEchoClassCode = dstEchoClassCode;
206  mDstEchoInstanceCode = dstEchoInstanceCode;
207  mDstEchoAddress = dstEchoAddress;
208 
209  mESV = esv;
210 
211  mTID = tid;
212 
213  mPropertyList = new ArrayList<EchoProperty>();
214  for(EchoProperty property : propertyList) {
215  mPropertyList.add(property.copy());
216  }
217  }
218 
219  public void setTID(short tid) {
220  mTID = tid;
221  }
222 
223  public short getTID() {
224  return mTID;
225  }
226 
227  public byte getESV() {
228  return mESV;
229  }
230 
231  public short getSrcEchoClassCode() {
232  return mSrcEchoClassCode;
233  }
234 
235  public byte getSrcEchoInstanceCode() {
236  return mSrcEchoInstanceCode;
237  }
238 
239  public String getSrcEchoAddress() {
240  return mSrcEchoAddress;
241  }
242 
243  public short getDstEchoClassCode() {
244  return mDstEchoClassCode;
245  }
246 
247  public void setDstEchoInstanceCode(byte dstEchoInstanceCode) {
248  mDstEchoInstanceCode = dstEchoInstanceCode;
249  }
250 
251  public byte getDstEchoInstanceCode() {
252  return mDstEchoInstanceCode;
253  }
254 
255  public void setDstEchoAddress(String dstEchoAddress) {
256  mDstEchoAddress = dstEchoAddress;
257  }
258 
259  public String getDstEchoAddress() {
260  return mDstEchoAddress;
261  }
262 
263  public List<EchoProperty> getPropertyList() {
264  return mPropertyList;
265  }
266 
268  return mPropertyList.toArray(new EchoProperty[]{});
269  }
270 
271  public byte[] getFrameByteArray() {
272  int propertyListSize = mPropertyList.size();
273  if(propertyListSize > 255) {
274  propertyListSize = 255;
275  }
276  int size = 12;
277  for(int i = 0; i < propertyListSize; i++) {
278  size += mPropertyList.get(i).size();
279  }
280  if(size > EchoSocket.UDP_MAX_PACKET_SIZE) return null;
281  ByteBuffer buffer = ByteBuffer.allocate(size);
282  buffer.order(ByteOrder.BIG_ENDIAN);
283 
284  buffer.put(EHD1);
285  buffer.put(EHD2);
286  buffer.putShort(mTID);
287  buffer.putShort(mSrcEchoClassCode);
288  buffer.put(mSrcEchoInstanceCode);
289  buffer.putShort(mDstEchoClassCode);
290  buffer.put(mDstEchoInstanceCode);
291  buffer.put(mESV);
292  buffer.put((byte)propertyListSize);
293  for(EchoProperty p : mPropertyList) {
294  buffer.put(p.epc);
295  buffer.put(p.pdc);
296  if(p.edt != null)
297  buffer.put(p.edt);
298  }
299  return buffer.array();
300 
301  }
302 
303 
304  public void addPropertyForResponse(byte epc) {
305  addPropertyForResponse(epc, null);
306  }
307 
308  public void addPropertyForResponse(byte epc, byte[] edt) {
309  EchoProperty property = new EchoProperty(epc, edt);
310  addPropertyForResponse(property);
311  }
312 
313  public void addPropertyForResponse(EchoProperty property) {
314  mPropertyList.add(property);
315  switch(mESV) {
316  case ESV_SET_NO_RES: case ESV_SETI_SNA:
317  if(property.pdc != 0) {
318  mESV = ESV_SETI_SNA;
319  }
320  break;
321  case ESV_SET_RES: case ESV_SETC_SNA:
322  if(property.pdc != 0) {
323  mESV = ESV_SETC_SNA;
324  }
325  break;
326  case ESV_GET_RES: case ESV_GET_SNA:
327  if(property.pdc == 0) {
328  mESV = ESV_GET_SNA;
329  }
330  break;
331  case ESV_INF: case ESV_INF_SNA:
332  if(property.pdc == 0) {
333  mESV = ESV_INF_SNA;
334  }
335  break;
336  }
337  }
338 
339  public void addProperty(EchoProperty property) {
340  mPropertyList.add(property);
341  }
342 
343  public EchoFrame copy() {
344  EchoFrame ret = new EchoFrame(mSrcEchoClassCode, mSrcEchoInstanceCode
345  ,mSrcEchoAddress
346  , mDstEchoClassCode, mDstEchoInstanceCode
347  , mDstEchoAddress, mESV, mTID, mPropertyList);
348  return ret;
349  }
350 
351  @Override
352  public String toString(){
353  return "class:"+getSrcEchoClassCode()+"(i:"+getSrcEchoInstanceCode()+
354  "["+getSrcEchoAddress()+"]" + "->" +
356  +"["+getDstEchoAddress()+"] epv:"+ getESV() + " tid:" + getTID();
357 
358  }
359 
360 }
EchoFrame(String srcEchoAddress, byte[] data)
Definition: EchoFrame.java:99
static final String SELF_ADDRESS
Definition: EchoSocket.java:52
void addProperty(EchoProperty property)
Definition: EchoFrame.java:339
static final byte ESV_SET_GET_SNA
Definition: EchoFrame.java:63
static final byte ESV_SET_GET_RES
Definition: EchoFrame.java:62
void addPropertyForResponse(byte epc)
Definition: EchoFrame.java:304
void addPropertyForResponse(EchoProperty property)
Definition: EchoFrame.java:313
EchoProperty[] getProperties()
Definition: EchoFrame.java:267
void setTID(short tid)
Definition: EchoFrame.java:219
void setDstEchoInstanceCode(byte dstEchoInstanceCode)
Definition: EchoFrame.java:247
static final byte ESV_SET_NO_RES
Definition: EchoFrame.java:59
EchoFrame(short srcEchoClassCode, byte srcEchoInstanceCode, short dstEchoClassCode, byte dstEchoInstanceCode, String dstEchoAddress, byte esv)
Definition: EchoFrame.java:80
static final byte ESV_SETI_SNA
Definition: EchoFrame.java:54
List< EchoProperty > getPropertyList()
Definition: EchoFrame.java:263
static final byte ESV_SET_GET
Definition: EchoFrame.java:61
static EchoFrame getEchoFrameFromStream(String srcEchoAddress, DataInputStream in)
Definition: EchoFrame.java:153
void setDstEchoAddress(String dstEchoAddress)
Definition: EchoFrame.java:255
static final byte ESV_INFC_RES
Definition: EchoFrame.java:53
static final byte ESV_INFC
Definition: EchoFrame.java:52
List< EchoProperty > mPropertyList
Definition: EchoFrame.java:75
static final int MIN_FRAME_SIZE
Definition: EchoFrame.java:39
static final byte ESV_INF
Definition: EchoFrame.java:51
static final byte ESV_INF_SNA
Definition: EchoFrame.java:57
static final byte ESV_SETI
Definition: EchoFrame.java:45
static final byte ESV_GET_SNA
Definition: EchoFrame.java:56
static final byte ESV_GET_RES
Definition: EchoFrame.java:50
static final byte ESV_GET
Definition: EchoFrame.java:47
static final byte ESV_SETC
Definition: EchoFrame.java:46
EchoFrame(short srcEchoClassCode, byte srcEchoInstanceCode, String srcEchoAddress, short dstEchoClassCode, byte dstEchoInstanceCode, String dstEchoAddress, byte esv, short tid, List< EchoProperty > propertyList)
Definition: EchoFrame.java:195
static final byte ESV_SETC_SNA
Definition: EchoFrame.java:55
static final byte ESV_SET_RES
Definition: EchoFrame.java:49
void addPropertyForResponse(byte epc, byte[] edt)
Definition: EchoFrame.java:308
static final byte ESV_INF_REQ
Definition: EchoFrame.java:48