一、蓝牙模式HID与BLE

  当扫码枪与手机连接时,通常采用的是蓝牙HID(Human Interface Device)模式。本质上是一个把扫码枪作为一个硬件键盘,按照键盘协议把扫码后的结果逐个输入到对应的控件上。

  优点:无需开发集成,配对就可以立即作为键盘输入使用。可以使用输入框等组件直接接收扫码结果。

  缺点:对非数字支持不佳,与输入法相关,在某些时候会触发英文联想-_-||,与虚拟键盘会发生冲突,连接扫码枪时需要切换键盘输入法输入。

  而我们要扫描的标签,不仅有英文,特殊符号,还有中文,因此以HID模式接入的蓝牙扫码枪,最终是不能满足要求的。于是重新选型了支持BLE模式的扫码枪。

  BLE模式扫码枪

  优点:兼容性好,遵循蓝牙协议,与键盘输入法无关。更底层,直接返回原始二进制数据流,方便判定编码以及进行字符编码转换。

  缺点:需要进行原生开发, 处理设备扫描,连接,数据读写等操作。

  二、BLE协议白话

  好在有github,其中的 BLESSED for Android - BLE made easy 项目,就是一个致力于简化android上BLE开发工作的开源库。但在撸代码前还是要简单理解下BLE协议的主要概念。

  较为重要的两个东西是Service(服务) 与Characteristic特性,译为功能可能更好理解),简而言之,一个设备可以提供多个服务,每个服务可以提供多个特性功能,每个服务及特性对应一个UUID

  与设备的通信通过功能进行,每个功能通过Properties(属性)表明该特性支持读,写或者通知

  为了便于理解BLE协议,推荐下载一个叫做“BLE调试助手”的APP。下面是APP的截图。

  

 

截图演示了如何从一个支持BLE协议的设备中读取电量,不需要提前配对,打开APP扫描到对应设备后,点击Connect, 随后列出的就是一堆上面说的Service(服务),能够显示服务名称的如“Battery Service”,是根据UUID的约定取得的。

  如电池服务为0x180F。点开服务后是Characteristic,其中的Battery Level(也是UUID约定 0x2A19)的Properties为 READ NOTIFY,表明该特性支持读取和通知。

  点击那个下箭头,点击读取,显示出返回数据为0x5D(十进制估计九十多:-0)。

  电池服务是一个在协议中约定的标准服务,但扫码枪的似乎不是,我们还需要找到扫码后,是通过哪个Service的哪个Characteristic进行通知的,通过这个工具APP也不难找,注意,要打开那个接受通知数据。

  扫码后会有数据显示,找到之后就可以开始编码了。

  三、第三方库  BLESSED for Android 的使用

  https://github.com/weliem/blessed-android

  下面进入具体的撸代码环节

  安装 gradle file加入

allprojects {repositories {...maven { url 'https://jitpack.io' }}
}dependencies {implementation 'com.github.weliem:blessed-android:2.0.6'
}

  扫描设备

BluetoothCentralManager central = new BluetoothCentralManager(AppContext.baseAppContext,bluetoothCentralManagerCallback,new Handler(Looper.getMainLooper()));
central.scanForPeripherals();

  bluetoothCentralManagerCallback是扫描回调方法,重要的有下面三个

//发现了一个设备
@Override
public void onDiscoveredPeripheral(BluetoothPeripheral peripheral, ScanResult scanResult)
//连接设备
@Override
public void onConnectedPeripheral(BluetoothPeripheral peripheral)
//设备断开
@Override
public void onDisconnectedPeripheral(BluetoothPeripheral peripheral, HciStatus status)

  发现设备后onDiscoveredPeripheral,连接设备,停止扫描 。bluetoothPeripheralCallback 为设备回调,用于接受通知

central.autoConnectPeripheral(peripheral, bluetoothPeripheralCallback);
central.stopScan();

  onConnectedPeripheral连接后查询提供的服务及特性

Log.i("BLE","onConnectedPeripheral");
List<BluetoothGattService> serviceList =  peripheral.getServices();
for (int i = 0; i < serviceList.size(); i++) {Log.i("BLE", "Service:  " + serviceList.get(i).getUuid());if(serviceList.get(i).getUuid().toString().equals("6e400001-b5a3-f393-e0a9-e50e24dcca9e")){List<BluetoothGattCharacteristic> list=  serviceList.get(i).getCharacteristics();for (int j = 0; j < list.size(); j++) {Log.i("BLE", "Characteristic:  " + list.get(j).getUuid());}}
}

  onConnectedPeripheral后,对特性开启通知,接受扫码结果,服务的和特性的UUID,需要对应填写,扫码结果是以通知信息返回的。

BluetoothGattCharacteristic currentTimeCharacteristic = peripheral.getCharacteristic(SERVICE_UUID, CURRENT_TIME_CHARACTERISTIC_UUID);
if (currentTimeCharacteristic != null) {//开启通知peripheral.setNotify(currentTimeCharacteristic, true);
}
//与设备通信需要创建绑定
boolean bret=  peripheral.createBond();

  断开重连可以在onDisconnectedPeripheral中处理

  接收扫码结果 在设备回调类 bluetoothPeripheralCallback中的下列方法处理。其中value为扫到的二维码值 

@Override
public void onCharacteristicUpdate(@NonNull BluetoothPeripheral peripheral, @NonNull byte[] value, @NonNull BluetoothGattCharacteristic characteristic, @NonNull GattStatus status)

  另:

  •   中文编码通常为GBK或者UTF8,需要猜测判断,最后附了个工具函数
  •   因为BLE默认数据包较短,对大量数据,会拆分多次发送,onCharacteristicUpdate会被调用多次,需要将value拼接后,进行字符编码判断处理。  

