All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.rapplogic.xbee.api.zigbee.ZNetTxRequest Maven / Gradle / Ivy

/**
 * Copyright (c) 2008 Andrew Rapp. All rights reserved.
 *  
 * This file is part of XBee-API.
 *  
 * XBee-API is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *  
 * XBee-API is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *  
 * You should have received a copy of the GNU General Public License
 * along with XBee-API.  If not, see .
 */

package com.rapplogic.xbee.api.zigbee;

import java.util.EnumSet;
import java.util.HashMap;
import java.util.Map;

import com.rapplogic.xbee.api.ApiId;
import com.rapplogic.xbee.api.XBeeAddress16;
import com.rapplogic.xbee.api.XBeeAddress64;
import com.rapplogic.xbee.api.XBeeRequest;
import com.rapplogic.xbee.util.ByteUtils;
import com.rapplogic.xbee.util.IntArrayOutputStream;

/**
 * Series 2 XBee.  Sends a packet to a remote radio.  The remote radio
 * receives the data as a ZNetRxResponse packet.
 * 

* API ID: 0x10 *

* @author andrew * */ public class ZNetTxRequest extends XBeeRequest { // 10/28/08 the datasheet states 72 is maximum payload size but I was able to push 75 through successfully, // even with all bytes as escape bytes (a total post-escape packet size of 169!). /** * This is the maximum payload size for ZNet firmware, as specified in the datasheet. * This value is provided for reference only and is not enforced by this software unless * max size unless specified in the setMaxPayloadSize(int) method. * Note: this size refers to the packet size prior to escaping the control bytes. * Note: ZB Pro firmware provides the ATNP command to determine max payload size. * For ZB Pro firmware, the TX Status will return a PAYLOAD_TOO_LARGE (0x74) delivery status * if the payload size is exceeded */ public final static int ZNET_MAX_PAYLOAD_SIZE = 72; public final static int DEFAULT_BROADCAST_RADIUS = 0; private XBeeAddress64 destAddr64; private XBeeAddress16 destAddr16; private int broadcastRadius; private Option option; private int[] payload; private int maxPayloadSize; //TODO frameId should go last in all Request constructors since it is not specific to any one request public enum Option { // TODO handle new options. option needs to be an int so you can do Option.UNICAST | Option.DISABLE_RETRIES | Option.USE_EXTENDED_TIMEOUT etc // 0x01 - Disable retries and route repair // 0x20 - Enable APS encryption (if EE=1) // 0x40 - Use the extended transmission timeout UNICAST (0), BROADCAST (8), DISABLE_RETRIES (1), ENABLE_APS_ENCRYPTION (0x20), USE_EXTENDED_TIMEOUT (0x40); private static final Map lookup = new HashMap(); static { for(Option s : EnumSet.allOf(Option.class)) { lookup.put(s.getValue(), s); } } public static Option get(int value) { return lookup.get(value); } private final int value; Option(int value) { this.value = value; } public int getValue() { return value; } } /** * From manual p. 33: * The ZigBee Transmit Request API frame specifies the 64-bit Address and the network address (if * known) that the packet should be sent to. By supplying both addresses, the module will forego * network address Discovery and immediately attempt to route the data packet to the remote. If the * network address of a particular remote changes, network address and route discovery will take * place to establish a new route to the correct node. Upon successful * * Key points: * - always specify the 64-bit address and also specify the 16-bit address, if known. Set * the 16-bit network address to 0xfffe if not known. * - check the 16-bit address of the tx status response frame as it may change. * - keep a hash table mapping of 64-bit address to 16-bit network address. * * * @param frameId * @param dest64 * @param dest16 * @param broadcastRadius * @param option * @param payload */ public ZNetTxRequest(int frameId, XBeeAddress64 dest64, XBeeAddress16 dest16, int broadcastRadius, Option option, int[] payload) { this.setFrameId(frameId); this.destAddr64 = dest64; this.destAddr16 = dest16; this.broadcastRadius = broadcastRadius; this.option = option; this.payload = payload; } /** * Abbreviated constructor for sending a unicast TX packet * * @param dest64 * @param payload */ public ZNetTxRequest(XBeeAddress64 dest64, int[] payload) { this(XBeeRequest.DEFAULT_FRAME_ID, dest64, XBeeAddress16.ZNET_BROADCAST, ZNetTxRequest.DEFAULT_BROADCAST_RADIUS, Option.UNICAST, payload); } protected IntArrayOutputStream getFrameDataAsIntArrayOutputStream() { if (this.getMaxPayloadSize() > 0 && payload.length > this.getMaxPayloadSize()) { throw new IllegalArgumentException("Payload exceeds user-defined maximum payload size of " + this.getMaxPayloadSize() + " bytes. Please package into multiple packets"); } IntArrayOutputStream out = new IntArrayOutputStream(); // api id out.write(this.getApiId().getValue()); // frame id (arbitrary byte that will be sent back with ack) out.write(this.getFrameId()); // add 64-bit dest address out.write(destAddr64.getAddress()); // add 16-bit dest address out.write(destAddr16.getAddress()); // write broadcast radius out.write(broadcastRadius); // write options byte out.write(option.getValue()); out.write(payload); return out; } public int[] getFrameData() { return this.getFrameDataAsIntArrayOutputStream().getIntArray(); } public ApiId getApiId() { return ApiId.ZNET_TX_REQUEST; } public XBeeAddress64 getDestAddr64() { return destAddr64; } public void setDestAddr64(XBeeAddress64 destAddr64) { this.destAddr64 = destAddr64; } public XBeeAddress16 getDestAddr16() { return destAddr16; } public void setDestAddr16(XBeeAddress16 destAddr16) { this.destAddr16 = destAddr16; } public int getBroadcastRadius() { return broadcastRadius; } public void setBroadcastRadius(int broadcastRadius) { this.broadcastRadius = broadcastRadius; } public Option getOption() { return option; } public void setOption(Option option) { this.option = option; } public int[] getPayload() { return payload; } public void setPayload(int[] payload) { this.payload = payload; } public String toString() { return super.toString() + ",destAddr64=" + this.destAddr64 + ",destAddr16=" + this.destAddr16 + ",broadcastRadius=" + this.broadcastRadius + ",option=" + this.option + ",payload=" + ByteUtils.toBase16(this.payload); } public int getMaxPayloadSize() { return maxPayloadSize; } public void setMaxPayloadSize(int maxPayloadSize) { this.maxPayloadSize = maxPayloadSize; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy