Пример #1
0
/* Send a data packet to another module using its 16-bit ID */
int xbee_send16(xbee_t *xbee, const void *data, uint8_t len, uint8_t opt, const uint8_t addr[2])
{
    xbee_a16_tx_pkt_t *pkt;
    uint8_t frame_id;
    int ret;


    pkt = (xbee_a16_tx_pkt_t *)xbee_alloc_pkt_mem(XBEE_XMIT, len + 9);
    if (pkt == NULL) {
        xbee_tx_err(xbee);
        return -ENOMEM;
    }

    xbee_hdr_init(pkt->hdr, len + 5);

    pkt->type = XBEE_PKT_TYPE_TX16;
    memcpy(pkt->dest, addr, 2);
    pkt->opt = opt;
    frame_id = xbee_next_frame_id(xbee);
    pkt->frame_id = frame_id;
    memcpy(pkt->data, (uint8_t *)data, len);
    pkt->data[len] = xbee_crc((xbee_pkt_t *)pkt);

    ret = xbee_out(xbee, (xbee_pkt_t *)pkt, len + sizeof(xbee_a16_tx_pkt_t) + 1);

    if (ret >= 0)
        return frame_id;

    xbee_tx_err();

    xbee_free_pkt_mem((xbee_pkt_t *)pkt);

    return ret;
}
Пример #2
0
int xbee_send_remote_at_cmd(xbee_t *xbee,
							const char cmd[],
							uint8_t param_len,
							uint8_t apply, 
							const uint8_t params[],
							const uint8_t addr64[8],
							const uint8_t addr16[2])
{
    xbee_remote_at_cmd_pkt_t *pkt;
    uint8_t frame_id;
    int ret;


    pkt = (xbee_remote_at_cmd_pkt_t *)xbee_alloc_pkt_mem(XBEE_XMIT, param_len + 19);
    if (pkt == NULL) {
        xbee_tx_err();
        return -ENOMEM;
    }

    xbee_hdr_init(pkt->hdr, param_len + 15);

    pkt->type = XBEE_PKT_TYPE_REMOTE_ATCMD;

    frame_id = xbee_next_frame_id(xbee);
    pkt->frame_id = frame_id;

	memcpy(pkt->dest64, addr64, 8);
	memcpy(pkt->dest16, addr16, 2);
	
	pkt->apply = apply ? 2:0;

    pkt->command[0] = cmd[0];
    pkt->command[1] = cmd[1];

    memcpy(pkt->param, params, param_len);
    pkt->param[param_len] = xbee_crc((xbee_pkt_t *)pkt);

    ret = xbee_out(xbee, (xbee_pkt_t *)pkt, 
                              sizeof(xbee_remote_at_cmd_pkt_t) + param_len + 1);

    if (ret >= 0)
        return frame_id;

    xbee_free_pkt_mem((xbee_pkt_t *)pkt);

    xbee_tx_err();

    return ret;
}
Пример #3
0
int xbee_ipv4_envelope_send(const xbee_ipv4_envelope_t FAR *envelope)
{
	xbee_dev_t *xbee;
	xbee_header_transmit_ipv4_t header;
	int retval;
	
	if (envelope == NULL || envelope->xbee == NULL) {
		return -EINVAL;
	}
	
	if (envelope->length > XBEE_IPV4_MAX_PAYLOAD) {
		return -E2BIG;
	}
	
	xbee = (xbee_dev_t *) envelope->xbee;
	
	header.frame_type = XBEE_FRAME_TRANSMIT_IPV4;
	header.frame_id = xbee_next_frame_id(xbee);
	header.remote_addr_be = envelope->remote_addr_be;
	header.remote_port_be = htobe16(envelope->remote_port);
	header.local_port_be = htobe16(envelope->local_port);
	header.protocol = envelope->protocol;
	header.options = envelope->options;
	

	#ifdef XBEE_IPV4_VERBOSE
		char protocol_string[8];
		char buf_addr[16];
		xbee_ipv4_protocol_str(protocol_string, envelope->protocol)
		printf( "%s: %u bytes to %s "	\
			"(src_port=0x%04x dest_port=0x%04x prot=%s opt=%02x)\n",
			__FUNCTION__, envelope->length, 
			xbee_ipv4_ntoa(buf_addr, envelope->remote_addr_be),
			envelope->remote_port, envelope->local_port,
			protocol_string, envelope->options);
	#endif
	
	retval = xbee_frame_write( xbee, &header, sizeof(header), 
				envelope->payload, envelope->length, 0);
	
	#ifdef XBEE_IPV4_VERBOSE
		printf( "%s: %s returned %d\n", __FUNCTION__, "xbee_frame_write", retval);
	#endif
	return retval;
}
Пример #4
0
int xbee_send_at_cmd(xbee_t *xbee,
                  const char cmd[],
                  uint8_t param_len, 
                  const uint8_t params[])
{
    xbee_at_cmd_pkt_t *pkt;
    uint8_t frame_id;
    int ret;


    pkt = (xbee_at_cmd_pkt_t *)xbee_alloc_pkt_mem(XBEE_XMIT, param_len + 8);
    if (pkt == NULL) {
        xbee_tx_err();
        return -ENOMEM;
    }

    xbee_hdr_init(pkt->hdr, param_len + 4);

    pkt->type = XBEE_PKT_TYPE_ATCMD;

    frame_id = xbee_next_frame_id(xbee);

    pkt->frame_id = frame_id;

    pkt->command[0] = cmd[0];
    pkt->command[1] = cmd[1];

    memcpy(pkt->param, params, param_len);
    pkt->param[param_len] = xbee_crc((xbee_pkt_t *)pkt);

    ret = xbee_out(xbee, (xbee_pkt_t *)pkt, 
                              sizeof(xbee_at_cmd_pkt_t) + param_len + 1);

    if (ret >= 0)
        return frame_id;

    xbee_free_pkt_mem((xbee_pkt_t *)pkt);

    xbee_tx_err();

    return ret;
}
Пример #5
0
/**
	@internal

	Sends data to an endpoint/profile/cluster on a remote WPAN
	node.  See wpan_endpoint_send_fn() for parameters and return values.

	User code should use wpan_envelope_send() instead of calling this
	function directly.
*/
xbee_wpan_debug
int _xbee_endpoint_send( const wpan_envelope_t FAR *envelope, uint16_t flags)
{
	xbee_dev_t *xbee;
	xbee_header_transmit_explicit_t	header;
	int error;

	// note that wpan_envelope_send() verifies that envelope is not NULL

	xbee = (xbee_dev_t *) envelope->dev;

	// Convert envelope to the necessary frame type and call xbee_frame_send
	header.frame_type = (uint8_t) XBEE_FRAME_TRANSMIT_EXPLICIT;
	header.frame_id = xbee_next_frame_id( xbee);
	header.ieee_address = envelope->ieee_address;
	header.network_address_be = htobe16( envelope->network_address);
	header.source_endpoint = envelope->source_endpoint;
	header.dest_endpoint = envelope->dest_endpoint;
	header.cluster_id_be = htobe16( envelope->cluster_id);
	header.profile_id_be = htobe16( envelope->profile_id);
	header.broadcast_radius = 0;
	header.options = (flags & WPAN_SEND_FLAG_ENCRYPTED)
														? XBEE_TX_OPT_APS_ENCRYPT : 0;

	#ifdef XBEE_WPAN_VERBOSE
		printf( "%s: %u bytes to 0x%04x "	\
			"(ep=%02x->%02x clust=%04x prof=%04x opt=%02x)\n",
			__FUNCTION__, envelope->length, envelope->network_address,
			envelope->source_endpoint, envelope->dest_endpoint,
			envelope->cluster_id, envelope->profile_id, header.options);
	#endif

	error = xbee_frame_write( xbee,
		&header, sizeof(header), envelope->payload, envelope->length, 0);

	#ifdef XBEE_WPAN_VERBOSE
		printf( "%s: %s returned %d\n", __FUNCTION__, "xbee_frame_write", error);
	#endif

	return error;
}