Bluez下的rfcomm層通訊測試程式
在去年完成了Bluez在X86平臺下安裝後,為了測試安裝十分成功,根據一些資料編寫了一個簡單的藍芽server—client傳遞字串的程式,有 server 端啟動後傳送一個簡單的字串"hello"給client端,client端如果能夠接收到就列印在螢幕上.本來那個時候想將server 端交叉編譯後移植到ARM平臺的,後來還是沒有這樣做,就直接在X86平臺上進行了通訊實驗,很簡單的就通過了,現在寫好了利用兩個Bluetooth設 備進行檔案傳輸的程式,在X86平臺上已經編譯和傳輸檔案通過,但是還是存在一些小的問題,這段時間又在公司來實習培訓了,都沒有去弄了.下週開始要開始 弄自己的這些程式了,希望能夠很快的解決掉自己的畢業設計好全力弄公司的工作.還有朋友ifq說在傳輸很大的字串(超過1000)時會出現問題,我還沒 有去尋找解決的辦法.實際上Bluetooth 的通訊其實和普通socket程式設計中建立tcp連線很相似.下面是測試程式的程式碼:
客戶端程式碼:
#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";
void baswap(bdaddr_t *dst, const bdaddr_t *src)
{
register unsigned char *d = (unsigned char *) dst;
register const unsigned char *s = (const unsigned char *) src;
register int i;
for (i = 0; i < 6; i++)
d[i] = s[5-i];
}
int str2ba(const char *str, bdaddr_t *ba)
{
uint8_t b[6];
const char *ptr = str;
int i;
for (i = 0; i < 6; i++) {
b[i] = (uint8_t) strtol(ptr, NULL, 16);
if (i != 5 && !(ptr = strchr(ptr, ':')))
ptr = ":00:00:00:00:00";
ptr++;
}
baswap(ba, (bdaddr_t *) b);
return 0;
}
if(argc==2)
{
dest=argv[1];
}
else
{
printf("prarm error/n");
exit(1);
}
// allocatea socket
s=socket(AF_BLUETOOTH,SOCK_STREAM,BTPROTO_RFCOMM);
if(s<0)
{
perror("create socket error");
exit(1);
}
// set the connection parameters (who to connect to )
addr.rc_family=AF_BLUETOOTH;
addr.rc_channel=(uint8_t)1;
str2ba(dest,&addr.rc_bdaddr);
// connect to server
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);
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(AF_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");
}
void baswap(bdaddr_t *dst, const bdaddr_t *src)
{
register unsigned char *d = (unsigned char *) dst;
register const unsigned char *s = (const unsigned char *) src;
register int i;
for (i = 0; i < 6; i++)
d[i] = s[5-i];
}
int ba2str(const bdaddr_t *ba, char *str)
{
uint8_t b[6];
baswap((bdaddr_t *) b, ba);
return sprintf(str, "%2.2X:%2.2X:%2.2X:%2.2X:%2.2X:%2.2X",
b[0], b[1], b[2], b[3], b[4], b[5]);
}
/*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);
exit(1);
}
}
close(client);
close(s);
return 0 ;
}