我正在尝试从经过持续健康联盟认证的Omron
708-BT血压计中读取数据。我正在关注蓝牙HDP应用程序的此示例。我正在设法连接到设备并以字节格式检索数据,但是无法解析数据以获取所需的值。我正在尝试遵循本PDF第19页上指定的IEEE血压规范。
这是已添加到上面链接的示例代码中的代码。
//Variables in the class
private int count;
private byte[] invoke = {0x00, 0x00};
private class ReadThread extends Thread {
private ParcelFileDescriptor mFd;
public ReadThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
FileInputStream fis = new FileInputStream(mFd.getFileDescriptor());
final byte data[] = new byte[300];
try {
while(fis.read(data) > -1) {
// At this point, the application can pass the raw data to a parser that
// has implemented the IEEE 11073-xxxxx specifications. Instead, this sample
// simply indicates that some data has been received
Log.e("Test", data.toString());
if (data[0] != (byte) 0x00)
{
String test = byte2hex(data);
Log.i(TAG, test);
if(data[0] == (byte) 0xE2){
Log.i(TAG, "E2");
count = 1;
(new WriteThread(mFd)).start();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i(TAG, "Seconds Write Thread");
count = 2;
(new WriteThread(mFd)).start();
}
else if (data[0] == (byte)0xE7){
Log.i(TAG, "E7");
count = 3;
//set invoke id so get correct response
invoke = new byte[] { data[6], data[7] };
(new WriteThread(mFd)).start();
//parse data!!
int number_of_data_packets = data[25];
int packet_start = 30;
final int SYS_DIA_MAP_DATA = 1;
final int PULSE_DATA = 2;
final int ERROR_CODE_DATA = 3;
for (int i = 0; i < number_of_data_packets; i++){
Log.e("TEST", Integer.toString(i));
int obj_handle = data[packet_start+1];
switch (obj_handle)
{
case SYS_DIA_MAP_DATA:
int sys = byteToUnsignedInt(data[packet_start+9]);
int dia = byteToUnsignedInt(data[packet_start+11]);
int map = byteToUnsignedInt(data[packet_start+13]);
//create team string... 9+13~9+20
Log.e("RESULT", "sys is "+ sys);
sendMessage(RECEIVED_SYS, sys);
Log.e("RESULT", "dia is "+ dia);
sendMessage(RECEIVED_DIA, dia);
Log.e("RESULT", "map is "+ map);
break;
case PULSE_DATA:
//parse
int pulse = byteToUnsignedInt(data[packet_start+5]);
Log.e("RESULT", "pulse is " + pulse);
sendMessage(RECEIVED_PUL, pulse);
break;
case ERROR_CODE_DATA:
//need more signal
break;
}
packet_start += 1;//4 + data[packet_start+3]; //4 = ignore beginning four bytes
}
}
else if (data[0] == (byte) 0xE4)
{
count = 4;
(new WriteThread(mFd)).start();
}
//zero out the data
for (int i = 0; i < data.length; i++){
data[i] = (byte) 0x00;
}
}
sendMessage(STATUS_READ_DATA, 0);
}
} catch(IOException ioe) {}
if (mFd != null) {
try {
mFd.close();
} catch (IOException e) { /* Do nothing. */ }
}
sendMessage(STATUS_READ_DATA_DONE, 0);
}
}
private class WriteThread extends Thread {
private ParcelFileDescriptor mFd;
public WriteThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
FileOutputStream fos = new FileOutputStream(mFd.getFileDescriptor());
final byte data_AR[] = new byte[] { (byte) 0xE3, (byte) 0x00,
(byte) 0x00, (byte) 0x2C,
(byte) 0x00, (byte) 0x00,
(byte) 0x50, (byte) 0x79,
(byte) 0x00, (byte) 0x26,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x08, //bt add for phone, can be automate in the future
(byte) 0x3C, (byte) 0x5A, (byte) 0x37, (byte) 0xFF,
(byte) 0xFE, (byte) 0x95, (byte) 0xEE, (byte) 0xE3,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
final byte data_DR[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x12,
(byte) 0x00, (byte) 0x10,
(byte) invoke[0], (byte) invoke[1],
(byte) 0x02, (byte) 0x01,
(byte) 0x00, (byte) 0x0A,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x0D, (byte) 0x1D,
(byte) 0x00, (byte) 0x00 };
final byte get_MDS[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x0E,
(byte) 0x00, (byte) 0x0C,
(byte) 0x00, (byte) 0x24,
(byte) 0x01, (byte) 0x03,
(byte) 0x00, (byte) 0x06,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00 };
final byte data_RR[] = new byte[] { (byte) 0xE5, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
final byte data_RRQ[] = new byte[] { (byte) 0xE4, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
final byte data_ABORT[] = new byte[] { (byte) 0xE6, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
try {
Log.i(TAG, String.valueOf(count));
if (count == 1)
{
fos.write(data_AR);
Log.i(TAG, "Association Responded!");
}
else if (count == 2)
{
fos.write(get_MDS);
Log.i(TAG, "Get MDS object attributes!");
}
else if (count == 3)
{
fos.write(data_DR);
Log.i(TAG, "Data Responsed!");
}
else if (count == 4)
{
fos.write(data_RR);
Log.i(TAG, "Data Released!");
}
} catch(IOException ioe) {}
}
数据的十六进制表示如下。我相信此数据可以保存血压值中的值,但可能是错误的。我认为这是唯一的原因,因为在上面链接的PDF中,数据将以十六进制值e7开头。
03-23 23:14:44.186:I / BluetoothHDPService(23652):
任何帮助将非常感激。提前致谢。
我设法解决了这个问题。我遇到的主要问题是,我只读取了一个血压,然后一直按上载。这确实上传了有关监视器的一些信息,但不包括血压读数。知道这一点后,我还有许多其他较小的错误需要解决,但没有什么太复杂的。最终工作服务的代码如下。
public class BluetoothHDPService extends Service {
private static final String TAG = "BluetoothHDPService";
public static final int RESULT_OK = 0;
public static final int RESULT_FAIL = -1;
// Status codes sent back to the UI client.
// Application registration complete.
public static final int STATUS_HEALTH_APP_REG = 100;
// Application unregistration complete.
public static final int STATUS_HEALTH_APP_UNREG = 101;
// Channel creation complete.
public static final int STATUS_CREATE_CHANNEL = 102;
// Channel destroy complete.
public static final int STATUS_DESTROY_CHANNEL = 103;
// Reading data from Bluetooth HDP device.
public static final int STATUS_READ_DATA = 104;
// Done with reading data.
public static final int STATUS_READ_DATA_DONE = 105;
// Message codes received from the UI client.
// Register client with this service.
public static final int MSG_REG_CLIENT = 200;
// Unregister client from this service.
public static final int MSG_UNREG_CLIENT = 201;
// Register health application.
public static final int MSG_REG_HEALTH_APP = 300;
// Unregister health application.
public static final int MSG_UNREG_HEALTH_APP = 301;
// Connect channel.
public static final int MSG_CONNECT_CHANNEL = 400;
// Disconnect channel.
public static final int MSG_DISCONNECT_CHANNEL = 401;
public static final int RECEIVED_SYS = 901;
public static final int RECEIVED_DIA = 902;
public static final int RECEIVED_PUL = 903;
private int count;
private byte[] invoke = {0x00, 0x00};
private BluetoothHealthAppConfiguration mHealthAppConfig;
private BluetoothAdapter mBluetoothAdapter;
private BluetoothHealth mBluetoothHealth;
private BluetoothDevice mDevice;
private int mChannelId;
private Messenger mClient;
// Handles events sent by {@link HealthHDPActivity}.
@SuppressLint("HandlerLeak")
private class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// Register UI client to this service so the client can receive messages.
case MSG_REG_CLIENT:
Log.d(TAG, "Activity client registered");
mClient = msg.replyTo;
break;
// Unregister UI client from this service.
case MSG_UNREG_CLIENT:
mClient = null;
break;
// Register health application.
case MSG_REG_HEALTH_APP:
registerApp(msg.arg1);
break;
// Unregister health application.
case MSG_UNREG_HEALTH_APP:
unregisterApp();
break;
// Connect channel.
case MSG_CONNECT_CHANNEL:
mDevice = (BluetoothDevice) msg.obj;
connectChannel();
break;
// Disconnect channel.
case MSG_DISCONNECT_CHANNEL:
mDevice = (BluetoothDevice) msg.obj;
disconnectChannel();
break;
default:
super.handleMessage(msg);
}
}
}
final Messenger mMessenger = new Messenger(new IncomingHandler());
/**
* Make sure Bluetooth and health profile are available on the Android device. Stop service
* if they are not available.
*/
@SuppressLint("ShowToast")
@Override
public void onCreate() {
super.onCreate();
Log.e("TEST", "HDPService Created");
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
// Bluetooth adapter isn't available. The client of the service is supposed to
// verify that it is available and activate before invoking this service.
stopSelf();
return;
}
if (!mBluetoothAdapter.getProfileProxy(this, mBluetoothServiceListener,
BluetoothProfile.HEALTH)) {
Toast.makeText(this, "bluetooth_health_profile_not_available",
Toast.LENGTH_LONG);
stopSelf();
return;
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "BluetoothHDPService is running.");
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
};
// Register health application through the Bluetooth Health API.
private void registerApp(int dataType) {
Log.e(TAG, "registerApp()");
mBluetoothHealth.registerSinkAppConfiguration(TAG, dataType, mHealthCallback);
}
// Unregister health application through the Bluetooth Health API.
private void unregisterApp() {
Log.e(TAG, "unregisterApp()");
mBluetoothHealth.unregisterAppConfiguration(mHealthAppConfig);
}
// Connect channel through the Bluetooth Health API.
private void connectChannel() {
Log.i(TAG, "connectChannel()");
mBluetoothHealth.connectChannelToSource(mDevice, mHealthAppConfig);
}
// Disconnect channel through the Bluetooth Health API.
private void disconnectChannel() {
Log.i(TAG, "disconnectChannel()");
mBluetoothHealth.disconnectChannel(mDevice, mHealthAppConfig, mChannelId);
}
// Callbacks to handle connection set up and disconnection clean up.
private final BluetoothProfile.ServiceListener mBluetoothServiceListener =
new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEALTH) {
mBluetoothHealth = (BluetoothHealth) proxy;
if (Log.isLoggable(TAG, Log.DEBUG))
Log.d(TAG, "onServiceConnected to profile: " + profile);
}
}
public void onServiceDisconnected(int profile) {
if (profile == BluetoothProfile.HEALTH) {
mBluetoothHealth = null;
}
}
};
private final BluetoothHealthCallback mHealthCallback = new BluetoothHealthCallback() {
// Callback to handle application registration and unregistration events. The service
// passes the status back to the UI client.
public void onHealthAppConfigurationStatusChange(BluetoothHealthAppConfiguration config,
int status) {
if (status == BluetoothHealth.APP_CONFIG_REGISTRATION_FAILURE) {
mHealthAppConfig = null;
sendMessage(STATUS_HEALTH_APP_REG, RESULT_FAIL);
} else if (status == BluetoothHealth.APP_CONFIG_REGISTRATION_SUCCESS) {
mHealthAppConfig = config;
sendMessage(STATUS_HEALTH_APP_REG, RESULT_OK);
} else if (status == BluetoothHealth.APP_CONFIG_UNREGISTRATION_FAILURE ||
status == BluetoothHealth.APP_CONFIG_UNREGISTRATION_SUCCESS) {
sendMessage(STATUS_HEALTH_APP_UNREG,
status == BluetoothHealth.APP_CONFIG_UNREGISTRATION_SUCCESS ?
RESULT_OK : RESULT_FAIL);
}
}
// Callback to handle channel connection state changes.
// Note that the logic of the state machine may need to be modified based on the HDP device.
// When the HDP device is connected, the received file descriptor is passed to the
// ReadThread to read the content.
public void onHealthChannelStateChange(BluetoothHealthAppConfiguration config,
BluetoothDevice device, int prevState, int newState, ParcelFileDescriptor fd,
int channelId) {
Log.e("Read Thread", "Start If Statements");
Log.e("Read Thread", "prevState: " + prevState);
Log.e("Read Thread", "newState: " + newState);
if (Log.isLoggable(TAG, Log.DEBUG))
Log.d(TAG, String.format("prevState\t%d ----------> newState\t%d",
prevState, newState));
// if (prevState != BluetoothHealth.STATE_CHANNEL_CONNECTED &&
// newState == BluetoothHealth.STATE_CHANNEL_CONNECTED) {
if (prevState == BluetoothHealth.STATE_CHANNEL_DISCONNECTED &&
newState == BluetoothHealth.STATE_CHANNEL_CONNECTED) {
if (config.equals(mHealthAppConfig)) {
mChannelId = channelId;
sendMessage(STATUS_CREATE_CHANNEL, RESULT_OK);
Log.e("Read Thread", "Read Start 1");
(new ReadThread(fd)).start();
} else {
Log.e("Read Thread", "Status Create Channel Fail 1");
sendMessage(STATUS_CREATE_CHANNEL, RESULT_FAIL);
}
} else if (prevState == BluetoothHealth.STATE_CHANNEL_CONNECTING &&
newState == BluetoothHealth.STATE_CHANNEL_DISCONNECTED) {
sendMessage(STATUS_CREATE_CHANNEL, RESULT_FAIL);
Log.e("Read Thread", "Status Create Channel Fail 2");
} else if (newState == BluetoothHealth.STATE_CHANNEL_DISCONNECTED) {
if (config.equals(mHealthAppConfig)) {
sendMessage(STATUS_DESTROY_CHANNEL, RESULT_OK);
Log.e("Read Thread", "Status Disconnect OK");
} else {
sendMessage(STATUS_DESTROY_CHANNEL, RESULT_FAIL);
Log.e("Read Thread", "Status Disconnect FAIL");
}
}else if (prevState == BluetoothHealth.STATE_CHANNEL_CONNECTING && newState == BluetoothHealth.STATE_CHANNEL_CONNECTED) {
if (config.equals(mHealthAppConfig)) {
mChannelId = channelId;
sendMessage(STATUS_CREATE_CHANNEL, RESULT_OK);
Log.e("Read Thread", "Read Start 2");
(new ReadThread(fd)).start();
} else {
sendMessage(STATUS_CREATE_CHANNEL, RESULT_FAIL);
Log.e("Read Thread", "Status Create Channel Fail 3");
}
}
}
};
// Sends an update message to registered UI client.
private void sendMessage(int what, int value) {
if (mClient == null) {
Log.d(TAG, "No clients registered.");
return;
}
try {
mClient.send(Message.obtain(null, what, value, 0));
} catch (RemoteException e) {
// Unable to reach client.
e.printStackTrace();
}
}
public String byte2hex(byte[] b){
// String Buffer can be used instead
String hs = "";
String stmp = "";
for (int n = 0; n < b.length; n++){
stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
if (stmp.length() == 1){
hs = hs + "0" + stmp;
}
else{
hs = hs + stmp;
}
if (n < b.length - 1){
hs = hs + "";
}
}
return hs;
}
public static int byteToUnsignedInt(byte b) {
return 0x00 << 24 | b & 0xff;
}
public static int toInt(byte[] bytes) {
int ret = 0;
for (int i=0; i<4 && i<bytes.length; i++) {
ret <<= 8;
ret |= (int)bytes[i] & 0xFF;
}
return ret;
}
// Thread to read incoming data received from the HDP device. This sample application merely
// reads the raw byte from the incoming file descriptor. The data should be interpreted using
// a health manager which implements the IEEE 11073-xxxxx specifications.
private class ReadThread extends Thread {
private ParcelFileDescriptor mFd;
public ReadThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
Log.e("TEST", "Read Data 1");
FileInputStream fis = new FileInputStream(mFd.getFileDescriptor());
final byte data[] = new byte[200];
Log.i(TAG, "Read Data 2");
try {
while(fis.read(data) > -1) {
// At this point, the application can pass the raw data to a parser that
// has implemented the IEEE 11073-xxxxx specifications. Instead, this sample
// simply indicates that some data has been received.
Log.i(TAG, "INBOUND");
String test = byte2hex(data);
Log.i(TAG, test);
if (data[0] != (byte) 0x00)
{
if(data[0] == (byte) 0xE2){
Log.i(TAG, "E2 - Association Request");
count = 1;
(new WriteThread(mFd)).start();
try {
sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
count = 2;
(new WriteThread(mFd)).start();
}
else if (data[0] == (byte)0xE7){
Log.i(TAG, "E7 - Data Given");
if(data[3] != (byte)0xda){
invoke[0] = data[6];
invoke[1] = data[7];
Log.i(TAG, "E7 - Reading?");
ByteBuffer sys = ByteBuffer.allocate(2);
sys.order(ByteOrder.LITTLE_ENDIAN);
sys.put(data[45]);
sys.put(data[46]);
short sysVal = sys.getShort(0);
Log.i(TAG, " Sys - "+sysVal);
ByteBuffer dia = ByteBuffer.allocate(2);
dia.order(ByteOrder.LITTLE_ENDIAN);
dia.put(data[47]);
dia.put(data[48]);
short diaVal = dia.getShort(0);
Log.i(TAG, " Dia - "+diaVal);
sendMessage(9919, diaVal);
sendMessage(9920, sysVal);
for(int i=0; i<(data.length-2); i++){
ByteBuffer bb = ByteBuffer.allocate(2);
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.put(data[i]);
bb.put(data[i+1]);
short shortVal = bb.getShort(0);
Log.i(TAG, i+" Short Val - "+shortVal);
}
count = 3;
//set invoke id so get correct response
(new WriteThread(mFd)).start();
}
//parse data!!
}
else if (data[0] == (byte) 0xE4)
{
//count = 4;
// (new WriteThread(mFd)).start();
}
//zero out the data
for (int i = 0; i < data.length; i++){
data[i] = (byte) 0x00;
}
}
sendMessage(STATUS_READ_DATA, 0);
}
} catch(IOException ioe) {}
if (mFd != null) {
try {
mFd.close();
} catch (IOException e) { /* Do nothing. */ }
}
sendMessage(STATUS_READ_DATA_DONE, 0);
}
}
private class WriteThread extends Thread {
private ParcelFileDescriptor mFd;
public WriteThread(ParcelFileDescriptor fd) {
super();
mFd = fd;
}
@Override
public void run() {
FileOutputStream fos = new FileOutputStream(mFd.getFileDescriptor());
final byte data_AR[] = new byte[] { (byte) 0xE3, (byte) 0x00,
(byte) 0x00, (byte) 0x2C,
(byte) 0x00, (byte) 0x00,
(byte) 0x50, (byte) 0x79,
(byte) 0x00, (byte) 0x26,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x80, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x08, //bt add for phone, can be automate in the future
(byte) 0x3C, (byte) 0x5A, (byte) 0x37, (byte) 0xFF,
(byte) 0xFE, (byte) 0x95, (byte) 0xEE, (byte) 0xE3,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00};
final byte data_DR[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x12,
(byte) 0x00, (byte) 0x10,
(byte) 0x00, (byte) 0x24,
(byte) 0x02, (byte) 0x01,
(byte) 0x00, (byte) 0x0A,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x0D, (byte) 0x1D,
(byte) 0x00, (byte) 0x00 };
final byte get_MDS[] = new byte[] { (byte) 0xE7, (byte) 0x00,
(byte) 0x00, (byte) 0x0E,
(byte) 0x00, (byte) 0x0C,
(byte) 0x00, (byte) 0x24,
(byte) 0x01, (byte) 0x03,
(byte) 0x00, (byte) 0x06,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00, (byte) 0x00 };
final byte data_RR[] = new byte[] { (byte) 0xE5, (byte) 0x00,
(byte) 0x00, (byte) 0x02,
(byte) 0x00, (byte) 0x00 };
// final byte data_RRQ[] = new byte[] { (byte) 0xE4, (byte) 0x00,
// (byte) 0x00, (byte) 0x02,
// (byte) 0x00, (byte) 0x00 };
//
// final byte data_ABORT[] = new byte[] { (byte) 0xE6, (byte) 0x00,
// (byte) 0x00, (byte) 0x02,
// (byte) 0x00, (byte) 0x00 };
try {
Log.i(TAG, String.valueOf(count));
if (count == 1)
{
fos.write(data_AR);
Log.i(TAG, "Association Responded!");
}
else if (count == 2)
{
fos.write(get_MDS);
Log.i(TAG, "Get MDS object attributes!");
}
else if (count == 3)
{
fos.write(data_DR);
Log.i(TAG, "Data Responsed!");
}
else if (count == 4)
{
fos.write(data_RR);
Log.i(TAG, "Data Released!");
}
} catch(IOException ioe) {}
}
}
}
连接设备 接口说明 用于连接 扫描出来的蓝牙设备。 参数说明 字段 类型 必须? 说明 device RKBLEDevice 是 蓝牙设备 示例代码 Swift: RokidMobileSDK.binder.connect(device: RKBLEDevice) Objc: [RokidMobileSDK.binder connect:device]; 断开设备 接口说明 用于断开已经连接的
连接蓝牙设备 接口说明 接口需传入蓝牙名称(蓝牙address重启后会变) 参数说明 字段 类型 必须? 说明 name String 是 设备名称 举个大栗子 RokidMobileSDK.binder.connectBT(name, new IBTConnectCallBack() { @Override public void onConnectSucceed(BTDevic
我如何获得Android所有已连接蓝牙设备的列表,而不考虑配置文件? 或者,我看到您可以通过BluetoothManager获取特定配置文件的所有连接设备。获取连接的设备。 我想我可以通过ACTION_ACL_CONNECTED/ACTION_ACL_DISCONNECTED监听连接/断开来查看哪些设备连接...似乎容易出错。 但我想知道是否有更简单的方法来获取所有已连接蓝牙设备的列表。
连接和断开蓝牙设备在Windows Phone/Desktop 8.1上产生了各种结果。我一直在使用命名空间和我尝试连接具有不同蓝牙版本/类的几个设备。 版本1.2(1级和2级) 每当我尝试连接到2.0或2.1设备时,都会出现问题。第一次尝试连接到每个设备时,一切都会顺利,连接也会打开。当我随后关闭连接并重新连接设备时,问题就开始了。在重新连接期间,连接将永远不会打开,调试器将抛出一个系统。例外:
问题内容: 我正在使用蓝牙聊天功能,以便连接和接收来自蓝牙设备的数据。 我使用以下代码读取数据: 设备一直在发送数据而不会停止。 通过上面的代码,我得到以下消息: 然后转到下一行: 并且永远不会从该呼叫中返回。我猜这是因为它开始从设备读取数据,并且直到断开连接才停止。如何一次读取一定数量的字节? 编辑 除非由于它不保留代码,否则不从设备取回任何数据? 问题答案: 我改用DataInputStrea
我可以在Android中看到蓝牙设备的两种状态。1、配对2。已连接-<我正在尝试在Android系统中使用当前连接的蓝牙设备。但我只从适配器获得配对设备列表。getBondedDevices() 我需要当前连接的设备。我怎么能得到这个。请有人帮我实现这一点。提前谢谢。