Android下的BLE编程遇到的一些BUG

 1.连接过程中出现BlueToothGatt failed to register callback

    BLE的连接过程是搜索→连接→发现服务。在连接的过程中会碰到BlueToothGatt Failed to register callback的问题。目前该问题的解决方式如下:

private void BleConnect(BluetoothDevice device) {
	mBleDevice = device;
	mBleMediator.stopScan(mBleScanCallback);
		
	mHandler.postDelayed(new Runnable() {

		@Override
		public void run() {
			mBleMediator.connectBle(BleActivity.this, true, mBleDevice);			
		}
	}, 50);
}
   即在BLE搜索到设备之后暂停一段,然后再进行连接,目前该问题只在三星手机Android 4.3的固件中出现。

2.接收多条数据出现数据丢失

    通过回调函数onCharacteristicChanged()或者onCharacteristicWrite()接收数据时,如果同时接收多条数据,并且设备端发送的数据间隔过短,接收函数有可能出现数据的丢失。个人感觉是回调函数的线程同步问题,解决方式如下。

/**
 * 触发远程characteristics通知结果时回调
 * 
 * @param bleGatt 与characteristics相关联的GATT客户端连接
 * @param bleChrc 通知更新结果的characteristics
 */
public void onCharacteristicChanged(BluetoothGatt bleGatt, BluetoothGattCharacteristic bleChrc) {

	byte[] mByte = bleChrc.getValue();
	StringBuilder mStrBuilder = new StringBuilder(mByte.length);
				
	/** 逐byte转换 */
	for (byte mByteChar : mByte) {
		mStrBuilder.append(String.format("%02x", mByteChar));
	} /** end of for (byte mByteChar : mByte) */
					
	try {
		Thread.sleep(50);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
}

       在接收数据之后线程Sleep()一段时间,可以提高数据接收的可靠性。

    关于BLE数据传输的可靠性。蓝牙传输本身的可靠性较高,在4.0规范中其链路层核心协议L2CAP使用了CRC校验,用以保证数据传输的可靠性,如果CRC校验出错,则直接丢弃数据。但是在规范中并没有强制规定丢包时的重传,如果将BLE使用在对传输可靠性要求较高的场合,还需在应用层自己封装一层传输协议

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux BLE编程是使用Linux系统进行BLE(蓝牙低功耗)设备开发的过程。BLE是一种低耗电量的蓝牙技术,用于与智能设备或传感器通信。Linux系统通常被用于处理服务器和嵌入式设备,因此在这些领域进行BLE编程是很有必要的。 在Linux平台下,BLE编程可以方便地使用Bluez库进行,它是Linux系统下蓝牙协议栈的核心组件。Bluez库提供了一组API,允许开发人员使用C,Python,Java等编程语言进行BLE设备编程。开发者可以通过Bluez库实现广告,扫描,连接和数据传输等蓝牙核心操作。 此外,在开发BLE应用程序时,还需要使用功能强大的开发工具链和蓝牙相关设备的支持。例如,可以使用rfkill命令用于关闭或打开蓝牙设备,使用hcitool命令进行设备扫描和连接,使用gatttool命令进行数据传输和配置特征值。 总之,Linux BLE编程是一个相对复杂的任务,需要具备深入了解和专业的技能,但是它也提供了丰富的工具和API,可以极大地简化和加速开发过程。对于那些希望在嵌入式,物联网和智能设备领域进行开发的人来说,学习Linux BLE编程是很有价值的。 ### 回答2: BLE是蓝牙低功耗技术,是一种广泛应用于各种智能设备中的无线通信技术。在Linux平台上进行BLE编程的主要工具是BlueZ,它是一个蓝牙协议栈和工具集,用于支持蓝牙设备连接、通信和管理。本文将介绍如何在Linux上使用BlueZ进行BLE编程。 首先,为了使用BlueZ进行BLE编程,需要安装BlueZ库。在Ubuntu或Debian上,可以通过命令行运行以下命令安装BlueZ: sudo apt-get install libbluetooth-dev 安装后,开发人员可以开始在Linux平台上开发BLE应用程序。 在BlueZ中,BLE编程涉及使用软件包bluez-libs和bluez-utils来开发和管理蓝牙设备。bluez-libs库包括用于访问蓝牙设备、服务、特征和描述符的API。bluez-utils解决方案提供了命令行工具,可以在Linux上与蓝牙设备进行通信。 下面介绍一个简单的BLE编程示例,该程序通过使用BlueZ API来连接和读取BLE设备上的特征。此示例涉及使用BlueZ库中的GATT API,并在Python中实现。 以下是程序的步骤: 1.首先,程序需要搜索BLE设备,获取其MAC地址。程序使用命令来扫描BLE设备连接: sudo hcitool lescan 2.使用命令找到设备MAC地址,可以使用BlueZ API进行连接,以下是连接设备的Python代码示例: import pybluez import sys import bluetooth def connectToGatt(): print "Searching for GATT server..." nearby_devices = bluetooth.discover_devices(duration=10, lookup_names=True, flush_cache=True, lookup_class=False) addr = None for bdaddr, name in nearby_devices: if name == "MyDevice": addr = bdaddr break if addr is None: print "Could not find specified device nearby" return print "Device found! MAC address is ", addr services = pybluez.find_service(address=addr) if len(services) > 0: print "GATT services found:" for service in services: print " Service Name: %s" % service["name"] print " Service Provider: %s" % service["provider"] print " Service Protocol: %s" % service["protocol"] print " Service Description: %s" % service["description"] print " Service Provided: %s" % service["provided"] print " Service Required: %s" % service["required"] print " Service Characteristics:" for characteristic in service["characteristics"]: print " Characteristic Name: %s" % characteristic["name"] print " Characteristic Description: %s" % characteristic["description"] print " Characteristic Type: %s" % characteristic["type"] print " Characteristic Value: %s" % characteristic["value"] else: print "No GATT services found for the specified device" if __name__ == '__main__': connectToGatt() 以上代码是一个简单的Python代码示例,使用BlueZ API来搜索和连接到指定的BLE设备,并显示设备上可用的服务和特征。 总之,在Linux操作系统上进行BLE编程需要了解BlueZ库,并熟悉BLE设备的基本概念和编程方法。BlueZ API提供了许多用于连接、读取和管理BLE设备的方法和函数,开发人员可以使用这些API来开发自己的BLE应用程序。以上代码示例是一个简单的示例,开发人员可以根据自己的需求进行修改和扩展。 ### 回答3: Linux BLE编程指的是在Linux系统下进行蓝牙低功耗(BLE)设备的开发编程BLE是一种新型的蓝牙技术,拥有低功耗、低成本、小型化等优点,因此在物联网应用中得到了广泛应用。 在进行Linux BLE编程时,常用的开发工具包括BlueZ和Gattlib。BlueZ是Linux系统下最常用的蓝牙协议栈,提供了一系列的命令行工具和API接口,可用于扫描、连接、读写蓝牙设备的属性等操作。Gattlib是一个使用C语言编写的蓝牙低功耗开发库,用于在Linux系统下进行BLE设备的开发工作。 进行BLE编程时,需要了解BLE协议栈的基本架构和相关概念。BLE协议栈分为三个层次:物理层、链接层和传输层。在物理层,BLE使用了2.4GHz的ISM频段,通过GFSK调制来传输信息。在链接层,BLE使用了广播和连接两种方式来与设备通信,其中广播方式用于快速发现设备,连接方式则用于稳定的通信。在传输层,BLE使用了GATT协议(通用属性协议框架),用于描述BLE设备的属性和特征。 在进行BLE开发时,需要了解BLE设备的UUID和属性。UUID(通用唯一标识符)是BLE设备中的唯一标识符,用于区分不同的服务和特征。属性是BLE设备中的某个具体数据,由UUID、值和属性标志组成。BLE设备的属性由服务、特征和描述符三种组成,服务用于描述设备提供的服务,特征则表示服务中不同的部分,描述符则用于描述特征的行为和属性。 总之,进行Linux BLE编程需要了解BLE协议栈的基本知识,熟练掌握Bluez和Gattlib等开发工具,理解BLE设备的UUID和属性等核心概念,才能进行BLE设备的开发和编程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值