Linux bluetooth RFCOMM example in C(C 상 리눅스 블루투스 예제)
임베디드(Embedded)/디바이스 프로그래밍(Device Progamming) 2013. 12. 23. 19:401. 목적
ㄱ. 리눅스 상에서 블루투스를 통한 통신을 하기 위하여 rfcomm 방식의 통신의 예를 통해 통신하여 본다.
2. 본론
ㄱ. 먼저 블루투스 통신은 크게 2가지로 나뉜다.
a. TCP 같은 기능을 하는 RFCOMM : TCP는 65535개의 포트를 지원하지만 RFCOMM은 30개의 포트를 지원함
b. UDP와 같은 기능을 하는 L2CAP
ㄴ. 아래의 소스코드는 RFCOMM 예제이이다. RFCOMM 프로토콜은 더욱 믿을 수 있는 연결을 지원한다(TCP와 유사함)
ㄷ. 다음의 명령어를 통해 서버측 디바이스의 블루투스 address를 알아 볼 수 있다.
$ hcitool dev
Devices:
hci0 00:1F:81:03:11:22
ㄹ. RFCOMM server.c 소스
- /*
- compilation step
- # gcc -o server server.c -lbluetooth -lpthread
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include <signal.h>
- #include <pthread.h>
- #include <sys/socket.h>
- #include <bluetooth/bluetooth.h>
- #include <bluetooth/rfcomm.h>
- int s,client ;
- void ctrl_c_handler(int signal);
- void close_sockets();
- void *readMsg();
- void *sendMsg();
- int main(int argc,char **argv){
- (void) signal(SIGINT,ctrl_c_handler);
- pthread_t readT, writeT;
- char *message1 = "Read thread\n";
- char *message2 = "Write thread\n";
- int iret1, iret2;
- struct sockaddr_rc loc_addr={ 0 },client_addr={ 0 };
- char buf[18] = { 0 };
- unsigned int opt = sizeof(client_addr) ;
- //allocate socket
- s = socket(AF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM) ;
- //bind socket to port 1 of the first available
- loc_addr.rc_family = AF_BLUETOOTH ;
- str2ba("00:1F:81:00:00:01",&loc_addr.rc_bdaddr) ;//hci0; server device address is given
- loc_addr.rc_channel = 1 ; //port (maximum should be 30 for RFCOMM)
- bind(s,(struct sockaddr *)&loc_addr,sizeof(loc_addr));
- printf("Binding success\n");
- //put socket into listen mode
- listen(s,1) ;
- printf("socket in listen mode\n");
- //accept one connection
- client = accept(s,(struct sockaddr *)&client_addr,&opt);
- ba2str(&client_addr.rc_bdaddr,buf);
- fprintf(stdout,"Connection accepted from %s\n",buf);
- /* Create independent threads each of which will execute function */
- iret1 = pthread_create(&readT,NULL,readMsg,(void*) message1);
- iret2 = pthread_create(&writeT,NULL,sendMsg,(void*) message2);
- pthread_join(readT,NULL);
- pthread_join(writeT,NULL);
- close_sockets() ;
- return 0 ;
- }
- void *sendMsg(){
- char msg[25] ;
- int status ;
- do{
- memset(msg,0,sizeof(msg));
- fgets(msg,24,stdin);
- if(strncmp("EXIT",msg,4)==0 || strncmp("exit",msg,4)==0)break;
- status = send(client,msg,strlen(msg),0);
- fprintf(stdout,"Status = %d\n",status);
- }while(status > 0);
- }
- void *readMsg(){
- int bytes_read;
- char buf[1024] = { 0 };
- do{
- memset(buf,0,sizeof(buf));
- //read data from the client
- bytes_read = recv(client,buf,sizeof(buf),0) ;
- fprintf(stdout,"Bytes read = %d\n",bytes_read);
- if(bytes_read <= 0)break;
- fprintf(stdout,"<<>> %s",buf);
- }while(1);
- }
- void close_sockets(){
- //close connection
- close(client);
- close(s) ;
- printf("sockets closed\n");
- }
- void ctrl_c_handler(int signal) {
- printf("Catched signal: %d ... !!\n", signal);
- close_sockets();
- exit(0);
- //(void) signal(SIGINT, SIG_DFL);
- }
ㅁ. RFCOMM client.c 소스
- /*
- compilation step
- # gcc -o client client.c -lbluetooth -lpthread
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <signal.h>
- #include <pthread.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <bluetooth/bluetooth.h>
- #include <bluetooth/rfcomm.h>
- int s ;
- void ctrl_c_handler(int signal);
- void close_sockets();
- void *readMsg();
- void *sendMsg();
- int main(int argc,char **argv){
- (void) signal(SIGINT,ctrl_c_handler);
- pthread_t readT, writeT;
- char *message1 = "Read thread\n";
- char *message2 = "Write thread\n";
- int iret1, iret2;
- struct sockaddr_rc addr= { 0 };
- int status ;
- char dest[18] = "00:1F:81:00:00:01";
- char msg[25];
- //allocate a socket
- s = socket(AF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);
- addr.rc_family = AF_BLUETOOTH ;
- addr.rc_channel = 1 ;
- str2ba(dest,&addr.rc_bdaddr);
- //connect to server
- printf("going 2 connect\n");
- status = connect(s,(struct sockaddr *)&addr,sizeof(addr)) ;
- //send a message
- if(0 == status){
- printf("connect success\n");
- /* Create independent threads each of which will execute function */
- iret1 = pthread_create(&readT,NULL,readMsg,(void*) message1);
- iret2 = pthread_create(&writeT,NULL,sendMsg,(void*) message2);
- pthread_join(readT,NULL);
- pthread_join(writeT,NULL);
- }
- close_sockets();
- return 0;
- }
- void *sendMsg(){
- char msg[25] ;
- int status ;
- do{
- memset(msg,0,sizeof(msg));
- fgets(msg,24,stdin);
- if(strncmp("EXIT",msg,4)==0 || strncmp("exit",msg,4)==0)break;
- status = send(s,msg,strlen(msg),0);
- fprintf(stdout,"Status = %d\n",status);
- }while(status > 0);
- }
- void *readMsg(){
- int bytes_read;
- char buf[1024] = { 0 };
- do{
- memset(buf,0,sizeof(buf));
- //read data from the client
- bytes_read = recv(s,buf,sizeof(buf),0) ;
- fprintf(stdout,"Bytes read = %d\n",bytes_read);
- if(bytes_read <= 0)break;
- fprintf(stdout,"<<>> %s",buf);
- }while(1);
- }
- void close_sockets(){
- close(s);
- fprintf(stdout,"Close sockets\n");
- }
- void ctrl_c_handler(int signal){
- fprintf(stdout,"Interrupt caught[NO: %d ]\n",signal);
- close_sockets();
- exit(0);
- }
3. 결론
ㄱ. 블루투스의 RFCOMM 프로토콜 통신의 예를 통해 학습하여 보았다.
'임베디드(Embedded) > 디바이스 프로그래밍(Device Progamming)' 카테고리의 다른 글
리눅스에서 블루투스 검색 가능하게 만들기 위한 기초 How to make discover able Bluetooth device on Linux (0) | 2014.02.07 |
---|---|
How to change bluetooth device name in Ubuntu? 우분투에서 블루투스 드라이버 이름 바꾸기 (0) | 2013.12.21 |
error: newly created file is older than distributed files! Check your system clock 발생 시 해결 방안 (0) | 2013.12.21 |
우분투 NFS 시작시에 자동 마운트 하기 (0) | 2013.12.19 |
Ubuntu에서 apt-get update fail to fetch 에러 대처법 (0) | 2013.12.19 |