diff --git a/examples/communication/coap/SendCoAPDataSample/src/com/digi/xbee/api/sendcoapdata/MainApp.java b/examples/communication/coap/SendCoAPDataSample/src/com/digi/xbee/api/sendcoapdata/MainApp.java index 329e14a7..2b51bf7b 100644 --- a/examples/communication/coap/SendCoAPDataSample/src/com/digi/xbee/api/sendcoapdata/MainApp.java +++ b/examples/communication/coap/SendCoAPDataSample/src/com/digi/xbee/api/sendcoapdata/MainApp.java @@ -20,8 +20,8 @@ import com.digi.xbee.api.ThreadDevice; import com.digi.xbee.api.exceptions.XBeeException; +import com.digi.xbee.api.models.CoAPURI; import com.digi.xbee.api.models.HTTPMethodEnum; -import com.digi.xbee.api.packet.thread.CoAPTxRequestPacket; import com.digi.xbee.api.utils.HexUtils; /** @@ -46,7 +46,7 @@ public class MainApp { private static final HTTPMethodEnum METHOD = HTTPMethodEnum.PUT; - private static final String URI = CoAPTxRequestPacket.URI_DATA_TRANSMISSION; + private static final String URI = CoAPURI.URI_DATA_TRANSMISSION; private static final String DATA_TO_SEND = "Hello XBee!"; diff --git a/library/src/main/java/com/digi/xbee/api/ThreadDevice.java b/library/src/main/java/com/digi/xbee/api/ThreadDevice.java index fee8ff63..69a35b41 100644 --- a/library/src/main/java/com/digi/xbee/api/ThreadDevice.java +++ b/library/src/main/java/com/digi/xbee/api/ThreadDevice.java @@ -26,6 +26,7 @@ import com.digi.xbee.api.exceptions.XBeeDeviceException; import com.digi.xbee.api.exceptions.XBeeException; import com.digi.xbee.api.models.AssociationIndicationStatus; +import com.digi.xbee.api.models.CoAPURI; import com.digi.xbee.api.models.HTTPMethodEnum; import com.digi.xbee.api.models.IPProtocol; import com.digi.xbee.api.models.RemoteATCommandOptions; @@ -346,13 +347,13 @@ protected AssociationIndicationStatus getAssociationIndicationStatus() * valid URI string and must meet the following criteria. There * are built-in CoAP URIs: * * @param method HTTP method used for the transmission. @@ -379,7 +380,7 @@ protected AssociationIndicationStatus getAssociationIndicationStatus() */ public byte[] sendCoAPData(Inet6Address ipv6Address, String uri, HTTPMethodEnum method, byte[] data) throws TimeoutException, IllegalArgumentException, XBeeException { - boolean applyChanges = uri.startsWith(CoAPTxRequestPacket.URI_AT_COMMAND); + boolean applyChanges = uri.startsWith(CoAPURI.URI_AT_COMMAND); return sendCoAPData(ipv6Address, uri, method, applyChanges, data, false); } @@ -402,13 +403,13 @@ public byte[] sendCoAPData(Inet6Address ipv6Address, String uri, * valid URI string and must meet the following criteria. There * are built-in CoAP URIs: * * @param method HTTP method used for the transmission. @@ -455,13 +456,13 @@ public byte[] sendCoAPData(Inet6Address ipv6Address, String uri, HTTPMethodEnum * valid URI string and must meet the following criteria. There * are built-in CoAP URIs: * * @param method HTTP method used for the transmission. @@ -486,7 +487,7 @@ public byte[] sendCoAPData(Inet6Address ipv6Address, String uri, HTTPMethodEnum */ public void sendCoAPDataAsync(Inet6Address ipv6Address, String uri, HTTPMethodEnum method, byte[] data) throws TimeoutException, IllegalArgumentException, XBeeException { - boolean applyChanges = uri.startsWith(CoAPTxRequestPacket.URI_AT_COMMAND); + boolean applyChanges = uri.startsWith(CoAPURI.URI_AT_COMMAND); sendCoAPData(ipv6Address, uri, method, applyChanges, data, true); } @@ -505,13 +506,13 @@ public void sendCoAPDataAsync(Inet6Address ipv6Address, String uri, * valid URI string and must meet the following criteria. There * are built-in CoAP URIs: * * @param method HTTP method used for the transmission. @@ -570,13 +571,13 @@ public void sendCoAPDataAsync(Inet6Address ipv6Address, String uri, HTTPMethodEn * valid URI string and must meet the following criteria. There * are built-in CoAP URIs: * * @param method HTTP method used for the transmission. @@ -617,8 +618,8 @@ private byte[] sendCoAPData(Inet6Address ipv6Address, String uri, HTTPMethodEnum throw new NullPointerException("HTTP method cannot be null"); // If AT command uri is used but no AT command is specified throw an error. - if (uri.startsWith(CoAPTxRequestPacket.URI_AT_COMMAND) - && uri.length() < CoAPTxRequestPacket.URI_AT_COMMAND.length() + 3) + if (uri.startsWith(CoAPURI.URI_AT_COMMAND) + && uri.length() < CoAPURI.URI_AT_COMMAND.length() + 3) throw new IllegalArgumentException("AT command URI must contain an AT command."); // Check if device is remote. diff --git a/library/src/main/java/com/digi/xbee/api/models/CoAPURI.java b/library/src/main/java/com/digi/xbee/api/models/CoAPURI.java new file mode 100644 index 00000000..8df5a471 --- /dev/null +++ b/library/src/main/java/com/digi/xbee/api/models/CoAPURI.java @@ -0,0 +1,40 @@ +/** + * Copyright 2017, Digi International Inc. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, you can obtain one at http://mozilla.org/MPL/2.0/. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +package com.digi.xbee.api.models; + +/** + * Class containing the different constants that can be used as Uniform Resource + * Identifier (URI) when working with CoAP transmissions. + * + * @since 1.2.1 + */ +public class CoAPURI { + + /** + * URI for data transmissions (PUT). + */ + public static final String URI_DATA_TRANSMISSION = "XB/TX"; + + /** + * URI for AT Command operation (PUT or GET). + */ + public static final String URI_AT_COMMAND = "XB/AT"; + + /** + * URI for IO operation (POST). + */ + public static final String URI_IO_SAMPLING = "XB/IO"; +} \ No newline at end of file diff --git a/library/src/main/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacket.java b/library/src/main/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacket.java index 4be327d3..0fa8da04 100644 --- a/library/src/main/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacket.java +++ b/library/src/main/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacket.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.digi.xbee.api.models.CoAPURI; import com.digi.xbee.api.models.HTTPMethodEnum; import com.digi.xbee.api.models.RemoteATCommandOptions; import com.digi.xbee.api.packet.APIFrameType; @@ -45,9 +46,10 @@ *

The method indicates the HTTP function used for the transmission. It is * specified by the {@link HTTPMethodEnum} enumerator.

* - *

The URI field is a string that must be {@value #URI_DATA_TRANSMISSION} for - * data transmission (PUT), {@value #URI_AT_COMMAND} for AT Command operations - * (PUT or GET) or {@value #URI_IO_SAMPLING} for IO operation (POST).

+ *

The URI field is a string that must be {@value CoAPURI#URI_DATA_TRANSMISSION} + * for data transmission (PUT), {@value CoAPURI#URI_AT_COMMAND} for AT Command + * operations (PUT or GET) or {@value CoAPURI#URI_IO_SAMPLING} for IO + * operation (POST).

* *

The packet also includes an optional payload. For data transmission, it * should contain the data to send; for AT Command operations, empty to query @@ -61,15 +63,6 @@ public class CoAPTxRequestPacket extends XBeeAPIPacket { // Constants. - /** URI for data transmissions (PUT). */ - public static final String URI_DATA_TRANSMISSION = "XB/TX"; - - /** URI for AT Command operation (PUT or GET). */ - public static final String URI_AT_COMMAND = "XB/AT"; - - /** URI for IO operation (POST). */ - public static final String URI_IO_SAMPLING = "XB/IO"; - private static final int MIN_API_PAYLOAD_LENGTH = 26; /* 1 (Frame type) + 1 (frame ID) + 1 (transmit options) + 1 (RESTful method) + 16 (dest address) + 1 (URI length) + 5 (URI) */ @@ -176,8 +169,8 @@ public static CoAPTxRequestPacket createPacket(byte[] payload) { * * @throws IllegalArgumentException if {@code frameID < 0} or * if {@code frameID > 255} or - * if {@code uri contains }{@value #URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE} or {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_APPLY_CHANGES} - * if {@code uri does not contain }{@value #URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE}. + * if {@code uri contains }{@value CoAPURI#URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE} or {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_APPLY_CHANGES} + * if {@code uri does not contain }{@value CoAPURI#URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE}. * @throws NullPointerException if {@code method == null} or * if {@code destAddress == null} or * if {@code uri == null}. @@ -192,8 +185,8 @@ public CoAPTxRequestPacket(int frameID, int transmitOptions, HTTPMethodEnum meth if (frameID < 0 || frameID > 255) throw new IllegalArgumentException(ERROR_FRAME_ID_ILLEGAL); - if ((uri != null && !uri.contains(URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE) - || (uri != null && uri.contains(URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE && transmitOptions != RemoteATCommandOptions.OPTION_APPLY_CHANGES)) + if ((uri != null && !uri.contains(CoAPURI.URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE) + || (uri != null && uri.contains(CoAPURI.URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE && transmitOptions != RemoteATCommandOptions.OPTION_APPLY_CHANGES)) throw new IllegalArgumentException(ERROR_OPTIONS_INVALID); if (method == null) throw new NullPointerException(ERROR_METHOD_NULL); @@ -253,17 +246,17 @@ public boolean isBroadcast() { /** * Sets the transmit options bifield. * - * @param options The transmit options bitfield. + * @param transmitOptions The transmit options bitfield. * - * @throws IllegalArgumentException if {@code uri contains }{@value #URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE} or {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_APPLY_CHANGES} - * if {@code uri does not contain }{@value #URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE}. + * @throws IllegalArgumentException if {@code uri contains }{@value CoAPURI#URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE} or {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_APPLY_CHANGES} + * if {@code uri does not contain }{@value CoAPURI#URI_AT_COMMAND} and {@code transmitOptions != }{@value RemoteATCommandOptions#OPTION_NONE}. * * @see #getTransmitOptions() * @see com.digi.xbee.api.models.RemoteATCommandOptions */ public void setTransmitOptions(int transmitOptions) { - if ((uri != null && !uri.contains(URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE) - || (uri != null && uri.contains(URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE && transmitOptions != RemoteATCommandOptions.OPTION_APPLY_CHANGES)) + if ((uri != null && !uri.contains(CoAPURI.URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE) + || (uri != null && uri.contains(CoAPURI.URI_AT_COMMAND) && transmitOptions != RemoteATCommandOptions.OPTION_NONE && transmitOptions != RemoteATCommandOptions.OPTION_APPLY_CHANGES)) throw new IllegalArgumentException(ERROR_OPTIONS_INVALID); this.transmitOptions = transmitOptions; diff --git a/library/src/test/java/com/digi/xbee/api/SendCoAPDataTest.java b/library/src/test/java/com/digi/xbee/api/SendCoAPDataTest.java index 12e81d90..2ebf05b7 100644 --- a/library/src/test/java/com/digi/xbee/api/SendCoAPDataTest.java +++ b/library/src/test/java/com/digi/xbee/api/SendCoAPDataTest.java @@ -32,6 +32,7 @@ import com.digi.xbee.api.exceptions.TimeoutException; import com.digi.xbee.api.exceptions.TransmitException; import com.digi.xbee.api.exceptions.XBeeException; +import com.digi.xbee.api.models.CoAPURI; import com.digi.xbee.api.models.HTTPMethodEnum; import com.digi.xbee.api.packet.thread.CoAPTxRequestPacket; @@ -75,7 +76,7 @@ public void setup() throws Exception { */ @Test(expected=NullPointerException.class) public void testSendCoAPDataAddressNull() throws TimeoutException, IllegalArgumentException, XBeeException { - threadDevice.sendCoAPData(null, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(null, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -104,7 +105,7 @@ public void testSendCoAPDataUriNull() throws TimeoutException, IllegalArgumentEx */ @Test(expected=NullPointerException.class) public void testSendCoAPDataMethodNull() throws TimeoutException, IllegalArgumentException, XBeeException { - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, null, DATA); } @@ -120,7 +121,7 @@ public void testSendCoAPDataMethodNull() throws TimeoutException, IllegalArgumen @Test(expected=NullPointerException.class) public void testSendCoAPDataAddressNullWithApplyChanges() throws TimeoutException, IllegalArgumentException, XBeeException { - threadDevice.sendCoAPData(null, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(null, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, false, DATA); } @@ -151,7 +152,7 @@ public void testSendCoAPDataUriNullWithApplyChanges() @Test(expected=NullPointerException.class) public void testSendCoAPDataMethodNullWithApplyChanges() throws TimeoutException, IllegalArgumentException, XBeeException { - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, null, false, DATA); } @@ -167,7 +168,7 @@ public void testSendCoAPDataMethodNullWithApplyChanges() @Test(expected=IllegalArgumentException.class) public void testSendCoAPDataIllegalArgument() throws TimeoutException, IllegalArgumentException, XBeeException { - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_AT_COMMAND + "/G", + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_AT_COMMAND + "/G", HTTPMethodEnum.PUT, DATA); } @@ -186,7 +187,7 @@ public void testSendCoAPDataFromRemoteDevices() // Return that the XBee device is remote when asked. Mockito.when(threadDevice.isRemote()).thenReturn(true); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -205,7 +206,7 @@ public void testSendCoAPDataConnectionClosed() // Throw an Interface not open exception when sending and checking any packet. Mockito.doThrow(new InterfaceNotOpenException()).when(threadDevice).sendAndCheckCoAPPacket(Mockito.any(CoAPTxRequestPacket.class), Mockito.eq(false)); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -224,7 +225,7 @@ public void testSendCoAPDataInvalidOperatingMode() // Throw an invalid operating mode exception when sending and checking any packet. Mockito.doThrow(new InvalidOperatingModeException()).when(threadDevice).sendAndCheckCoAPPacket(Mockito.any(CoAPTxRequestPacket.class), Mockito.eq(false)); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -244,7 +245,7 @@ public void testSendCoAPDataTimeout() // Throw a timeout exception when sending and checking any packet. Mockito.doThrow(new TimeoutException()).when(threadDevice).sendAndCheckCoAPPacket(Mockito.any(CoAPTxRequestPacket.class), Mockito.eq(false)); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -264,7 +265,7 @@ public void testSendCoAPDataTransmitException() // Throw a transmit exception when sending and checking any packet. Mockito.doThrow(new TransmitException(null)).when(threadDevice).sendAndCheckCoAPPacket(Mockito.any(CoAPTxRequestPacket.class), Mockito.eq(false)); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -284,7 +285,7 @@ public void testSendCoAPDataIOException() // Throw an XBee exception when sending and checking any packet. Mockito.doThrow(new XBeeException()).when(threadDevice).sendAndCheckCoAPPacket(Mockito.any(CoAPTxRequestPacket.class), Mockito.eq(false)); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); } @@ -304,7 +305,7 @@ public void testSendCoAPDataSuccess() // Do nothing when sending and checking any packet. Mockito.doReturn(new byte[]{0x00}).when(threadDevice).sendAndCheckCoAPPacket(Mockito.any(CoAPTxRequestPacket.class), Mockito.eq(false)); - threadDevice.sendCoAPData(ipv6Address, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, + threadDevice.sendCoAPData(ipv6Address, CoAPURI.URI_DATA_TRANSMISSION, HTTPMethodEnum.PUT, DATA); // Verify the sendAndCheckCoAPPacket(CoAPTxRequestPacket, boolean) method was called. diff --git a/library/src/test/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacketTest.java b/library/src/test/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacketTest.java index ddd2c53d..e083ce13 100644 --- a/library/src/test/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacketTest.java +++ b/library/src/test/java/com/digi/xbee/api/packet/thread/CoAPTxRequestPacketTest.java @@ -39,6 +39,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; +import com.digi.xbee.api.models.CoAPURI; import com.digi.xbee.api.models.HTTPMethodEnum; import com.digi.xbee.api.models.RemoteATCommandOptions; import com.digi.xbee.api.packet.APIFrameType; @@ -58,7 +59,7 @@ public class CoAPTxRequestPacketTest { private int options = RemoteATCommandOptions.OPTION_NONE; private Inet6Address destAddress; private HTTPMethodEnum method = HTTPMethodEnum.GET; - private String uriData = CoAPTxRequestPacket.URI_DATA_TRANSMISSION; + private String uriData = CoAPURI.URI_DATA_TRANSMISSION; private byte[] data = "Test".getBytes(); @Rule @@ -588,7 +589,7 @@ public final void testSetDestAddressNotNull() throws Exception { @Test public final void testSetTransmitOptionsATURIOptionsIllegal() { // Set up the resources for the test. - CoAPTxRequestPacket packet = new CoAPTxRequestPacket(frameID, options, method, destAddress, CoAPTxRequestPacket.URI_AT_COMMAND, data); + CoAPTxRequestPacket packet = new CoAPTxRequestPacket(frameID, options, method, destAddress, CoAPURI.URI_AT_COMMAND, data); exception.expect(IllegalArgumentException.class); exception.expectMessage(is(equalTo("Transmit options can only be " + @@ -605,7 +606,7 @@ public final void testSetTransmitOptionsATURIOptionsIllegal() { @Test public final void testSetTransmitOptionsTXURIOptionsIllegal() { // Set up the resources for the test. - CoAPTxRequestPacket packet = new CoAPTxRequestPacket(frameID, options, method, destAddress, CoAPTxRequestPacket.URI_DATA_TRANSMISSION, data); + CoAPTxRequestPacket packet = new CoAPTxRequestPacket(frameID, options, method, destAddress, CoAPURI.URI_DATA_TRANSMISSION, data); exception.expect(IllegalArgumentException.class); exception.expectMessage(is(equalTo("Transmit options can only be " +