zoukankan      html  css  js  c++  java
  • Android Ble4.0开发

    最近在做一个蓝牙的项目,是Blu4.0,Android系统支持是4.3版本以上(为此特地卖了个手机,尴尬)。


    当然也参考了不少大牛的的微博,说的都不错,再次特地感谢

    http://blog.csdn.net/hellogv/article/details/6036849

    http://blog.csdn.net/hellogv/article/details/6042091

    http://www.cnblogs.com/zdz8207/archive/2012/10/17/bluetooth_ble_android.html

    http://blog.csdn.net/changemyself/article/details/8454633

    http://blog.csdn.net/hellogv/article/details/24267685


    调试Ble硬件的读写的App

    http://www.wandoujia.com/apps/com.siflink.ble.mgr

    这个App,可以在自己app为开发好的情况下,简单的测试下读写特征值,不知道为什么,好像只能写入一个值。也许是我不知道怎么写入多个值。委屈


    下面这个是从github上搜索的一个ble4.0的代码

    https://github.com/StevenRudenko/BleSensorTag



    网上有很多关于Ble4.0的开发,再次也不做介绍,反正都是差不多的。

    1、声明蓝牙的权限

        <uses-permission android:name="android.permission.BLUETOOTH" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
        <uses-permission android:name="android.permission.WRITE_SETTINGS" />
        <uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />

    2、监听搜索的回调

    BleBluetoothGattCallback gattCallback = new BleBluetoothGattCallback();
    	gattCallback.setOnBleReadCallback(new OnBleReadCallback() {
    		public void onReadData(byte[] data) {
    
    
    	}
    
    
    	public void onReadComple() {
    		McLog.mByStackTrace();
    	}
    
    
    	public void onConnect() {
    		showToast("连接设备成功");
    		isConnect = true;
    	}
    
    
    	public void onDisConnect() {
    		showToast("断开设备");
    		isConnect = false;
    	}
    });
    BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
    		public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
    			McLog.mByStackTrace();
    			String address = device.getAddress();
    			String name = device.getName();
    			String t = name + "[" + address + "]";
    			McLog.i("find a device %s", t);
    
    
    			if (isRightDevice(device)) { // 判断是否是自己的想要的设备
    				btAdapter.stopLeScan(this);
    				// 进行请求的链接
    				device.connectGatt(context, false, gattCallback);
    				McLog.i("device %s is this account's.", t);
    			} else {
    				McLog.i("device %s is not this account's.", t);
    			}
    		}
    	};
    
    
    BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    btAdapter = bluetoothManager.getAdapter();
    btAdapter.startLeScan(leScanCallback);


    3、设置请求链接的回调

    public class BleBluetoothGattCallback extends BluetoothGattCallback {
    	
    	public static final UUID SERVER_UUID = UUID.fromString("0000FFF0-0000-1000-8000-00805F9B34FB");
    	
    	OnBleReadCallback onBleReadCallback;
    
    	public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { // 链接状态的改变的回调
    		McLog.mByStackTrace();
    		McLog.i("status = " + status);
    		McLog.i("newState = " + newState);
    		switch (newState) {
    			case BluetoothProfile.STATE_CONNECTED:
    				McLog.e("STATE_CONNECTED"); // 链接成功
    				gatt.discoverServices();
    				if (onBleReadCallback != null) {
    					onBleReadCallback.onConnect();
    				}
    				break;
    			case BluetoothProfile.STATE_DISCONNECTED:
    				gatt.close();
    				McLog.e("STATE_DISCONNECTED");// 断开链接
    				if (onBleReadCallback != null) {
    					onBleReadCallback.onDisConnect();
    				}
    				break;
    			case BluetoothProfile.STATE_CONNECTING:
    				McLog.e("STATE_CONNECTING");
    				break;
    			case BluetoothProfile.STATE_DISCONNECTING:
    				McLog.e("STATE_DISCONNECTING");
    				break;
    		}
    	}
    
    	public void onServicesDiscovered(final BluetoothGatt gatt, int status) { // <span style="font-family: Arial, Helvetica, sans-serif;">发现服务的回调</span>
    		McLog.mByStackTrace(); 
    		McLog.i("status = " + status);
    		if (status == BluetoothGatt.GATT_SUCCESS) {
    			BluetoothGattService service = gatt.getService(SERVER_UUID);
    			McLog.i("service = " + service);
    			if (service != null) {
    				// 找到服务后,可以进行读取数据和写入数据
    			}
    		} else {
    			// McToastUtil.show("discover services fail.");
    		}
    	}
    
    	public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {// 读取特征值的回调
    		McLog.i("onCharacteristicRead");
    		UUID currentUUId = characteristic.getUuid();
    		McLog.i("currentUUId = " + currentUUId);
    		if (currentUUId == null) {
    			return;
    		}
    		// 数据的内容
    		byte[] data = characteristic.getValue();
    		McLog.i("data = " + Arrays.toString(data));
    	}
    
    	public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {// 写入特征值回调
    		McLog.i("onCharacteristicWrite status = " + status);
    	}
    
    	public void setOnBleReadCallback(OnBleReadCallback onBleReadCallback) {
    		this.onBleReadCallback = onBleReadCallback;
    	}
    
    	public interface OnBleReadCallback { // 自己定义的回调
    
    		void onConnect();
    
    		void onReadData(byte[] data);
    
    		void onReadComple();
    
    		void onDisConnect();
    	}
    }



    最后特别重要的是,一定好配合硬件工程师调试蓝牙。


  • 相关阅读:
    REUSE_ALV_GRID_DISPLAY_LVC I_CALLBACK_HTML_TOP_OF_PAGE
    查找数组中最大值java
    jvm 调优
    jvm 内存
    树形遍历文件夹
    程序创建一个ArrayList,添加1到10的10个随机数,删除大于5的数 java
    字符串反序排序 并带有空格输出 java
    摆动排序
    免密登陆
    springboot UEditor集成
  • 原文地址:https://www.cnblogs.com/liushuibufu/p/4140909.html
Copyright © 2011-2022 走看看