Отправить данные с Android Bluetooth на ПК с Bluecove
Я пытаюсь отправить данные с Android (используя API из SDK) на ПК, используя Bluecove на Windows, являясь последним сервером.
Я могу заставить андроид подключиться к серверу, но когда я пишу в выходной поток сокета, на сервере ничего не происходит. У меня есть метод onPut, но он никогда не вызывается.
Код следует ниже, если бы кто-нибудь мог мне помочь, я был бы очень признателен:
Android
public class BluetoothWorker {
private static UUID generalUuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private static BluetoothSocket socket;
private static BluetoothSocket getBluetoothSocket(){
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
mBluetoothAdapter.cancelDiscovery();
Set<BluetoothDevice> pairedDevices = mBluetoothAdapter.getBondedDevices();
// If there are paired devices
if (pairedDevices.size() > 0) {
// Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
if(device.getName().equalsIgnoreCase(("MIGUEL-PC"))){
try {
return device.createRfcommSocketToServiceRecord(generalUuid);
} catch (IOException e) {
return null;
}
}
}
}
return null;
}
public static boolean sendData(String status){
socket = getBluetoothSocket();
try {
socket.connect();
} catch (IOException e) {
// TODO Auto-generated catch block
socket = null;
}
if(socket != null){
try {
socket.getOutputStream().write(status.getBytes());
socket.getOutputStream().flush();
socket.close();
return true;
} catch (IOException e) {
socket = null;
return false;
}
}else{
return false;
}
}
}
Код ПК
public class AISHIntegrationBTBridge {
static final String serverUUID = "0000110100001000800000805F9B34FB";
public static void main(String[] args) throws IOException {
LocalDevice.getLocalDevice().setDiscoverable(DiscoveryAgent.GIAC);
SessionNotifier serverConnection = (SessionNotifier) Connector.open("btgoep://localhost:"
+ serverUUID + ";name=ObexExample");
int count = 0;
while(count < 2) {
RequestHandler handler = new RequestHandler();
serverConnection.acceptAndOpen(handler);
System.out.println("Received OBEX connection " + (++count));
}
}
private static class RequestHandler extends ServerRequestHandler {
public int onPut(Operation op) {
try {
HeaderSet hs = op.getReceivedHeaders();
String name = (String) hs.getHeader(HeaderSet.NAME);
if (name != null) {
System.out.println("put name:" + name);
}
InputStream is = op.openInputStream();
StringBuffer buf = new StringBuffer();
int data;
while ((data = is.read()) != -1) {
buf.append((char) data);
}
System.out.println("got:" + buf.toString());
op.close();
return ResponseCodes.OBEX_HTTP_OK;
} catch (IOException e) {
e.printStackTrace();
return ResponseCodes.OBEX_HTTP_UNAVAILABLE;
}
}
}
}
2 ответа
Я сделал подобное 2 года назад.
Для Android мой код немного отличается от вашего:
BluetoothSocket socket = Device.createRfcommSocketToServiceRecord(device_UUID);
socket.connect();
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeChar('x'); // for example
socket.close();
я использовал DataOutputStream
отправить данные на ПК. Но, конечно, это не имеет значения, просто для справки.
Для ПК,
LocalDevice localDevice = LocalDevice.getLocalDevice();
localDevice.setDiscoverable(DiscoveryAgent.GIAC); // Advertising the service
String url = "btspp://localhost:" + device_UUID + ";name=BlueToothServer";
StreamConnectionNotifier server = (StreamConnectionNotifier) Connector.open(url);
StreamConnection connection = server.acceptAndOpen(); // Wait until client connects
//=== At this point, two devices should be connected ===//
DataInputStream dis = connection.openDataInputStream();
char c;
while (true) {
c = dis.readChar();
if (c == 'x')
break;
}
connection.close();
Я не уверен, что вышеуказанные коды все еще работают сегодня, как это было сделано 2 года назад. API BlueCove, возможно, сильно изменился. Но в любом случае эти коды работают для меня. Надеюсь, это поможет вам.
Еще одно замечание: мне пришлось удалить драйвер Toshiba Bluetooth на моем компьютере и переустановить драйвер Microsoft, чтобы использовать BlueCove. Иначе это не сработает. (Тем не менее, последняя версия BlueCove, возможно, уже поддерживала различные драйверы, пожалуйста, исправьте меня, если я сказал что-то не так.)
Попробуйте использовать "println" вместо "write" в вашем методе Android sendData!