iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android BLE怎么实现扫码枪基于BLESSED开发
  • 669
分享到

Android BLE怎么实现扫码枪基于BLESSED开发

2023-06-29 17:06:11 669人浏览 泡泡鱼
摘要

这篇文章主要介绍“Android BLE怎么实现扫码枪基于BLESSED开发”,在日常操作中,相信很多人在Android BLE怎么实现扫码枪基于BLESSED开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作

这篇文章主要介绍“Android BLE怎么实现扫码枪基于BLESSED开发”,在日常操作中,相信很多人在Android BLE怎么实现扫码枪基于BLESSED开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android BLE怎么实现扫码枪基于BLESSED开发”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、蓝牙模式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的截图。

Android BLE怎么实现扫码枪基于BLESSED开发

Android BLE怎么实现扫码枪基于BLESSED开发

Android BLE怎么实现扫码枪基于BLESSED开发

截图演示了如何从一个支持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是扫描回调方法,重要的有下面三个

//发现了一个设备@Overridepublic void onDiscoveredPeripheral(BluetoothPeripheral peripheral, ScanResult scanResult)//连接设备@Overridepublic void onConnectedPeripheral(BluetoothPeripheral peripheral)//设备断开@Overridepublic 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为扫到的二维码值

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

另:

  • 中文编码通常为GBK或者UTF8,需要猜测判断,最后附了个工具函数  

  • 因为BLE默认数据包较短,对大量数据,会拆分多次发送,onCharacteristicUpdate会被调用多次,需要将value拼接后,进行字符编码判断处理。  

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) {// 0xxxxxxx                continue;            } else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) {// 110xxxxx 10xxxxxx                if (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 10xxxxxx                if (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;            } else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) {// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx                if (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;            }            isUtf8 = false;            break;        }        return isUtf8;    }

到此,关于“Android BLE怎么实现扫码枪基于BLESSED开发”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Android BLE怎么实现扫码枪基于BLESSED开发

本文链接: https://www.lsjlt.com/news/325872.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android BLE怎么实现扫码枪基于BLESSED开发
    这篇文章主要介绍“Android BLE怎么实现扫码枪基于BLESSED开发”,在日常操作中,相信很多人在Android BLE怎么实现扫码枪基于BLESSED开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-06-29
  • AndroidBLE蓝牙开发之实现扫码枪基于BLESSED开发
    目录一、蓝牙模式HID与BLE二、BLE协议白话三、第三方库 BLESSED for Android的使用一、蓝牙模式HID与BLE 当扫码枪与手机连接时,通常采用的是蓝牙HID(H...
    99+
    2022-11-13
  • 基于Java怎么实现扫码登录
    这篇文章主要介绍了基于Java怎么实现扫码登录的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Java怎么实现扫码登录文章都会有所收获,下面我们一起来看看吧。原理解析1. 身份认证机制在介绍扫码登录的原理之前...
    99+
    2023-06-30
  • Android开发怎么实现模仿360二维码扫描功能
    小编给大家分享一下Android开发怎么实现模仿360二维码扫描功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:一、效果图:二、框架搭建首先,下载最新...
    99+
    2023-05-30
    android
  • Android开发基于ArcSoft实现人脸识别的方法是什么
    本篇内容主要讲解“Android开发基于ArcSoft实现人脸识别的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android开发基于ArcSoft实现人脸识别的方法是什么”吧!效果...
    99+
    2023-06-25
  • Android开发中怎么实现一个手势密码功能
    本篇文章为大家展示了Android开发中怎么实现一个手势密码功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果使用GestureOverlayView,在xml配置文件中使用Android.ge...
    99+
    2023-05-31
    android roi
  • Android开发中中怎么实现投放九宫格手势密码功能
    这篇文章将为大家详细讲解有关Android开发中中怎么实现投放九宫格手势密码功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。要实现九宫格密码要解决的问题有:给九宫格密码界面布局九个点,即确...
    99+
    2023-05-31
    android roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作