首要我们来回忆一下
Bluetooth Low Energy (BLE) Mode(低功耗蓝牙形式)

是 Android 操作系统中支撑低功耗蓝牙设备衔接和通讯的一种形式。它专门设计用于衔接和交互低功耗设备,如智能手环、智能家居设备、传感器等。

BLE 形式相对于传统蓝牙形式具有以下特点:

  1. 低功耗:BLE 形式专心于下降能量消耗,以延长设备的电池寿命。它采用了一系列的能量优化战略,如睡觉形式、衔接间隙调整和数据包尺度控制等,以最小化通讯过程中的功耗。

  2. 快速衔接:BLE 形式支撑快速衔接和断开衔接,以下降设备之间树立衔接所需的时刻和功耗。这使得低功耗设备能够在需求时快速与 Android 设备树立衔接,并在完成任务后快速断开衔接以节省能量。

  3. 周期性数据传输:BLE 形式适用于周期性地传输小量数据。它运用了一种称为 GATT(Generic Attribute Profile)的协议,答应设备界说服务和特性,以便在衔接期间传输数据。这种数据传输方法适用于传感器数据、健康监测数据等周期性生成的小数据量。

  4. 中心与外围设备人物:在 BLE 形式下,Android 设备能够一起充任中心设备(Central)和外围设备(Peripheral)的人物。作为中心设备,Android 设备能够查找并衔接到周围的外围设备。作为外围设备,Android 设备能够承受来自中心设备的衔接请求,并进行数据交换。

  5. 蓝牙配对简化: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形式开发谈天软件能够完成低功耗、快速和牢靠的通讯。经过恰当的衔接和数据交换逻辑,能够完成移动设备和外部设备之间的实时通讯。但是,开发过程中需求留意处理衔接状态、数据传输和异常情况,以保证良好的用户体验和稳定性。

期望能够对你有所协助!