/**
* BlueCove - Java library for Bluetooth
* Copyright (C) 2004 Intel Corporation
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @version $Id$
*/
package com.intel.bluetooth.test;
import javax.microedition.io.Connector;
import java.io.DataOutputStream;
import javax.bluetooth.DataElement;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.BluetoothStateException;
import java.io.IOException;
import javax.microedition.io.StreamConnection;
import java.util.Enumeration;
import java.util.Vector;
public class SimpleClient implements DiscoveryListener {
static final UUID uuid = new UUID(Consts.TEST_UUID, false);
//static final UUID uuid = com.intel.bluetooth.BluetoothConsts.RFCOMM_PROTOCOL_UUID;
//static final UUID uuid = com.intel.bluetooth.BluetoothConsts.L2CAP_PROTOCOL_UUID;
Vector devices;
Vector records;
CancelThread cancelThread;
class CancelThread extends Thread {
SimpleClient client;
boolean inquiryCompleted;
CancelThread(SimpleClient client) {
this.client = client;
this.inquiryCompleted = false;
}
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (!this.inquiryCompleted) {
System.out.println("cancelling inquiry on timeout");
try {
if (LocalDevice.getLocalDevice().getDiscoveryAgent().cancelInquiry(client)) {
System.out.println("inquiry cancelled");
}
} catch (BluetoothStateException bse) {
System.out.println("Got BluetoothStateException: " + bse);
}
}
}
}
public SimpleClient(String message) {
devices = new Vector();
cancelThread = new CancelThread(this);
cancelThread.start();
synchronized (this) {
try {
LocalDevice.getLocalDevice().getDiscoveryAgent().startInquiry(DiscoveryAgent.GIAC, this);
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (BluetoothStateException e) {
e.printStackTrace();
}
}
for (Enumeration enum_d = devices.elements(); enum_d.hasMoreElements();) {
RemoteDevice d = (RemoteDevice) enum_d.nextElement();
if (!EnvSettings.isTestAddress(d.getBluetoothAddress())) {
continue;
}
try {
System.out.println("discovered name: " + d.getFriendlyName(false));
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("discovered address: " + d.getBluetoothAddress());
synchronized (this) {
records = new Vector();
try {
LocalDevice.getLocalDevice().getDiscoveryAgent().searchServices(new int[] { 0x0100, 0x0101, 0x0A0, 0x0A1, 0x0A2, 0x0A3, 0x0A4 },
new UUID[] { uuid }, d, this);
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (BluetoothStateException e) {
e.printStackTrace();
}
}
/*
*
* BUGBUG: need to give the system time to sort itself out after
* doing a service attribute request
*
*/
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (Enumeration enum_r = records.elements(); enum_r.hasMoreElements();) {
ServiceRecord r = (ServiceRecord) enum_r.nextElement();
String name = null;
DataElement nameDataElement = r.getAttributeValue(0x0100);
if (nameDataElement != null) {
name = nameDataElement.getValue().toString();
}
System.out.println("Name attribute: " + name);
String url = r.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
System.out.println("url: " + url);
if ((name != null) && name.startsWith(Consts.TEST_SERVERNAME_PREFIX)) {
try {
StreamConnection conn = (StreamConnection) Connector.open(url);
DataOutputStream dos = new DataOutputStream(conn.openOutputStream());
System.out.println("Sending message");
dos.writeUTF(message);
dos.close();
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
System.out.println("Not a BlueCove ServiceRecord " + r);
}
}
}
}
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
devices.addElement(btDevice);
System.out.println("deviceDiscovered " + btDevice.getBluetoothAddress() + " DeviceClass: " + ((Object)cod).toString());
}
public synchronized void inquiryCompleted(int discType) {
String txt;
switch (discType) {
case INQUIRY_COMPLETED: txt = "INQUIRY_COMPLETED"; break;
case INQUIRY_TERMINATED: txt = "INQUIRY_TERMINATED"; break;
case INQUIRY_ERROR: txt = "INQUIRY_ERROR"; break;
default:txt = "n/a";
}
System.out.println("inquiry completed: discType = " + discType + " " + txt);
cancelThread.inquiryCompleted = true;
notifyAll();
}
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
for (int i = 0; i < servRecord.length; i++) {
records.addElement(servRecord[i]);
}
}
public synchronized void serviceSearchCompleted(int transID, int respCode) {
String txt;
switch (respCode) {
case SERVICE_SEARCH_COMPLETED: txt = "SERVICE_SEARCH_COMPLETED"; break;
case SERVICE_SEARCH_TERMINATED: txt = "SERVICE_SEARCH_TERMINATED"; break;
case SERVICE_SEARCH_ERROR: txt = "SERVICE_SEARCH_ERROR"; break;
case SERVICE_SEARCH_NO_RECORDS: txt = "SERVICE_SEARCH_NO_RECORDS"; break;
case SERVICE_SEARCH_DEVICE_NOT_REACHABLE: txt = "SERVICE_SEARCH_DEVICE_NOT_REACHABLE"; break;
default: txt = "n/a";
}
System.out.println("service search completed: respCode = " + respCode + " " + txt);
notifyAll();
}
public static void main(String[] args) {
EnvSettings.setSystemProperties();
if (args.length == 1) {
new SimpleClient(args[0]);
} else {
System.out.println("syntax: SimpleClient <message>");
new SimpleClient("bluecove test message");
}
}
}