【问题】

折腾:

【记录】编写Android中的蓝牙模块驱动和底层HART设备

期间,参考:

Bluetooth | Android Developers – ManagingAConnection

参考“Connecting as a client”中的:

tmp = device.createRfcommSocketToServiceRecord(MY_UUID);

遇到UUID不懂的问题。

然后随便去

http://www.guidgenerator.com/online-guid-generator.aspx

弄了个UUID:

e214d9ae-c3ba-4e25-abb5-299041353bc3

结果运行到:

            try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { }
return;
}

中的:

mmSocket.connect(); 

时就抛异常了。

即:

遇到createRfcommSocketToServiceRecord的UUID不懂,以及BluetoothSocket的connect失败。

【解决过程】

1.参考:

android – Why can’t HTC Droid running OTA 2.1 communicate with RFCOMM? – Stack Overflow

去试试:

Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
mBTSocket = (BluetoothSocket) m.invoke(device, 1);

结果看着就不太对啊。。就不继续试了。

2.参考:

Need Bluetooth UUID clarification – Google Groups

去试试:

00001101-0000-100­0-8000-00805F9B34FB

结果直接挂掉。

3.再去试试:

00000003-0000-100­0-8000-00805F9B34FB

也会挂掉。

4.后来再去搜:

android bluetooth connect fail

然后去参考:

android bluetooth can’t connect – Stack Overflow

和:

The Missing Manual: Android Bluetooth RFCOMM « Wires Are Obsolete

去试试,用代码:

 // Create a BroadcastReceiver for ACTION_FOUND
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
// BluetoothDevice deviceExtra = intent.getParcelableExtra("android.bluetooth.device.extra.DEVICE");
// Parcelable[] uuidExtra = intent.getParcelableArrayExtra("android.bluetooth.device.extra.UUID"); String action = intent.getAction();
// When discovery finds a device
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice btDev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
Parcelable[] btDevUuid = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);

调试得到的btDevUuid都是null的。

5.换用:

         if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object from the Intent
BluetoothDevice btDev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
//Parcelable[] btDevUuid = intent.getParcelableArrayExtra(BluetoothDevice.EXTRA_UUID);
UUID btDevUuid = intent.getParcelableExtra(BluetoothDevice.EXTRA_UUID);

还是不行。

6.参考:

Issue 15919 – android – Bluetooth connect fails under 2.3.3 for SPP devices using secure comms

中提到的:

BluetoothDevice | Android Developers

中提示的:

Hint: If you are connecting to a Bluetooth serial board then try using the well-known SPP UUID 00001101-0000-1000-8000-00805F9B34FB. However if you are connecting to an Android peer then please generate your own unique UUID.

所以再去试试这个UUID:

00001101-0000-1000-8000-00805F9B34FB

最终是可以了:

对应的相关代码为:

 private String mactekHartModemName;
private UUID mactekHartModemUuid; //void afterFoundBtHartModem(BluetoothDevice btDev, Parcelable[] btDevUuid){
void afterFoundBtHartModem(BluetoothDevice btDev, UUID btDevUuid){
if(null != btDevUuid){ } //mactekHartModemName = btDev.getName(); //"MACTekViator75FE"
//mactekHartModemUuid = UUID.fromString(mactekHartModemName); String uuidValue;
//http://www.guidgenerator.com/online-guid-generator.aspx
//uuidValue = "e214d9ae-c3ba-4e25-abb5-299041353bc3"; //https://groups.google.com/forum/#!topic/android-developers/vyTEJOXELos
//uuidValue = "00001101-0000-100­0-8000-00805F9B34FB";
//uuidValue = "00000003-0000-100­0-8000-00805F9B34FB";
uuidValue = "00001101-0000-1000-8000-00805F9B34FB"; mactekHartModemUuid = UUID.fromString(uuidValue); ConnectThread connectBtThread = new ConnectThread(btDev);
connectBtThread.start();
} private class ConnectThread extends Thread {
private final BluetoothSocket mmSocket;
private final BluetoothDevice mmDevice; public ConnectThread(BluetoothDevice device) {
// Use a temporary object that is later assigned to mmSocket,
// because mmSocket is final
BluetoothSocket tmp = null;
mmDevice = device; // Get a BluetoothSocket to connect with the given BluetoothDevice
try {
// MY_UUID is the app's UUID string, also used by the server code
tmp = device.createRfcommSocketToServiceRecord(mactekHartModemUuid);//00001101-0000-1000-8000-00805F9B34FB } catch (IOException e) { }
mmSocket = tmp;
} public void run() {
// Cancel discovery because it will slow down the connection
mBluetoothAdapter.cancelDiscovery(); try {
// Connect the device through the socket. This will block
// until it succeeds or throws an exception
mmSocket.connect();
} catch (IOException connectException) {
// Unable to connect; close the socket and get out
try {
mmSocket.close();
} catch (IOException closeException) { }
return;
} // Do work to manage the connection (in a separate thread)
manageConnectedSocket(mmSocket);
} /** Will cancel an in-progress connection, and close the socket */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) { }
}
}

