package blucat;
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import javax.bluetooth.DataElement;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import com.intel.bluetooth.BluetoothConsts;
/**
*
* @author Joseph Paul Cohen
*
*/
public class ListServices {
public static void listServices(String target) throws Exception{
throw new Exception("NYI");
}
public static void listServices() throws Exception{
PrintUtil.out.println("#" + "Listing all services");
@SuppressWarnings("unused")
Set<ServiceRecord> records = findViaSDP();
}
final static Object serviceSearchCompletedEvent = new Object();
static Set<ServiceRecord> findViaSDP() throws Exception{
Set<ServiceRecord> toReturn = new HashSet<ServiceRecord>();
UUID[] uuidSet ={
//new UUID(0x1002),
//BluetoothConsts.RFCOMM_PROTOCOL_UUID,
BluetoothConsts.L2CAP_PROTOCOL_UUID
// BluetoothConsts.OBEX_PROTOCOL_UUID,
// new UUID(0x0003)
};
int[] attrIDs = new int[] {
0x0100 // Service name
,0x0003
};
RemoteDeviceDiscovery.findDevices();
Set<RemoteDevice> devices = RemoteDeviceDiscovery.getDevices();
for (RemoteDevice remote : devices){
synchronized(serviceSearchCompletedEvent) {
PrintUtil.verbose("#" + "Searching for services on ");
PrintUtil.out.println("+," + RemoteDeviceDiscovery.deviceName(remote));
LocalDevice.getLocalDevice().getDiscoveryAgent()
.searchServices(attrIDs, uuidSet, remote, new ServiceDiscoveryListener(toReturn));
serviceSearchCompletedEvent.wait();
}
}
return toReturn;
}
static class ServiceDiscoveryListener implements DiscoveryListener{
Set<ServiceRecord> toReturn;
public ServiceDiscoveryListener(Set<ServiceRecord> toReturn) {
this.toReturn = toReturn;
}
@Override
public void deviceDiscovered(RemoteDevice arg0, DeviceClass arg1) {
//PrintUtil.out.println("deviceDiscovered");
}
@Override
public void inquiryCompleted(int arg0) {
//PrintUtil.out.println("done");
}
@Override
public void serviceSearchCompleted(int arg0, int arg1) {
//PrintUtil.out.println("service search completed!");
synchronized(serviceSearchCompletedEvent){
serviceSearchCompletedEvent.notifyAll();
}
}
@Override
public void servicesDiscovered(int arg0, ServiceRecord[] arg1) {
//PrintUtil.out.println(arg1);
for (ServiceRecord servRec : arg1) {
printServiceRecord(servRec);
toReturn.add(servRec);
}
}
}
private static void printServiceRecord(ServiceRecord rec){
try{
String name = "";
if (rec.getAttributeValue(0x0100) != null)
name = "" + rec.getAttributeValue(0x0100).getValue();
String desc = "";
if (rec.getAttributeValue(0x0003) != null)
desc = "" + rec.getAttributeValue(0x0003).getValue();
String url = rec.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
if (url != null)
url = url.substring(0, url.indexOf(";"));
String remoteMac = rec.getHostDevice().getBluetoothAddress();
String remoteName = rec.getHostDevice().getFriendlyName(false);
PrintUtil.out.print("-,");
if (BlucatState.csv)
PrintUtil.out.print((new Date()).getTime() + ", " + BluCatUtil.clean(remoteMac) + ", \"" + BluCatUtil.clean(remoteName) + "\", ");
PrintUtil.out.println("\"" + BluCatUtil.clean(name) + "\", \"" + BluCatUtil.clean(desc) + "\", " + BluCatUtil.clean(url));
if (BlucatState.verbose){
PrintUtil.out.println(" #Attributes Returned " + rec.getAttributeIDs().length );
for (int i : rec.getAttributeIDs()){
DataElement val = rec.getAttributeValue(i);
@SuppressWarnings("deprecation")
String sval = val.toString();
sval = sval.replace("\n", "\n ");
PrintUtil.out.println(" #" + String.format("0x%04x",i) + "=" + sval);
}
}
}catch(Exception e){
PrintUtil.out.println("#Error: " + e.getMessage());
e.printStackTrace();
}
}
}