相关文章推荐
彷徨的哑铃  ·  windows 10 通过git ...·  8 月前    · 
没读研的便当  ·  SVN ...·  1 年前    · 
爱健身的瀑布  ·  jsonobject 数组-掘金·  1 年前    · 
慷慨的黄豆  ·  C++ STL std::list探索 - 知乎·  1 年前    · 

1、设置蓝牙权限(android6.0以下)

蓝牙权限在AndroidManifest.xml中加入如下代码:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

如果想要只在支持BLE的安卓设备上运行则需要再加如下:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="false"/> 

2、打开蓝牙

//打开蓝牙
public void ble_open() {
    //获取蓝牙适配器实例
    BluetoothAdapter ble_adapter = BluetoothAdapter.getDefaultAdapter();
    if(ble_adapter !=null){
        //判断蓝牙是否已打开
        if (!ble_adapter.isEnabled()) {
            //打开蓝牙,强制打开,不安全
            //ble_adapter.enable();
            //弹窗询问是否打开,推荐,可以重新onActivityResult确认是否打开
            Intent ble_intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(ble_intent,0);
    }else
        Toast.makeText(this, "该设备不支持蓝牙", Toast.LENGTH_SHORT).show();
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0){
        switch (resultCode){
            case RESULT_OK:
                //蓝牙打开成功
                break;
            case RESULT_CANCELED:
                //蓝牙打开失败
                break;

3、蓝牙搜索

搜索蓝牙设备有三种方法:

1、startLeScan(LeScanCallback)此方法适用于4.3以上版本,扫描结果通过实现BluetoothAdapter.LeScanCallback接口方法onLeScan来接收

2、此外startScan(ScanCallbackcallback)适用于5.0以上;

3、ble_adapter.startDiscovery()虽然说是兼容经典蓝牙和低功耗蓝牙,但有些设备无法检测到低功耗蓝牙;startDiscovery是一个异步方法,其过程:系统发送BluetoothAdapter.ACTIOINDISCOVERYSTARTED的广播 ,然后搜到一个蓝牙设备就发送一个BluetoothDevice.ACTIONFOUND的广播,结束发送BluetoothAdapter.ACTIONFINISHED的广播,整个过程耗时12s,这也说明搜索结果需要注册一个广播来接收;

public void ble_scan(View view) {
    //判断是否处于扫描状态
    if (isScan)
        return;
    //扫描时间设为10s
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            ble_adapter.stopLeScan(MainActivity.this);
            isScan = false;
    }, 10000);
    //开始扫描
    if (ble_adapter.isEnabled()) {
        ble_adapter.startLeScan(this);
        isScan = true;
        text_list.setVisibility(View.VISIBLE);
 * 返回扫描结果的回调
 * @param device     蓝牙信息相关类,可以获取蓝牙名称,地址,绑定状态等
 * @param rssi       蓝牙设备信号值,正常为负值,值越大信号越强
 * @param scanRecord 远程设备提供的配对号
@Override
public void onLeScan(BluetoothDevice device, int rssi, byte[] scanRecord) {
    if (device.getName().equals(ble_name)) {
        BleDevice bleDevice = new BleDevice(device, rssi, false);
        if (!ble_list.contains(bleDevice))
            ble_list.add(bleDevice);
        sendMSG(FIND_BLE_DEVICE);
        ble_adapter.stopLeScan(this);

4、蓝牙连接与通讯

//连接设备
public void ble_connect(String address, final int position) {
    BluetoothDevice device = ble_adapter.getRemoteDevice(address);
    ble_gatt = device.connectGatt(this, true, new BluetoothGattCallback() {
        //连接状态改变回调
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            super.onConnectionStateChange(gatt, status, newState);
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                ble_list.get(position).setConnect(true);
                sendMSG(CONNECT_SUCCESS);
                //连接成功,开始搜索服务,一定要调用此方法,否则获取不到服务
                gatt.discoverServices();
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                ble_list.get(position).setConnect(false);
                sendMSG(CONNECT_FAILED);
                ble_gatt.close();
        //发现服务时,调用回调,表示可以通信了
        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            super.onServicesDiscovered(gatt, status);
            UUID service_UUID = Constants.CX21_SERVICE_UUID;
            UUID characteristic_UUID = Constants.CX21_CHARACTERISTIC_UUID;
            //通过UUID找到服务
            ble_GattService = gatt.getService(service_UUID);
            //找到服务后在通过UUID找到特征
            ble_Characteristic = ble_GattService.getCharacteristic(characteristic_UUID);
            if (ble_Characteristic != null) {
                //启用onCharacteristicChanged(),用于接收数据
                Boolean isTrue = gatt.setCharacteristicNotification(ble_Characteristic, true);
                BluetoothGattDescriptor descriptor = ble_Characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
                descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
                gatt.writeDescriptor(descriptor);
                sendMSG(SERVICE_DISCOVERED);
            } else {
                sendMSG(SERVICE_DISCOVERED_FAILED);
                return;
        //由于远程特征通知而触发的回调
        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            super.onCharacteristicChanged(gatt, characteristic);
            //使用的蓝牙设备发送的是16进制,需要处理,否则会乱码
            receive = bytesToHexString(characteristic.getValue());
            sendMSG(RECEIVE_MSG);
        //写入成功的回调
        @Override
        public void onCharacteristicWrite(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicWrite(gatt, characteristic, status);
            if (BluetoothGatt.GATT_SUCCESS == status) {
                sendMSG(WRITE_SUCCESS);
        //读取成功回调
        @Override
        public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
            super.onCharacteristicRead(gatt, characteristic, status);
            if (BluetoothGatt.GATT_SUCCESS == status) {
            String receive = "";
            for (int i = 0; i < characteristic.getValue().length; i++) {
                int v = characteristic.getValue()[i] & 0xFF;
                receive += Integer.toHexString(v);
            Log.e("connect", "read:" + receive);

1)、向蓝牙模块写数据如下:

String writeData = "00801001015A";
ble_Characteristic.setValue(getHexBytes(writeData));
gatt.writeCharacteristic(ble_Characteristic);

如果写入成功会回调onCharacteristicWrite方法;

2)、读数据:

gatt.readCharacteristic(ble_Characteristic);

如果读取成功,可以在onCharacteristicRead中获取到数据;

蓝牙透传关于蓝牙透传,基本步骤如下:1、设置蓝牙权限2、打开蓝牙3、蓝牙搜索4、蓝牙连接与通讯测试使用android4.4版本手机与蓝牙硬件模块;1、设置蓝牙权限(android6.0以下)蓝牙权限在AndroidManifest.xml中加入如下代码:如果想要只在支持BLE的安卓设备上运行则需要再加如下: 2、打开蓝牙//打开蓝牙 的操作流程网友介绍得比较详细,这里不再做重复介绍,上面的演示效果除了布局,写的代码其余都在这一个MainActivity类里,也就没有做太多优化(抄起来方便),其中比较关键的就是一定要检查那两个UUID: package com.example.bluetooth4; import android.bluetooth.BluetoothA
1.获得BluetoothAdapter,对任何Bluetooth Activity都需要先获得。获取方法是调用getDefaultAdapter()方法。  ​BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (mBluetoothAdapter == null) { // De
        最近在开发,由于是使用的模块开发,但是andriod的系统的经典也需要熟悉和知道。在这个背景下,参考了网络上的一些资料,完善了demo,方便了后来者能初步运用相关的。站在巨人的肩旁上,才能走的更远。 一、整体思路和对应相关方法 1、获得BluetoothAdapter:BluetoothAdapter.getDefaultAdapter(); 2、打开:询问用...
最近做项目,需要开发安卓应用,实现串口的收发,目测CH340G在安卓手机上非常麻烦,而且驱动都是Java版本的, 就没选择,博主在大二的时候学习过Java SE基本的语法,写过一些小程序就放弃了Java的道路。最后选择了无线模块,实现串口通信。现在Qt跨平台支持安卓,是在是令人欣喜。在网上找资料,用Qt on Android做驱动的几乎没有,也没有相关例程,所以准备撰写此文,献给广大嵌入式程序员们。 一、软硬件平台 1.1 硬件平台 1、:HC-05,(淘宝上有卖),它的接口就是跟串口一样的
如果你的产品之前使用的是BLE 模块,现在想使用BT401模块来替换你之前的模块 1、你的 APP不需要做任何更改,你只需要更改我们的模块UUID即可,你可以自己来更改, 通过串口AT指令 2、例如你之前使用的模块的服务UUID 为0XFFF0,特征UUID 为0XFFF1 的话, 3、你只需要发送这两条命令更改我们模块的服务UUID 与特征UUID 就可以 通过串口发送:AT+U0F...
Android Studio 助手是一个用于在 Android 应用程序中集成模块的工具。技术已被广泛应用于物联网设备、医疗设备、智能家居设备等,而 Android Studio 助手则为开发这些设备的 Android 应用程序提供了便利。 使用 Android Studio 助手,开发者可以在自己的应用程序中集成模块,实现与设备之间的通讯。例如,可以通过助手连接智能手环,获取用户的心率、步数等数据,并将这些数据输到应用程序中进行分析和显示。 另外,开发者可以根据自己的需求进行定制,例如通过助手控制灯光、电子设备等。这些定制内容可以极大地增强设备的用户体验,提高设备的智能程度。 Android Studio 助手的使用方法相对简单,只需要按照指导进行操作即可。但是在集成模块时,开发者需要特别注意安全性问题,避免数据被黑客攻击或泄露。因此,在进行模块的集成时,应该谨慎选择模块,采取一些安全措施,如加密输等。 总之,Android Studio 助手提供了一个快速、简便的工具,用于开发 Android 应用程序中的模块,对于物联网设备领域的应用有着非常重要的作用,更好地实现了设备的连接、控制和数据处理等功能。