Java Bluetooth 程式開發入門
This document is provided as is. Use it at your own risks. You are, however, welcomed to use it for educational, non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟
請勿轉貼
目錄
藍芽簡介
開發環境簡介
這一節的說明主要是針對 Linux 的環境,或者更嚴格的說是我還沒有發現 Blue Cove 以前的測試環境。現在 Windows XP SP2 之後已經支援藍芽的驅動程式, 再加上 Blue Cove 以及藍芽設備,你就可以開始開發了。不過,我還是把 以下的說明留下來當參考用。
- 兩部安裝了 Linux 的電腦,請確定這個版本的 Linux 內建支援 BlueZ。 我們用的是 Fedora Core 1,你也可以參考 窮人的 Java Bluetooth 開發環境之建置 來建置你的開發環境。
- 依照 BlueZ 硬體相容清單 去 採購你的藍芽裝置. 我用的是別人幫我買的 X-Micro 的 Bluetooth USB Dongle. 雖然這個設備並未出現在相容清單內,但是目前 為止使用上都還蠻順利的。你可以在環境架好了以後,再去購買,如果發現不相容 可以馬上退貨。
- Linux 環境安裝有 J2SDK 1.4.x (or later) 以及 Rococo Software's Impronto Developer Kit for Linux.
- 安裝至少 bluez-libs 和 bluez-utils 套件。
- 請在兩部電腦上都利用以下指令來確定你的環境是正確的(# 為註解)
hciconfig -a #來確定你的藍芽裝置是正常運作的
hcitool scan #來確定遠端的藍芽裝置是正常運作的
#假設遠端的藍芽裝置是 00:02:72:01:83:E0
hcitool info 00:02:72:01:83:E0 #來確定兩部藍芽裝置可以互相連線的
- 注意: 我發現如果 hcitool info 00:02:72:01:83:E0 出現 Input/Output Error ,這可能是你的藍芽裝置的設定需求是要求 auth and encrypt,而 hcitool 是以 noauth and noencrypt 的方式來進行 (跟我們以下的範例程式相同),你可以用以下的指令來取消設定
hciconfig hci0 noauth
hciconfig hci0 noencrypt
# Authentication and Encryption
auth enable;
encrypt enable;
# Authentication and Encryption
auth disable;
encrypt disable;
程式開發
- LocalDevice 的查詢
- LocalInfo.java
import java.io.*;
import javax.bluetooth.*;
public class LocalInfo
{
public static void main(String args[]) throws BluetoothStateException {
LocalDevice localdev = null;
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
System.out.println("a local bluetooth device is found:");
System.out.println(" Name: " + localdev.getFriendlyName());
System.out.println("Address: " + localdev.getBluetoothAddress());
System.out.println("/nIts device classes are:");
DeviceClass devcla = localdev.getDeviceClass();
System.out.println(devcla.toString());
System.out.println("Service Class: " + devcla.getServiceClasses());
System.out.println("Major Device Class: " + devcla.getMajorDeviceClass());
System.out.println("Minor Device Class: " + devcla.getMinorDeviceClass());
}
}
- LocalInfo.java
- RemoteDevice 的查詢
- RemoteInfo.java
import java.io.*;
import javax.bluetooth.*;
public class RemoteInfo
{
public static void main(String args[]) throws BluetoothStateException
{
LocalDevice localdev = null;
MyListener listener = new MyListener();
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
DiscoveryAgent agent = localdev.getDiscoveryAgent();
try {
agent.startInquiry(DiscoveryAgent.GIAC, listener);
} catch (BluetoothStateException e) {
System.out.println("Device unable to inquiry");
System.exit(2);
}
}
}
- MyListener.java
//
// a Lisntener class that implements DiscoveryListener
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class MyListener implements DiscoveryListener
{
private RemoteDevice remote = null;
// 當藍芽裝置發現遠端有藍芽裝置,就會自動呼叫(依照順序)
// deviceDiscovered() and then inquiryCompleted()
public void deviceDiscovered(RemoteDevice rt, DeviceClass cod) {
remote = rt;
System.out.println("A Remote Device Found:");
System.out.println("Address: " + rt.getBluetoothAddress());
try {
System.out.println(" Name: " + rt.getFriendlyName(true));
} catch (IOException e) {}
}
public void inquiryCompleted(int distype) {
if(distype == INQUIRY_TERMINATED)
System.out.println("Application Terminated");
else if(distype == INQUIRY_COMPLETED)
System.out.println("Inquiry Completed");
else
System.out.println("ERROR: Inquiry aborted");
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
}
public void serviceSearchCompleted(int transID, int respCode) {
}
}
- 我們也可以將 RemoteInfo 和 MyListener 結合成一個 class,底下的 RemoteOne.java 說明這個做法。
//
// Query remote device's information.
// Combine client and DiscoveryListener into one class
// compare this program with RemoteInfo and MyListener
// Advantage: main() can use queried remote device directly
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class RemoteOne implements DiscoveryListener
{
public static void main(String args[]) throws BluetoothStateException
{
LocalDevice localdev = null;
RemoteOne listener = new RemoteOne();
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
DiscoveryAgent agent = localdev.getDiscoveryAgent();
try {
agent.startInquiry(DiscoveryAgent.GIAC, listener);
} catch (BluetoothStateException e) {
System.out.println("Device unable to inquiry");
System.exit(2);
}
}
// implement required methods.
private RemoteDevice remote = null;
public void deviceDiscovered(RemoteDevice rt, DeviceClass cod) {
remote = rt;
System.out.println("A Remote Device Found:");
System.out.println("Address: " + rt.getBluetoothAddress());
try {
System.out.println(" Name: " + rt.getFriendlyName(true));
} catch (IOException e) {}
}
public void inquiryCompleted(int distype) {
if(distype == INQUIRY_TERMINATED)
System.out.println("Application Terminated");
else if(distype == INQUIRY_COMPLETED)
System.out.println("Inquiry Completed");
else
System.out.println("ERROR: Inquiry aborted");
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
}
public void serviceSearchCompleted(int transID, int respCode) {
}
}
- RemoteInfo.java
- 利用 RFCOMM 來交換訊息:RFListener.java 和 RFDateClient.java 在同一部 電腦執行,而 RFDateServ.java 再另一部電腦執行。一般來說,程式的執行過程 需要先將 server 端的 service 實作出來,然後將該 service 跟 server 登記並 發布,因此你必須先執行 RFDateServ。等到 service 發布後,你就 執行 RFDateClient 讓 client 經由 searchServices() 發現 service 並與 service 取得連接。
- RFListener.java
//
// a Lisntener class that implements DiscoveryListener
// From a source code published in Benhui.net claimes that
// Impronto prefers to have a Lisntener class.
// conn: RFCOMM
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class RFListener implements DiscoveryListener
{
private static RemoteDevice remote;
private static ServiceRecord first;
public RemoteDevice getDevFound() {
return remote;
}
public void deviceDiscovered(RemoteDevice rt, DeviceClass cod) {
remote = rt;
System.out.println("A Remote Device Found:");
System.out.println("Address: " + rt.getBluetoothAddress());
try {
System.out.println(" Name: " + rt.getFriendlyName(true));
} catch (IOException e) {}
}
public void inquiryCompleted(int distype) {
if(distype == INQUIRY_TERMINATED)
System.out.println("Application Terminated");
else if(distype == INQUIRY_COMPLETED)
System.out.println("Inquiry Completed");
else
System.out.println("ERROR: Inquiry aborted");
}
// 當裝置從遠端的藍芽裝置發現該裝置上有服務的時候,會先呼叫
// servicesDiscovered() 然後 serviceSearchCompleted()
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
first = servRecord[0];
// 從 service record 來取得 url
String url = first.getConnectionURL(first.NOAUTHENTICATE_NOENCRYPT, false);
try {
// 與 server 建立連線
StreamConnection conn = (StreamConnection) Connector.open(url);
String message = "What time is it now?";
InputStream is = conn.openInputStream();
OutputStream os = conn.openOutputStream();
byte[] rbuf = new byte[100];
os.write(message.getBytes());
is.read(rbuf);
System.out.println(new String(rbuf));
is.close();
os.close();
conn.close();
} catch (Exception e) {
System.out.println("ERROR: connection error");
}
}
public void serviceSearchCompleted(int transID, int respCode) {
// 依照 respCode 來了解 serviceSearch 的結果
if(respCode == SERVICE_SEARCH_COMPLETED)
System.out.println("Services successfully located");
else if(respCode == SERVICE_SEARCH_TERMINATED)
System.out.println("Service inquiry was cancelled");
else if(respCode == SERVICE_SEARCH_DEVICE_NOT_REACHABLE)
System.out.println("Service connection cannot be established");
else if(respCode == SERVICE_SEARCH_NO_RECORDS)
System.out.println("No service found");
else
System.out.println("ERROR: service inquiry failed");
}
}
- RFDateClient.java
//
// a Client to request Date/Time from server
// connection: RFCOMM
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class RFDateClient
{
public static void main(String args[]) throws BluetoothStateException
{
LocalDevice localdev = null;
RFListener listener = new RFListener();
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
DiscoveryAgent agent = localdev.getDiscoveryAgent();
try {
// startInquiry() is non-blocking.
agent.startInquiry(DiscoveryAgent.GIAC, listener);
} catch (BluetoothStateException e) {
System.out.println("ERROR: device inquiry failed");
System.exit(2);
}
// pause for a while
while (listener.getDevFound() == null)
try {
Thread.sleep(5000);
} catch (Exception e) {}
RemoteDevice rd = listener.getDevFound();
// UUID 還得多研究一下
UUID[] uuidSet = new UUID[1];
uuidSet[0] = new UUID("102030405060708090A0B0C0D0E0F011", false);
int trans;
try {
// 對遠端藍芽裝置 rd 查詢服務
trans = agent.searchServices(null, uuidSet, rd, listener);
} catch (BluetoothStateException e) {
System.out.println("device unable to begin service inquiry");
}
}
}
- RFDateServ.java
//
// a Date/Time server
// conn: RFCOMM
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
import java.util.*;
public class RFDateServ
{
public static void main(String args[])
{
LocalDevice localdev = null;
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
// show an example usage of getProperty.
//System.out.println("MTU: " + localdev.getProperty(
// "bluetooth.l2cap.receiveMTU.max"));
UUID uuid = new UUID("102030405060708090A0B0C0D0E0F011", false);
String url = "btspp://localhost:" + uuid.toString();
try {
// 1. create service record
StreamConnectionNotifier n = (StreamConnectionNotifier) Connector.open(url);
// 2. obtain the service record
// set ServiceRecrod ServiceAvailability (0x0008) attribute to
// indicate our service is available
// 0xFF indicate fully available status
// This operation is optional
ServiceRecord record = localdev.getRecord(n);
record.setAttributeValue( 0x0008, new DataElement( DataElement.U_INT_1,0xF
F ) );
System.out.println("Waiting to be connected...");
// 3.ready to accept connection: will block until a client connects
StreamConnection conn = n.acceptAndOpen();
// send and receive data
String message = new Date().toString();
InputStream is = conn.openInputStream();
OutputStream os = conn.openOutputStream();
os.write(message.getBytes());
byte[] rbuf = new byte[100];
is.read(rbuf);
System.out.println("Received: " + new String(rbuf));
is.close();
os.close();
conn.close();
} catch (Exception e) {
System.out.println("ERROR: connection failed.");
}
}
}
- 相同的,我們也提供一個將 client 與 listener 包起來的範例,其他的 就讓讀者自己去試試看。
//
// a Client to request Date/Time from server
// connection: RFCOMM
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class RFClientOne implements DiscoveryListener
{
public static void main(String args[]) throws BluetoothStateException
{
LocalDevice localdev = null;
RFClientOne listener = new RFClientOne();
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
DiscoveryAgent agent = localdev.getDiscoveryAgent();
try {
// startInquiry() is non-blocking.
agent.startInquiry(DiscoveryAgent.GIAC, listener);
} catch (BluetoothStateException e) {
System.out.println("ERROR: device inquiry failed");
System.exit(2);
}
// pause for a while
// NOTE: if there is no remote device, this may go into infinite loop
// this program also shows that to start services from a client it's
// better to have a GUI interface.
while (remote == null)
try {
Thread.sleep(5000);
} catch (Exception e) {}
UUID[] uuidSet = new UUID[1];
uuidSet[0] = new UUID("102030405060708090A0B0C0D0E0F011", false);
int trans;
try {
trans = agent.searchServices(null, uuidSet, remote, listener);
} catch (BluetoothStateException e) {
System.out.println("device unable to begin service inquiry");
}
}
// implement required listener methods.
private static RemoteDevice remote = null;
private static ServiceRecord first = null;
public void deviceDiscovered(RemoteDevice rt, DeviceClass cod) {
remote = rt;
System.out.println("A Remote Device Found:");
System.out.println("Address: " + rt.getBluetoothAddress());
try {
System.out.println(" Name: " + rt.getFriendlyName(true));
} catch (IOException e) {}
}
public void inquiryCompleted(int distype) {
if(distype == INQUIRY_TERMINATED)
System.out.println("Application Terminated");
else if(distype == INQUIRY_COMPLETED)
System.out.println("Inquiry Completed");
else
System.out.println("ERROR: Inquiry aborted");
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
first = servRecord[0];
String url = first.getConnectionURL(first.NOAUTHENTICATE_NOENCRYPT, false);
try {
StreamConnection conn = (StreamConnection) Connector.open(url);
String message = "What time is it now?";
InputStream is = conn.openInputStream();
OutputStream os = conn.openOutputStream();
byte[] rbuf = new byte[100];
os.write(message.getBytes());
is.read(rbuf);
System.out.println(new String(rbuf));
is.close();
os.close();
conn.close();
} catch (Exception e) {
System.out.println("ERROR: connection error");
}
}
public void serviceSearchCompleted(int transID, int respCode) {
if(respCode == SERVICE_SEARCH_COMPLETED)
System.out.println("Services successfully located");
else if(respCode == SERVICE_SEARCH_TERMINATED)
System.out.println("Service inquiry was cancelled");
else if(respCode == SERVICE_SEARCH_DEVICE_NOT_REACHABLE)
System.out.println("Service connection cannot be established");
else if(respCode == SERVICE_SEARCH_NO_RECORDS)
System.out.println("No service found");
else
System.out.println("ERROR: service inquiry failed");
}
}
- RFListener.java
- 利用 L2CAP 來交換訊息
- L2Listener.java
//
// a Lisntener class that implements DiscoveryListener
// From a source code published in Benhui.net claimes that
// Impronto prefers to have a Lisntener class.
// conn: L2CAP
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class L2Listener implements DiscoveryListener
{
private static RemoteDevice remote;
private static ServiceRecord first;
public RemoteDevice getDevFound() {
return remote;
}
public void deviceDiscovered(RemoteDevice rt, DeviceClass cod) {
remote = rt;
System.out.println("A Remote Device Found:");
System.out.println("Address: " + rt.getBluetoothAddress());
try {
System.out.println(" Name: " + rt.getFriendlyName(true));
} catch (IOException e) {}
}
public void inquiryCompleted(int distype) {
if(distype == INQUIRY_TERMINATED)
System.out.println("Application Terminated");
else if(distype == INQUIRY_COMPLETED)
System.out.println("Inquiry Completed");
else
System.out.println("ERROR: Inquiry aborted");
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
first = servRecord[0];
// 需增加 url += ";ReceiveMTU=512;TransmitMTU=512";
String url = first.getConnectionURL(first.NOAUTHENTICATE_NOENCRYPT, false);
url += ";ReceiveMTU=512;TransmitMTU=512";
try {
L2CAPConnection conn = (L2CAPConnection) Connector.open(url);
String message = "Hello Server";
int is = conn.getReceiveMTU();
int os = conn.getTransmitMTU();
byte[] rbuf = new byte[is];
conn.send(message.getBytes());
conn.receive(rbuf);
System.out.println("Received: " + new String(rbuf));
conn.close();
} catch (Exception e) {
System.out.println("ERROR: connection error");
}
}
public void serviceSearchCompleted(int transID, int respCode) {
if(respCode == SERVICE_SEARCH_COMPLETED)
System.out.println("Services successfully located");
else if(respCode == SERVICE_SEARCH_TERMINATED)
System.out.println("Service inquiry was cancelled");
else if(respCode == SERVICE_SEARCH_DEVICE_NOT_REACHABLE)
System.out.println("Service connection cannot be established");
else if(respCode == SERVICE_SEARCH_NO_RECORDS)
System.out.println("No service found");
else
System.out.println("ERROR: service inquiry failed");
}
}
- DateClient.java
//
// a Client to request Date/Time from server
// connection: L2CAP
// usage: you can use l2ping to check if the connection is up and running.
//
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class DateClient
{
public static void main(String args[]) throws BluetoothStateException
{
LocalDevice localdev = null;
L2Listener listener = new L2Listener();
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
DiscoveryAgent agent = localdev.getDiscoveryAgent();
try {
// startInquiry() is non-blocking.
agent.startInquiry(DiscoveryAgent.GIAC, listener);
} catch (BluetoothStateException e) {
System.out.println("ERROR: device inquiry failed");
System.exit(2);
}
// pause for a while
while (listener.getDevFound() == null)
try {
Thread.sleep(5000);
} catch (Exception e) {}
RemoteDevice rd = listener.getDevFound();
UUID[] uuidSet = new UUID[1];
uuidSet[0] = new UUID("102030405060708090A0B0C0D0E0F011", false);
int trans;
try {
trans = agent.searchServices(null, uuidSet, rd, listener);
} catch (BluetoothStateException e) {
System.out.println("device unable to begin service inquiry");
}
}
}
- DateServ.java
import java.io.*;
import javax.bluetooth.*;
import javax.microedition.io.*;
public class DateServ
{
public static void main(String args[])
{
// Since no service record is needed, LocalDevice is not needed.
// for L2CAP, protocol name btl2cap is used.
UUID uuid = new UUID("102030405060708090A0B0C0D0E0F011", false);
String url = "btl2cap://localhost:" + uuid.toString() +";ReceiveMTU=512;Tran
smitMTU=512";
try {
// 1. create service record
L2CAPConnectionNotifier n = (L2CAPConnectionNotifier) Connector.open(url);
System.out.println("Waiting to be connected...");
// 3.ready to accept connection: will block until a client connects
L2CAPConnection conn = n.acceptAndOpen();
// send and receive data
String message = "Hello World";
int is = conn.getReceiveMTU();
int os = conn.getTransmitMTU();
conn.send(message.getBytes());
byte[] rbuf = new byte[is];
conn.receive(rbuf);
System.out.println("Received: " + new String(rbuf));
conn.close();
} catch (Exception e) {
System.out.println("ERROR: connection failed.");
}
}
}
- L2Listener.java
- 利用 OBEX 來傳送檔案 The Object Exchange (OBEX) protocol 允許客戶端程式利用 pull (onGet()) 或者 push (onPut())的方式來下載或者上傳檔案,在以下的範例中, 我們展示如何從 server 端下載一個 XML 的檔案到客戶端。
- OBEXServ.java
//
// a simple file server
// conn: OBEX
//
import java.io.*;
import javax.bluetooth.*;
import javax.obex.*;
import javax.microedition.io.*;
public class OBEXServ extends ServerRequestHandler
{
// override onGet() in ServerRequestHandler
public int onGet(Operation op) {
try {
HeaderSet headers = op.getReceivedHeaders();
// receive the name of the file requested by clients
String fname = (String) headers.getHeader(HeaderSet.NAME);
DataOutputStream os = op.openDataOutputStream();
DataInputStream is = new DataInputStream(
new FileInputStream(fname));
/*
// the following two lines are from RocoSoft User Guide
// 還搞不清楚為什麼手冊要這樣子寫?
InputConnection fconn = (InputConnection) Connector.open(fname);
DataInputStream is = fconn.openDataInputStream();
*/
// confirm file name with clients
HeaderSet rephead = createHeaderSet();
rephead.setHeader(HeaderSet.NAME, fname);
op.sendHeaders(rephead);
// send the file to the client
int data;
while((data = is.read()) != -1) {
os.write((byte) data);
}
is.close();
os.close();
op.close();
} catch (IOException e) {
return ResponseCodes.OBEX_HTTP_INTERNAL_ERROR;
}
return ResponseCodes.OBEX_HTTP_OK;
}
public static void main(String args[]) {
// create a request handler
OBEXServ handler = new OBEXServ();
UUID uuid = new UUID("102030405060708090A0B0C0D0E0F011", false);
String url = "btgoep://localhost:" + uuid.toString();
try {
// 1. create service record
SessionNotifier n = (SessionNotifier) Connector.open(url);
System.out.println("Waiting to be connected...");
// 3.ready to accept connection: will block until a client connects
n.acceptAndOpen(handler);
// send and receive data is now covered by onGet() or onPut()
} catch (Exception e) {
System.out.println("ERROR: connection failed.");
}
}
}
- OBEXClient.java
//
// a Client to request file from server
// connection: OBEX
//
import java.io.*;
import javax.bluetooth.*;
import javax.obex.*;
import javax.microedition.io.*;
public class OBEXClient implements DiscoveryListener
{
public static void main(String args[]) throws BluetoothStateException
{
LocalDevice localdev = null;
OBEXClient listener = new OBEXClient();
try {
localdev = LocalDevice.getLocalDevice();
} catch (BluetoothStateException e) {
System.out.println("ERROR: cannot access local device");
System.exit(1);
}
DiscoveryAgent agent = localdev.getDiscoveryAgent();
try {
agent.startInquiry(DiscoveryAgent.GIAC, listener);
} catch (BluetoothStateException e) {
System.out.println("ERROR: device inquiry failed");
System.exit(2);
}
// pause for a while
// NOTE: if there is no remote device, this may go into infinite loop
// this program also shows that to start services from a client it's
// better to have a GUI interface.
while (remote == null)
try {
Thread.sleep(5000);
} catch (Exception e) {}
UUID[] uuidSet = new UUID[1];
uuidSet[0] = new UUID("102030405060708090A0B0C0D0E0F011", false);
int trans;
try {
trans = agent.searchServices(null, uuidSet, remote, listener);
} catch (BluetoothStateException e) {
System.out.println("device unable to begin service inquiry");
}
}
// implement required listener methods.
private static RemoteDevice remote = null;
private static ServiceRecord first = null;
public void deviceDiscovered(RemoteDevice rt, DeviceClass cod) {
remote = rt;
System.out.println("A Remote Device Found:");
System.out.println("Address: " + rt.getBluetoothAddress());
try {
System.out.println(" Name: " + rt.getFriendlyName(true));
} catch (IOException e) {}
}
public void inquiryCompleted(int distype) {
if(distype == INQUIRY_TERMINATED)
System.out.println("Application Terminated");
else if(distype == INQUIRY_COMPLETED)
System.out.println("Inquiry Completed");
else
System.out.println("ERROR: Inquiry aborted");
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
first = servRecord[0];
String url = first.getConnectionURL(first.NOAUTHENTICATE_NOENCRYPT, false);
try {
ClientSession conn = (ClientSession) Connector.open(url);
// check to see if OBEX connection is successful
HeaderSet reshead = conn.connect(null);
int status = reshead.getResponseCode();
if(status != ResponseCodes.OBEX_HTTP_OK) {
System.out.println("OBEX connection error!!");
System.exit(1);
}
System.out.println("Getting object from server");
// get object from server
HeaderSet headset = conn.createHeaderSet();
headset.setHeader(HeaderSet.NAME, "test.xml");
Operation op = conn.get(headset);
InputStream is = op.openInputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
System.out.println("Reading data from server");
// read data from server
int data;
while((data = is.read()) != -1)
os.write((byte) data);
System.out.println("Size: " + os.size());
System.out.println(os.toString());
// Although this is not necessary required, but if this is not inserted,
// I got IO error. And this type of IO error requires some hardware
// reset.
Thread.sleep(5000);
is.close();
os.close();
conn.close();
} catch (Exception e) {
System.out.println("ERROR: connection error");
}
}
public void serviceSearchCompleted(int transID, int respCode) {
if(respCode == SERVICE_SEARCH_COMPLETED)
System.out.println("Services successfully located");
else if(respCode == SERVICE_SEARCH_TERMINATED)
System.out.println("Service inquiry was cancelled");
else if(respCode == SERVICE_SEARCH_DEVICE_NOT_REACHABLE)
System.out.println("Service connection cannot be established");
else if(respCode == SERVICE_SEARCH_NO_RECORDS)
System.out.println("No service found");
else
System.out.println("ERROR: service inquiry failed");
}
}
Last Updated: Tuesday, 30-Nov-2010 18:16:30 CST
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu - OBEXServ.java