コード例 #1
0
ファイル: serial.c プロジェクト: rmartinjak/motefs
int serial_send(int node, int op, const uint8_t *data, int len)
{
    uint8_t buf[1 + SPACKET_SIZE + MFSMSG_SIZE];
    memset(buf, 0, sizeof buf);

    tmsg_t *spacket_header, *msg;

    buf[0] = 0;
    spacket_header = new_tmsg(buf + 1, SPACKET_SIZE);
    spacket_header_dest_set(spacket_header, 0xffff);
    spacket_header_length_set(spacket_header, MFSMSG_SIZE);
    spacket_header_type_set(spacket_header, MFSMSG_AM_TYPE);

    msg = new_tmsg(buf + 1 + SPACKET_SIZE, MFSMSG_SIZE);
    mfsmsg_node_set(msg, node);
    mfsmsg_op_set(msg, op);

    if (len > MFS_DATA_SIZE)
        len = MFS_DATA_SIZE;
    set_data(msg, data, len);

    DEBUG_PACKET(buf);

    return (src_type == SRC_DEVICE) ?
        write_serial_packet(src_dev, buf, sizeof buf) :
        write_sf_packet(src_fd, buf, sizeof buf);
}
コード例 #2
0
ファイル: sfun_send.c プロジェクト: araujokth/kth-wsn
/* Function: mdlOutputs =======================================================
 * Abstract:
 *    In this function, you compute the outputs of your S-function
 *    block.
 */
