使用bluecove将数据从android蓝牙发送到PC
我正在尝试使用 Windows 上的 Bluecove 将数据从 Android(使用其 SDK 中的 API)发送到 PC,这是最后一个服务器。
我可以让 android 连接到服务器,但是当我写入套接字的输出流时,服务器上没有任何反应。我重写了 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;
}
}
}
PC代码
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;
}
}
}
}
I'm trying to send data from android (using API from its SDK) to a PC using Bluecove on windows, being this last one the server.
I can get the android to connect to the server but when I write to the socket's output stream, nothing happens on server. I have the onPut method overriden but it is never called.
Code follows bellow, if anyone could help me I would be very appreciated :
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;
}
}
}
PC code
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;
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
2年前我也做过类似的事情。
对于 Android,我的代码与您的稍有不同:
我使用
DataOutputStream
将数据发送到 PC。不过当然这并不重要,仅供参考。对于 PC,
我不确定上面的代码今天是否仍然有效,因为这是 2 年前完成的。 BlueCove API 可能已经发生了很大变化。但无论如何,这些代码对我有用。希望这可以帮助你。
还要注意的是,我必须卸载电脑中的东芝蓝牙驱动程序并重新安装微软驱动程序才能使用 BlueCove。否则,就行不通。 (不过,最新版本的BlueCove可能已经支持了不同的驱动,如有说错请指正。)
I have done similar thing 2 years ago.
For Android, my code is slightly different from yours:
I used
DataOutputStream
to send data to PC. But surely this doesn't matter, just for your reference.For PC,
I am not sure if the above codes still work today, as this was done 2 years ago. The BlueCove API may have changed a lot. But anyway, these codes work for me. Hope this may help you.
One more note is that, I had to uninstall the Toshiba Bluetooth Driver in my PC and reinstall the Microsoft one in order to make use of BlueCove. Otherwise, it won't work. (However, latest version of BlueCove may have already supported different drivers, please correct me if I said anything wrong.)
尝试在 Android sendData 方法中使用“println”而不是“write”!
Try with "println" instead of "write" in your Android sendData method !