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