rfcomm层的socket程序编写

转载 2011年01月08日 18:20:00

今天写了个简单的蓝牙server—client传递字符串的程序,并且把server移植到了开发板上,测试通过。能够在测试端输入字符串,并显示在服务端。现在输入超过1200个左右的字符就会出现问题,还不清楚究竟是socket的write大小限制在1000多,还是自己缓冲区的问题,明天去借本书来研究研究。
利用蓝牙建立连接其实和普通socket编程中建立tcp连接很相似,首先在监听端创建socket,bind,然后listen,accept.在客户端connect就连接上了.之后用read,write进行读写.区别在于建立的socket类型方面有所区别.

客户端的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
int main( int argc , char **argv)
{
   struct sockaddr_rc addr={0};
   int s,status;
   char *dest,*buf; //="00:11:67:32:61:62";

   if(argc==2)
     {
       dest=argv[1];
     }
   else
     {
       printf("prarm error/n");
       exit(1);
     }
   // a l l o c a t e a s oc k e t
   s=socket(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);
   if(s<0)
     {
       perror("create socket error");
       exit(1);
     }
   // s e t the conne c t ion parameter s (who to connect to )
   addr.rc_family=AF_BLUETOOTH;
   addr.rc_channel=(uint8_t)1;
   str2ba(dest,&addr.rc_bdaddr);
   // connect to s e r v e r
   printf("connectting.../n");
   status=connect(s,(struct sockaddr *)&addr,sizeof(addr));
   // send a message
   if(status==0){
     printf("scuess!/n");
     status=write(s,"hello!",6);
  
   do{
     scanf("%s",buf);
     status=write(s,buf,strlen(buf));
     if(status<0) perror("uh oh");
   }while(strcmp(buf,"goodbye")!=0);
   }
   else
     {
       printf("Failed!/n");
     }

   close(s);
   return 0;
}

服务端的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
int main (int argc,char **argv)
{
   struct sockaddr_rc loc_addr ={0},rem_addr={0};
   char buf[1024] ={0};//,*addr;
   int s,client, bytes_read,result;
   int opt = sizeof(rem_addr);
  

   printf("Creating socket.../n");
   s =socket(PF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);
   if(s<0)
     {
       perror("create socket error");
       exit(1);
     }
   else
     {
       printf("success!/n");
     }

   loc_addr.rc_family=AF_BLUETOOTH;
   loc_addr.rc_bdaddr=*BDADDR_ANY;
   loc_addr.rc_channel=(uint8_t)1;
  
   printf("Binding socket.../n");
   result=bind(s,(struct sockaddr *)&loc_addr, sizeof(loc_addr));
   if(result<0)
     {
       perror("bind socket error:");
       exit(1);
     }
   else
     {
       printf("success!/n");
     }

   /*result=ba2str(&loc_addr.rc_bdaddr,addr);
   if(result<0)
     {
       perror("addr convert error");
       exit(1);
     }
     printf("local addr is:%s/n",addr);*/
   printf("Listen... ");
   result=listen(s,1);
   if(result<0)
     {
       printf("error:%d/n:",result);
       perror("listen error:");
       exit(1);
     }
   else
     {
       printf("requested!/n");
     }

   printf("Accepting.../n");
   client= accept(s,(struct sockaddr *)&rem_addr,&opt);
   if(client<0)
     {
       perror("accept error");
       exit(1);
     }
   else
     {
       printf("OK!/n");
     }
   ba2str(&rem_addr.rc_bdaddr,buf);
   fprintf(stderr,"accepted connection from %s /n",buf);
   memset(buf,0,sizeof(buf));

   while(1)
     {
       bytes_read = read(client,buf,sizeof(buf));
       if(bytes_read>0){
    printf("received[%s]/n",buf);
    if(strcmp(buf,"goodbye")==0)
       exit(1);
    memset(buf,0,bytes_read);
       }
     }


   close(client);
   close(s);
   return 0 ;
}


str2ba和ba2str俩个函数可以把蓝牙地址和字符串呼唤,十分有用!

 

bluetooth开发(二)------基于rfcomm通信编程之服务器端

蓝牙的基本功能无非就是配对(后面会阐述),基于OPUSH协议的传输文件(后面会讲),向蓝牙播放音频(以后会讲),基于rfcomm的通信,拨号上网,ftp等。通过对bluez的深入学习,已基本上实现了在...
  • hellomxj1
  • hellomxj1
  • 2014年04月10日 09:03
  • 3163

bluetooth开发(三)------基于rfcomm通信编程之客户端

蓝牙的基本功能无非就是配对(后面会阐述),基于OPUSH协议的传输文件(后面会讲),向蓝牙播放音频(以后会讲),基于rfcomm的通信,拨号上网,ftp等。通过对bluez的深入学习,已基本上实现了在...
  • hellomxj1
  • hellomxj1
  • 2014年04月10日 09:06
  • 2889

蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)

https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf 声明:这篇文章是楼主beaut...
  • mirkerson
  • mirkerson
  • 2015年10月21日 15:47
  • 12648

Bluez下的rfcomm层通信测试程序

 2007-03-09 12:54       在去年完成了Bluez在X86平台下安装后,为了测试安装十分成功,根据一些资料编写了一个简单的蓝牙server—client传递字符串的程序,有ser...
  • sdlcgxcqx
  • sdlcgxcqx
  • 2008年12月26日 16:26
  • 2924

android 蓝牙代码架构及其uart 到rfcomm流程

Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架)
  • ahskx
  • ahskx
  • 2016年04月07日 08:54
  • 840

rfcomm层的socket程序编写

今天写了个简单的蓝牙server—client传递字符串的程序,并且把server移植到了开发板上,测试通过。能够在测试端输入字符串,并显示在服务端。现在输入超过1200个左右的字符就会出现问题,还不...
  • xiaolei05
  • xiaolei05
  • 2011年01月08日 18:20
  • 1152

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:and...
  • xubin341719
  • xubin341719
  • 2014年08月12日 20:01
  • 25544

rfcomm层的socket程序编写

导读:   今天写了个简单的蓝牙server—client传递字符串的程序,并且把server移植到了开发板上,测试通过。能够在测试端输入字符串,并显示在服务端。现在输入超过1200个左右的字符就会...
  • yingfox
  • yingfox
  • 2007年11月11日 10:26
  • 1197

rfcomm层的socket程序编写

今天写了个简单的蓝牙server—client传递字符串的程序,并且把server移植到了开发板上,测试通过。能够在测试端输入字符串,并显示在服务端。现在输入超过1200个左右的字符就会出现问题,还不...
  • bailang2222
  • bailang2222
  • 2009年10月14日 14:48
  • 573

socket进行RFCOMM连接(Wince 6.0)

亲自测试一下代码使用socket进行配对连接,连接成功后可以使用recv和send等接口进行接收发送数据 SOCKADDR_BTH sa; WSADATA wsaData; i...
  • luliyuan
  • luliyuan
  • 2017年01月23日 14:36
  • 522
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:rfcomm层的socket程序编写
举报原因:
原因补充:

(最多只允许输入30个字)