Android 蓝牙4.0在实际开发中的运用

1.蓝牙搜索.

 首先是获取BluetoothAdapter对象:

   final BluetoothManager bluetoothManager =
                (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
    BluetoothAdapter   bluetoothAdapter = bluetoothManager.getAdapter();

   当bluetoothAdapter不为空时代表设备支持BLE4.0.

   然后调用BluetoothAdapter 的startLeScan(callback)方法,这里需要传入一个callBack对象,用于搜到设备时回调。

实现如下:

    private BluetoothAdapter.LeScanCallback callback =
            new BluetoothAdapter.LeScanCallback() {

        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  //如果搜到设备,将会执行这里,device即是搜到的设备。一般这里需要将搜到的设备添加到listView的适配器中,用于显示到界面
                }
            });
        }
    };

停止搜索调用BluetoothAdapter的stopLeScan(callback)方法。

2.链接蓝牙以及接收数据.

 连接蓝牙代码如下:

 BluetoothGatt bluetoothGatt = device.connectGatt(this, false, mGattCallback);

第一个参数是Context对象,第二个参数表示是否自动连接,第三个是一个CallBack对象,当设备连接状态发生改变,数据的收发状态改变时回调。

  private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            String intentAction;
            if (newState == BluetoothProfile.STATE_CONNECTED) {//连接成功

            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {//断开连接
              
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
       
        }

        @Override
        public void onCharacteristicRead(BluetoothGatt gatt,
                                         BluetoothGattCharacteristic characteristic,
                                         int status) {
          
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt,
                                            BluetoothGattCharacteristic characteristic) {

        byte[] data = characteristic.getValue();//如果连接设备发送数据到手机端,将通过这个函数获取数据。
          
        }
    };

device是第一步搜到的设备BluetoothDevice对象,也可以通过获取该设备的MAC地址,然后再获取BluetoothDevice对象:

        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(deviceMAC);
如果bluetoothGatt不为空,则连接成功.


3.蓝牙发数据.

  通过BLE发送数据时,需要知道连接设备的一些服务UUID,一般UUID都类似。

public static final UUID SERVICE = UUID
                .fromString("0000FFF0-0000-1000-8000-00805F9B34FB");

public static final UUID SEND_UUID = UUID
                .fromString("0000FFF6-0000-1000-8000-00805F9B34FB");

public static final UUID RECEIVE_UUID = UUID
                .fromString("0000FFF7-0000-1000-8000-00805F9B34FB");

public static final UUID CCC = UUID
            .fromString("00002902-0000-1000-8000-00805f9b34fb");


有了这些UUID后就可以开始发送数据:

BluetoothGattService bluetoothGattService = bluetoothGatt
                .getService(SERVICE);           //获取UUID对应的服务。

BluetoothGattCharacteristic charac = bluetoothGattService
                .getCharacteristic(SEND_UUID); //获取指定服务下的特性

然后就是注册一个数据接收通知

if (bluetoothGatt.setCharacteristicNotification(charac, true)) {
            BluetoothGattDescriptor clientConfig = charac
                    .getDescriptor(CCC);
            if (clientConfig != null) {
                clientConfig
                        .setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                bluetoothGatt.writeDescriptor(clientConfig);
            }
        }

    charac.setValue(data); //这里将要发送的数据加入该特性中,data 类型为byte数组,如果数据超过20字节需要在每次发送加入间隔。
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        bluetoothGatt.writeCharacteristic(charac);//发送数据


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql递归查询,无限级上下级菜单

mysql递归查询,mysql中从子类ID查询所有父类(做无限分类经常用到) 由于mysql 不支持类似 oracle with ...connect的 递归查询语法 之前一直以为类似的查询要么用存储过程要么只能用程序写递归查询. 现在发现原来一条sql语句也是可以搞定的 先…

“睡服”面试官系列第二篇之promise(建议收藏学习)

目录 1promise的定义 2基本用法 3. Promise.prototype.then() 4. Promise.prototype.catch() 5. Promise.all() 6. Promise.race() 7. Promise.resolve() 8. Promise.reject() 9. 两个有用的附加方法 10总结 1promise的定义 Promise 是异步编程的一种解决方案&#xf…

Android M 新的运行时权限开发者需要知道的一切

android M 的名字官方刚发布不久,最终正式版即将来临! android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响。惊讶的是android社区鲜有谈论这事儿,尽管这事很重要或许在不远的将来会…

查看IIS连接数

如果要想知道确切的当前网站IIS连接数的话,最有效的方法是通过windows自带的系统监视器来查看。 一、运行-->输入“perfmon.msc”. 二、在“系统监视器”图表区域里点击右键,然后点“添加计数器”. 三、在“添加计数器”窗口,“性能对象”…

