https://blog.csdn.net/lf0814/article/details/79217937
2018年01月31日 15:39:17 CristianoLi` 阅读数:3504
蓝牙&WiFi
蓝牙:安卓平台提供对蓝牙的通讯栈的支持,允许设别和其他的设备进行无线传输数据。应用程序层通过安卓API来调用蓝牙的相关功能,这些API使程序无线连接到蓝牙设备,并拥有P2P或者多端无线连接的特性。
功能:客户端先在系统页面打开蓝牙和服务端进行配对,配对完成后,返回APP中,显示所有已经配对的蓝牙设备信息列表。点击某一个已配对的蓝牙设备,客户端和服务端进行蓝牙通讯连接。连接成功后,显示服务端的一些支持信息,然后进入WIFI设置页面,扫描WiFi列表,点击某一个WiFi进行密码连接,连接成功后,将WiFi信息发送到服务端,服务端接收后开始连接,完成。
支持Apple的设备与Android设备的通讯:通过使用BLE(低功耗蓝牙,Bluetooth Low Energy,又叫蓝牙4.0)就可以实现,它有两个角色,分别是中央角色,和周边角色。中心设备(中央角色)使用来自与外部设备的信息去完成某项特定任务,外部设备(周边角色)包含一项或者多项服务,一个服务是一个数据集合。
(一)蓝牙相关
(1)权限
蓝牙所需权限,(6.0之上需要用户授权)
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
(2)API相关
经典模式:
-
- BluetoothAdapter:代表本地蓝牙适配器(蓝牙无线电)。BluetoothAdapter是所有蓝牙交互的入口。使用这个你可以发现其他蓝牙设备,查询已配对的设备列表,使用一个已知的MAC地址来实例化一个BluetoothDevice,以及创建一个BluetoothServerSocket来为监听与其他设备的通信。
- BlueDevice:代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息。
- BluetoothSocket:代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。
- BluetoothServerSocket:代表一个开放的服务器socket,它监听接受的请求(与TCP ServerSocket类似)。为了连接两台Android设备,一个设备必须使用这个类开启一个服务器socket。当一个远程蓝牙设备开始一个和该设备的连接请求,BluetoothServerSocket将会返回一个已连接的BluetoothSocket,接受该连接。
BLE:
- BluetoothGatt:继承BluetoothProfile,通过BluetoothGatt可以连接设备(connect),发现服务(discoverServices),并把相应地属性返回到BluetoothGattCallback,可以看成蓝牙设备从连接到断开的生命周期。
- BluetoothGattCharacteristic:相当于一个数据类型,可以看成一个特征或能力,它包括一个value和0~n个value的描述(BluetoothGattDescriptor)。
- BluetoothGattDescriptor:描述符,对Characteristic的描述,包括范围、计量单位等。
- BluetoothGattService:服务,Characteristic的集合。
- BluetoothGattCallback:已经连接上设备,对设备的某些操作后返回的结果。
3)功能的实现:
经典模式:
1>. 获取蓝牙适配器:
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
2>.判断蓝牙是否打开,并监听蓝牙打开状态
if (!mBluetoothAdapter.isEnabled()) {
//若没打开则打开蓝牙
mBluetoothAdapter.enable();
}
IntentFilter btoothFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
registerReceiver(btoothWifiBrocast, btoothFilter);
class BtoothWifiBrocast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int blueState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 0);
switch (blueState) {
case BluetoothAdapter.STATE_TURNING_ON:
ToastUtil.showShort("蓝牙打开中...");
break;
case BluetoothAdapter.STATE_ON:
ToastUtil.showShort("蓝牙已打开");
llBtoothInfo.setVisibility(View.VISIBLE);
getBluetoothList();
break;
case BluetoothAdapter.STATE_TURNING_OFF:
ToastUtil.showShort("蓝牙关闭中...");
break;
case BluetoothAdapter.STATE_OFF:
ToastUtil.showShort("蓝牙已关闭");
llBtoothInfo.setVisibility(View.INVISIBLE);
break;
default:
break;
}
}
}
}
3&g