偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.
全部博文(1748)
分类: Android平台
2016-05-17 10:56:31
今天写了个简单的蓝牙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俩个函数可以把蓝牙地址和字符串呼唤,十分有用! |