【总结】

此处,必须使用Android的SSP(协议栈默认)的UUID:

00001101-0000-1000-8000-00805F9B34FB

才能正常和外部的,也是SSP串口的蓝牙设备去连接。

Android中连接蓝牙设备时遇到createRfcommSocketToServiceRecord的UUID问题和BluetoothSocket的connect失败的更多相关文章

  1. Android中打包JAR时获取资源ID的方法

    前言:在打包android源码的时,有的时候源码中包含了资源文件,但是jar包中不包含,所以会异常,解决的方案就是不用系统的提供的id名,而是直接 获取id,如反射. 1.系统提供的方法: /** * ...

  2. Android中Activity运行时屏幕方向与显示方式详解

    现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...

  3. Android中使用getDrawable时提示:Call requires API level 21(current min is 15)

    场景 在通过getDrawable方法获取照片资源时提示: Call requires API level 21(current min is 15) 注: 博客: https://blog.csdn ...

  4. Android中ListView滚动时上下边界的那一抹色彩

    后台实现: if (Integer.parseInt(Build.VERSION.SDK) >= 9) { listview.setOverScrollMode(View.OVER_SCROLL ...

  5. Android中Activity切换时共享视图元素的切换动画(5.0以上)

    同一时候公布在我的博客 点此进入 背景 说来这个的背景很easy,常常在使用图片列表的时候就会想,假设"列表中的图片放大到整个屏幕"作为 Activity 的补间动画.就很完美了. ...

  6. Android中decode JPG时建议使用inPreferQualityOverSpeed

    在BitmapFactory.decodeBitmap方法中,参数BitmapFactory.Options里有一项是inPreferQualityOverSpeed:设为true的话,画质更好,加载 ...

  7. vue项目中连接MySQL时,报错ER_ACCESS_DENIED_ERROR: Access denied for user 'root'@'localhost' (using password:YES)

    一.前言 我们前端很多时候在写vue项目的时候,会把后端的数据拿到本地来跑,在连接MySQL数据库的时候,可能出现一些问题,如: ER_ACCESS_DENIED_ERROR: Access deni ...

  8. android中 检查网络连接状态的变化,无网络时跳转到设置界面

    1:在AndroidManifest.xml中加一个声明 <receiver android:name="NetCheckReceiver">    <inten ...

  9. 在android中配置 slf4j + log4j 日志记录框架

    需求: 在项目开发中,需要记录 操作日志 .起初自己写了个简单的日志记录文本写入到文本的方法,后来随着项目的膨胀,需要考虑更多的操作,开始考虑性能问题. 实现: 考虑使用 slf4j + log4j ...

随机推荐

  1. Intellij IDEA 常用 设置 及 快捷键 (持续更新)

    Transparent native-to-ascii conversion以下设置都可以通过 设置中的搜索框 进行关键字搜索 0, 打开Project 设置 Command + ; 1, 打开Mod ...

  2. Nginx简单操作

    Nginx简单操作 平滑重启:读取配置文件,正确后启动新nginx,关闭旧服务进程 # kill HUP nginx.pid # /usr/sbin/nginx -c /etc/nginx/nginx ...

  3. 织梦dedecms|文章模型内容页标签

    文章标题:{dede:field.title/}文章链接:{dede:field name='arcurl'/}发布时间:{dede:field.pubdate function="MyDa ...

  4. Nginx 之一:编译安装nginx 1.8.1 及配置

    一:基介绍 官网地址www.nginx.org,nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间 ...

  5. js中的一元运算符

    一元运算符只有一个参数,即要操作的对象或值.它们是 ECMAScript 中最简单的运算符. delete delete 运算符删除对以前定义的对象属性或方法的引用.例如: var o = new O ...

  6. 数据结构——链表(linkedlist)

    基本分类: 1.单向链表 2.带尾指针的单向链表 3.双向循环链表 以下分类进行说明 1.单向链表 基本元素:*front //头节点 *next //下一节点 声明:node<T>*p; ...

  7. 国外稳定的免费PHP空间byethost.com

    byethost.com是一个老牌的免费空间商,从2006年起就開始提供免费空间了,其免费服务很稳定(看完下文你就知道有多稳定了). 提供5.5G的免费空间,200G的月流量,能够绑定50个域名,也能 ...

  8. HDU 2570:迷瘴

    迷瘴 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. [转]组合数取模 Lucas定理

    对于C(n, m) mod p.这里的n,m,p(p为素数)都很大的情况.就不能再用C(n, m) = C(n - 1,m) + C(n - 1, m - 1)的公式递推了. 这里用到Lusac定理 ...

  10. hdu3483之二项式展开+矩阵快速幂

    A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...