android.bluetooth.BluetoothSocket 无法连接

2024-02-18

我已经尝试了其他评论中的所有建议但无济于事,我希望有人可以帮助我。我已经为这个问题苦苦挣扎了三天了。我非常确定我的 UUID 是正确的,并且我知道蓝牙访问已在清单中启用。

我正在尝试将我的 Android 应用程序连接到在 Fedora 中运行的 python 服务器。它间歇性地起作用,现在根本不起作用。我收到的 android 异常通常是这样的。这些异常是在 btSocket.connect(); 时抛出的。在下面附加的代码中执行。

12-09 05:08:42.331: ERROR/BluetoothService(676): java.io.IOException: Service discovery failed

or

12-09 05:27:00.757: ERROR/BluetoothService(729): java.io.IOException: Service discovery failed

这是我的 Android 蓝牙类,应该可以处理所有事情。当主应用程序类收到套接字已连接的消息时启动该线程。我的蓝牙课程基于http://www.anddev.org/viewtopic.php?p=35487#35487 http://www.anddev.org/viewtopic.php?p=35487#35487.

package spin.halo;

import java.io.*;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.UUID;

import android.bluetooth.*;
import android.os.Handler;
import android.util.Log;

public class BluetoothService extends Thread{

    private static final String TAG = "BluetoothService";
    private static final boolean D = true;
    private BluetoothAdapter mBluetoothAdapter = null;
    private BluetoothSocket btSocket = null;
    private OutputStream outStream = null;
    private InputStream inStream = null;
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");

    private static String address;

    private Handler appHandler;

    public BluetoothService(Handler h) {
        if (D)
            Log.e(TAG, "+++ ON CREATE +++");

        appHandler = h;

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            Log.e(TAG, "NO BT ADAPTER!");
            return;
        }

        if (!mBluetoothAdapter.isEnabled()) {
            Log.e(TAG, "Bluetooth is not enabled!");
            return;
        }

        if (D)
            Log.e(TAG, "+++ DONE IN ON CREATE, GOT LOCAL BT ADAPTER +++");
    }

    public void connectToServer() {
        connectToServer("60:33:4B:25:0D:37");
    }

    public void connectToServer(String serverMacAddress) {

        address = serverMacAddress;
        //
        if (D) {
            Log.e(TAG, "+ ABOUT TO ATTEMPT CLIENT CONNECT +");
        }

        BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        Log.v(TAG, "REMOTE DEVICE: " + device.toString());

        try {
            btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
            Log.v(TAG, "SOCKET: " + btSocket.toString());
        } catch (Exception e) {
            Log.e(TAG, "ON RESUME: Socket creation failed.", e);
        }

        /* Discovery may be going on, e.g., if you're running a
         'scan for devices' search from your handset's Bluetooth
         settings, so we call cancelDiscovery(). It doesn't hurt
         to call it, but it might hurt not to... discovery is a
         heavyweight process; you don't want it in progress when
         a connection attempt is made.*/
        mBluetoothAdapter.cancelDiscovery();

        // Blocking connect, for a simple client nothing else can
        // happen until a successful connection is made, so we
        // don't care if it blocks.

        try {
            btSocket.connect();
            Log.e(TAG, "ON RESUME: BT connection established, data transfer link open.");
            appHandler.sendMessage(appHandler.obtainMessage(ValidationApp.BT_CONNECTION_MADE, ""));
        } catch (IOException e) {
            try {
                Log.e(TAG, "ON RESUME: Could not connect", e);
                btSocket.close();
            } catch (IOException e2) {
                Log.e(TAG, "ON RESUME: Unable to close socket during connection failure", e2);
            }
        }

        // Create output stream
        try {
            outStream = btSocket.getOutputStream();
        } catch (IOException e) {
            Log.e(TAG, "ON RESUME: Output stream creation failed.", e);
        }

        // Create input stream
        try {
            inStream = btSocket.getInputStream();
        } catch (IOException e) {
            Log.e(TAG, "Input stream creation failed.", e);
        }
    }

    public void write(String message) {
        if(message.length() > 0) {
            byte[] msgBuffer = message.getBytes();
            try {
                outStream.write(msgBuffer);
            } catch (IOException e) {
                Log.e(TAG, "ON RESUME: Exception during write.", e);
            }
        }
    }

    public void run() {
        LineNumberReader mLineReader = new LineNumberReader(new InputStreamReader(inStream));
        while(true) {
            try {
                String message = mLineReader.readLine();

                if(D) {Log.v(TAG, "Bluetooth says: " + message);}
                Log.v(TAG, appHandler.obtainMessage(ValidationApp.BT_MESSAGE, message).toString());
                appHandler.sendMessage(appHandler.obtainMessage(ValidationApp.BT_MESSAGE, message));
            } catch (IOException e) {
                Log.e(TAG, "startListen: ", e);
            }
        }
    }
}

