throws Exception {
int preOptionNum = 0;
- for (int i = 0; i < 40; i++) {
- List<byte[]> values = coapMessage.getOption(i);
+ for (CoapOption opt : CoapOption.values()) {
+ int optionNum = opt.getvalue();
+ List<byte[]> values = coapMessage.getOption(optionNum);
if (values != null) {
if (values.size() > 0) {
for (byte[] value : values) {
- writeOption(i - preOptionNum,
+ writeOption(optionNum - preOptionNum,
value != null ? value.length : 0, byteBuf,
value);
- preOptionNum = i;
+ preOptionNum = optionNum;
}
} else {
- writeOption(i - preOptionNum, 0, byteBuf, null);
- preOptionNum = i;
+ writeOption(optionNum - preOptionNum, 0, byteBuf, null);
+ preOptionNum = optionNum;
}
}
}
public abstract class CoapMessage extends Message {
- protected byte[] mToken = null;
- protected int mObserve = -1;
+ protected byte[] mToken = null;
+ protected int mObserve = -1;
// Option fields
- protected List<byte[]> if_match = null;
- protected byte[] uri_host = null;
- protected List<byte[]> etag = null;
- protected boolean if_none_match = false;
- protected byte[] uri_port = null;
- protected List<byte[]> location_path = null;
-
- protected byte[] max_age = null;
- protected byte[] accept = null;
- protected List<byte[]> location_query = null;
- protected byte[] proxy_uri = null;
- protected byte[] proxy_scheme = null;
- protected byte[] size1 = null;
- protected byte[] content_format = null;
+ protected List<byte[]> if_match = null;
+ protected byte[] uri_host = null;
+ protected List<byte[]> etag = null;
+ protected boolean if_none_match = false;
+ protected byte[] uri_port = null;
+ protected List<byte[]> location_path = null;
+
+ protected byte[] max_age = null;
+ protected byte[] accept = null;
+ protected List<byte[]> location_query = null;
+ protected byte[] proxy_uri = null;
+ protected byte[] proxy_scheme = null;
+ protected byte[] size1 = null;
+ protected byte[] content_format = null;
+
+ // OCF spec Option fields
+ protected byte[] accept_version = null;
+ protected byte[] content_version = null;
public CoapMessage() {
}
case 6:
mObserve = Bytes.bytesToInt(value);
break;
+
+ // ACCEPT_VERSION
+ case 2049:
+ accept_version = value;
+ break;
+
+ // CONTENT_VERSION
+ case 2053:
+ content_version = value;
+ break;
+
default: {
if (optnum % 2 == 1) {
throw new BadOptionException(
case 6:
return mObserve != -1
? Arrays.asList(Bytes.intToMax4Bytes(mObserve)) : null;
+
+ // ACCEPT_VERSION
+ case 2049:
+ return accept_version != null ? Arrays.asList(accept_version)
+ : null;
+
+ // CONTENT_VERSION
+ case 2053:
+ return content_version != null ? Arrays.asList(content_version)
+ : null;
}
return null;
return ContentFormat.NO_CONTENT;
}
- switch (content_format[0]) {
+ int contentFormat = Bytes.bytesToInt(content_format);
+
+ switch (contentFormat) {
case 40:
return ContentFormat.APPLICATION_LINK_FORMAT;
return ContentFormat.APPLICATION_JSON;
case 60:
+ case 10000:
return ContentFormat.APPLICATION_CBOR;
}
if (content_format == null) {
return 0;
} else {
- return content_format[0];
+ return Bytes.bytesToInt(content_format);
+ }
+ }
+
+ public int getAcceptVersionValue() {
+ if (accept_version == null) {
+ return 0;
+ } else {
+ return Bytes.bytesToInt(accept_version);
}
}
+ public void setVersionValue(int value) {
+ setAcceptVersionValue(value);
+ setContentVersionValue(value);
+ }
+
+ public void setAcceptVersionValue(int value) {
+ accept_version = new byte[] { (byte) ((value >> 8) & 0xFF),
+ (byte) (value & 0xFF) };
+ }
+
+ public int getContentVersionValue() {
+ if (content_version == null) {
+ return 0;
+ } else {
+ return Bytes.bytesToInt(content_version);
+ }
+ }
+
+ public void setContentVersionValue(int value) {
+ content_version = new byte[] { (byte) ((value >> 8) & 0xFF),
+ (byte) (value & 0xFF) };
+ }
+
@Override
public void setLocationPath(String locationPath) {
if (location_path == null) {
package org.iotivity.cloud.base.protocols.coap;
public enum CoapOption {
- IF_MATCH(1), URI_HOST(3), ETAG(4), IF_NONE_MATCH(5), URI_PORT(
+ IF_MATCH(1), URI_HOST(3), ETAG(4), IF_NONE_MATCH(5), OBSERVE(6), URI_PORT(
7), LOCATION_PATH(8), URI_PATH(11), CONTENT_FORMAT(12), MAX_AGE(
14), URI_QUERY(15), ACCEPT(17), LOCATION_QUERY(
20), PROXY_URI(35), PROXY_SCHEME(39), SIZE1(
- 60), OBSERVE(6);
+ 60), ACCEPT_VERSION(
+ 2049), CONTENT_VERSION(2053);
public static CoapOption valueOf(int option) {
switch (option) {
case 6:
return CoapOption.OBSERVE;
+
+ case 2049:
+ return CoapOption.ACCEPT_VERSION;
+
+ case 2053:
+ return CoapOption.CONTENT_VERSION;
}
throw new IllegalArgumentException("Invalid option value");