在利用RBTFT 协议进行实际的文件传输时,首先第一步是进行串口初始化操作,在串口初始化成功时,通过异步消息RBTFT C0NNECT向应用程序报告,表示一条通信链路建立完毕。开始发送数据时,应用程序根据内部缓冲区的大小决定每次真正可发送的数据量,数据将被存储在内部缓冲区内,按照RBTFT协议,内部缓冲区的数据分割成一帧一帧并加人帧信息和CRC校验信息,每一帧将调用内部线程发送数据,当内部缓冲区的数据全部发送完毕(即内部缓冲区为空)时,则向应用程序发送消息表示内部缓冲区的数据全部发送完毕,应用程序将可继续发送其余的数据。在接收方,每到达一帧时,接收方就判读帧信息、对到达的数据进行接收并进行CRC校验,若发生错误则通过RBTFT协议所定义的方式进行重发或协商,当通信能继续则不向应用程序发送任何消息,继续保持链路,若通信不能继续,则放弃此链路,并且向应用程序发送RBTFT ERROR的消息,应用程序将重新复位此链路或进行其它相应的处理。另外,当有任何一方断开链接,应用程序将接收到RBTFT CLOSE消息,表示此链路已经断开。在接收端,所接收到的分帧的数据被去掉帧头重新归到接收缓冲区流,重新拼装为所传输的文件。然后,再进行下一个文件的传输,直至传输完所有的文件。 对于在应用层提高蓝牙无线连接的可靠性而言,最为可贵的是RBTFT协议支持断点续传。我们目前所实现的也就是将RBTFT文件传输协议嵌人到蓝牙无线文件传输的应用中,这样,即便出现文件传输中断的情况,也可以进行断点续传。这对于大文件无线传输尤为有意义。 RBTFT协议支持断点续传的原理在于RBTFT数据帧在报头中携带有指明文件数据在文件具体某个位置开始的偏移量。当发生错误或连接中断时,接收方发送一个带有偏移量的信息帧,说明它希望发送方从该位置重新开始传输。这样就无需重传整个文件,从而实现了断点续传。 5.2 蓝牙文件传翰RBTFT协议发送文件的详细过程 以下是蓝牙文件传输RBTFT 协议发送单个文件的详细过程: n =0; //初始化重试次数计数器,收发双方建立连接; file = fopen (filename,“rb ”); 设置并发送包含文件名、文件长度的报头; for ( ; ;) { message =所读取接收方发来的响应报头信息; switch (message) { case 接收方返回“已经准备接收”: 发送第一个数据子包,并以子包结束符指明后面有后续包; Continue ; case 接收方拒绝接收: fclose (file); return OK; case 接收方返回确认信息: 发下一个包; Continue; case 超时:n=n l; if (n>20)//重试20 次,若还不能恢复连接,则放弃 {return ERROR;} else if {重新建立连接; 请求接收方发送带有偏移量的信息帧; 接收该信息帧; 从指定偏移量处开始继续传送; Continue;} case 接收方放弃传输: return ERROR; case 文件传输完毕: 输出“文件传输完毕”的屏幕提示信息; return OK; } 6 结论 本文叙述了蓝牙无线连接在射频、基带协议、链路管理协议(LMP)中采用的可靠性措施,包括:差错检测和校正、进行数据编解码、差错控制、数据加噪等。为了进一步在无线连接中提高蓝牙文件传输的可靠性,在蓝牙RFCOMM协议的基础之上建立了本文所描述的蓝牙的文件传输协议,称之为RBTFT,其中,创造性地提出了支持文件断点续传的办法,并得到了实现,从而在应用层有效地提高了蓝牙无线连接的可靠性。我们相信,在切实提高了蓝牙无线连接的可靠性之后,蓝牙技术将会得到更加广泛的应用。
|