关于安卓蓝牙开发的探索

简介: 安卓蓝牙开发

日常开发中,蓝牙通信一般用于手机与手机或者手机与硬件。为此,特别开发一个module,用于日常使用。
代码地址在文末~~~~
项目构成图
代码结构如上图,libble的module,就是蓝牙库。
下图中,BLEManager就是本库对外调用的唯一类。
代码目录

实现思路

(一)检查手机的蓝牙状态,如蓝牙的开关,是否可用等状态

通过安卓自带的BluetoothAdapter对象,可以对蓝牙进行开关等操作:

开启蓝牙
BLEObjProvider.getInstance().getBluetoothAdapter().enable();
关闭蓝牙
BLEObjProvider.getInstance().getBluetoothAdapter().disable();
蓝牙是否打开
BLEObjProvider.getInstance().getBluetoothAdapter().isEnabled();
AI 代码解读

(二)扫描附近的蓝牙

代码如下:

取消扫描
BLEObjProvider.getInstance().getBluetoothAdapter().cancelDiscovery();
开始扫描(注意,扫描前先取消扫描)
BLEObjProvider.getInstance().getBluetoothAdapter().startDiscovery();
AI 代码解读

(三)连接蓝牙(注意客户端和服务端的连接方式)

客户端主动连接代码:

mSendSocket = mCurrentBLEInfo.getDevice().
createRfcommSocketToServiceRecord(UUID.fromString(mCurrentSendUUID));
mSendSocket.connect();
AI 代码解读

服务端监听核心代码

mServerSocket = BLEObjProvider.getInstance().getBluetoothAdapter()
.listenUsingInsecureRfcommWithServiceRecord(
"SERVER", UUID.fromString(mCurrentReceiveUUID));
mReceiveSocket = mServerSocket.accept();
AI 代码解读

(四)消息的收发

消息发送核心代码

mSendBufferedReader = new BufferedReader(new InputStreamReader(
                            new ByteArrayInputStream(data.getBytes())));
                    mSendBufferedWriter = new BufferedWriter(
                            new OutputStreamWriter(mSendSocket.getOutputStream()));
                    String txt;
                    while ((txt = mSendBufferedReader.readLine()) != null) {
                        mSendBufferedWriter.write(txt + "\n");
                    }
                    mSendBufferedWriter.flush();
AI 代码解读

接收消息核心代码:

 mServerSocket = BLEObjProvider.getInstance().getBluetoothAdapter()
                        .listenUsingInsecureRfcommWithServiceRecord(
                                "SERVER", UUID.fromString(mCurrentReceiveUUID));
                BLELog.d(TAG, "等待连接1");
                mReceiveSocket = mServerSocket.accept();
                mReceiveBufferedReader = mReceiveSocket.getInputStream();
                mServerSocket.close();
                mIsBeConnectEd = true;
                BLELog.d(TAG, "等待连接2");
                notifyStatus(5);
                //被连接后,监听连接
                while (mIsBeConnectEd) {
                    //使用byte固定长度进行读取,不使用read line原因是其会导致阻塞
                    cacheByte = new byte[2048];
                    int length = mReceiveBufferedReader.read(cacheByte, 0, cacheByte.length);
                    readTxt = new String(cacheByte, 0, length);
                    if (!TextUtils.isEmpty(readTxt)) {
                        BLELog.d(TAG, "接收信息:" + readTxt);
                        for (BLEDataListener listener : mListener) {
                            listener.receiveCallBack(readTxt);
                        }
                    }
                }
AI 代码解读

以上,就是所有核心代码的介绍,不过具体该蓝牙库实现起来,还是有些细节需要考虑的:

(一)蓝牙的自动重连机制(开放给开发者自行设置)

(二)蓝牙接收数据时,read方法的方式。注意read方法和readline()的区别。readline()会导致线程阻塞,从而导致anr的发生。

(三)注意发送消息的队列处理,如发送队列的数据管理。

最后,附上该蓝牙库的api一览表:

  /**
     * 搜索设备
     */
    boolean scanDevice();

    /**
     * 停止搜索
     */
    boolean stopScan();

    /**
     * 连接蓝牙
     */
    void connect(BLEInfo info, String uuid);

    /**
     * 断开连接
     */
    void disConnect();

    /**
     * 设置接收
     */
    void receive(String uuid);

    /**
     * 断开接收
     */
    void disReceive();

    /**
     * 发送数据
     */
    void sendData(String data);

    /**
     * 释放所有
     */
    void releaseAll();

    /**
     * 客户端是否自动重连--每次使用都要重新设置
     */
    void clientAutoConnect(boolean auto);

    /**
     * 服务端自动监听--每次使用都要重新设置
     */
    void serverAutoAccept(boolean auto);

    /**
     * 是否打开蓝牙
     */
    boolean isOpenBLE();

    /**
     * 打开蓝牙
     */
    boolean openBLE();

    /**
     * 关闭蓝牙
     */
    boolean closeBLE();
  /**
     * 设置结果监听
     */
    void setOnResultListener(BLEScanResultListener listener);

    /**
     * 移除结果监听
     */
    void removeResultListener(BLEScanResultListener listener);

    /**
     * 设置状态监听
     * */
    void setOnStatusListener(BLEStatusListener listener);

    /**
     * 移除状态监听
     * */
    void removeOnStatusListener(BLEStatusListener listener);

    /**
     * 设置数据监听
     * */
    void setOnDataListener(BLEDataBackListener listener);

    /**
     * 移除数据监听
     * */
    void removeOnDataListener(BLEDataBackListener listener);
AI 代码解读

代码传送门

that's all-------------------------------------------------------------------

目录
相关文章
Termux安卓终端美化与开发实战:从下载到插件优化,小白也能玩转Linux
Termux是一款安卓平台上的开源终端模拟器,支持apt包管理、SSH连接及Python/Node.js/C++开发环境搭建,被誉为“手机上的Linux系统”。其特点包括零ROOT权限、跨平台开发和强大扩展性。本文详细介绍其安装准备、基础与高级环境配置、必备插件推荐、常见问题解决方法以及延伸学习资源,帮助用户充分利用Termux进行开发与学习。适用于Android 7+设备,原创内容转载请注明来源。
274 76
escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
escrcpy 是一款基于 Scrcpy 的开源项目,使用 Electron 构建,提供图形化界面来显示和控制 Android 设备。它支持 USB 和 Wi-Fi 连接,帧率可达 30-120fps,延迟低至 35-70ms,启动迅速且画质清晰。escrcpy 拥有丰富的功能,包括自动化任务、多设备管理、反向网络共享、批量操作等,无需注册账号或广告干扰。适用于游戏直播、办公协作和教育演示等多种场景,是一款轻量级、高性能的 Android 控制工具。
124 1
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
85 8
【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
72 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
219 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
175 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
73 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
217 3
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
97 19
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
139 14

热门文章

最新文章