Android BLE 蓝牙开发之实现扫码枪基于BLESSED开发

目录
  • 一、蓝牙模式HID与BLE
  • 二、BLE协议白话
  • 三、第三方库 BLESSED for Android的使用

一、蓝牙模式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拼接后,进行字符编码判断处理。  
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开发的文章就介绍到这了,更多相关Android BLE 蓝牙开发内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • android商户扫码枪读取手机二维码

    扫码抢实现读取二维码信息,本地扫码枪是外接写入设备,本质是监控读写输入,下面介绍下扫码设备读取支付二维码. 1.引入扫码设备辅助类 public class ScanGunKeyEventHelper { private final static long MESSAGE_DELAY = 500; //延迟500ms,判断扫码是否完成. private StringBuffer mStringBufferResult; //扫码内容 private boolean mCaps; //大小写区分

  • Android设备获取扫码枪扫描内容

    条形码扫码枪现在随处可见,可以很迅速地扫描出条形码内容,比什么手机相机扫码快了不是一点两点. 为了节约成本,扫码枪可以直接通过蓝牙连接android或其他设备. 那么android设备如何通过蓝牙获取扫描内容的呢? 1. 蓝牙配对,连接设备 打开系统设置,找到蓝牙,打开扫码枪,配对扫码枪设备.输入一个固定的配对码,一般扫码枪说明书里都有写.配对完成后,显示设备已连接.就ok. 2.AndroidManifest中配置权限 android项目中的AndroidManifest.xml文件添加蓝牙权

  • android实现扫码枪功能

    扫码枪扫码效果等同于键盘录入,会回调dispatchKeyEvent键盘按下事件. 开发环境:有线扫码枪,支持二维码 代码 1. 接收数据 /** * 扫码枪扫码处理 */ @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN) { int keyCode = event.getKeyCode(); char aChar = (char)

  • Android 蓝牙BLE开发完全指南

    目录  介绍 连接模式 GATT协议 使用过程 扫描 连接 设备连接 发现服务 数据传输 其他 断开连接 参考 总结  介绍 1.BLE 是 Bluetooth Low Energy 的缩写,意思为低功耗蓝牙.由蓝牙技术联盟(Bluetooth SIG)设计的无线通讯技术,主要用于医疗,健身,安全和家庭娱乐行业. 与传统蓝牙相比,蓝牙低功耗旨在大幅降低功耗和成本,同时也能够达到相同的通讯效果. 支持多个平台,包括 IOS,Android,Windows Phone 和 BlackBerry 以及

  • Android BLE 蓝牙开发之实现扫码枪基于BLESSED开发

    目录 一.蓝牙模式HID与BLE 二.BLE协议白话 三.第三方库 BLESSED for Android的使用 一.蓝牙模式HID与BLE 当扫码枪与手机连接时,通常采用的是蓝牙HID(Human Interface Device)模式.本质上是一个把扫码枪作为一个硬件键盘,按照键盘协议把扫码后的结果逐个输入到对应的控件上. 优点:无需开发集成,配对就可以立即作为键盘输入使用.可以使用输入框等组件直接接收扫码结果. 缺点:对非数字支持不佳,与输入法相关,在某些时候会触发英文联想-_-||,与虚

  • IOS Ble蓝牙开发实现方法

    本篇博文阐述如何开发Ble蓝牙.在蓝牙中的一些常见服务,扫描,以及链接: 主蓝牙类文件.h 主蓝牙类文件.m UUID文件 蓝牙列表展示的文件 一:引入Ble蓝牙的框架<CoreBluetooth/CoreBluetooth.h> BuleHelp.h #import <Foundation/Foundation.h> //导入蓝牙框架 #import <CoreBluetooth/CoreBluetooth.h> #import "DeviceModel.h

  • Android 基于agora 开发视频会议的代码

    一.概述 参照官方demo,基于agora开发,输入会议号(频道)和显示名称 参会,可设置参会选项. 支持用户注册和登录. 支持多人参会. 二.效果 三.代码 package io.agora.openvcall.ui; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.ActionBar; import android.text.Editable; import andr

  • Android 2d游戏开发之贪吃蛇基于surfaceview

    前两个游戏是基于View游戏框架的,View游戏框架只适合做静止的,异步触发的游戏,如果做一直在动的游戏,View的效率就不高了,我们需要一种同步触发的游戏框架,也就是surfaceview游戏框架,你可能会问,什么乱七八糟的,啥叫同步?啥叫异步?...我就不告诉你...我们先看一下这个同步框架,看看骚年你能不能自己领悟. GameView.java(继承自SurfaceView) package com.next.eatsnake; import android.content.Context

  • Android实现蓝牙(BlueTooth)设备检测连接

    无论是WIFI还是4G网络,建立网络连接后都是访问互联网资源,并不能直接访问局域网资源.比如两个人在一起,A要把手机上的视频传给B,通常情况是打开手机QQ,通过QQ传送文件给对方.不过上传视频很耗流量,如果现场没有可用的WIFI,手机的数据流量又不足,那又该怎么办呢?为了解决这种邻近传输文件的问题,蓝牙技术应运而生.蓝牙技术是一种无线技术标准,可实现设备之间的短距离数据交换. Android为蓝牙技术提供了4个工具类,分别是蓝牙适配器BluetoothAdapter.蓝牙设备BluetoothD

  • Android设备蓝牙连接扫描枪获取扫描内容

    条形扫描枪主要可以扫描条形码和二维码等,扫描速度比手机扫描设备快得多,本文简单介绍android 通过蓝牙监听蓝牙连接,当扫描设备连接完成后,扫描设备相当于外接键盘,通过监听外接键盘输入事件,获取扫描出的内容. 其他参照文档:Android设备获取扫码枪扫描内容 1.蓝牙配对 打开系统设置,蓝牙配对扫描枪, 一般扫描枪说明书都有写,配对完成后,显示已连接 2.AndroidManifest中配置权限 在中配置蓝牙连接所需要的权限 <!-- 蓝牙 --> <uses-permission

  • 基于localStorge开发登录模块的记住密码与自动登录实例

    关于这个模块功能模块的由来,这是鸟大大的处女秀,为什么这么说呢?一天在群里,一个哥们说有私活,开发一个****模块,我那天手痒痒就和他聊了两句,然后,就决定给她做这个模块了,和他谈了谈交付时间,他说最迟两天,然后谈了谈加个,最后达成,500¥!!!这个模块其实第一天晚上我就开发出来了,那时我给他微信说,功能模块开发ok了,要不要远程查看一下,没问题的话就交了,一会他回我,好了就发过来,然后微信就转过来500¥,当时很诧异,毕竟是处女秀,然后就把项目交给他了,并且是完美交付,在客户那里,也没有出现

  • 基于wxpython开发的简单gui计算器实例

    本文实例讲述了基于wxpython开发的简单gui计算器.分享给大家供大家参考.具体如下: # wxCalc1 a simple GUI calculator using wxPython # created with the Boa Constructor which generates all the GUI components # all I had to do is add some code for each button click event # Boa free from: h

  • Android 取消蓝牙配对框实现自动配对功能

    我看了几个文章,主要是接受配对广播,然后设置pin,实现配对,但是网上的大部分手机是不可以的,Android.bluetoothdevice 下 action_pair_request ,没有定义这个,开始困扰了我一点时间,实现难度:是否能进入那个广播响应 定义了一个类,这个是网上的可以直接用 package zicox.esc; import java.lang.reflect.Method; import java.lang.reflect.Field; import android.blu

  • android实现蓝牙文件发送的实例代码,支持多种机型

    最近项目上需要实现蓝牙传输apk的一个功能,能够搜索周围的蓝牙手机并分享文件.从需求上讲android手机自带的蓝牙传输模块就可以满足需要了,实现也很简单.不过让人头疼的是,虽然说一般的主流机型都配置有蓝牙模块,但是android机型碎片化太严重,不同android版本手机蓝牙功能也不一样.4.0.3以下版本和以上版本使用的蓝牙包是不同的,分别是"com.android.bluetooth"和"com.mediatek.bluetooth".还有一些厂商对蓝牙模块进

随机推荐