在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → android 蓝牙4.0设备的连接

android 蓝牙4.0设备的连接

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:15.59M
  • 下载次数:39
  • 浏览次数:345
  • 发布时间:2016-12-13
  • 实例类别:Android平台开发
  • 发 布 人:tiwolf
  • 文件格式:.rar
  • 所需积分:3
 相关标签: 蓝牙4.0 16进制

实例介绍

【实例简介】实现了手机app与蓝牙模块HC-08,HMSOFT之间的连接和数据交互,已经测试过是可以的


【实例截图】





【核心代码】
/*  * Copyright (C) 2013 The Android Open Source Project  *  * Licensed under the Apache License, Version 2.0 (the "License");  * you may not use this file except in compliance with the License.  * You may obtain a copy of the License at  *  *      http://www.apache.org/licenses/LICENSE-2.0  *  * Unless required by applicable law or agreed to in writing, software  * distributed under the License is distributed on an "AS IS" BASIS,  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  * See the License for the specific language governing permissions and  * limitations under the License.  */  package com.example.tiwolf.one; import android.annotation.SuppressLint; import android.app.Service; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothGatt; import android.bluetooth.BluetoothGattCallback; import android.bluetooth.BluetoothGattCharacteristic; import android.bluetooth.BluetoothGattDescriptor; import android.bluetooth.BluetoothGattService; import android.bluetooth.BluetoothManager; import android.bluetooth.BluetoothProfile; import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import java.util.List; import java.util.UUID; /**  * Service for managing connection and data communication with a GATT server hosted on a  * given Bluetooth LE device.  */ @SuppressLint("NewApi") public class BluetoothLeService extends Service { private final static String TAG = BluetoothLeService.class.getSimpleName(); private BluetoothManager mBluetoothManager; private BluetoothAdapter mBluetoothAdapter; private String mBluetoothDeviceAddress; private BluetoothGatt mBluetoothGatt; private int mConnectionState = STATE_DISCONNECTED; private static final int STATE_DISCONNECTED = 0; private static final int STATE_CONNECTING = 1; private static final int STATE_CONNECTED = 2; public final static String ACTION_GATT_CONNECTED = "com.example.bluetooth.le.ACTION_GATT_CONNECTED"; public final static String ACTION_GATT_DISCONNECTED = "com.example.bluetooth.le.ACTION_GATT_DISCONNECTED"; public final static String ACTION_GATT_SERVICES_DISCOVERED = "com.example.bluetooth.le.ACTION_GATT_SERVICES_DISCOVERED"; public final static String ACTION_DATA_AVAILABLE = "com.example.bluetooth.le.ACTION_DATA_AVAILABLE"; public final static String EXTRA_DATA = "com.example.bluetooth.le.EXTRA_DATA"; public final static UUID UUID_HEART_RATE_MEASUREMENT = UUID.fromString(SampleGattAttributes.HEART_RATE_MEASUREMENT); // Implements callback methods for GATT events that the app cares about.  For example,  // connection change and services discovered.连接的状态  private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() { @Override  public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction; //收到设备notify值(设备上报值)  if (newState == BluetoothProfile.STATE_CONNECTED) {
                intentAction = ACTION_GATT_CONNECTED; mConnectionState = STATE_CONNECTED;
                broadcastUpdate(intentAction);
                Log.i(TAG, "Connected to GATT server."); // Attempts to discover services after successful connection.  Log.i(TAG, "Attempting to start service discovery:"  mBluetoothGatt.discoverServices());
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                intentAction = ACTION_GATT_DISCONNECTED; mConnectionState = STATE_DISCONNECTED;
                Log.i(TAG, "Disconnected from GATT server.");
                broadcastUpdate(intentAction);
            }
        } @Override  public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            } else {
                Log.w(TAG, "onServicesDiscovered received: "  status);
            }
        } @Override  public void onCharacteristicRead(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic characteristic, int status) { if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
            }
        } @Override  public void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {
            broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
        }
    }; private void broadcastUpdate(final String action) { final Intent intent = new Intent(action);
        sendBroadcast(intent);
    } //接收数据进行更新  private void broadcastUpdate(final String action, final BluetoothGattCharacteristic characteristic) { final Intent intent = new Intent(action); // This is special handling for the Heart Rate Measurement profile.  Data parsing is  // carried out as per profile specifications:  // http://developer.bluetooth.org/gatt/characteristics/Pages/CharacteristicViewer.aspx?u=org.bluetooth.characteristic.heart_rate_measurement.xml  //在这里进行数据的接收和数据相关的换算  if (!UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) {//characterstic.getUuid()获取的数据为0000ffe1-0000-1000-8000-00805f9b34fb,所以后面需要注意  int flag = characteristic.getProperties(); int format = -1; if ((flag & 0x01) != 0) {
                format = BluetoothGattCharacteristic.FORMAT_UINT16;
                Log.d(TAG, "Heart rate format UINT16.");
            } else {
                format = BluetoothGattCharacteristic.FORMAT_UINT8;
                Log.d(TAG, "Heart rate format UINT8.");
            } final int heartRate = characteristic.getIntValue(format, 1);
            Log.d(TAG, String.format("Received heart rate: %d", heartRate));
            intent.putExtra(EXTRA_DATA, String.valueOf(heartRate));
        } else { // For all other profiles, writes the data formatted in HEX.对于所有的文件,写入十六进制格式的文件  //在这里读取到数据,读取到的数据都是换算后有有符号的10进制数字  final byte[] data = characteristic.getValue(); //从蓝牙控件中发送字符串"90 79 83 54 54 21 55 AA",过来后换成是带符号的十进制data{-112,121,-125,84,84,33,85,-86}  if (data != null && data.length > 0) { final StringBuilder stringBuilder = new StringBuilder(data.length); //将十进制重新再转换成十六进制的data  for(byte byteChar : data)
                    stringBuilder.append(String.format("%02X ", byteChar)); //                intent.putExtra(EXTRA_DATA, new String(data)   "\n"   stringBuilder.toString());  intent.putExtra(EXTRA_DATA, stringBuilder.toString());
            }
        }
        sendBroadcast(intent);
    } public class LocalBinder extends Binder {
        BluetoothLeService getService() { return BluetoothLeService.this;
        }
    } @Override  public IBinder onBind(Intent intent) { return mBinder;
    } @Override  public boolean onUnbind(Intent intent) { // After using a given device, you should make sure that BluetoothGatt.close() is called  // such that resources are cleaned up properly.  In this particular example, close() is  // invoked when the UI is disconnected from the Service.  close(); return super.onUnbind(intent);
    } private final IBinder mBinder = new LocalBinder(); /**  * Initializes a reference to the local Bluetooth adapter.  *初始化蓝牙设备  * @return Return true if the initialization is successful.  */  public boolean initialize() { // For API level 18 and above, get a reference to BluetoothAdapter through  // BluetoothManager.  if (mBluetoothManager == null) { mBluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE); if (mBluetoothManager == null) {
                Log.e(TAG, "Unable to initialize BluetoothManager."); return false;
            }
        } mBluetoothAdapter = mBluetoothManager.getAdapter(); if (mBluetoothAdapter == null) {
            Log.e(TAG, "Unable to obtain a BluetoothAdapter."); return false;
        } return true;
    } /**  * Connects to the GATT server hosted on the Bluetooth LE device.  *  * @param address The device address of the destination device.  *  * @return Return true if the connection is initiated successfully. The connection result  *         is reported asynchronously through the  *         {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}  *         callback.  * 设备之间的连接状态  */  public boolean connect(final String address) { if (mBluetoothAdapter == null || address == null) {
            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address."); return false;
        } // Previously connected device.  Try to reconnect.  if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress)
                && mBluetoothGatt != null) {
            Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection."); //mBlue  if (mBluetoothGatt.connect()) { mConnectionState = STATE_CONNECTING; return true;
            } else { return false;
            }
        } final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); if (device == null) {
            Log.w(TAG, "Device not found.  Unable to connect."); return false;
        } // We want to directly connect to the device, so we are setting the autoConnect  // parameter to false.  mBluetoothGatt = device.connectGatt(this, false, mGattCallback);
        Log.d(TAG, "Trying to create a new connection."); mBluetoothDeviceAddress = address; mConnectionState = STATE_CONNECTING; return true;
    } /**  * Disconnects an existing connection or cancel a pending connection. The disconnection result  * is reported asynchronously through the  * {@code BluetoothGattCallback#onConnectionStateChange(android.bluetooth.BluetoothGatt, int, int)}  * callback.  */  public void disconnect() { if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized"); return;
        } mBluetoothGatt.disconnect();
    } /**  * After using a given BLE device, the app must call this method to ensure resources are  * released properly.  */  public void close() { if (mBluetoothGatt == null) { return;
        } mBluetoothGatt.close(); mBluetoothGatt = null;
    } /**  * Request a read on a given {@code BluetoothGattCharacteristic}. The read result is reported  * asynchronously through the {@code BluetoothGattCallback#onCharacteristicRead(android.bluetooth.BluetoothGatt, android.bluetooth.BluetoothGattCharacteristic, int)}  * callback.  *  * @param characteristic The characteristic to read from.读取蓝牙中的数据  */  public void readCharacteristic(BluetoothGattCharacteristic characteristic) { if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized"); return;
        } mBluetoothGatt.readCharacteristic(characteristic);
    } /**  * 向蓝牙里面写入数据  * @param characteristic  */  public void writeCharacteristic(BluetoothGattCharacteristic characteristic)
    { if (mBluetoothAdapter==null||mBluetoothGatt==null)
        {
            Log.e(TAG, "BluetoothAdapter not initialized");
        } mBluetoothGatt.writeCharacteristic(characteristic);
    } /**  * Enables or disables notification on a give characteristic.  *  * @param characteristic Characteristic to act on.  * @param enabled If true, enable notification.  False otherwise.  * 获取当前设备的一些信息  */  public void setCharacteristicNotification(BluetoothGattCharacteristic characteristic, boolean enabled) { if (mBluetoothAdapter == null || mBluetoothGatt == null) {
            Log.w(TAG, "BluetoothAdapter not initialized"); return;
        } //        mBluetoothGatt.setCharacteristicNotification(characteristic, enabled);   boolean isEnableNotification = mBluetoothGatt.setCharacteristicNotification(characteristic, enabled); if(isEnableNotification) {
            List<BluetoothGattDescriptor> descriptorList = characteristic.getDescriptors(); if(descriptorList != null && descriptorList.size() > 0) { for(BluetoothGattDescriptor descriptor : descriptorList) {
                    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); mBluetoothGatt.writeDescriptor(descriptor);
                }
            }
        } // This is specific to Heart Rate Measurement. //        if (UUID_HEART_RATE_MEASUREMENT.equals(characteristic.getUuid())) { //            BluetoothGattDescriptor descriptor = characteristic.getDescriptor( //                    UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG)); //            descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE); //            mBluetoothGatt.writeDescriptor(descriptor); //        }  } /**  * Retrieves a list of supported GATT services on the connected device. This should be  * invoked only after {@code BluetoothGatt#discoverServices()} completes successfully.  *  * @return A {@code List} of supported services.  */  public List<BluetoothGattService> getSupportedGattServices() { if (mBluetoothGatt == null) return null; return mBluetoothGatt.getServices();
    } //返回一个具体的服务  public BluetoothGattService getSupportedGattServices(UUID uuid)
    {
        BluetoothGattService mBluetoothGattService; if (mBluetoothGatt==null)return null;
        mBluetoothGattService=mBluetoothGatt.getService(uuid); return mBluetoothGattService;
    }
}

标签: 蓝牙4.0 16进制

实例下载地址

android 蓝牙4.0设备的连接

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警