static void mdlOutputs(SimStruct *S, int_T tid)
{

    int len, i;
    char packet[100];
    char input_value[8];
    
    const real_T *BI = (const real_T *) ssGetInputPortSignal(S,0);
    const real_T *T1 = (const real_T *) ssGetInputPortSignal(S,1);
    const real_T *T2 = (const real_T *) ssGetInputPortSignal(S,2);
    const real_T *T3 = (const real_T *) ssGetInputPortSignal(S,3);
    const real_T *T4 = (const real_T *) ssGetInputPortSignal(S,4);
    const real_T *T5 = (const real_T *) ssGetInputPortSignal(S,5);
    const real_T *T6 = (const real_T *) ssGetInputPortSignal(S,6);
    const real_T *T7 = (const real_T *) ssGetInputPortSignal(S,7);
    const real_T *INIT = (const real_T *) ssGetInputPortSignal(S,8);
    const real_T *OK = (const real_T *) ssGetInputPortSignal(S,9);
    
    packet[0] = 0x00;
    packet[1] = 0xff;
    packet[2] = 0xff;
    packet[3] = 0xff;
    packet[4] = 0xff;
    packet[5] = (char) sizeof(char)*8; /* payload length */
    packet[6] = 0x00;
    packet[7] = 0x06;
    
    if( INIT[0] == 0 ) {
        
        input_value[0] = (char) BI[0];
        input_value[1] = (char) T1[0];
        input_value[2] = (char) T2[0];
        input_value[3] = (char) T3[0];
        input_value[4] = (char) T4[0];
        input_value[5] = (char) T5[0];
        input_value[6] = (char) T6[0];
        input_value[7] = (char) T7[0];
        
    } else {
        
        input_value[0] = (char) 0xff;
        input_value[1] = (char) 0xff;
        input_value[2] = (char) 0xff;
        input_value[3] = (char) 0xff;
        input_value[4] = (char) 0xff;
        input_value[5] = (char) 0xff;
        input_value[6] = (char) 0xff;
        input_value[7] = (char) 0xff;
        
    }
    
    memcpy(packet + 8, input_value, packet[5]);
    
    if(OK[0]==1) {
        write_sf_packet(fd, (void *) packet, 16);
    }
    
}
コード例 #3
0
ファイル: sf.c プロジェクト: 0111sandesh/TinyOS-Sec
void dispatch_packet(const void *packet, int len)
{
  struct client_list **c;

  for (c = &clients; *c; )
    if (write_sf_packet((*c)->fd, packet, len) >= 0)
      c = &(*c)->next;
    else
      rem_client(c);
}
コード例 #4
0
int write_telos_packet(int fd, const telospacket *packet)
/* Effects: writes len byte packet to serial forwarder on file descriptor
     fd
   Returns: 0 if packet successfully written, -1 otherwise
*/
{
  unsigned char l;
  uint8_t *buffer;
  int result;
  int i;

  if (packet->length > 28) 
  {
  	dbg(TSRC,"packet too long! (%i bytes)\n",packet->length);
  	return -1;
  }

  buffer = malloc(packet->length + 5);
  buffer[0] = 0xff;
  buffer[1] = 0xff;
  buffer[2] = packet->type;
  //buffer[3] = telos_dsn;
  //telos_dsn++;
  buffer[3] = packet->group;
  buffer[4] = packet->length;
/*  buffer[6] = 0;
  buffer[7] = 0;
  buffer[8] = packet->type;
  buffer[9] = packet->group;*/
  memcpy(buffer+5, packet->data, packet->length);
  
  l = packet->length + 5;

	printf("Sending...");
	for (i=0; i < l; i++)
	{
		printf("%X ",buffer[i]);
	}
	printf("\n");
  pthread_mutex_lock(&sfwritemutex);
  result = write_sf_packet(fd, (void*)buffer, packet->length+5);

  pthread_mutex_unlock(&sfwritemutex);

  free((void*)buffer);

  return result;
}
コード例 #5
0
///////////////////////////////////////////////////////////////////////////////////////////////////
// This is where the Magic Happens
///////////////////////////////////////////////////////////////////////////////////////////////////
int main(int argc, char **argv)
{
	///////////////////////////////////////////////////////////////////////////////////////////////
	// Communication Variables
	///////////////////////////////////////////////////////////////////////////////////////////////
	
	int fd;
	int mote_addr;
	TOS_write_t tos_write;
	
	struct pollfd pl;
		
	///////////////////////////////////////////////////////////////////////////////////////////////
	// Collection Variables
	///////////////////////////////////////////////////////////////////////////////////////////////

	gen_msg_t msg;
	int state = STATE_START_TRAVERSAL;
	int seq_num = 0;
	int num_retrys = 0;
	int total_msgs;
	uint32_t num_bundles = 0;
	uint32_t curr_nundle_num = 0;
	
	FILE *Fp;
	///////////////////////////////////////////////////////////////////////////////////////////////
	// Thread Variables
	///////////////////////////////////////////////////////////////////////////////////////////////
	pthread_t *read_thread;
	pthread_t *write_thread;
	
	pthread_attr_t pthread_custom_attr;
	
	pthread_attr_init(&pthread_custom_attr);
	read_thread = (pthread_t *) malloc(sizeof(pthread_t));
	write_thread = (pthread_t *) malloc(sizeof(pthread_t));
	
	if (argc != 4)
	{
		
		fprintf(stderr, "Usage: %s <host> <port> <mote_addr> - dump packets from a serial forwarder %d \n", argv[0], argc);
		exit(2);
	}
	
	fd = open_sf_source(argv[1], atoi(argv[2]));
	
	if (fd < 0)
	{
		fprintf(stderr, "Couldn't open serial forwarder at %s:%s\n", argv[1], argv[2]);
		exit(1);
	}
	
	Fp = fopen("data.txt", "w+");
	
	mote_addr = atoi(argv[3]);
	
	msg.addr = mote_addr;
	msg.group = 0x7d;
	msg.length = sizeof(uint16_t)+sizeof(uint8_t);
	msg.src_addr = SRC_ADDR;
	
	pl.fd = fd;
	pl.events = POLLIN;

	while (1337)
	{
		void *data; 
		int w_ret;
		int r;
		
		msg.seq_num = seq_num++;
		msg.type = AM_RADIO_HI_POWER;
		data = get_packet(&msg);
		w_ret = write_sf_packet(fd, data, TOS_MSG_SIZE);
		
		r = rand() % 300;
		
		usleep((256 + r)*1024);	
	}
	
	/*
	while (1337)
	{
		int w_ret;
		void *data; 
		int len;
		int i;
		const unsigned char *packet;
		switch (state) {
			case STATE_START_TRAVERSAL:
				printf ("Sending BEGIN_TRAVERSAL Message \n");
				msg.seq_num = seq_num;
				msg.type = AM_BEGIN_TRAVERSAL_MSG;
				data = get_packet(&msg);
				w_ret = write_sf_packet(fd, data, TOS_MSG_SIZE);
				if ( listen_for_message(&packet, fd, &len) )
				{
					// we got a response, but did we succeed?
					if (packet[MSG_STATUS_OFFSET] != 0x00)
					{
						seq_num++;
						num_retrys = 0;
						printf ("BeginTraversal succeeded \n");
						memcpy(&num_bundles, &packet[9], sizeof(uint32_t));
						printf ("There should be %d bundles \n\n" , num_bundles);
						fprintf(Fp, "There should be %d bundles \n\n", num_bundles);
						state = STATE_GET_BUNDLE;
						
					}
					else
					{
						if (num_retrys > MAX_RETRYS)
						{
							printf ("BeginTraversal FAILED.. EXITING \n");
							exit(0);
						}
						num_retrys++;
						seq_num++;
						printf ("BeginTraversal FAILED.. trying again \n\n");
					}
					free (packet);
				}
				free(data);
				break;
			case STATE_GET_BUNDLE:
				printf ("Sending GET_BUNDLE_MSG Message \n");
				msg.seq_num = seq_num;
				msg.type = AM_GET_BUNDLE_MSG;
				data = get_packet(&msg);
				w_ret = write_sf_packet(fd, data, TOS_MSG_SIZE);
				
				if ( listen_for_message(&packet, fd, &len) )
				{
					// we got a response, but did we succeed?
					if (packet[MSG_STATUS_OFFSET] == 0x01)
					{
						uint16_t turtle_num;
						uint16_t bundle_num;
						num_retrys = 0;
						seq_num++;
						curr_nundle_num++;
						state = STATE_GET_NEXT_CHUNK;
						printf ("GetBundle succeeded \n");
						print_received_message(packet, len);
						memcpy(&turtle_num, &packet[9], sizeof(uint16_t) );
						memcpy(&bundle_num, &packet[11], sizeof(uint16_t) );
						fprintf(Fp, "Turtle: %d Bundle: %d\n", turtle_num, bundle_num);
					}
					else if (packet[MSG_STATUS_OFFSET] == 0x02) // we got the bundle, but it's not valid
					{
						num_retrys = 0;
						seq_num++;
						state = STATE_G0_NEXT_BUNDLE;
						printf ("GetBundle succeeded but the bundle is invalid \n");
					}
					else // BAD 
					{
						if (num_retrys > MAX_RETRYS)
						{
							printf ("GetBundle FAILED.. EXITING \n");
							exit(0);
						}
						state = STATE_GET_BUNDLE;
						num_retrys++;
						printf ("ERROR: GetBundle failed... trying again \n");
						
					}
					free(packet);
				}
				free (data);
				break;
			case STATE_GET_NEXT_CHUNK:
				printf ("Sending GET_NEXT_CHUNK Message \n");
				msg.seq_num = seq_num;
				msg.type = AM_GET_NEXT_CHUNK;
				data = get_packet(&msg);
				w_ret = write_sf_packet(fd, data, TOS_MSG_SIZE);
				if ( listen_for_message(&packet, fd, &len) )
				{
					if (packet[MSG_STATUS_OFFSET] == 0x01)
					{
						num_retrys = 0;
						seq_num++;
						state = STATE_GET_NEXT_CHUNK;
						printf ("GetNextChunk succeeded \n");
						print_data_message(packet, len, Fp);
						//fprintf(Fp, "%s\n", packet);
					}
					else if (packet[MSG_STATUS_OFFSET] == 0x02) // we got the bundle, but it's not valid
					{
						num_retrys = 0;
						seq_num++;
						state = STATE_G0_NEXT_BUNDLE;
						printf ("We reached the end of this stream \n");
						fprintf(Fp, "\n");
						if (curr_nundle_num == num_bundles)
						{
							printf ("We got all the bundles. Let's end the collection session. \n");
							state = STATE_END_COLLECTION;
							
						}
					}
					else // BAD
					{
						if (num_retrys > MAX_RETRYS)
						{
							printf ("GetNextChunk FAILED.. EXITING \n");
							exit(0);
						}
						num_retrys++;
						printf ("ERROR: GetNextChunk failed... trying again \n");
						state = STATE_GET_NEXT_CHUNK;
					}
					free(packet);
				}
				free (data);
				break;
			case STATE_G0_NEXT_BUNDLE:
				printf ("Sending G0_NEXT_BUNDLE Message \n");
				msg.seq_num = seq_num;
				msg.type = AM_GO_NEXT_MSG;
				data = get_packet(&msg);
				w_ret = write_sf_packet(fd, data, TOS_MSG_SIZE);
				if ( listen_for_message(&packet, fd, &len) )
				{
					if (packet[MSG_STATUS_OFFSET] == 0x01)
					{
						num_retrys = 0;
						seq_num++;
						state = STATE_GET_BUNDLE;
						printf ("GoNext succeeded \n");
					}
					else // BAD
					{
						if (num_retrys > MAX_RETRYS)
						{
							printf ("GoNext FAILED.. Ending Collection Session \n");
							state = STATE_END_COLLECTION;
							exit(0);
						}
						seq_num++;
						num_retrys++;
						printf ("ERROR: GetNextChunk failed... trying again \n");
						state = STATE_G0_NEXT_BUNDLE;
					}
					free(packet);
				}
				free (data);
				break;
			case STATE_END_COLLECTION:
				printf ("Sending G0_END_COLLECTION Message \n");
				msg.seq_num = seq_num;
				msg.type = AM_END_DATA_COLLECTION_SESSION;
				data = get_packet(&msg);
				w_ret = write_sf_packet(fd, data, TOS_MSG_SIZE);
				
				if ( listen_for_message(&packet, fd, &len) )
				{
					if (packet[MSG_STATUS_OFFSET] == 0x01)
					{
						num_retrys = 0;
						printf ("EndCollectionSession succeeded. exiting... \n");
						fclose(Fp);
						exit(0);
					}
					else
					{
						if (num_retrys > MAX_RETRYS)
						{
							printf ("EndCollectionSession FAILED.. EXITING \n");
							exit(0);
						}
						num_retrys++;
						printf ("ERROR: EndCollectionSession failed... trying again \n");
						state = AM_END_DATA_COLLECTION_SESSION;
					}
					
					free(packet);
				}
				free (data);
				break;
			default: 
				printf("ERROR: %d is not a known state\n", state);
				exit(0);
				break;
		}
		if (w_ret == -1)
		{
			printf("error writing to socket... exiting\n");
			exit (0);
		}
	}
	*/
	return 0;
}
コード例 #6
0
void* mote_write(void *buf)
{
	TOS_write_t *tos = (TOS_write_t *) buf;
	uint8_t seq_num = 0;
	gen_msg_t msg;
	char *my_string;
	int nbytes = 100;
	int bytes_read;
	
	msg.addr = tos->mote_addr;
	msg.group = 0x7d;
	msg.length = sizeof(uint16_t)+sizeof(uint8_t);
	msg.src_addr = SRC_ADDR;
	
	printf("What would you like to do: \n");
	printf("bd: Bundle Delete \n");
	printf("gb: Get Bundle \n");
	printf("gc: Get Next Chunk \n");
	printf("bt: Begin Traversal \n");
	printf("gn: Go Next \n");
	printf("ec: End Collection Session\n");
	
	while (1)
	{
		int w_ret = 0;
		void *data; 
		my_string = (char *) malloc (nbytes + 1);
		bytes_read = getline (&my_string, &nbytes, stdin);
		
		if (my_string[0] == 's' && my_string[1] == 'n')
		{
			seq_num++;
			printf ("Sequence Number incremented: %d\n",seq_num);
		}
		if (my_string[0] == 'b' && my_string[1] == 'd')
		{
			
			msg.seq_num = seq_num;
			msg.type = AM_DELETE_BUNDLE_MSG;
			data = get_packet(&msg);
			w_ret = write_sf_packet(tos->fd, data, TOS_MSG_SIZE);
			free(data);
			
		}
		if (my_string[0] == 'g' && my_string[1] == 'b')
		{
			msg.seq_num = seq_num;
			msg.type = AM_GET_BUNDLE_MSG;
			data = get_packet(&msg);
			w_ret = write_sf_packet(tos->fd, data, TOS_MSG_SIZE);
			free(data);
		}
		if (my_string[0] == 'g' && my_string[1] == 'c')
		{
			msg.seq_num = seq_num;
			msg.type = AM_GET_NEXT_CHUNK;
			data = get_packet(&msg);
			w_ret = write_sf_packet(tos->fd, data, TOS_MSG_SIZE);
			free(data);
		}
		if (my_string[0] == 'b' && my_string[1] == 't')
		{
			msg.seq_num = seq_num;
			msg.type = AM_BEGIN_TRAVERSAL_MSG;
			data = get_packet(&msg);
			w_ret = write_sf_packet(tos->fd, data, TOS_MSG_SIZE);
			free(data);
		}
		if (my_string[0] == 'g' && my_string[1] == 'n')
		{
			msg.seq_num = seq_num;
			msg.type = AM_GO_NEXT_MSG;
			data = get_packet(&msg);
			w_ret = write_sf_packet(tos->fd, data, TOS_MSG_SIZE);
			free(data);
		}
		if (my_string[0] == 'e' && my_string[1] == 'c')
		{
			msg.seq_num = seq_num;
			msg.type = AM_END_DATA_COLLECTION_SESSION;
			data = get_packet(&msg);
			w_ret = write_sf_packet(tos->fd, data, TOS_MSG_SIZE);
			free(data);
		}
		if (w_ret == -1)
		{
			printf("error writing to socket... exiting\n");
			exit (0);
		}
		
	}
	return NULL;
}