Android爪机连接蓝牙设备并进行通信的小例子

一般的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;

		@Override
		public 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)));
				// 连接ok
				BufferedInputStream in = new BufferedInputStream(mBTSocket.getInputStream());
				int b1 = in.read();
				int b2 = in.read();
				if (b1 == 0xaa && b2 == 0x53) {
					// 帧头找到
					in.skip(2);// 跳过设备ID
					in.skip(2);// 跳过指令长度
					in.skip(1);// 跳过指令码
					int lenEPC = in.read(); // EPC长度
					System.out.println("EPC lenth: " + lenEPC);
					StringBuilder builderEPC = new StringBuilder();
					// 读取EPC
					System.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.有木有相关实例代码,求发给楼主一份,楼主也想站在巨巨们的肩膀上,求成全~。~

(求代码不能忘记留邮箱:[email protected],谢谢)

你可能感兴趣的:(Android,Android,蓝牙,通信,实例,打印)