我的 python 代码的关键部分如下。我对这段代码很有信心。

# pybluez library
import bluetooth

server_socket = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
client_sockets = []

server_socket.bind(("",bluetooth.PORT_ANY))
port = server_socket.getsockname()[1]
uuid = "00001101-0000-1000-8000-00805F9B34FB"

print "Listening for devices..."

# advertise service
server_socket.listen(1)
bluetooth.advertise_service( server_socket, "Validation Host",
    service_id = uuid,
    service_classes = [ uuid, bluetooth.SERIAL_PORT_CLASS ],
    profiles = [ bluetooth.SERIAL_PORT_PROFILE ],
)

# accept incoming connections
client_sock, client_info = server_socket.accept()
client_sockets.append(client_sock)
print "Accepted Connection from ", client_info

谢谢参观。


您的代码看起来总体不错,我假设您只是从一些示例中复制并粘贴它。

部分 Android 手机(例如 HTCdesire)存在 bug,导致 device.createRfcommSocketToServiceRecord 方法失​​败。我建议采用以下方法:

1)尝试使用提供的Python脚本在两台Linux计算机之间聊天http://www.radekdostal.com http://www.radekdostal.com(你知道在哪) 这样您就可以验证您的 Linux 设置是否正常工作。

2) 尝试启动从计算机到 Android 的连接(使用 android-bluetooth-chat-c​​lient-python) 请注意,默认的 BluetoothChat 演示只能在第一次尝试时接受连接。

3) 尝试从 Android 手机连接到 Linux 计算机,但使用以下代码手动指定 RFCOMM 通道号

// BUGBUG: Following code is not properly implemented on HTC DESIRE
// mSocket =                  device.createRfcommSocketToServiceRecord(UUID.fromString("6a462dc0-703a-4bf3-a80e-a473a6332c64"));
// WORKAROUND: Connecting directly to RFCOMM channel 1
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { int.class });
mSocket = (BluetoothSocket) m.invoke(device, Integer.valueOf(1)); // 1==RFCOMM channel code 

您需要使用以下命令找出您的 RFCOMM 通道号:

# sdptool browse local
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android.bluetooth.BluetoothSocket 无法连接 的相关文章

