在Java ME设备上执行蓝牙应用程序的首要步骤之一就是发现过程(discovery process)。简而言之就是,发现过程就是带有蓝牙的设备互相找到彼此的过程,然后一起携手找出它们各个可以支持的服务。下一步就是要学习如何在这些两两设备之间传送数据。
在本篇技术小文章中,我将向你展示如何创建一个可以互相查找设备的一个MIDlet,然后让用户发送一个简单的消息到其中一个被找到的设备中。我已经在Nokia N95的机器上测试并核实了这个MIDlet的工作了,通过启用蓝牙支持,它可以连接到一个运行Windows Vista的电脑上。
我把整个过程分成以下几个步骤:
1. 开始发现过程。
2. 查询在发现过程中找到的设备所支持的服务。
3. 使用支持服务的URL开始并处理一个OBEX数据交换。
以下各段将详细说明这些步骤。在这些步骤中遵循代码片段可以查阅这个MIDlet的整个源代码。源代码可以在最后的Resources下的压缩文件中获得。
第一步:开始发现过程
发现过程是用来告诉本地蓝牙堆栈可以和在附近任何蓝牙设备进行配对。在这个MIDlet中,这个堆栈可以通过你的设备提供者所提供的JSR 82来完成。这个发现过程通过发现在本地设备中的代理来开始的,如以下代码所示:
// get the local discovery agent
agent = LocalDevice.getLocalDevice().getDiscoveryAgent();
// start the inquiry for general unlimited inquiry
agent.startInquiry(DiscoveryAgent.GIAC, this);
一旦发现代理启动发现过程,它将在一个执行DiscoveryListener接口的类上调用各种调回方法。就我们而言,这是我们的MIDlet类。具体来说,必须执行这个接口的四个方法,其中两个是在发现阶段我们所感兴趣的:deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) 和 inquiryCompleted(int discType)。这两个方法处理一个设备的发现并完成发现过程。在以下所展示的来自MIDlet的代码中,一旦它们被发现或是当程序结束的时候,我们使用这些方法来添加我们的设备上的UI。
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
try {
// add the devices using the friendly names
listofDevices.append(btDevice.getFriendlyName(false), null);
// add to the devices hashtable
devices.put(new Long(listofDevices.size()), btDevice);
} catch(Exception ex) { handleError(ex); }
}
public void inquiryCompleted(int discType) {
// once the inquiry is completed, show the list of devices to the user
if(listofDevices.size() == 0) {
display.setCurrent(nothing, noteBox);
} else {
display.setCurrent(listofDevices);
}
}