Android爪机连接蓝牙设备并进行通信的小例子
16lz
2021-01-26
一般的Android手机都带有蓝牙,虽说BT这东西放到现在看速度是奇慢,但还是有很多的手持设备等,提供了蓝牙的支持,那么用我们的手机,就可以连接到这些设备,然后进行一些操作。
比如楼主这次要实现的是用手机连接到蓝牙设备,扫描RFID码。
先大体说下步骤吧:
1.打开手机和设备的BT。
2.手机和设备进行配对,扫描,输入密码进行配对。
3.手机和设备之间建立起Socket通信。
4.发/收消息,进行通信。
5.关掉Socket,GG。
步骤1~2,我是直接在设置里进行操作的,自己再写一套太麻烦了。这里我们主要来看3~5步:
首先,要从已配对的设备列表中,找到我们要连接的目标设备。
BluetoothAdapter是这样获取的:
mBTAdapter = BluetoothAdapter.getDefaultAdapter();
通过BTAdapter,就可以获取已经配对的设备列表,从中挑选出我需要的BTDevice:
/** * 找到目录设备(已配对) */private void connectToDevice() {mTargetDevice = null;Set devices = mBTAdapter.getBondedDevices();if (devices != null && devices.size() > 0) {Iterator iterator = devices.iterator();while (iterator.hasNext()) {// 有带关键字"6301"的,则取之BluetoothDevice dev = iterator.next();if (dev.getName().contains("6301")) {mTargetDevice = dev;break;}}if (mTargetDevice == null) {// 无则取第一个mTargetDevice = devices.iterator().next();}mConnectedDev.setText(String.format(getString(R.string.connected_device),mTargetDevice.getName()));// 开始扫描mScanThread = new ST(mTargetDevice);mScanThread.start();} else {mConnectedDev.setText(R.string.no_bond_device);}}
有了目标设备,我们就可以进行连接了,工作放在另一个线程里来做:
private class ST extends Thread {private ST(BluetoothDevice d) {mDevice = d;// 正在连接至设备mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0,getString(R.string.connecting_to_device)));}private BluetoothDevice mDevice;private BluetoothSocket mBTSocket;@Overridepublic void run() {try {Method m = mDevice.getClass().getMethod("createRfcommSocket", new Class[] {int.class});mBTSocket = (BluetoothSocket) m.invoke(mDevice, 1);mBTSocket.connect();// 可以开如扫描mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0, getString(R.string.ok_to_scan)));// 连接okBufferedInputStream in = new BufferedInputStream(mBTSocket.getInputStream());int b1 = in.read();int b2 = in.read();if (b1 == 0xaa && b2 == 0x53) {// 帧头找到in.skip(2);// 跳过设备IDin.skip(2);// 跳过指令长度in.skip(1);// 跳过指令码int lenEPC = in.read(); // EPC长度System.out.println("EPC lenth: " + lenEPC);StringBuilder builderEPC = new StringBuilder();// 读取EPCSystem.out.println("read EPC E");for (int i = 0; i < lenEPC; i++) {builderEPC.append(Integer.toHexString(in.read()));}System.out.println("read EPC X");mRFIDString = builderEPC.toString().trim().toUpperCase();mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0, mRFIDString));} else {readFailed();}} catch (Exception e) {e.printStackTrace();readFailed();} finally {if (mBTSocket != null) {try {mBTSocket.close();} catch (IOException e) {e.printStackTrace();}}}}private void readFailed() {mHandler.sendMessage(mHandler.obtainMessage(0, 0, 0,getString(R.string.scan_failed_plz_retry)));}public void closeSocket() {if (mBTSocket != null) {try {mBTSocket.close();mBTSocket = null;} catch (IOException e) {e.printStackTrace();}}}}
说明:
1. run()方法开头用反射调用"createRfcommSocket"方法的一段代码,是为了解决连接时频繁报出connection reset等问题的,引起这些问题的主要原因,还是由于传入的UUID不对。
2. BluetoothSocket和普通的Socket基本是一样的,用起来无门槛。
这个例子,是手机连接蓝牙设备使用到的一个通用例子,run()里的操作,是根据蓝牙设备的不同而不同的。
楼主现在在琢磨Android手机连接蓝牙打印机进行打印,有相关经验的朋友,望不吝赐教,解答以下问题:
1. 有没有一个“大一统”的蓝牙打印机API包?
2. 没有的话,是不是每针对一款打印机,就要写一套通代码?
3.有木有相关实例代码,求发给楼主一份,楼主也想站在巨巨们的肩膀上,求成全~。~
(求代码不能忘记留邮箱:ueryueryuery@163.com,谢谢)
更多相关文章
- Android:创建可穿戴应用 - 建立模拟器和创建项目
- Android设备获取扫码枪扫描的内容与可能遇到的问题解决
- Android传感器 设备坐标系到世界坐标系的转换 分析以及应用
- Android(安卓)Developers:传感器概述
- android Ble4.0蓝牙开发之搜索慢、startLeScan()过时,6.0以上不需
- Android传感器概述(二)
- 跟Google学习Android开发-起始篇-支持不同的设备(1)
- Android设备MTP方式连接PC增删文件无法实时更新的问题
- android版本兼容,高版本低版本兼容性-[Android_YangKe]