首要我们来回忆一下
Bluetooth Low Energy (BLE) Mode(低功耗蓝牙形式)
是 Android 操作系统中支撑低功耗蓝牙设备衔接和通讯的一种形式。它专门设计用于衔接和交互低功耗设备,如智能手环、智能家居设备、传感器等。
BLE 形式相对于传统蓝牙形式具有以下特点:
-
低功耗:BLE 形式专心于下降能量消耗,以延长设备的电池寿命。它采用了一系列的能量优化战略,如睡觉形式、衔接间隙调整和数据包尺度控制等,以最小化通讯过程中的功耗。
-
快速衔接:BLE 形式支撑快速衔接和断开衔接,以下降设备之间树立衔接所需的时刻和功耗。这使得低功耗设备能够在需求时快速与 Android 设备树立衔接,并在完成任务后快速断开衔接以节省能量。
-
周期性数据传输:BLE 形式适用于周期性地传输小量数据。它运用了一种称为 GATT(Generic Attribute Profile)的协议,答应设备界说服务和特性,以便在衔接期间传输数据。这种数据传输方法适用于传感器数据、健康监测数据等周期性生成的小数据量。
-
中心与外围设备人物:在 BLE 形式下,Android 设备能够一起充任中心设备(Central)和外围设备(Peripheral)的人物。作为中心设备,Android 设备能够查找并衔接到周围的外围设备。作为外围设备,Android 设备能够承受来自中心设备的衔接请求,并进行数据交换。
-
蓝牙配对简化:BLE 形式引入了简化的蓝牙配对过程。它运用了一种称为 LE Secure Connections 的安全协议,支撑更安全的配对和衔接过程,一起减少了用户干预的需求。
在 Android 上运用 BLE 形式,开发者能够利用 Android 供给的 Bluetooth Low Energy API 进行设备查找、衔接管理、数据传输和服务特性的交互。经过这些 API,开发者能够完成与 BLE 设备的通讯和交互,以满足特定运用的需求。
总结来说,Bluetooth Low Energy (BLE) Mode 是 Android 中用于低功耗蓝牙设备衔接和通讯的形式。它专心于下降功耗、快速衔接、周期性数据传输,并供给了中心和外围设备人物的支撑。经过运用 BLE 形式,开发者能够完成与低功耗设备的交互,满足各种运用场景的需求。
接下来我们要用Bluetooth Low Energy (BLE) Mode(低功耗蓝牙形式)完成一个简略蓝牙谈天示例:
首要,在 AndroidManifest.xml 文件中增加以下权限:
复制代码
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
首要,你需求创立一个用于扫描和显现邻近蓝牙设备的设备列表界面。这个界面应该包含一个列表视图用于显现可用设备,并供给扫描按钮以扫描邻近的设备。当用户挑选一个设备时,你需求树立与该设备的蓝牙衔接。
接下来,你需求创立一个谈天界面,用于显现收发的音讯。这个界面应该包含一个音讯列表视图和一个用于输入音讯的文本框,以及一个发送按钮。当用户输入音讯并点击发送按钮时,你需求将音讯经过蓝牙发送给已衔接的设备,并将收到的音讯显现在音讯列表中。
下面是一个简化的示例代码,用于演示这个蓝牙谈天运用的结构:
复制代码
// 设备列表界面
public class DeviceListActivity extends AppCompatActivity {
// TODO: 完成设备扫描和衔接逻辑
}
// 谈天界面
public class ChatActivity extends AppCompatActivity {
// TODO: 完成音讯收发和蓝牙衔接逻辑
}
DeviceListActivity
设备列表界面的代码:
public class DeviceListActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private List<BluetoothDevice> deviceList;
private DeviceListAdapter deviceListAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_device_list);
// 初始化 BluetoothAdapter
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
deviceList = new ArrayList<>();
deviceListAdapter = new DeviceListAdapter(deviceList);
ListView deviceListView = findViewById(R.id.deviceListView);
deviceListView.setAdapter(deviceListAdapter);
deviceListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// 衔接到选中的设备
BluetoothDevice selectedDevice = deviceList.get(position);
Intent chatIntent = new Intent(DeviceListActivity.this, ChatActivity.class);
chatIntent.putExtra("deviceAddress", selectedDevice.getAddress());
startActivity(chatIntent);
}
});
// 扫描 BLE 设备
scanDevices();
}
private void scanDevices() {
// 查看蓝牙是否已敞开
if (bluetoothAdapter == null || !bluetoothAdapter.isEnabled()) {
// 请求用户敞开蓝牙
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
return;
}
// 开端扫描 BLE 设备
bluetoothAdapter.startLeScan(leScanCallback);
}
private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 增加设备到列表中
deviceList.add(device);
deviceListAdapter.notifyDataSetChanged();
}
});
}
};
}
activity_device_list.xml
<!-- activity_device_list.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/deviceListView"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
ChatActivity
谈天界面的代码:
public class ChatActivity extends AppCompatActivity {
private BluetoothAdapter bluetoothAdapter;
private BluetoothGatt bluetoothGatt;
private BluetoothGattCharacteristic receiveCharacteristic;
private BluetoothGattCharacteristic sendCharacteristic;
private String targetDeviceAddress;
private EditText messageEditText;
private Button sendButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
messageEditText = findViewById(R.id.messageEditText);
sendButton = findViewById(R.id.sendButton);
sendButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage(messageEditText.getText().toString());
messageEditText.setText("");
}
});
// 获取方针设备的 MAC 地址
targetDeviceAddress = getIntent().getStringExtra("deviceAddress");
// 初始化 BluetoothAdapter
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
// 衔接到方针设备
connectToDevice();
}
private void connectToDevice() {
BluetoothDevice device = bluetoothAdapter.getRemoteDevice(targetDeviceAddress);
bluetoothGatt = device.connectGatt(this, false, gattCallback);
}
private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
if (newState == BluetoothProfile.STATE_CONNECTED) {
// 衔接成功后发现服务
gatt.discoverServices();
} else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
// 衔接断开,关闭衔接
gatt.close();
bluetoothGatt = null;
}
}
@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
// 获取接纳音讯的特征
receiveCharacteristic = getCharacteristic(gatt, "0000fff0-0000-1000-8000-00805f9b34fb", "0000fff1-0000-1000-8000-00805f9b34fb");
// 获取发送音讯的特征
sendCharacteristic = getCharacteristic(gatt, "0000fff0-0000-1000-8000-00805f9b34fb", "0000fff2-0000-1000-8000-00805f9b34fb");
}
}
@Override
public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
// 写入特征值的回调
if (status == BluetoothGatt.GATT_SUCCESS) {
// 写入成功
}
}
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
// 接纳到特征值改变的回调,处理接纳到的音讯
byte[] data = characteristic.getValue();
String message = new String(data);
// 处理接纳到的音讯
showMessage(message);
}
};
private BluetoothGattCharacteristic getCharacteristic(BluetoothGatt gatt, String serviceUUID, String characteristicUUID) {
BluetoothGattService service = gatt.getService(UUID.fromString(serviceUUID));
if (service != null) {
return service.getCharacteristic(UUID.fromString(characteristicUUID));
}
return null;
}
private void sendMessage(String message) {
if (bluetoothGatt != null && sendCharacteristic != null) {
byte[] data = message.getBytes();
sendCharacteristic.setValue(data);
bluetoothGatt.writeCharacteristic(sendCharacteristic);
}
}
private void showMessage(String message) {
// 在谈天界面显现接纳到的音讯
}
}
activity_chat.xml
<!-- activity_chat.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/receivedMessageTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp" />
<EditText
android:id="@+id/messageEditText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Type your message here" />
<Button
android:id="@+id/sendButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send" />
</LinearLayout>
在这个示例演示了在 Android 中运用 Bluetooth Low Energy (BLE) Mode(低功耗蓝牙形式)完成简略的蓝牙谈天运用。
它在移动设备和其他外部设备之间供给了一种快速、牢靠且低功耗的通讯方法。在开发根据BLE的谈天软件时,需求留意以下几个要害点。
首要,BLE通讯由两个人物组成:中心设备(Central)和外围设备(Peripheral)。中心设备是移动设备,如智能手机,负责扫描、衔接和发送数据。外围设备是BLE外部设备,如传感器或其他BLE支撑设备,负责广播和供给数据。
其次,BLE通讯运用GATT(Generic Attribute Profile)协议。GATT界说了数据传输的方法和格局,经过服务(Service)和特征(Characteristic)来安排和传输数据。服务供给相关功用的调集,特征则包含具体的数据或操作。
在谈天软件中,中心设备作为客户端衔接到外围设备作为服务器,经过GATT协议进行数据交换。中心设备能够经过扫描BLE设备列表来发现可用设备,并挑选要衔接的方针设备。一旦衔接树立,中心设备能够经过读取和写入特征来完成与外围设备的通讯。
在开发过程中,需求完成恰当的衔接和断开衔接逻辑,处理衔接状态的改变,以及处理数据的发送和接纳。经过设置恰当的特征和服务,能够发送和接纳文本音讯或其他数据。一起,还能够运用恰当的UI组件来展示接纳到的音讯,并供给发送音讯的功用。
别的,需求处理异常情况和过错,例如设备不可用、衔接失败或数据传输过错。在处理BLE通讯时,还要考虑设备的兼容性和数据传输的稳定性,由于BLE通讯在不同设备之间可能存在一些差异。
总而言之,运用BLE形式开发谈天软件能够完成低功耗、快速和牢靠的通讯。经过恰当的衔接和数据交换逻辑,能够完成移动设备和外部设备之间的实时通讯。但是,开发过程中需求留意处理衔接状态、数据传输和异常情况,以保证良好的用户体验和稳定性。
期望能够对你有所协助!