客户端:
首先:初始化蓝牙
private LocalDevice localDevice; //本地设备实例
String localBTAddress; //本地蓝牙地址
String localBTName; //蓝牙名称
DiscoveryAgent agent; //发现代理
transIDs = new int[devices.size()]; //保存搜索到的设备ID
try
{localDevice = LocalDevice.getLocalDevice();//取得本地设备实例
localBTAddress = localDevice.getBluetoothAddress();//记录蓝牙地址
localBTName = localDevice.getFriendlyName(); //记录蓝牙名称
agent = localDevice.getDiscoveryAgent(); //取得蓝牙代理
} catch(Exception e){
System.err.println(“初始化蓝牙设备失败: ”+e); }
其次:利用蓝牙代理搜索设备和服务
discoveryAgent.startInquiry(DiscoveryAgent.GIAC,this); wait(); //等待synchronized 块
transIDs[i] = discoveryAgent.searchServices(attrSet, uuids, rd, this); wait();
实现DiscoveryListener 接口 :
public void deviceDiscovered() {remoteDevice.getFriendlyName(false);}//发现设备时调用,保存设备名
public void inquiryCompleted() {synchronized (this) {notify();}} //设备搜索结束时调用,唤醒线程
public void servicesDiscovered(){vector.addElement(serviceRecord[i]);}//发现服务时调用,保存serviceRecord
public void serviceSearchCompleted(){synchronized (this) {notify();}} //服务搜索结束时调用,唤醒线程
第三:与服务器连接(需要服务器创建连接之后才有效)
String url = serviceRecord.getConnectionURL(int requiredSecurity,boolean mustBeMaster);
L2CAPConnection con = (L2CAPConnection)Connector.open(url);
服务器端:
首先:初始化蓝牙(同客户端,只不过多了一条设置服务可发现!)
private LocalDevice localDevice; //本地设备实例
String localBTAddress; //本地蓝牙地址
String localBTName; //蓝牙名称
DiscoveryAgent agent; //发现代理
try
{localDevice = LocalDevice.getLocalDevice();//取得本地设备实例
if(! localDevice.setDiscoverable(DiscoveryAgent.GIAC)){//设置服务器可发现 return false; }
localBTAddress = localDevice.getBluetoothAddress();//记录蓝牙地址
localBTName = localDevice.getFriendlyName(); //记录蓝牙名称
agent = localDevice.getDiscoveryAgent(); //取得蓝牙代理
} catch(Exception e){
System.err.println(“初始化蓝牙设备失败: ”+e); }
其次:创建服务器端连接
L2CAPConnectionNotifier notifier = (L2CAPConnectionNotifier) Connector.open(localBTAddress);//建立一个连接, 同时创建一个蓝牙服务
L2CAPConnection con = notifier.acceptAndOpen();//自动将服务注册到蓝牙发现数据库中(SDDB), 之后该服务就可以被客户端搜索了
总结步骤:
① 服务器和客户端同时初始化(服务器端设置服务发现localDevice.setDiscoverable,客户端需获得发现代理DiscoveryAgent )。
②服务器端通过Connector.open(URL【自定义的】) 强制转换成L2CAPConnectionNotifier 或StreamConnectionNotifier 建立一个连接, 同时创建一个蓝牙服务。然后调用acceptAndOpen()方法, 该方法会自动将服务注册到蓝牙发现数据库中(SDDB), 之后该服务就可以被客户端搜索了。——>属于服务器的初始化范围内的
③客户端利用蓝牙代理搜索设备和服务,同时用DiscoveryListener 接口获得 RemoteDevice、ServiceRecord实例对象。
④客户端再通过Connector.open(URL【通过serviceRecord.getConnectionURL()取得的】)强制转换成L2CAPConnection 或StreamConnection 建立一个连接。