isUtf8  

public static Boolean isUtf8(byte[] buffer) {boolean isUtf8 = true;int end = buffer.length;for (int i = 0; i < end; i++) {byte temp = buffer[i];if ((temp & 0x80) == 0) {// 0xxxxxxxcontinue;} else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) {// 110xxxxx 10xxxxxxif (i + 1 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0) {i = i + 1;continue;}} else if ((temp & 0xE0) == 0xE0 && (temp & 0x10) == 0) {// 1110xxxx 10xxxxxx 10xxxxxxif (i + 2 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0&& (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0) {i = i + 2;continue;}} else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) {// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxxif (i + 3 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0&& (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0&& (buffer[i + 3] & 0x80) == 0x80 && (buffer[i + 3] & 0x40) == 0) {i = i + 3;continue;}}isUtf8 = false;break;}return isUtf8;}isUtf8

Android BLE 蓝牙开发-扫码枪集成相关推荐

  1. Android BLE蓝牙开发知识总结

    Android BLE蓝牙开发知识总结 1.蓝牙介绍 1.1什么是蓝牙?    蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换(使用2 ...

  2. Android Ble蓝牙开发总结

    Android Ble蓝牙开发总结 前言 本文总结了ble的搜索,连接,读写操作.以及在开发过程中可能遇到的坑. 首先我们需要知道,什么是ble. 蓝牙发展至今经历了8个版本的更新.1.1.1.2.2 ...

  3. Android BLE 蓝牙开发指南(三)外围设备端开发详解

    Android BLE开发指南(一)入门基础 Android BLE开发指南(二)中心设备端程序开发详解 这篇文章将会详细讲解低功耗蓝牙外围设备端程序开发的主要流程.对于Android开发者而言,或许 ...

  4. Android Ble蓝牙开发

    BLE Android 应用 开发 1.权限设置 2.获取蓝牙设备管理器 3.设备搜索 3.1 停止搜索 4.设备连接 5.设备的重连 6.设备的断开与服务关闭 7.通知的注册与接收 8.数据的主动读 ...

  5. android ble 蓝牙绑定流程,android BLE蓝牙开发

    蓝牙BLE设备是目前比较热门的设备.由于BLE有低功耗等特点,被广泛应用到身边的电子产品上.如智能手表.手环.防丢器等各种产品上.最近研究一下android上的ble应用开发.跟大家分享一下相关的内容 ...

  6. Android 低功耗蓝牙开发

    初识低功耗蓝牙 Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)的核心功能并提供了相应的 API, 应用程序通过这些 API 扫 ...

  7. Android BLE蓝牙4.0开发 实现扫描、连接、通讯、获取通知、特性等 (一、打开蓝牙 进行扫描)

    目录 首先说下蓝牙4.0 目前android蓝牙有2种: ble蓝牙开发流程: 1.首先当然是进行权限申请啦: 2.获取蓝牙适配器 BluetoothAdapter 3.打开蓝牙 4.关闭蓝牙 5.在 ...

  8. 【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

    目录 目录 前言 一.相关概念介绍 二.实战开发 三.项目演示 四.Demo案例源码地址 五.更新记录 1.2020/12/29 :修改 setupService()中错误 2.2021/05/14 ...

  9. 【Android】BLE 蓝牙开发流程篇

    携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 4 天,点击查看活动详情 前言 本文旨在梳理 BLE 蓝牙开发的主要流程,其中涉及到其他的知识,将会单独成文梳理.如有任何疑问, ...

最新文章

  1. struts配置文件没有标签提示
  2. sizeof是c语言的一种运算符,C语言位运算和sizeof运算符详解
  3. Android开发之购物车加减按钮(附加源码)
  4. A/B Matrix CodeForces - 1360G(思维构造)
  5. java调用wkhtmltopdf生成pdf文件,美观,省事
  6. ARM S3C2410硬件手册重点
  7. CentOS7下安装MySQL5.7安装与配置(YUM)
  8. 慵懒中长大的人,只会挨生活留下的耳光
  9. The labor day's schedule and the rate of process
  10. linux 查看libevent 安装目录,关于Linux下libevent库的基础安装和使用
  11. 智力与联系能力的关系
  12. 计算机设计大赛学生现场,我校学生在2019计算机设计大赛全国总决赛中再创佳绩...
  13. BMW Trojan 样本分析
  14. 杭州英博电磁流量计通讯协议
  15. oracle11g 32021,64ビットのOracle Data Access Components(ODAC)のダウンロード
  16. 在JavaScript中NaN为什么不等于NaN
  17. 【信息安全】信息安全三要素CIA
  18. 编程语言只是一个工具
  19. Mysql列转行-union all方法
  20. php扩展名与文件类型对照表

热门文章

  1. Three.js 透明物体不能正常显示(闪烁)/渲染顺序的控制问题
  2. iframe 绕过 微信公众号文章防盗检测
  3. 气象行业与超级计算机,当AI撞上天气预报,会成为传统气象行业的末日吗?
  4. BOM和DOM和事件
  5. Invoking “make -j12 -l12“ failed
  6. mysql递归查询CTE
  7. 解决NVIDIA软件或驱动安装包出错
  8. 计算机电大微课作品,微课在电大计算机专业教学中的应用
  9. ADSL 使用中的异常故障处理
  10. 机器嗅觉探源之五——气味电子化(1)