/* 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; }
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; }
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; }
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; }
/** @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; }