Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9409521
  • 博文数量: 1748
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 20070
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1748)

文章存档

2024年(24)

2023年(26)

2022年(112)

2021年(217)

2020年(157)

2019年(192)

2018年(81)

2017年(78)

2016年(70)

2015年(52)

2014年(40)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: Android平台

2016-05-17 10:56:31

http://blog.sina.com.cn/s/blog_75a598c40100qfm7.html

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

  
   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俩个函数可以把蓝牙地址和字符串呼唤,十分有用!
阅读(1931) | 评论(0) | 转发(0) |
0

上一篇:linux DTS / DTB

下一篇:bluez

给主人留下些什么吧!~~