Android蓝牙4.0单车锁应用实例开发

前言:

露脸 0_o 一直想开始写一些文章,一直没有机会写,犹犹豫豫了好久,现在为大家带来关于蓝牙交互的文章,一方面为了提升自己的能力,积累一点经验,一方面也是希望分享自己所遇到的一些问题以及解决方法能给正在面临这些问题的伙伴们带来一些帮助。

概述:
在如今共享的时代,共享单车已经达到了一个很庞大的数量,大到一线城市,小到二线三线城市,而共享单车的核心就是车锁,车锁开锁模式又有蓝牙,GPRS等,在我开发项目的基础下,我先总结了下蓝牙4.0开发使用的一些东西分享一下,下面先看交互流程.

  • 请求蓝牙权限,打开蓝牙

  • 蓝牙扫描附近设备

  • 蓝牙匹配成功蓝牙的连接

  • 蓝牙协议数据的通信

  • 锁指令返回的数据的解析


具体知道流程之后我们直接进入蓝牙功能的一些运用与交互

蓝牙权限

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
允许搜索发现附近设备以及配对
<uses-permission android:name="android.permission.BLUETOOTH"/>
允许连接到已配对的蓝牙设备

申请完权限之后,我们先熟悉几个蓝牙开发主要使用类

BluetoothAdapter
BluetoothAdapter代表了移动设备的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作, 例如 : 启动设备发现(startDiscovery), 获取已配对设备(getBoundedDevices), 通过mac蓝牙地址获取蓝牙设备(getRemoteDevice), 从其它设备创建一个监听连接(listenUsingRfcommWithServiceRecord);

获取该适配器对象
> BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

BluetoothManager
BluetoothManager在Android4.3以上支持(API level 18),高级管理者用于获得BluetoothAdapter的实例并进行整体蓝牙管理, 使用getSystemService(String)创建一个BluetoothManager BLUETOOTH_SERVICE,然后调用getAdapter()来获得theBluetoothAdapter。或者,你可以调用静态辅助getDefaultAdapter()。

获取该适配器对象
>BluetoothManager mBluetoothManager =
(BluetoothManager) getContext().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = mBluetoothManager .getAdapter();

在了解一些主要使用类之后我们开始蓝牙4.0的开发的工作.

判断蓝牙的打开与关闭

BluetoothManager mBluetoothManager =
(BluetoothManager) getContext().getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = mBluetoothManager .getAdapter();
//如果bluetoothAdapter == null,说明设备不支持蓝牙 if (bluetoothAdapter.isEnabled()){//已开启蓝牙,此时我们开始搜索附近设备searchBluetooth();}else {//未开启蓝牙,此时打开蓝牙bluetoothAdapter.enable();searchBluetooth();}

扫描搜索附近设备
这里之后我们直接引用github封装好的蓝牙通信库,只开放连接,读写,通知等语义。简单明了.附上githb地址:https://github.com/dingjikerbo/BluetoothKit

        SearchRequest request = new SearchRequest.Builder().searchBluetoothLeDevice(3000, 3)   // 先扫BLE设备3次,每次3s.searchBluetoothClassicDevice(5000) // 再扫经典蓝牙5s.searchBluetoothLeDevice(2000)      // 再扫BLE设备2s.build();bluetoothClient.search(request, new SearchResponse() {@Overridepublic void onSearchStarted() {//搜索开始}@Overridepublic void onDeviceFounded(SearchResult device) {//搜索成功,找到设备//一般我们都是通过蓝牙唯一的MAC地址进行匹配,我这只写一个例子,具体mac地址我们是根据后台返回的值与设备进行匹配if (("mac").equals(device.getAddress())) {//匹配成功时停止搜索并连接设备bluetoothClient.stopSearch();connect(device);}}@Overridepublic void onSearchStopped() {//搜索停止}@Overridepublic void onSearchCanceled() {//搜索被取消}});

连接设备

        BleConnectOptions options = new BleConnectOptions.Builder().setConnectRetry(3)   // 连接如果失败重试3次.setConnectTimeout(30000)   // 连接超时30s.setServiceDiscoverRetry(3)  // 发现服务如果失败重试3次.setServiceDiscoverTimeout(20000)  // 发现服务超时20s.build();bluetoothClient.connect(device.getAddress(), new BleConnectResponse() {@Overridepublic void onResponse(int code, BleGattProfile profile) {if (code == REQUEST_SUCCESS) {//当连接成功时,我们需要进行一些数据通信}}});

