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();
}
}
最后特别重要的是,一定好配合硬件工程师调试蓝牙。
Android Ble4.0开发的更多相关文章
- android 5.0开发环境搭建
Android 5.0 是 Google 于 2014 年 10 月 15 日发布的全新 Android 操作系统.本文将就最新的Android 5.0 开发环境搭建做详细介绍. 工具/原料 jdk- ...
- 搭建Android 5.0开发环境
1.Android SDK的安装 下载地址:http://developer.android.com/index.html 访问网站的话请自备梯子 选择:adt-bundle-windows-x86_ ...
- Android 6.0 开发人员对系统权限的使用与练习(Permissions Best Practices)
Permissions Best Practices 在安装的过程中,用户非常easy忽略权限请求. 假设一个用户相应用感觉沮丧或者操心泄漏个人信息,那么这些用户就会不用他或者卸载它. 怎样规避这个问 ...
- 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体解释
转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发具体 ...
- Android 5.0 开发者官方网站疏理知识结构
Android 5.0 开发人员官网知识结构疏理 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公 ...
- Android 7.0 行为变更
Android 7.0 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 如果您之前发布过 Android 应用,请注意 ...
- Android 4.0的图形硬件加速及绘制技巧
转:http://zuiniuwang.blog.51cto.com/3709988/721798 从Android 3.0开始,Android 2D的绘制流程就设计为能够更好地支持硬件加速.使用GP ...
- Android 7.0新特性
还望支持个人博客站:http://www.enjoytoday.cn 由于google目前不是无法直接在国内访问,故此,对于android 开发平台的7.0新特性做个保存.也可供大家查阅.原文转自an ...
- Android Studio 0.4 + PhoneGap 3.3 开发环境的搭建
最近在尝试HTML5移动平台下的开发 由于安卓的方便性,首先开始了安卓的试验 现在安卓下的开发工具首选 Android Studio (写这文章的时候,是0.4) 而跨平台的HTML5 App比较出名 ...
随机推荐
- xxnet 360浏览器设置
开xxnet全局pac只能代理. 然后选择360浏览器里面使用ie代理设置就行
- C++11的一般概念——The C++ standard library, 2nd Edition 笔记(二)
( 原书第四章,General Concepts) 只介绍新内容,关于头文件格式和后缀等C++03已经规范化的内容,不再赘述. namespace std:新的std子空间包括: std::tr1, ...
- Java中创建数组的几种方法
Java中创建数组的几种方法 public static void main(String[] args) { //创建数组的第一种方法 int[] arr=new int[6]; int intVa ...
- 2018.09.25 codeforces1053E. Euler tour(并查集+st表+模拟)
传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的 ...
- 2018.09.11 poj1845Sumdiv(质因数分解+二分求数列和)
传送门 显然需要先求出ab" role="presentation" style="position: relative;">abab的所有质因 ...
- 2018.08.28 洛谷P4360 [CEOI2004]锯木厂选址(斜率优化dp)
传送门 一道斜率优化dp入门题. 是这样的没错... 我们用dis[i]表示i到第三个锯木厂的距离,sum[i]表示前i棵树的总重量,w[i]为第i棵树的重量,于是发现如果令第一个锯木厂地址为i,第二 ...
- java socket 之UDP编程
一.概念 在TCP的所有操作中都必须建立可靠的连接,这样一来肯定会浪费大量的系统性能,为了减少这种开销,在网络中又提供了另外的一种传输协议——UDP,不可靠的连接(这种协议在各种聊天工具中被广泛使用) ...
- docker入门实战
基本概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上. Docker是一个重新定义了程序开发测试.交付和 ...
- Linux 部署 tomcat 常用命令
1. 文件夹重命名 mv somedir somedir1 2. 授权所有子目录 chmod -R 777 somedir 3.授权单个目录 chmod 777 somedir 4.实时打印控制台日 ...
- hdu 5062 单峰数(12321)的个数
http://acm.hdu.edu.cn/showproblem.php?pid=5062 模拟筛出对称单峰数(12321)的个数,水题 #include <cstdio> #inclu ...