想让android app读到keyfob三轴加速度的值,但现在在手机端添加readCharacteristic的代码,只能获得一个最上面一个characteristic的值,即:把下面的换一下顺序,Y在最上,那只能读到Y轴的值,怎么才能同时读到X、Y、Z这三个characteristic的值?
mBluetoothLeService.readCharacteristic(mAccelXCharacteristic);
mBluetoothLeService.readCharacteristic(mAccelYCharacteristic);
mBluetoothLeService.readCharacteristic(mAccelZCharacteristic);
另外,我有尝试让程序获得这个加速度service的所有characteristic的值,有时候能得到ffa1和ffa3的值,又时候仅能获得ffa3的值,这又是怎么回事呢?
Yan:
Ss,
恩,,,
第一,你试过用TI 的 BLE Device Monitor这个PC 工具能读到这三轴的数据吗?看看服务是否都正常。
第二,我建议你试一下等收到比如说X 的Android的 onCharacteristicsRead ()之后,再发送Y 的读请求,这样试试看行不行。
Ss Zh:
回复 Yan:
Yan,
用BTool可以同时读到三轴值,服务应该是没问题的
对于建议二,我试了下,除非在两个之间加一条等待语句Thread.sleep(2000);才可以,而且时间小了,像1s也还是不行,但是这样的话就不是同一时刻的xyz值了呀
以下是我试着改的BluetoothLeService里的broadcastUpdate,目的是得到accelerometer这个server所有characteristic的value,放在字符串myStr里,可是假如我在DeviceControlActivity里给的语句是mBluetoothLeService.readCharacteristic(mAccelXCharacteristic);,那么下面这个循环虽然能得到5个characteristic,但只能得到x的value,其他的都是null,这是为什么呢?
private void broadcastUpdate(final String action,final BluetoothGattCharacteristic charc){final Intent intent = new Intent(action);List<BluetoothGattCharacteristic> characteristics = charc.getService().getCharacteristics();StringBuilder myStr = new StringBuilder();//writes the data formatted in HEX.for(BluetoothGattCharacteristic characteristic:characteristics){final byte[] data = characteristic.getValue();if (data != null && data.length > 0) {final StringBuilder stringBuilder = new StringBuilder(data.length);for(byte byteChar : data)stringBuilder.append(String.format("%02X ", byteChar));String s = characteristic.getUuid().toString();myStr.append(s.substring(6, 8) + ":" + stringBuilder.toString());}}intent.putExtra(EXTRA_DATA, myStr.toString());sendBroadcast(intent);}
Ss Zh:
回复 Yan:
Yan,
我现在还有几个问题:
1.我每次向keyfob写入数据的时候,第一次写入成功后八成会断开连接,然后还得手动重连
2.我试了下每隔一定时间获取x轴加速度值,我发现数据更新特别慢,1.5秒到2秒才能更新一次,这是连接的问题还是android程序的问题?
3.在获取xyz三轴数据的时候,我发现程序run的模式下只能获取x轴的,而debug模式下设几个断点,就可以得到三轴的数据,这又是为什么呢?我感觉应该跟第二个问题有些关系,是不是什么被阻塞了?
Yan:
回复 Ss Zh:
Ss,
关于xyz 三轴,我有个问题,你为什么要手机去读keyfob呢?
keyfob代码里面是一次性读取xyz 三轴数据,然后以notification的方式主动发送给手机的,这样没延迟。。。
1. 你向keyfob 写了啥数据呢?
Ss Zh:
回复 Yan:
Yan,
手机去读keyfob么,项目需要。。
我看keyfob开发手册4.6节“ Using the Accelerometer Service"里说ACCEL_X(Y\Z)_UUID有不同的UUID,再结合android的例子程序BluetoothLeGatt,我以为就只能通过分别度这三个characteristic来得到value,可是这么做以后就像我前面说的出现各种问题。写数据主要是控制accelEnable的情况,写”01“让keyfob的accelerometer开始发数据。
我怎样才能在手机端一次性读取xyz三轴数据而没延迟呢?
da qin zheng sheng:
回复 Ss Zh:
有难度,用的啥型号手机?通信协议或者不完全一致?
Ss Zh:
回复 da qin zheng sheng:
用的小辣椒3S,使用BTool的时候是实时更新的,不明白手机怎么就这么多问题,还是就这手机有这么多问题。。
Yan:
回复 Ss Zh:
Ss,
打开overlap试一下,然后代码里面连续发送三个轴的读请求看看,比如
{
read(x);
read(y);
read(z);
}
overlap的指导:http://processors.wiki.ti.com/index.php/OverlappedProcessing