蓝牙编程-l2cap协议层的c/s程序

原创 2006年06月08日 15:40:00
昨天晚上完成了使用BlueZ协议栈中的lib实现rfcomm层连接的程序,并且移植到了arm-linux上运行通过.程序实现了客户端发送字符串在服务端控制台显示.但是在输入大量的字符时会出现没有响应的情况.看了下书估计和socket中的MTU(Max Transportion Unit)有关系,但也没有继续去试验了,应为在我的应用中一般不会直接使用rfcomm作为连接协议,而是使用l2cap协议.所以今天就来试试l2cap协议方式的socket连接.
以下为客户端的程序:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>
int main( int argc , char **argv)
{
   struct sockaddr_l2 addr={0};
   int s,status;
   char *dest,*buf; //="00:11:67:32:61:62";

   if(argc==2)
     {
       dest=argv[1];
     }
   else
     {
       printf("useage:client addr/n");
       exit(1);
     }
   // a l l o c a t e a s oc k e t
   s=socket(PF_BLUETOOTH,SOCK_SEQPACKET,BTPROTO_L2CAP);
   if(s<0)
     {
       perror("create socket error");
       exit(1);
     }
   // s e t the conne c t ion parameter s (who to connect to )
   addr.l2_family=AF_BLUETOOTH;
   addr.l2_psm=htobs(0x1001);
   str2ba(dest,&addr.l2_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/l2cap.h>
int main (int argc,char **argv)
{
   struct sockaddr_l2 loc_addr ={0},rem_addr={0};
   char buf[1024] ={0};//,*addr;
   int s,client, bytes_read,result;
   int opt = sizeof(rem_addr);
  
   //allocate socket
   printf("Creating socket.../n");
   s =socket(PF_BLUETOOTH,SOCK_SEQPACKET,BTPROTO_L2CAP);
   if(s<0)
     {
       perror("create socket error");
       exit(1);
     }
   else
     {
       printf("success!/n");
     }
   // bind socket to port 1 of the first available
   // local bluetooth adapter
   loc_addr.l2_family=AF_BLUETOOTH;
   loc_addr.l2_bdaddr=*BDADDR_ANY;
   loc_addr.l2_psm=htobs(0x1001);
  
   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");
     }
   // put socket into listening mode
   /*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");
     }
   // ac c ept one conne c t ion
   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.l2_bdaddr,buf);
   fprintf(stderr,"accepted connection from %s /n",buf);
   memset(buf,0,sizeof(buf));
   // read data from the client
   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 connection

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

整个程序和rfcomm协议下的socket程序区别不是很大,只是在创建socket的时候使用协议和数据结构有所不同.在使用中发现在默认MTU的设置下,能够一次传输的字符串长度明显长于rfcomm模式下,且较为稳定.
但是在默认情况下,这样创建的连接并不能算是可信赖的连接.下次再来研究下如何创建一个可信赖的连接./
<iframe frameborder="0" id="gn_notemagic" style="position: absolute; display: block; opacity: 0.7; z-index: 500; width: 17px; height: 21px; top: 69px; right: 100px;" src="http://www.google.com/gn/static_files/blank.html"></iframe>

相关文章推荐

蓝牙编程-l2cap协议层的c/s程序

l2cap协议方式的socket连接.以下为客户端的程序:#include #include #include #include #include #include int main( int arg...

51822蓝牙协议之实例解析L2CAP协议

概要: 逻辑链路控制和适配协议(L2CAP),支持高层协议多路复用、数据分段和重组,并且支持传送服务质量信息。 本文件主要针对协议状态自动机、分组格式及构成相关内容进行描述 ...

蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)

一、主机控制接口协议  HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1、蓝牙控制器接口数据分组:指令分组、事件分组、数据分组 (1)、指令分组 ...

蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)

转自 http://blog.csdn.net/xubin341719/article/details/38305331
  • adazone
  • adazone
  • 2014年11月13日 17:12
  • 816

蓝牙核心-L2CAP

概要: 逻辑链路控制和适配协议(L2CAP),支持高层协议多路复用、数据分段和重组,并且支持传送服务质量信息。 本文件主要针对协议状态自动机、分组格式及构成相关内容进行描述。 L2CAP层次结构(L2...

蓝牙L2CAP剖析(二)

关键字:bluetooth 蓝牙协议  HCI剖析 HCI概述 HCI笔记 LMP L2CAP SDP RFCOMM  作者:zhongjun 本着互相学习的目的,来分享此一系列的文章,欢迎...

CC2640R2F BLE5.0 蓝牙协议栈逻辑链路控制和适配层协议(L2CAP)

逻辑链路控制和适配层协议(L2CAP) L2CAP层位于Host的最下方,并在主机(GAP,GATT,APP)和下层协议栈的上层之间传输数据。该层负责在主机和协议栈之间把交换的数据进行分段和重组以及...

linux下bluetooth编程(六)L2CAP层编程实例

例一:发送Signaling Packet: Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x000...

linux下bluetooth编程(四)L2CAP层编程

一:L2CAP协议简介: Logical Link Control and Adaptation Protocol(L2CAP)   逻辑连接控制和适配协议(L2CAP) 为上层协议提供面向连接...

实战Linux Bluetooth编程(四) L2CAP层编程

(L2CAP协议简介,L2CAP在BlueZ中的实现以及L2CAP编程接口)   一:L2CAP协议简介: Logical Link Control and Adaptation Protoco...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:蓝牙编程-l2cap协议层的c/s程序
举报原因:
原因补充:

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