这篇文章中,我叙述一下怎样通过socket的方式搜索手机并发送文件的过程。
1. 既然要使用socket,那么首先就是要建一个socket链接。
hSock := socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
这里的AF_BTH的值为32,是专用于蓝牙soket的建立
2. 搜索手机和服务
Windows在驱动接口和socket中提供的Bluetooth Service Discovery Protocol(SDP)蓝牙服务发现协议。可以通过试用下面的一系列函数实现手机和服务的搜索:
WSASetService
WSALookupServiceBegin
WSALookupServiceNext
WSALookupServiceEnd
3.通过socket与手机连接以后,可以直接通过write函数往手机发送数据。
但是发送的数据如何能被手机正确的识别? 这里就要谈谈对象推送服务。
对象推送服务是支持蓝牙的设备所提供的一种服务,其GUID为'{00001105-0000-1000-8000 -00805F 9B34FB}'。 在与手机进行连接的时候,我们需要指定需要手机提供哪些服务。把服务作为connect函数的一个参数。
errCode:=connect(hSock, @MySockAddrBth, sizeof(MySockAddrBth));
其中MySockAddrBth 的结构如下:
_SOCKADDR_BTH = packed record
addressFamily: WORD;
btAddr: Int64;
serviceClassId: System.TGUID;
port: ULONG;
end;
serviceClassId就用于指定服务的GUID。
由于我们是需要向手机传送文件,并且不需要预先经过认证,所以服务我使用的就是对象推送服务。
连接之后向手机发送文件,通过write函数写入的数据怎样被手机正确的识别? 那就是这些数据必须是经过OBEX协议封装好的数据。这就需要把要发送的文件分成若干个段,每一段数据根据OBEX协议进行封装,加上包头和包尾,才能向手机进行发送。手机受到这种包后,就会按照OBEX协议揭开,把每一段数据合并成为一个文件。
关于OBEX协议,我们下一章再讨论。