BlueCove、笔记本电脑和带蓝牙功能的 Android 平板电脑

Posted

技术标签:

【中文标题】BlueCove、笔记本电脑和带蓝牙功能的 Android 平板电脑【英文标题】:BlueCove, Laptop, and an Android tablet with Bluetooth 【发布时间】:2012-06-30 23:14:54 【问题描述】:

我正在尝试通过一个简单的应用程序来了解使用蓝牙的基础知识。我还想要一个笔记本电脑应用程序,这样我就可以简单地调试蓝牙通信。下面的代码是我尝试将笔记本电脑作为客户端(使用 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 设备查询完成。 服务查询开始。 来自:银河标签 服务搜索完成 - 代码:1 来自:WS1190 服务搜索完成 - 代码:4 蓝牙设备: 1. 2013E061D922(银河标签) 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();
    

【问题讨论】:

【参考方案1】:

这是一个老问题,所以我不知道是否有人还在寻找答案,但无论如何这里有一个...... :)。您询问的行返回 null,因为 url 为 null。试试这个 UUID 而不是代码中的那个:0000110100001000800000805f9b34fb

【讨论】:

【参考方案2】:

经过很长时间的更新 - 事实证明,蓝牙要求 UUID 采用“0000xxxx00001000800000805f9b34fb”的形式,这确实引出了一个问题,即为什么不只使用 16 位标识符而不是 128 位 UUID,但没关系。

我不知道 BlueCove 是否可以在我的笔记本电脑上使用它,但我最近在我的笔记本电脑上使用 Linux 和“Bluez”进行的实验表明,这种形式的任何 UUID 都可以使用。 Android 可能应该在他们的文档中包含它作为某种注释。

【讨论】:

以上是关于BlueCove、笔记本电脑和带蓝牙功能的 Android 平板电脑的主要内容,如果未能解决你的问题,请参考以下文章

PC端 java 开发蓝牙所遇到的问题

Java JSR-82实现(javax.Bluetooth。*) - 使用Bluecove

蓝牙耳机怎么连接不上电脑?

惠普笔记本win10系统蓝牙功能突然失效的解决办法

笔记本电脑蓝牙无法使用

蓝牙耳机怎么连接电脑