不从蓝牙健康设备读取数据(适用于Android 2.2及更高版本)

时间:2012-06-12 06:17:31

标签: java android bluetooth buffer inputstream

我正试图从“蓝牙健康设备”中捕获Android手机上的(数据)读数,如血氧计,温度计,称重秤等。 我可以将设备连接到手机,但是当它去读取数据时它只会卡在那里。  我正在执行以下步骤..(Android 2.2) 首先,我正在创建套接字连接

  1. BluetoothSocket Socket.connect();// for socket connection-----done successfully

  2. BluetoothSocket tmp= device.createRfcommSocketToServiceRecord(MY_UUID); //在这里     MY_UUID = “00001101-0000-1000-8000-00805F9B34FB”;

  3. 阅读帖子中的
  4. byte[] buffer = new byte[37];// i think here I am not getting exact bytes

    int bufferBytes = 0, bufferIndex = 0;

        Log.e(TAG, "MESSAGE_READ....");
        Communications comms = null;
        Bundle bundle = new Bundle();
        try {
             comms = new Communications();
             Log.e(TAG, "After Communications....");
    
        } catch (Exception e) {
            Log.e(TAG, "Error in communicaton....");
        }
    
    
        // Keep listening to the InputStream while connected
        while (true) {
    
            Log.e(TAG, "Its coming in while");
            try {
    
                try {
                    bufferBytes = mmInStream.read(buffer);// the code stuck here its not going down till health device get off(its directly jump to exception after device get off)
                } catch (IndexOutOfBoundsException e) {
                    Log.e(TAG, "bufferBytes error ====== +e.getMessage());
                }
    
    
    
                //Log.e(TAG, "bufferBytes====== "+bufferBytes);
                while (bufferBytes > bufferIndex) {
    
                    String[] message = comms.receiveMessage(buffer,
                            bufferIndex, bufferBytes);
                    bufferIndex = Integer.parseInt(message[1]);
                    Log.e(TAG, "bufferIndex====== "+bufferIndex);
                    if (message[0] != null) {
    
                        /*
                         * Processing message sent by device
                         */
                        StringTokenizer dataInTokens = new StringTokenizer(
                                message[0]);
    
                        if (dataInTokens.hasMoreTokens() == true) {
    
                            String token = dataInTokens.nextToken();
                            Log.e(TAG, "token====== "+token);
                            if (token.equals("a")) {
    
                                int weight = 0;
                                if (dataInTokens.hasMoreTokens() == true) {
    
                                    weight = Integer.parseInt(dataInTokens
                                            .nextToken());
    
                                    // Send a message back to the Activity
                                    msg = mHandler
                                            .obtainMessage(ScaleActivity.MESSAGE_READ);
                                    bundle.putInt(ScaleActivity.WEIGHT,
                                            weight);
                                    msg.setData(bundle);
                                    mHandler.sendMessage(msg);
                                }
                            } else if (token.equals("b")) {
    
                                int weight = 0;
                                if (dataInTokens.hasMoreTokens() == true) {
    
                                    weight = Integer.parseInt(dataInTokens
                                            .nextToken());
    
                                    // Send a message back to the Activity
                                    msg = mHandler
                                            .obtainMessage(ScaleActivity.MESSAGE_READ);
                                    bundle.putInt(
                                            ScaleActivity.WEIGHT_TO_SAVE,
                                            weight);
                                    msg.setData(bundle);
                                    mHandler.sendMessage(msg);
                                }
                            }
                        }
                    }
                }
    
  5. 我也尝试了Android 4.0 HDP示例。它可用here 但是我们的健康装置不能与hdp相容。所以它也不适合我。

1 个答案:

答案 0 :(得分:1)

我正处于同样的境地。我能够使用SSP配置文件(UUID 00001101-0000-1000-8000-00805F9B34FB)建立连接并创建套接字。我已通过执行此反射代码验证蓝牙健康设备是否正在公开SSP服务(检索设备公开的UUID的方法在此API级别中隐藏):

Class<?> cl = Class.forName("android.bluetooth.BluetoothDevice");
Method method = cl.getMethod("getUuids");
Object retval = method.invoke(myBTDevice);

(retval包含一系列可以连接的有效UUID设备服务。)

我认为问题在于,在尝试读取任何内容之前,必须将一组命令发送到设备,否则read方法将永久挂起。我已经谷歌搜索了几天,试图弄清楚这个隐藏的协议,但没有成功。我也搜索了制造商的名称和型号,但没有(DigiFox Fingertip脉搏血氧仪)。

我唯一的希望是,在设备中提供了一个在Windows中运行的自定义软件,它可以成功地与设备通信并且能够读取测量值。在阅读任何内容之前,我可能需要使用某种蓝牙分析仪或数据包嗅探器来检查发送到设备的数据。如果我能够使它工作,我会在这里发布。

问候。