蓝牙协议的通信
我们在与蓝牙通信的时候,发送或者接受指令,我们都需要Service UUID,该 service 下的 characteristic,(UUID是“Universally Unique Identifier”的缩写,通用唯一识别码的意思。对于蓝牙设备,每个服务都有一个与它对应的UUID(唯一的)。)我们可以简单看一个,
0788888e-8535-b5a0-7140-a11112495cba 操作类型Write 向硬件写指令

0788888e-8535-b5a0-7140-a11112495cb8 操作类型Notify 硬件返回的信息
现在我们可以开始通过UUID来进行正常的发送指令和接收指令,在发送指令通信之前我们先注册蓝牙通知.

//注册通知使用serviceUUID和如图Notifity类型的characteristicUUIDbluetoothClient.notify(mac, serviceUUID, characterUUID2, new BleNotifyResponse() {@Overridepublic void onNotify(UUID service, UUID character, byte[] value) {//这里是接收蓝牙指令的回调}@Overridepublic void onResponse(int code) {if (code == REQUEST_SUCCESS) {//注册成功}}});

我们现在可以发送一个指令到蓝牙设备与其通信,一般我们通信都会规定一份协议,
随便举个例子
0 STX 数据头/帧头 固定值:0xFE
1 NUM 随机数
2 ID APP 端用户 ID 号
3
4
5
6 KEY 0x00
7 CMD 0x11

8 LEN 0x08
9-16 DATA 设备识别 KEY,8 字节
17 CRC CRC 之前数据经过加密后的 CRC16 校验值
18
我们根据以上拼接一个byte[]数组,(中途会有一些加密方式比如crc校验,异或等)然后发送给蓝牙设备

//发送指令使用serviceUUID和如图Write类型的characteristicUUIDbluetoothClient.write(mac, serviceUUID, characterUUID1, data, new BleWriteResponse() {@Overridepublic void onResponse(int code) {if (code == REQUEST_SUCCESS) {//命令发送成功}}});

