分享我的Android蓝牙开源作品—HBluetooth

本篇将跟大家分享我在github上的一个开源项目,是关于安卓蓝牙开发的封装,包含蓝牙设备的搜寻、连接、通信,支持经典蓝牙和低功耗蓝牙,语言版本有Java和Kotlin两个版本。...

哥们,我最近搞了个关于安卓蓝牙开发封装的开源项目。这玩意儿兼容老式蓝牙和低功耗蓝牙,用Java和其他几种语言编写。做这个主要是想帮新手和学习者们更好地弄懂安卓蓝牙怎么玩。初衷可不是为了填补市场的空缺,而是想让刚入行的小伙伴们有个学习的起点。下边,我得详细跟大家说说怎么用这个项目,还有我的一些想法。

一、为什么选择封装这个框架

我想到要搞个封装的框架开源语言安卓版,主要是因为做安卓蓝牙开发时发现,市面上的好东西不少,可对新手来说,那些框架太复杂了,理解起来也不容易。所以我想弄个简单好懂点的框架,让新手们更快学会蓝牙开发。所以设计框架的时候,我特别留意分的模块和代码的清晰度,希望每个新手读源码的时候都能感到做蓝牙开发的乐趣。

在这套体系中,我尽量不搞得太复杂,直接用安卓原生代码,让大家看清楚每一步的操作。虽然我水平有限,做不到完美,但想通过这个项目,激发大家对安卓蓝牙开发的兴趣。毕竟,学东西本身就是挺有意思的,这框架是我分享乐趣的一种方式。

二、我的开发经历与收获

我工作里相当一部分时间都在研究蓝牙这事儿。封装这个框架开源语言安卓版,主要是为了帮助别人,其实也让我自己对蓝牙有了更深的认识。在这一来一回的摸索里,我对蓝牙开发的玩意儿有了新的梳理,发现了好多之前没留意的细节。比如,蓝牙设备怎么连接,通信时注意事项那些,都是在弄框架的过程中慢慢领悟的。

而且,项目做着做着,我慢慢发现蓝牙开发不简单,特别在兼容各种蓝牙设备时,老碰上没想到的麻烦。这经历让我更有心把这套框架分享出去,希望帮到更多开发者,尤其是刚接触这个新领域的朋友们。

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

三、项目的基本使用方法

dependencies {
     implementation 'com.github.g-HJY:HBluetooth:V1.3.6'
}

大家好,我来讲讲这个开源项目的用法。它有两种语言版本,Java和另一个版本,随便选一个你喜欢来开发。接入这框架特别容易,要么下全套项目,要么简单加上依赖到你的项目里即可。

         public class MyApp extends Application {
             @Override
             public void onCreate() {
                 super.onCreate();
                 //初始化 HBluetooth
                 HBluetooth.init(this);
             }
         }

用之前,先在你的应用里跑一遍初始化流程。然后,别忘了打开蓝牙功能,这可是关键一步。要是你用低功耗蓝牙,还得设置点东西,比如主要服务ID、读写特征的ID这类的。听着麻烦开源语言安卓版,但都是为了设备能顺畅连接和交流。

四、设备扫描与连接

             //开启蓝牙功能
             HBluetooth.getInstance().enableBluetooth()

完成了前面的步骤后,就来扫蓝牙设备。要选好是经典蓝牙还是低功耗蓝牙。找到设备后,连上它。一切搞定了,就可以跟设备聊天了。这整个操作就是围着连接和交流转的。

我操作过程中遇到点麻烦,像设备老断线、数据传得慢这些。这事儿挺闹心的,但也让我更懂蓝牙这行的门道。做这个项目就是想让大家以后遇到这些情况能更快解决。

五、持续优化与维护

     //请填写你自己设备的UUID
        //低功耗蓝牙才需要如下配置BleConfig,经典蓝牙不需要new HBluetooth.BleConfig()
        HBluetooth.BleConfig bleConfig = new HBluetooth.BleConfig();
        bleConfig.withServiceUUID("0000fe61-0000-1000-8000-00805f9b34fb")
                 .withWriteCharacteristicUUID("0000fe61-0000-1000-8000-00805f9b34fb")
                 .withNotifyCharacteristicUUID("0000fe61-0000-1000-8000-00805f9b34fb")
                //命令长度大于20个字节时是否分包发送,默认false,分包时可以调两参方法设置包之间发送间隔
                //.splitPacketToSendWhenCmdLenBeyond(false)
                //useCharacteristicDescriptor 默认false
                //.useCharacteristicDescriptor(false)
                .setMtu(200, new BleMtuChangedCallback() {
                    @Override
                    public void onSetMTUFailure(int realMtuSize, BluetoothException bleException) {
                        Log.i(TAG, "bleException:" + bleException.getMessage() + "  realMtuSize:" + realMtuSize);
                    }
                    @Override
                    public void onMtuChanged(int mtuSize) {
                        Log.i(TAG, "Mtu set success,mtuSize:" + mtuSize);
                    }
                });
     //低功耗蓝牙才需要调setBleConfig
	HBluetooth.getInstance().setBleConfig(bleConfig);

一直都在给这个项目找bug还升级。前阵子有个哥们儿给我提出了第一个问题,心里还挺激动,也感觉这玩意儿还是挺有用的。咱这框架虽然不是顶级的,但我会继续调整,保证更多新手能靠它学好。

咱们得相信,随着时间发展,蓝牙技术肯定会越做越好,这个体系也会越来越完善。大家都来给些建议,让我们一起把项目做得更棒。毕竟,开源就是要大家一起来分享和帮忙,大家齐心协力,这个框架才能更好地帮到每个开发者。

           HBluetooth.getInstance()
                .scan(type, new ScanCallBack() {
            @Override
            public void onScanStart() {
                Log.i(TAG, "开始扫描");
            }
            @Override
            public void onScanning() {
                Log.i(TAG, "扫描中");
            }
            @Override
            public void one rror(int errorType, String errorMsg) {
            }
            @Override
            public void onScanFinished(List bluetoothDevices) {
                Log.i(TAG, "扫描结束");
                if (bluetoothDevices != null && bluetoothDevices.size() > 0) {
                    list.clear();
                    list.addAll(bluetoothDevices);
                    adapter.notifyDataSetChanged();
                }
            }
        });
或者,如果你想在第一步操作后直接进行扫描,则可以这样调用:
        HBluetooth.getInstance()
                .enableBluetooth()
                .scan(type, new ScanCallBack() {
            @Override
            public void onScanStart() {
                Log.i(TAG, "开始扫描");
            }
            @Override
            public void onScanning() {
                Log.i(TAG, "扫描中");
            }
            @Override
            public void one rror(int errorType, String errorMsg) {
            }
            @Override
            public void onScanFinished(List bluetoothDevices) {
                Log.i(TAG, "扫描结束");
                if (bluetoothDevices != null && bluetoothDevices.size() > 0) {
                    list.clear();
                    list.addAll(bluetoothDevices);
                    adapter.notifyDataSetChanged();
                }
            }
        });

相关文章

发表评论