安卓蓝牙技术Bluetooth使用流程(Bluetooth详解)
一:蓝牙设备之间的通讯首要包含了四个进程
设置蓝牙设备 寻觅局域网内也许或许匹配的设备 衔接设备 设备之间的数据传输
二:详细编程完结
1. 发动蓝牙功用
首要经过调用静态办法getDefaultAdapter()获取蓝牙适配器BluetoothAdapter,假如回来为空,则无法继续执行了。例如安卓源码:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // Device does not support Bluetooth }
其次,调用isEnabled()来查询当时蓝牙设备的状况,假如回来为false,则表明蓝牙设备没有敞开,接下来你需求封装一个ACTION_REQUEST_ENABLE恳求到intent里面,调用startActivityForResult()办法使能蓝牙设备,例如:
if (!mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
2. 查找设备
运用BluetoothAdapter类里的办法,你能够查找远端设备(大约十米以内)或许查询在你手机上现已匹配(或许说绑定)的别的设备了。当然需求断定对方蓝牙设备现已敞开或许现已敞开了“被发现使能”功用(对方设备是能够被发现的是你能够建议衔接的前提条件)。假如该设备是能够被发现的,会反馈回来一些对方的设备信息,比方姓名、MAC地址等,运用这些信息,你的设备就能够挑选去向对方初始化一个衔接。
假如你是首次与该设备衔接,那么一个配对的恳求就会主动的显示给用户。当设备配对好今后,他的一些根本信息(首要是姓名和MAC)被保留下来并能够运用蓝牙的API来读取。运用已知的MAC地址就能够对远端的蓝牙设备建议衔接恳求。
匹配好的设备和衔接上的设备的不同点:匹配好仅仅阐明对方设备发现了你的存在,并具有一个一起的识别码,而且能够衔接。衔接上:表明当时设备同享一个RFCOMM信道而且两者之间能够交换数据。也即是是说蓝牙设备在树立RFCOMM信道之前,有必要是现已配对好了的。
3. 查询匹配好的设备
在树立衔接之前你有必要先查询配对好了的蓝牙设备集以便挑选一个设备进行通讯,例如你能够你能够查询一切配对的蓝牙设备,并运用一个数组适配器将其打印显示出来:
SetpairedDevices =mBluetoothAdapter.getBondedDevices(); // If there are paired devices
if (pairedDevices.size() > 0) {
//Loop through paired devices
for (BluetoothDevice device : pairedDevices) {
// Add the name and address to an array adapter to show in a ListView
mArrayAdapter.add(device.getName() + "\n" + device.getAddress()); }
}
树立一个蓝牙衔接只需求MAC地址就现已满足。
4. 扫描设备
扫描设备,只需求调用startDiscovery()办法,这个扫描的进程大约继续是12秒,应用程序为了ACTION_FOUND动作需求注册一个BroadcastReceiver来承受设备扫描到的信息。关于每一个设备,体系都会播送ACTION_FOUND动作。
// 用ACTION_FOUND为action注册播送接收器 private final BroadcastReceiver mReceiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); // 发现设备 if (BluetoothDevice.ACTION_FOUND.equals(action)) { // 从Intent中获取蓝牙设备 BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); // 增加姓名和地址到设备适配器中 mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
}; //注册播送接收器 IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter); //在onDestroy时记住刊出播送接收器
5. 使能被发现
假如你想使你的设备能够被别的设备发现,将ACTION_REQUEST_DISCOVERABLE动作封装在intent中并调用startActivityForResult(Intent, int)办法就能够了。它将在不使你应用程序退出的情况下使你的设备能够被发现。缺省情况下的使能时刻是120秒,当然你能够能够经过增加EXTRA_DISCOVERABLE_DURATION字段来改动使能时刻(最大不超越300秒)例如:
Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE); discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300); startActivity(discoverableIntent);
运转该段代码今后,体系会弹出一个对话框来提示你发动设备使能被发现(此进程中假如你的蓝牙功用没有敞开,体系会帮你敞开),而且假如你预备对该远端设备发现一个衔接,你不需求敞开设备被发现功用,由于该功用仅仅在你的应用程序作为效劳器端的时分才需求。
6. 衔接设备
在应用程序中,想树立两个蓝牙设备之间的衔接,有必要完结客户端和效劳器端的代码(由于任何一个设备都有必要能够作为效劳端或许客户端)。一个敞开效劳来监听,一个建议衔接恳求(运用效劳器端设备的MAC地址)。当他们都具有一个蓝牙套接字在同一RFECOMM信道上的时分,能够以为他们之间现已衔接上了。效劳端和客户端经过不同的办法或别的们的蓝牙套接字。当一个衔接监听到的时分,效劳端获取到蓝牙套接字。当客户可翻开一个FRCOMM信道给效劳器端的时分,客户端获取到蓝牙套接字。
注意:在此进程中,假如两个蓝牙设备还没有配对好的,android体系会经过一个通知或许对话框的方式来通知用户。RFCOMM衔接恳求会在用户挑选之前堵塞。
7. 效劳端的衔接
当你想要衔接两台设备时,一个有必要作为效劳端(经过持有一个翻开的BluetoothServerSocket),目的是监听外来衔接恳求,当监听到今后提供一个衔接上的BluetoothSocket给客户端,当客户端从BluetoothServerSocket得到BluetoothSocket今后就能够毁掉BluetoothServerSocket,除非你还想监听更多的衔接恳求。
树立效劳套接字和监听衔接的根本进程:
首要经过调用listenUsingRfcommWithServiceRecord(String, UUID)办法来获取BluetoothServerSocket目标,参数String代表了该效劳的称号,UUID代表了和客户端衔接的一个标识(128位格局的字符串ID,相当于PIN码),UUID有必要两边匹配才能够树立衔接。
其次调用accept()办法来监听也许到来的衔接恳求,当监听到今后,回来一个衔接上的蓝牙套接字BluetoothSocket。
最后,在监听到一个衔接今后,需求调用close()办法来封闭监听程序。(通常蓝牙设备之间是点对点的传输)
注意:accept()办法不应该放在主Acitvity里面,由于它是一种堵塞调用(在没有监听到衔接恳求之前程序就一向停在那里)。解决办法是新建一个线程来办理。例如:
8. 客户端的衔接
为了初始化一个与远端设备的衔接,需求先获取代表该设备的一个BluetoothDevice目标。经过BluetoothDevice目标来获取BluetoothSocket并初始化衔接,详细进程:
运用BluetoothDevice目标里的办法createRfcommSocketToServiceRecord(UUID)来获取BluetoothSocket。UUID即是匹配码。然后,调用connect()办法来。假如远端设备接收了该衔接,他们将在通讯进程中同享RFFCOMM信道,而且connect回来。
注意:conncet()办法也是堵塞调用,通常树立一个独立的线程中来调用该办法。在设备discover进程中不应该建议衔接connect(),这么会显着减慢速度以至于衔接失败。且数据传输完结只要调用close()办法来封闭衔接,这么能够节约体系内部资源。
9. 办理衔接
当设备衔接上今后,每个设备都具有各自的BluetoothSocket。就能够完结设备之间数据的同享了。
首要经过调用getInputStream()和getOutputStream()办法来获取输入输出流。
然后经过调用read(byte[]) 和write(byte[]).办法来读取或许写数据。
完结细节:以为读取和写操作都是堵塞调用,需求树立一个专用线程来办理。
10. 权限设置
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permissionandroid:name="android.permission.BLUETOOTH" />