SpringMVC关于json、xml自动转换的原理研究[附带源码分析]

目录 前言现象源码分析实例讲解关于配置总结参考资料 前言 SpringMVC是目前主流的Web MVC框架之一。 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 现象 本文使用的demo基于maven…

“睡服”面试官系列第三篇之变量的结构赋值(建议收藏学习)

目录 变量的解构赋值 1. 数组的解构赋值 2. 对象的解构赋值 3. 字符串的解构赋值 4. 数值和布尔值的解构赋值 5. 函数参数的解构赋值 6. 圆括号问题 7. 用途 变量的解构赋值 1. 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值&#…

【宋红康程序思想学习日记3】杨辉三角

class Shuzu3 { public static void main(String[] args) {    int[][] yanghuinew int[10][];   //初始化二维数组   for(int i0;i<yanghui.length;i){     yanghui[i]new int[i1]; }   for(int i0;i<yanghui.length;i){     for(int j0;j<yanghui…

Android为网络请求自定义加载动画

android自带的加载动画都不怎么好看&#xff0c;在这里介绍一种自定义加载动画的方法 原始图片&#xff1a; 编写动画progressbar.xml, <?xml version"1.0" encoding"utf-8"?> <animated-rotate android:drawable"drawable/publicloading&…

mybatis在xml文件中处理大于号小于号的方法

第一种方法&#xff1a; 用了转义字符把>和<替换掉&#xff0c;然后就没有问题了。 SELECT * FROM test WHERE 1 1 AND start_date < CURRENT_DATE AND end_date > CURRENT_DATE 附&#xff1a;XML转义字符 < …

Android之Notification初识

1.Notification创建 首先&#xff0c;介绍一下&#xff0c;创建一个通知所需要用到的类和方法NotificationManager类 NotificationManager类是用来管理系统的所有通知的类&#xff0c;该类的对象必须通过Context类的getSystemService()方法获取。完整代码&#xff1a; Notifica…

MyBatis参数传入集合之foreach动态sql

foreach的主要用在构建in条件中&#xff0c;它可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item&#xff0c;index&#xff0c;collection&#xff0c;open&#xff0c;separator&#xff0c;close。item表示集合中每一个元素进行迭代时的别名&#xff0c;index指…

“睡服”面试官系列第四篇之字符串的扩展(建议收藏学习)

目录 字符串的扩展 1. 字符的 Unicode 表示法 2. codePointAt() 3. String.fromCodePoint() 4. 字符串的遍历器接口 5. at() 6. normalize() 7. includes(), startsWith(), endsWith() 8. repeat() 9. padStart()&#xff0c;padEnd() 10. 模板字符串 11. 实例&…

Chapter 5 Exercises Problems

转载于:https://www.cnblogs.com/momoko/p/4931714.html

Android之Notification制作多媒体控制器

上一篇讲述了Notification的基础用法&#xff0c;本篇将介绍&#xff0c;自定义通知栏&#xff0c;并利用讲到的内容&#xff0c;实现一个简单的音乐播发器。 1.自定义通知的实现&#xff1b; Notification有一个contentView属性&#xff0c;该属性接受的对象是RemoteView对象&…

MyBatis 多表联合查询及优化

关于优化 对于优化嘛&#xff0c;我这里简单的提几点&#xff0c;大家可以考虑一下。首先&#xff0c;就是对表的设计&#xff0c;在设计表初期&#xff0c;不仅仅要考虑到数据库的规范性&#xff0c;还好考虑到所谓的业务&#xff0c;以及对性能的影响&#xff0c;比如&#x…

React Native windows环境安装遇到的坑

在官方中文文档中&#xff08;http://reactnative.cn/docs/0.37/getting-started.html&#xff09;有一段话是&#xff1a;使用Chocolatey来安装NodeJS。注意&#xff0c;目前已知Node 7.1版本在windows上无法正常工作&#xff0c;请注意避开这个版本&#xff01; 如何避开&…

linux指令查看tomcat日志

实际开发中经常遇到查看远程tomcat日志&#xff0c;来查找原因:因此总结了一些常用的linux指令 1、先切换到&#xff1a;cd usr/local/tomcat5/logs 2、tail -f catalina.out3、这样运行时就可以实时查看运行日志了 Ctrlc 是退出tail命令。 其他常用的linux指令整理&#x…

iptables对请求的URL作IP访问控制

服务器运行环境是Tomcat&#xff0c;现在要实现的目的是&#xff0c;只允许特定的IP访问某个目录&#xff0c;一种方法是在tomcat配置文件server.conf中&#xff0c;使用RemoteAddrValve对虚拟主机做访问控制。另外一种方法可以通过iptables规则。个人比较喜欢iptables例如&…