All of lore.kernel.org
 help / color / mirror / Atom feed
From: 안희준 <heejune@snut.ac.kr>
To: bluez-users@lists.sourceforge.net
Subject: [Bluez-users] Help me solve the rfcomm programming.
Date: Wed, 26 Jan 2005 02:15:18 +0900	[thread overview]
Message-ID: <e14f8bedaa101.heejune@snut.ac.kr> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 1841 bytes --]

Hi, 
I am writing a programm using serial profile. But it makes me crzay.
When I am using serial port program (client and server) after I am setting 
using "rfcomm command" ,i.e, listen and connect, it is ok.
But, When I try to merge with my program The Peer doesnot gets Data even though the connection is opened successfully and 
client sent data successfully.
My program is like this.
                                                           open("/dev/rfcomm0") 
     test "config1" -----fork--------------------------^----*----- read( nothing or less than sent!!!) 
                           |                           | signal (to let parent know I can reciev
                           +----     exec ( rfcomm listen) .... 
                                                      | 
                          +------- exec (rfcomm connect) 
                          |                            | signal (to let parent know it can send something) 
     test "config2" -----fork ----                     v ----*------* write( 100 bytes)
                                                          open("/dev/rfcomm4")


 IS THIS Because I am using two USB dongle in the same Desktop linux????
 I think it is not, becuase I tested one dongle with one pc also, and same result.
 Is it bug or something new thing I don't understand??????
 Please check the attachment file for me 

 The reason I do this, we want relaying data (application level scatter net service!!!)
 It is reuired for us but scatter net doesnot supported in my dongle and even bluez!!

 thanks!!!!!
 
----------------
Ahn, Heejune,   Assistant Professor, PhD
Dept. CIE of Seoul National University of Technology
mobile: +82-1-3065-5418
office  : +82-2-970-6543
www  :  cie.snut.ac.kr/ahn
----------------------------------------------

[-- Attachment #1.2: Type: text/html, Size: 4421 bytes --]

[-- Attachment #2: test.c --]
[-- Type: application/octet-stream, Size: 8395 bytes --]

/*
 * Relay
 * The program useis Bluez RFCOMM socket to relaying packets 
 * Data packets from child to parent node and 
 * Control packet from parent to child node 
 * 
 * (c) copyright 2005 heejune@snut.ac.kr 
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <malloc.h>
#include <string.h>
#include <getopt.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/poll.h>
#include <sys/param.h>
#include <sys/ioctl.h>
#include <sys/socket.h>

#include "bluetooth.h"

#define DEFAULT_INPORT  "/dev/rfcomm0"
#define DEFAULT_OUTPORT  "/dev/rfcomm1"
//#define COMPORT1  "/dev/ttyS0"


static char *rfcomm_config_file = NULL;

static char *relay_state[] = {
	"Starting",     // when just booted 
	"Connecting",   // Try to connect parent 
	"ActiveCon",    // Connected with parent 
	"Listening",    // Waiting for incomming connection from child
	"PassiveCon",   // Connected with child
	"Idle",		// normal working without any connection  
	"Error"         // abnormal state 
};

static volatile sig_atomic_t user_stop = 0;

/* signal alarm */ 
static void sig_alrm(int sig)
{
	return;
}

/* ignore HUP signal */
static void sig_hup(int sig)
{
	return;
}

/* on CTRL-C, we stop job */
static void sig_term(int sig)
{
	user_stop= 1;
}

static void usage(void)
{
	printf("relay [config_file] %s\n"__DATE__);
}


typedef struct {

//	bdaddr_t  dest;
	int  dest;
	unsigned char data[1024];
} packet_t;

#define QSIZE 10
static packet_t pktQ[QSIZE];
static int qsize = 0;
static int qhead = 0;
static int qtail = 0;

#define TEST_PKT_LEN  32

#define RESP_OK ((unsigned int *){0xFFFFFFFF, 12, 0}) 
#define RESP_NOK ((unsigned int *){0xFFFFFFFF, 12, 1}) 

typedef enum{false = 0, true = 1} boolean; 
typedef enum{s_waiting= 0, s_sending = 1} state_t; 

static int incomming_handle(int fd)
{
	int n; 
	char buff[TEST_PKT_LEN];
	// RxRx request with timeout

	printf(" incomming - 1\n");
	n = read(fd,buff,TEST_PKT_LEN);
	printf(" incomming - 2\n");
	if(n < 0){
		perror("Cannot recieve");
	}else{
		printf("recieved: %d bytes\n", n);
	}
	//printf("type enter:");
	//getchar();
	
	// Tx response with timeout
	memset(buff,'1',TEST_PKT_LEN);
	n = write(fd,buff,TEST_PKT_LEN);
	if(n < 0){
		perror("Cannot response");
	}else{
		printf("return: %d bytes\n",n );
	}
	//fsync(fd); // flush it 
	
	close(fd);
}

static int outgoing_handle(int fd)
{
	char message[TEST_PKT_LEN];
	int n; 


	sleep(5);
	memset(message,'1',TEST_PKT_LEN);
	n = write(fd,message,TEST_PKT_LEN);
	if(n < 0){
		perror("Failed to send");
	}else{
		printf("Send %d\n", n);
	}
	//fsync(fd); // flush it 
	//getchar();

	n = read(fd,message,TEST_PKT_LEN);
	if(n< 0){	
		perror("Failed in echoed");
	}else{
		printf("Echoed %d\n", n);
	}
	//getchar();
	close(fd);
}

typedef struct {
	char *rfcomm;
	int x;
	int y;
	char *me;
	char *parent;
	char *child;
	int outdev;
	int indev;
} relay_t;
	
static int read_config_file(relay_t *pConfig, const char *filename)
{
	FILE *fptr = NULL;
	char line[128], key[64], strval[64]; 
	char *pline;
	int  inval;
	char *result;

	memset(line,0,128);
	memset(key,0,64);
	memset(strval,0,64);

	if(filename != NULL){
		fptr = fopen(filename,"r");
	}else{
		fptr = fopen("relay.conf","r");
	}
	if(fptr == NULL){
		perror("Cannot open relay.conf");
		return -1;
	}

	int lineno = 0;

	while(!feof(fptr)){
		lineno++;
		result = fgets(line,127,fptr);
		if(result == NULL){
			return;
		}	
		//printf("check:%s\n", line);

		// comment line 
		if(!strncmp("#",line,1)){
			continue;
		}

		// properties
		pline = line;
		pline= strtok(pline,"="); // key
		// values
		if(!strncmp("rfcomm",pline,6)){
			pline= strtok(NULL,"=");
		        pConfig->rfcomm = strdup(pline);	
		}else if(!strncmp("level",pline,4)){
			pline= strtok(NULL,"=");
			inval = atoi(pline);
		        pConfig->x = inval;	
		}else if(!strncmp("index",pline,5)){
			pline= strtok(NULL,"=");
			inval = atoi(pline);
		        pConfig->y = inval;	
		}else if(!strncmp("me",pline,2)){
			pline= strtok(NULL,"=");
		        pConfig->me = strdup(pline);	
		}else if(!strncmp("parent",pline,6)){
			pline= strtok(NULL,"=");
		        pConfig->parent = strdup(pline);	
		}else if(!strncmp("child",pline,5)){
			pline= strtok(NULL,"=");
		        pConfig->child = strdup(pline);	
		}else if(!strncmp("outdev",pline,6)){
			pline= strtok(NULL,"=");
			inval = atoi(pline);
		        pConfig->outdev = inval;	
		}else if(!strncmp("indev",pline,5)){
			pline= strtok(NULL,"=");
			inval = atoi(pline);
		        pConfig->indev = inval;	
		}else{ 
			printf("undefined at %d-th line : %s\n",lineno, line);
		}
		//getchar();
	}

} 


static void sig_usr1(int num){
	// notifying listening ok 
	return;

}

static void sig_usr2(int num){
	// notifying connection ok
	return;

}

/*  entrance of program */

int main(int argc, char *argv[]) 
{

        relay_t config;	
	bdaddr_t bdaddr;
	int i, opt, ctl, dev_id, show_all = 0;
	int outdev, indev;
	bdaddr_t *pInbdaddr, outbdaddr;
	int txargc = 3;
	char *txargv[] = {"relay","00:0b:24:01:0e:62","3"}; 
	int rxargc = 2;
	char *rxargv[] = {"relay","3"}; 
	int fdOut, fdIn;
	int fd;
	char message[128]; 
	int  nw;
	int n;
	state_t state;
	pid_t pid;
	int ret;
	char devname[128];
	char tmpstr[32];
 	char *env_init[] = {"LD_LIBRARY_PATH=/usr/blue/lib", NULL};



	signal(SIGUSR1, sig_usr1);
	signal(SIGUSR2, sig_usr2);
	// Setup configuration 
	// Default Local BA address
//	bacpy(&bdaddr, BDADDR_ANY);
	if(argc > 1){
		if(read_config_file(&config, argv[1]) < 0){
			exit(0); // configuration error 
		}
	}else{
		if(read_config_file(&config, NULL) < 0){
			exit(0); // configuration error 
		}
	}

	printf(" Config : x=%d, y=%d, me=%s, mom=%s, son=%s, in=%d, out=%d\n", config.x, config.y, config.me, config.parent, config.child, config.indev, config.outdev);

/*
	if(config.me != NULL){
		printf("user defined local bdaddr\n");
		str2ba(config.me,&bdaddr);
	}
*/

	sprintf(message,"this is message");

	// set alarm signal handler; not to be blocked  
	struct sigaction sa;
	memset(&sa, 0, sizeof(sa));
	sa.sa_handler = sig_alrm;
	sigaction(SIGALRM, &sa, NULL);

	
	// for test 
	if(config.x==2){
		state = s_sending;
	}else{
		state = s_waiting;
	}

	while(1){

	switch(state){

	case s_waiting:
		//printf("s_waiting ....\n");

		pid = fork();
		if(pid == 0){ // child 
			snprintf(tmpstr,31,"%d",config.indev);
			// execute the rfcomm program 
			printf("%s -i %s lsisten 3\n",config.rfcomm, config.me);
			//ret = execle(config.rfcomm,"relay","-i", config.me, "listen", "3",NULL, "LD_LIBRARY_PATH=\"/usr/blue/lib\"");
//			execle("/bin/ls","ls","-a",NULL,env_init);

			ret = execle(	"/usr/blue/bin/relay","relay",
					"-i", "00:0b:24:01:0e:62", 
					"listen", tmpstr, "3",NULL,
					env_init);
			fprintf(stderr, " child dies......\n");
			exit(0); // the child cannot proceed any more
		}else{
			printf("pausing .\n");
			// wait for connection
			pause();
			printf("escaped\n");

			snprintf(devname,32,"/dev/rfcomm%d",config.indev);
			printf(" rev via /dev/rfcomm%d\n",config.indev);
			printf("escaped2\n");
			fd = open(devname,O_RDWR);
			if(fd < 0)
				perror("Cannot open incomming fd"); 

				printf("escaped3\n");
				incomming_handle(fd);
			}

			// Stop the rfcomm connection 
			ret = kill(pid, SIGINT);
			if(ret < 0){
				perror("Error in killng listening conectin");
			}
			break;

	case s_sending: 

		pid = fork();
		if(pid == 0){ // child 
			snprintf(tmpstr,31,"%d",config.outdev);
			// execute the rfcomm program 
			fprintf(stderr, "connecting.... ......\n");
			ret = execle("/usr/blue/bin/relay", "relay","-i", "00:0b:24:01:0e:C7", "connect", tmpstr, "00:0b:24:01:0e:62","3",NULL,env_init);
			//ret = execle(config.rfcomm,"relay", "-i", config.me,  "connect", tmpstr, config.parent, "3",NULL, env_init);
			printf("die....... .\n");
			exit(0); // the child cannot proceed any more
		}else{

			// wait for connection
			printf("pausing .\n");
			pause();

			snprintf(devname,32,"/dev/rfcomm%d",config.outdev);
			printf(" sending via /dev/rfcomm%d\n",config.outdev);
			fd = open(devname,O_RDWR);
			if(fd < 0)
				perror("Cannot open outgoing fd"); 

			outgoing_handle(fd);
		}

		// Stop the rfcomm connection 
		ret = kill(pid, SIGINT);
		if(ret < 0){
			perror("kill error");
		}
		break;

	default:

		fprintf(stderr,"unknow state: %d\n", state);

	} // switch 	

	} /* while */

	return 0;
}



             reply	other threads:[~2005-01-25 17:15 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-01-25 17:15 안희준 [this message]
2005-01-25 17:28 ` [Bluez-users] Help me solve the rfcomm programming Marcel Holtmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=e14f8bedaa101.heejune@snut.ac.kr \
    --to=heejune@snut.ac.kr \
    --cc=bluez-users@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.