我们还有可能会需要知道一些蓝牙的连接状况,此时我们可以注册一个蓝牙连接的监听

        bluetoothClient.registerConnectStatusListener(mac, new BleConnectStatusListener() {@Overridepublic void onConnectStatusChanged(String mac, int status) {if (status == STATUS_CONNECTED) {//连接} else if (status == STATUS_DISCONNECTED) {//断开}}});

至此蓝牙通信就结束了,当然在IBluetoothClient 接口中 我们还有一些蓝牙的功能,比如断开连接,停止搜索,取消注册一些通知和监听,发送无返回类型指令,读取指令信息等等,其他蓝牙通信设备大部分都是这种类型,我们可以举一反三.

public interface IBluetoothClient {void connect(String mac, BleConnectOptions options, BleConnectResponse response);void disconnect(String mac);void registerConnectStatusListener(String mac, BleConnectStatusListener listener);void unregisterConnectStatusListener(String mac, BleConnectStatusListener listener);void read(String mac, UUID service, UUID character, BleReadResponse response);void write(String mac, UUID service, UUID character, byte[] value, BleWriteResponse response);void readDescriptor(String mac, UUID service, UUID character, UUID descriptor, BleReadResponse response);void writeDescriptor(String mac, UUID service, UUID character, UUID descriptor, byte[] value, BleWriteResponse response);void writeNoRsp(String mac, UUID service, UUID character, byte[] value, BleWriteResponse response);void notify(String mac, UUID service, UUID character, BleNotifyResponse response);void unnotify(String mac, UUID service, UUID character, BleUnnotifyResponse response);void indicate(String mac, UUID service, UUID character, BleNotifyResponse response);void unindicate(String mac, UUID service, UUID character, BleUnnotifyResponse response);void readRssi(String mac, BleReadRssiResponse response);void search(SearchRequest request, SearchResponse response);void stopSearch();void registerBluetoothStateListener(BluetoothStateListener listener);void unregisterBluetoothStateListener(BluetoothStateListener listener);void registerBluetoothBondListener(BluetoothBondListener listener);void unregisterBluetoothBondListener(BluetoothBondListener listener);void clearRequest(String mac, int type);void refreshCache(String mac);
}

Android蓝牙4.0单车锁应用实例开发相关推荐

  1. android 蓝牙4.0(BLE) 开发

    简介 蓝牙发展至今经历了9个版本的更新.1.1.1.2.2.0.2.1.3.0.4.0.4.1.4.2.5.0.那么在1.x~3.0之间的我们称之为传统蓝牙,4.x开始的蓝牙我们称之为低功耗蓝牙也就是 ...

  2. Android 蓝牙4.0(BLE)开发实现对蓝牙的写入数据和读取数据

    由于最近学校组织了一个移动APP(安卓)设计大赛,自己也学习安卓有一段时间了,就跟同学商量一起去参加试试,一拍即合,然后我们就开始想idea,因为最近可穿戴设备比较火,我们也就想试试.经过商量,我负责 ...

  3. 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受

    谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受 谈谈几个月以来开发android蓝牙4.0 BLE低功耗应用的感受,注明下时间:2012-10-17写的博客,后期更新的也注明了时间 ...

  4. 开发android蓝牙4.0 BLE低功耗应用的感受

    文章转自: http://www.cnblogs.com/zdz8207/archive/2012/10/17/bluetooth_ble_android.html 谈谈几个月以来开发android蓝 ...

  5. ym——物联网入口之中的一个Android蓝牙4.0

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 假设还有同学不知道蓝牙4.0能够做什么请查看Android+蓝牙 4.0 将带来什么? ...

  6. ym——物联网入口之一Android蓝牙4.0

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 如果还有同学不知道蓝牙4.0可以做什么请查看Android+蓝牙 4.0 将带来什么? ...

  7. android蓝牙4.0 BLE低功耗应用

    转自    http://www.cnblogs.com/zdz8207/archive/2012/10/17/bluetooth_ble_android.html 谈谈几个月以来开发android蓝 ...

  8. Android 蓝牙4.0(BLE)Demo

    给大家分享一下蓝牙4.0的Demo,本篇介绍基本使用 最终效果 如何获取UUID 使用 Android 蓝牙4.0(BLE) Demo下载 最终效果 如何获取UUID 去手机华为应用市场下载一个叫蓝牙 ...

  9. Android蓝牙4.0开发及发送指令到蓝牙硬件设备,简单好用,方法已写好直接可用

    近日,接到需要用到蓝牙解锁硬件设备的新需求,开发过程中呢也遇到许多硬件的坑,开发协议文档较简单,几句话就完了,第一次搞得我自己一脸懵逼,本来一两个小时就能写完并测试完成的过程用了两三天.哎!默默地回到 ...

  10. Android蓝牙4.0 BLE开发坑总结

    onServicesDiscovered 回调里不能直接执行 write /readDataFromCharacteristic() 或者 enableNotificationOfCharacteri ...

最新文章

  1. LeetCode简单题之托普利茨矩阵
  2. 10月机器学习开源项目Top10
  3. (6) 查看汉字转换成字节数组后的字节值
  4. 自己手写一个Mybatis框架(简化)
  5. 两大开源游戏引擎Cocos2d-x及OGEngine对比分析
  6. YBTOJ洛谷P4869:出现位置(线性基)
  7. php switch goto,PHP goto语句用法实例
  8. 构造函数和析构函数的作用,面向对象的三大特征
  9. 发力多人在线游戏!PS5有望2020年E3展会亮相!
  10. 纯CSS实现的炫酷HOVER效果
  11. 牛顿插值法C语言实现
  12. sprintf函数的用法
  13. 【Python计量】statsmodels对虚拟变量进行回归
  14. Android 集成谷歌地图
  15. 腾讯云数据迁移工具解决方案:华为云迁移到腾讯云
  16. 重复率30%可以通过论文查重吗?
  17. 虚幻——动画蓝图、状态机制作人物走跑跳动作
  18. 【STM32篇】驱动MXL90614红外测温模块
  19. springboot+flyway使用
  20. PHP代表什ILl生肖,三合生肖有哪些 是什么意思 有什么作用吗

热门文章

  1. python中字典的常用函数_Python字典(Dict)详解 - 常用函数详解
  2. [KALI系列第四章]进行ARP断网攻击,包含安装方法
  3. 双系统linux开机黑屏,解决双系统中ubuntu开关机异常,黑屏,出现“nouveau , SCHED_ERROR”字样等的问题...
  4. css2D、3D详解
  5. iOS开发之千呼万唤始出来iOS10更新内容以及iOS 10的闪退问题解决
  6. eclipse将安卓项目commit至github本地仓库后,项目bin文件夹下不生成apk且运行报错
  7. SQL Server2008R2中文版安装教程
  8. 2021高考成绩查询新浪,【转】2021高三一模分数线发布!各分数段可报大学出炉!...
  9. 大数据会议资料学习笔记201402
  10. Nginx 启动报 bind() to 0.0.0.0:XXXX failed (13: Permission denied)