gpt4 book ai didi

android - 如何将 Android 应用程序正确连接到支持蓝牙的 Arduino 微 Controller 上的 RFCOMM socket ?

转载 作者:IT老高 更新时间:2023-10-28 22:15:22 25 4
gpt4 key购买 nike

我正在与我大学的一些学生一起开发一个简单的蓝牙 Android 应用程序,该应用程序将用于与连接有蓝牙模块的 Arduino 微 Controller 进行串行通信 (RFCOMM)。

据我所知,我正在为 RFCOMM/SPP 00001101-0000-1000-8000-00805F9B34FB 使用正确的蓝牙地址和 UUID。 .我的应用程序启动一个线程,尝试使用 BluetoothDevice.createRfcommSocketToServiceRecord(UUID) 连接到设备.但出于某种原因,我们没有看到成功的连接。调用 connect() 时操作总是失败在由此产生的 BluetoothSocket来自上面的调用。

在我的 HTC Evo 上测试时, 运行 HTC 的变体 Gingerbread , connect()调用通常会失败并显示异常消息“无法启动服务发现”。看了一些资料,发现有人说HTC在蓝牙栈中对RFCOMM的实现有bug,于是我们决定在另一个同学的Samsung Galaxy S上试一试。 .第一次运行代码时,一切正常。 Arduino 微 Controller 连接到一个小型电动机,该电动机开始按预期工作。我没有排除问题是否出在微 Controller 方面。

随后在三星设备上使用该应用程序失败,现在显示一条消息“服务发现失败”。在我看来,可能是设备端的蓝牙模块认为RFCOMM服务还在使用。但是我们重新启动了微 Controller ,仍然看到了相同的结果。

我刚刚列出了线程代码,因为它是真正相关的。我已经读过使用反射来解决这些问题的非常常见的解决方法(hack)。我对它的尝试也失败了,但在那里并被注释掉了。希望有人能在这里引导我朝着正确的方向前进。另请注意,我确实在 list 中启用了必要的权限,并且在这两种情况下,设备都使用 Android 的用户界面成功配对到 Arduino。

private class ClientThread extends Thread {

private String _btAddress;

/**
* A handle to the local device's Bluetooth adapter hardware.
*/
private BluetoothAdapter _btAdapter = BluetoothAdapter.getDefaultAdapter();

/**
* A handle to the remote device Bluetooth context.
*/
private BluetoothDevice _btRemoteDevice;

/**
* A handle to the Bluetooth serial socket.
*/
private BluetoothSocket _btSocket;

/**
* Constructor.
* @param btAddress The BluetoothHardware address.
*/
public ClientThread(String btAddress)
{
_btAddress = btAddress;
}

public void run()
{
// Retrieves the device identified by the _btAddress property.
_btRemoteDevice = retrieveDevice();
if ( _btRemoteDevice == null )
sendUIMessage( CONNECTION_BT_DEVICE_NOT_BONDED );
else
sendBeacon();
}

/**
* Retrieves the device associated with this client thread.
* @return
*/
private BluetoothDevice retrieveDevice()
{
Set<BluetoothDevice> btDevices = _btAdapter.getBondedDevices();
for (BluetoothDevice btd : btDevices)
{
String addr = btd.getAddress();
String name = btd.getName();
if ( addr.equalsIgnoreCase(_btAddress) )
return btd;
}
return null;
}

/**
* Sends the beacon to the Bluetooth device.
*/
private void sendBeacon()
{
// Holds the output stream of the BluetoothDevice.
OutputStream os = null;

try
{
_btSocket = _btRemoteDevice.createRfcommSocketToServiceRecord( UUID.fromString( "00001101-0000-1000-8000-00805F9B34FB" ) );

//Method m = _btRemoteDevice.getClass().getMethod("createInsecureRfcommSocket", new Class[] {int.class});
//_btSocket = (BluetoothSocket) m.invoke(_btRemoteDevice, 1);
_btSocket.connect();
os = _btSocket.getOutputStream();
os.write('L');
}
catch (IOException e)
{
String message = e.getMessage();
e.printStackTrace();
sendUIMessage(CONNECTION_FAILURE_IO);
}
catch (Exception e)
{
e.printStackTrace();
sendUIMessage(CONNECTION_FAILURE_UNKNOWN);
}
finally
{
try
{
if (_btSocket != null)
_btSocket.close();
}
catch (IOException e)
{
System.out.println("Failed closing Bluetooth output stream.");
e.printStackTrace();
}
}
}
}

编辑:
蓝牙模块是 MDFLY RF-BT0417CB。我知道在 arduino 上运行的代码并不多,只是使用 Serial.available() 和 Serial.read() 与 BT 模块通信。但是,我有一条可能更有用的新信息。当我的应用程序安装在三星设备上时,它只运行了一次,但在随后的试验中失败了。不久前,与我一起工作的另一个学生使用 Android App Inventor(一个拖放 GUI 工具,也可以创建逻辑工作工件)来创建一个简单的应用程序,该应用程序连接相同的 BT 模块/arduino 板,该应用程序有效。他说安装我的应用程序时,另一个应用程序无法连接到 BT 模块,这让我相信系统一直认为资源已分配给我的应用程序。他卸载我的应用程序后,另一个能够连接。他没有其他应用程序的源代码,但我将自己尝试 App Inventor,看看它生成的源代码是否有任何不同。据我所知,我遵守了 Android 文档中定义的大多数标准实践,所以 BT 模块可能有些奇怪,或者 arduino 代码不一定以编程方式控制 BT 模块。

另一个编辑:
我不是蓝牙专家,但我们能够找到解决方法。正如一些人所知道的,有一堆公共(public)蓝牙设备 API,在编译时隐藏,但在运行时使用反射合法公开。其中之一是 createRfCommSocket(int)。这个API是隐藏的,不在官方文档中,但你可以阅读 here .我还没有尝试使用文档支持的 API,但问题似乎是手机和串行板之间的并发问题。手机发送了一条消息,这当然是一个阻塞调用,当它从那里返回时,关闭了连接。串行板上的屏蔽也会关闭连接,因此数据对 arduino 应用程序不可用。我们在 android 端 Debug模式下见证成功通信时意识到这一点,但在 Release模式下失败。在 android 端添加半秒延迟,在 BluetoothSocket 的传输和关闭之间修复了该问题。我不能说这个问题是否归因于 arduino 代码,因为我对架构不是很熟悉,但我们作为学生缺乏经验,所以我不会感到惊讶。

最佳答案

Communication Between Android And Arduino With Bluetooth(1)

我想这会对你有所帮助。
你能提供一些细节吗?我看过一个链接,你也可以看到这个。让我知道这是否有帮助?
How to create Insecure RFCOMM Socket in Android?

关于android - 如何将 Android 应用程序正确连接到支持蓝牙的 Arduino 微 Controller 上的 RFCOMM socket ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7986508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com