前段时间由于项目需要,针对部分热敏蓝牙打印机做了开发,本来刚开始是要用佳博的,结果开发完了说要换成汉印的打印机(此时内心一万只草泥马奔腾而过)。好了,言归正传。既然是蓝牙打印机,那么首先要做的就是进行蓝牙开发。先贴一个别人推荐的一个开源库:https://github.com/Jasonchenlijian/FastBle 话说在15年的时候有接触过原生的蓝牙开发,但是那时候并没有运用到项目中,当时给我的一个感觉就是再也不要做这个玩意儿了。没想到从今年(2019年)开始,一直在做这方面的项目,为了养家糊口只能硬着头皮上了。各种Google各种百度,最后还是没搞明白,那就放弃吧(怎么阔能,我是那么容易放弃的人吗(●'◡'●))。最后还是得感谢老天眷顾,我朋友他们也都在做这个,那就一起约个饭出来聊波技术咯~
其实对于蓝牙开发,最难的不是网上能找到的那些东西,它的一个关键点就是它需要的那几个UUID怎么获取?从何而来?同样这也是困惑我良久的一个问题。(serviceUuid、 writeCharactUuid 、 notifyCharactUuid 这三个)。我问了好多人他们都说不知道,实际上这个应该是厂家那边应该提供过来的,但是厂家不是技术,他们根本都不知道这是什么玩意儿,好吧 ,我跪了。那是不是真的没有办法了?并不是,虽然我的办法有点不太靠谱,但是对于菜的要死又无知的自己来说,当然要抱着试一试的态度咯。
连接成功后拿到UUID集合然后进行遍历,将遍历得到的这些UUID一个一个赋值去试,终于皇天不负有心人,守得云开见月明,成功啦。o(* ̄▽ ̄*)ブ(PS:这么长时间的头发总算没有白掉)。
下面介绍一下完整步骤。
首先,清单文件中给权限(6.0以上一定要加定位权限):
<!-- 使用蓝牙的权限 -->
<uses-permission android:name="android.permission.BLUETOOTH" />
<!-- 扫描蓝牙设备或者操作蓝牙设置 -->
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!--模糊定位权限,仅作用于6.0+-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!--精准定位权限,仅作用于6.0+-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
还有要添加
<uses-feature
android:name="android.hardware.bluetooth_le"
android:required="true" />
<service android:name="com.inuker.bluetooth.library.BluetoothService" />
然后就根据之前贴出的开源库进行开发就好了,我在这里贴一个工具类:
public class BleUtil {
private static final String TAG = "BleUtil-->";
private static BleUtil bleUtil;
public List<BleDevice> bleDevices;
private OnBleListener listener;
private String uuid_service = "自己获取的";
//接受数据特征UUID
private String uuid_characteristic_receive = "自己获取的";
//发送数据特征UUID(视情况而定,本人不需要发送数据功能)
// private String uuid_characteristic_send = "自己获取的";
private boolean isStandByBle;
private boolean isEnableBle;
private Context context;
private Handler handler = new Handler(Looper.getMainLooper());
private final int START_SCAN = 100;
private final int RESET_CONNECT = 101;
// private final UUID[] serviceUuids;
private BleDevice connectedBleDevice;
private BleScanRunnable bleScanRunnable;
private BleResetConnectRunnable bleConnectRunnable;
private BleManager bleManager;
private BleConnectedRunnable bleConnectedRunnable;
private boolean isResetConnect = false;
private boolean isScaning;
private final ReturnTimeOutRunnable returnTimeOutRunnable;
private String currentData = "";
private final ReceiveDataRunnable receiveDataRunnable;
private BleUtil(Context context) {