我正在尝试通过一个简单的应用程序获得使用蓝牙的基础知识。我也喜欢笔记本电脑应用程序,所以我可以简单地调试蓝牙通信。下面的代码是我尝试将笔记本电脑作为客户端(使用BlueCove 2.1.0),平板电脑作为服务器(Android 2.2)。
根据我的理解,这应该按照书面形式工作,笔记本电脑正在提供平板电脑及其提供的服务。但是,行"StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);"
每次都返回null。
任何想法都出了什么问题?以下是代码的输出:
在winsock上的BlueCove版本2.1.0 地址:68A3C44A5265
名称:WS1497
启动设备查询...
发现设备:2013E061D922
发现设备:00242BFE7375
INQUIRY_COMPLETED
设备查询已完成。
服务咨询开始。
来自:Galaxy Tab
服务搜索已完成 - 代码:1
来自:WS1190
服务搜索已完成 - 代码:4
蓝牙设备:
1. 2013E061D922(Galaxy Tab)
2. 00242BFE7375(WS1190)
btspp:// 2013E061D922:20; authenticate = false; encrypt = false; master = false ---- = null
线程“main”中的异常java.lang.NullPointerException
在MainClass.main(MainClass.java:104)
BlueCove堆栈关闭完成了
以下是我正在使用的代码:
笔记本电脑代码:
import java.io.DataInputStream;
import java.io.IOException;
import java.util.Vector;
import javax.bluetooth.DeviceClass;
import javax.bluetooth.DiscoveryAgent;
import javax.bluetooth.DiscoveryListener;
import javax.bluetooth.LocalDevice;
import javax.bluetooth.RemoteDevice;
import javax.bluetooth.ServiceRecord;
import javax.bluetooth.UUID;
import javax.microedition.io.Connector;
import javax.microedition.io.StreamConnection;
public class MainClass implements DiscoveryListener {
// object used for waiting
private static Object lock = new Object();
// vector containing the devices discovered
private static Vector<RemoteDevice> vecDevices = new Vector<RemoteDevice>();
private static Vector<String> vecServices = new Vector<String>();
// main method of the application
public static void main(String[] args) throws IOException {
// create an instance of this class
MainClass bluetoothDeviceDiscovery = new MainClass();
// display local device address and name
LocalDevice localDevice = LocalDevice.getLocalDevice();
System.out.println("Address: " + localDevice.getBluetoothAddress());
System.out.println("Name: " + localDevice.getFriendlyName());
// find devices
DiscoveryAgent agent = localDevice.getDiscoveryAgent();
System.out.println("Starting device inquiry...");
agent.startInquiry(DiscoveryAgent.GIAC, bluetoothDeviceDiscovery);
try {
synchronized (lock) {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Device Inquiry Completed. ");
System.out.println("Service Inquiry Started. ");
UUID uuids[] = new UUID[1];
uuids[0] = new UUID("fa87c0d0afac11de8a390800200c9a66", false);
for (RemoteDevice rd : vecDevices) {
System.out.println("From: " + rd.getFriendlyName(false));
agent.searchServices(null, uuids, rd, bluetoothDeviceDiscovery);
try {
synchronized (lock) {
lock.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// print all devices in vecDevices
int deviceCount = vecDevices.size();
if (deviceCount <= 0) {
System.out.println("No Devices Found .");
} else {
// print bluetooth device addresses and names in the format [ No.
// address (name) ]
System.out.println("Bluetooth Devices: ");
for (int i = 0; i < deviceCount; i++) {
RemoteDevice remoteDevice = (RemoteDevice) vecDevices
.elementAt(i);
System.out.println((i + 1) + ". "
+ remoteDevice.getBluetoothAddress() + " ("
+ remoteDevice.getFriendlyName(false) + ")");
}
}
// System.out.println("SR: " + sr.toString());
for (String url : vecServices) {
try {
String url = sr
.getConnectionURL(
ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);
StreamConnection conn = (StreamConnection) Connector.open(url, Connector.READ_WRITE);
System.out.println(url + " ----=" + conn);
DataInputStream din = new DataInputStream(
conn.openDataInputStream());
synchronized (lock) {
try {
lock.wait(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while (din.available() != 0) {
System.out.print(din.readChar());
}
System.out.println();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}// end main
// methods of DiscoveryListener
/**
* This call back method will be called for each discovered bluetooth
* devices.
*/
public void deviceDiscovered(RemoteDevice btDevice, DeviceClass cod) {
System.out.println("Device discovered: "
+ btDevice.getBluetoothAddress());
// add the device to the vector
if (!vecDevices.contains(btDevice)) {
vecDevices.addElement(btDevice);
}
}
// no need to implement this method since services are not being discovered
public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
for (ServiceRecord sr : servRecord) {
vecServices.add(sr.getConnectionURL(ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false));
}
}
// no need to implement this method since services are not being discovered
public void serviceSearchCompleted(int transID, int respCode) {
System.out.println("Service search completed - code: " + respCode);
synchronized (lock) {
lock.notify();
}
}
/**
* This callback method will be called when the device discovery is
* completed.
*/
public void inquiryCompleted(int discType) {
switch (discType) {
case DiscoveryListener.INQUIRY_COMPLETED:
System.out.println("INQUIRY_COMPLETED");
break;
case DiscoveryListener.INQUIRY_TERMINATED:
System.out.println("INQUIRY_TERMINATED");
break;
case DiscoveryListener.INQUIRY_ERROR:
System.out.println("INQUIRY_ERROR");
break;
default:
System.out.println("Unknown Response Code");
break;
}
synchronized (lock) {
lock.notify();
}
}// end method
}// end class
机器人:
package com.mira.Bluetooth;
import java.io.IOException;
import java.util.UUID;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.os.Bundle;
import android.util.Log;
public class BluetoothAndroidActivity extends Activity implements Runnable {
BluetoothServerSocket bss;
Thread t;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
BluetoothAdapter bta = BluetoothAdapter.getDefaultAdapter();
for (BluetoothDevice btd : bta.getBondedDevices()) {
Log.i("Bluetooth Device Found",
btd.toString() + "; " + btd.getName());
}
try {
bss =
bta.listenUsingRfcommWithServiceRecord("BluetoothChat", UUID.fromString("fa87c0d0-afac-11de-8a39-0800200c9a66"));
t = new Thread(this);
t.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
boolean bContinue = true;
while (bContinue) {
try {
Thread.sleep(100);
} catch (Exception e) {
}
try {
System.out.println("Listening for connection");
BluetoothSocket bs = bss.accept();
System.out.println("Connection received");
bs.getOutputStream().write("Hello BlueTooth World".getBytes());
bs.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
bContinue = false;
}
}
}
/*
* (non-Javadoc)
*
* @see android.app.Activity#onDestroy()
*/
@Override
protected void onStop() {
try {
System.out.println("Killing ServerSocket");
bss.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.onStop();
}
}
答案 0 :(得分:1)
这是一个老问题,所以我不知道是否有人仍在寻找答案,但无论如何这里都是...... :)。您询问的行是返回null,因为url
为空。试试这个UUID而不是代码中的UUID:0000110100001000800000805f9b34fb
。
答案 1 :(得分:0)
经过很长一段时间后的更新 - 事实证明,蓝牙要求UUID采用“0000xxxx0000100000080805f9b34fb”的形式,这确实提出了为什么不使用16位标识符而不是128位UUID的问题,但没关系。 / p>
我不知道BlueCove是否可以在我的笔记本电脑上使用它,但我最近在我的笔记本电脑上使用Linux和'Bluez'的实验表明该形式的任何UUID都有效。 Android可能应该在他们的文档中包含它作为某种说明。