随机推荐

  • Ruby 有哪些 Python 没有的功能,反之亦然?

    Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 关于 Python 与 Ruby 的讨论有很多 我都发现它们完全没有帮助 因为它们都围绕着为什
  • 如何使用 Django / Python 从 RESTful Web 服务中使用 XML?

    我应该使用 PyXML 还是标准库中的内容 ElementTree 作为标准 Python 库的一部分提供 ElementTree 是纯 python 而 cElementTree 是更快的 C 实现 Try to use the C im
  • 如何在 WiX 片段中获得编辑注册表 CLSID 的提升权限

    我正在尝试将 Windows 桌面搜索设置为使用系统默认过滤器 nlhtml dll 之外的不同 html 过滤器 当我查找 PersistentHandler 时 HKEY LOCAL MACHINE SOFTWARE Classes h
  • ASP.NET Core MVC 视图组件

    在 ASP NET Core MVC 以前称为 MVC 6 中 有一个称为视图组件的新功能区域 它似乎是部分视图的更好替代方案 我看过以下内容查看组件示例 http www asp net vnext overview aspnet vne
  • 在 AppDelegate 之外使用 NIB 创建 UITabBarController?

    对于 iOS 编程来说 我还是个新手 尽管进行了大量的研究 但我还是遇到了另一个障碍 我想要实现的 我想要一个当我从主 UI 导航时加载的 UITabBarController 我还想使用 NIB 来定义其属性 我能找到的所有示例都将 UI
  • Gstreamer视频输出位置跟踪和寻找

    我正在使用 gstreamer gst launch 捕获相机并将流保存为视频和图像帧 管道的问题是 当管道完成 通过中断 视频记录时 它不能支持位置跟踪和查找 因此 视频在 vlc 播放器中播放 长度未知 我认为问题出在管道本身 如何实现
  • 支持内容脚本中的所有 google 域

    我正在制作一个内容脚本 对谷歌结果网页执行某些操作 下面的行在manifest json无效 匹配 https www google 由于清单 json 中的上述行而导致的错误是 content scripts 0 matches 0 的值
  • 在EJB环境中是否有一些行为类似于.wait()和.notify()的东西?

    我知道我不能修改 EJB 容器中的线程 因此我不知道如何在 EJB 环境中以正确的方式执行以下操作 涉及的有 无状态会话 Bean 客户端 无状态会话 Bean 服务器 消息队列 队列 消息驱动 Bean Mdb 处理来自 队列 的消息 n
  • 如何将资源编译到我的应用程序中并访问它们?

    我怎样才能制作一个executable包含 DLL 和图像资源文件的软件包 那么如何在运行时从可执行文件中提取它们呢 使用 IDE 的选项 1 Delphi 2007 或更高版本 您可以单击 项目 菜单 然后选择 资源 您可以将任何文件加载
  • CodeMirror - 从编辑器外部获取 linting 结果

    我正在使用非常棒的 CodeMirror 库 我正在实例化的代码编辑器是表单的一部分 因此我想使用 linting 进行基本检查 以查看用户的输入是否有效 除非代码没问题 否则我不想处理表单 所以问题是 CodeMirror 编辑器实例上是
  • GLKit 和向纹理添加色调

    我在使用 GLKit 对 PNG 图像着色时遇到问题 我有一个白色的 PNG 图像 我将其加载到应用程序中 然后用它来创建纹理 UIImage image UIImage imageNamed brushImage NSError erro
  • 角度错误:StaticInjectorError(平台:核心)[e -> t]:

    当我构建APK时 prod我收到以下错误 ERROR Error StaticInjectorError e gt t StaticInjectorError Platform core e gt t NullInjectorError N
  • 有没有办法限制 javascript 性能来模拟缓慢的客户端

    我正在开发一个使用 jQuery 的网站 并且有大量使用 javascript 运行的网站 document ready 在我的开发机器上 一切运行良好 但它是一台非常强大的机器 我收到过一些使用旧硬件的人的报告 这些硬件的行为看起来很奇怪
  • 包装类的声明[重复]

    这个问题在这里已经有答案了 这个问题是一个问题的延续如何使用 来初始化字符串 https stackoverflow com questions 17489250 how can a string be initialized using
  • 在什么类型的循环中最好使用 CUDA 中的 #pragma unroll 指令?

    在 CUDA 中 可以使用以下方法展开循环 pragmaunroll 指令通过增加指令级并行性来提高性能 这 pragma可以选择后跟一个数字 指定必须展开循环的次数 不幸的是 文档没有给出何时应使用该指令的具体指示 由于编译器已经展开了具
  • Google 表格中的 ArrayFormula 和“AND”公式

    在 Google Sheets 中 当将 ArrayFormula 与 AND 公式一起使用时 我没有得到应有的结果 A B 6 7 In C1我把公式写为 and A1 gt 5 B1 gt 6 然后我得到True 如果在 D1 中我输入
  • 为什么在 Web api 方法中返回接口时,我会得到带有接口值的继承类的值?

    我有一个从 Interface 继承的类 并且我从我的 web api get methed 返回接口 问题是我将继承类的值作为 json 字符串获取 这是界面 public interface IFoo string A get set
  • ASIHTTPRequest 可以重试吗?

    有没有办法重试 ASIHTTPRequest 我在 REST 服务中使用自定义身份验证而不是基本 HTTP 身份验证 并且我想在会话过期时重试请求 对请求第二次调用 startAsynchronous 会导致异常 我想做这样的事情 requ
  • keypress 和 keydown 上的 String.fromCharCode 返回错误的字符

    我试图捕获在屏幕上显示之前插入的字符以验证屏幕 看我的代码 this on keypress keydown function e var t e target var k e which e keyCode var c String fr
  • android.bluetooth.BluetoothSocket 无法连接

    我已经尝试了其他评论中的所有建议但无济于事 我希望有人可以帮助我 我已经为这个问题苦苦挣扎了三天了 我非常确定我的 UUID 是正确的 并且我知道蓝牙访问已在清单中启用 我正在尝试将我的 Android 应用程序连接到在 Fedora 中运