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 无法连接 的相关文章

  • numpy:大量线段/点的快速规则间隔平均值

    我沿着一维线有许多 约 100 万个 不规则间隔的点 P 这些标记线段 这样 如果点是 0 x a x b x c x d 则线段从 0 gt x a x a gt x b x b gt x c x c gt x d 等 我还有每个段的 y
  • NumPy 和 SciPy - .todense() 和 .toarray() 之间的区别

    我想知道使用是否有什么区别 优点 缺点 toarray vs todense 在稀疏 NumPy 数组上 例如 import scipy as sp import numpy as np sparse m sp sparse bsr mat
  • Android 为什么这不会抛出错误的线程异常?

    我的印象是视图只能从主线程操作 但是 为什么这不会崩溃 public class MainActivity extends Activity TextView tv Override protected void onCreate Bund
  • Pandas groupby apply 执行缓慢

    我正在开发一个涉及大量数据的程序 我正在使用 python pandas 模块来查找数据中的错误 这通常工作得非常快 然而 我当前编写的这段代码似乎比应有的速度慢得多 我正在寻找一种方法来加快速度 为了让你们正确测试它 我上传了一段相当大的
  • Android 4.4 Kitkat 自定义视图操作栏未填充整个宽度

    我试图拥有一个带有自定义视图的简单操作栏 但我得到以下结果 为了演示 我创建了一个带有黄色背景颜色的简单 xml 它应该占据整个宽度 这是 XML
  • 找不到数据库路径是不可能的

    我对 android 开发很陌生 现在我正在尝试通过扩展 SQLiteOpenHelper 的类创建数据库 我确信数据存储在我的 Nexus 7 我用来测试应用程序的设备 上的某个位置 但是我找不到数据库的路径 我四处寻找其他类似的问题 所
  • uri 警告中缺少端口:使用 Python OpenCV cv2.VideoCapture() 打开文件时出错

    当我尝试流式传输 ipcam 时 出现了如下所示的错误 tcp 000000000048c640 uri 中缺少端口 警告 打开文件时出错 build opencv modules videoio src cap ffmpeg impl h
  • 如何正确导入主代码和模块中同时使用的模块?

    假设我有一个主脚本 main py 它导入另一个 python 文件import coolfunctions另一个 import chores 现在 假设 Coolfunctions 也使用家务活中的东西 因此我声明import chore
  • 根据第三个变量更改散点图中的标记样式

    我正在处理多列字典 我想绘制两列 然后根据第三列和第四列更改标记的颜色和样式 我很难改变 pylab 散点图中的标记样式 我的方法适用于颜色 不幸的是不适用于标记样式 x 1 2 3 4 5 6 y 1 3 4 5 6 7 m k l l
  • 在seaborn中对箱线图x轴进行排序

    我的数据框round data看起来像这样 error username task path 0 0 02 n49vq14uhvy93i5uw33tf7s1ei07vngozrzlsr6q6cnh8w 39 png 1 0 10 n49vq
  • Android:分配内存失败

    我正在尝试创建一个具有 2047 mb 内存的模拟器 当我运行它时 我收到此错误 2011 02 22 14 24 14 Emulator 2011 02 22 14 24 14 Emulator This application has
  • 如何分析组合的 python 和 c 代码

    我有一个由多个 python 脚本组成的应用程序 其中一些脚本正在调用 C 代码 该应用程序现在的运行速度比以前慢得多 因此我想对其进行分析以查看问题所在 是否有工具 软件包或只是一种分析此类应用程序的方法 有一个工具可以将 python
  • 根据列索引重命名 Dataframe 列

    是否有内置函数可以按索引重命名 pandas 数据框 我以为我知道列标题的名称 但事实证明第二列中有一些十六进制字符 根据我接收数据的方式 我将来可能会在第 2 列中遇到这个问题 因此我无法将这些特定的十六进制字符硬编码到 datafram
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 更换壳牌管道[重复]

    这个问题在这里已经有答案了 在 subprocess 模块的 Python 2 7 文档中 我找到了以下片段 p1 Popen dmesg stdout PIPE p2 Popen grep hda stdin p1 stdout stdo
  • 在 Python 中访问 argparse 的参数值

    我正在尝试为我的程序设置一些简单的标志参数 但无法弄清楚如何访问它们 我有 argparser parser argparse ArgumentParser description Simple PostScript Interpreter
  • Python:无法使用 os.system() 打开文件

    我正在编写一个使用该应用程序的 Python 脚本pdftk http www pdflabs com tools pdftk the pdf toolkit 几次来执行某些操作 例如 我可以在 Windows 命令行 shell 中使用
  • JetPack Compose - 卡中行中的weight() 不起作用

    创建 Android 应用程序时 我将一些可组合项放在卡片的一行中 如下所示 但它没有按我的预期工作 我添加 weight 1f 的可组合项不再显示 data class Test val title String val text Str
  • Streamlabs API 405 响应代码

    我正在尝试使用Streamlabs API https dev streamlabs com Streamlabs API 使用 Oauth2 来创建应用程序 因此 首先我将使用我的应用程序的用户发送到一个授权链接 其中包含我的应用程序的客
  • ARM Chromebook 上的 Android 开发环境?

    我尝试了多次安装和使用安卓工作室 https developer android com studio index html on an ARM Chromebook C100P https archlinuxarm org platfor

随机推荐

  • 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 中运