App 和设备通过蓝牙连接收发数据

本文介绍了在Android中如何进行蓝牙低功耗(BLE)开发,包括启动扫描设备、连接设备、发现服务、获取服务和特征以及进行数据收发的步骤。在MainActivice.java和BluetoothLeService.java中给出了关键代码实现。

一、Android 中进行蓝牙开发需要用到的类和执行过程

        1,使用BluetoothAdapter.startLeScance来扫描设备

     2,在扫描到设备的回调函数中的得到BluetoothDevice 对象,并使用Bluetooth.stopLeScan停止扫描

     3,使用BluetoothDevice.connectGatt来获取到BluetoothGatt对象

     4,执行BluetoothGatt.discoverServices,这个方法是异步操作,在回调函数onServicesDiscovered中得到status,通过判断status是否等于BluetoothGatt.GATT_SUCCESS来            判断查找Service是否成功

     5,如果成功了,则通过BluetoothGatt.getService来获取BluetoothGattService

     6,接着通过BluetoothGattService.getCharacteristic获取BluetoothGattCharacteristic

     7,然后通过BluetoothGattCharacteristic.getDescriptor获取BluetoothGattDescriptor


二、收发数据

      收发数据是通过GATT,GATT是通过蓝牙收发数据的一种协议,包含Characteristic,Descriptor,Service 三个属性值,BLE 分为三个部分Service , Characteristic ,Descriptor  这三个部分都是由UUID做为唯一的标识符,一个蓝牙终端可以包含多个Service ,一个Service 可以包含多个Characteristic ,一个Characteristic 包含一个Value 和多个Descriptor,一个Descriptor包含一个Value


三、上代码(有些工具类是在其他文件里面,我这里没有在改了,直接复制上来了)

MainActivice.java:


BluetoothManager bluetoothManager;
BluetoothAdapter mBluetoothAdapter;
Intent intentBluetoothLeService = new Intent();
//低功耗蓝牙的文件名
public static String BLUETOOTHSERVICE = "com.boe.navapp.remote.BluetoothLeService";




bluetoothManager = (BluetoothManager) MainActivity.this
        .getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
if (mBluetoothAdapter != null && mBluetoothAdapter.isEnabled()) {
    if (!(CommonUtil.isServiceRunning(MainActivity.this,
            Constants.BLUETOOTHSERVICE))) {
        intentBluetoothLeService = new Intent(MainActivity.this,
                BluetoothLeService.class);
        startService(intentBluetoothLeService);
    }
}
 
 
 
 
 
 
// 判断当前服务是否启动
public static boolean isServiceRunning(Context mContext, String className) {
    boolean isRunning = false;
    ActivityManager activityManager = (ActivityManager) mContext
            .getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningServiceInfo> serviceList = activityManager
            .getRunningServices(70);
    if (!(serviceList.size() > 0)) {
        return false;
    }
    for (int i = 0; i < serviceList.size(); i++) {
        if (serviceList.get(i).service.getClassName().equals(className) == true) {
            isRunning = true;
            break;
        }
    }
    return isRunning;
}


BluetoothLeService.java:(這里我讲下主要代码,文件我会传上去)

public final static String REMOTE_CONNECT_STATUS = "REMOTE_CONNECT_STATUS";// 当前选择的遥控器连接状态
public final static String REMOTE_CONNECTED_DEVICES = "REMOTECONNECTEDDEVICES";// 存储已经连接的设备列表
public final static String REMOTE_DEVICE_INFO = "REMOTEDEVICEINFO";
public final static String REMOTE_CURR_ADDR = "REMOTECURRADDR";// 当前连接设备的地址
public final static String ACTION_GATT_REMOTESEVEN_DISCONNECTED = "com.infisight.hudprojector.bluetooth.le.ACTION_GATT_REMOTESEVEN_DISCONNECTED";
private static final String SP_NAME = "address";
 
@Override
public void onCreate() {
    super.onCreate();
    LogTools.i(TAG, "BluetoothLeService onCreate");
    prefs = PreferenceManager.getDefaultSharedPreferences(this);
    telMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    prefs.edit().putBoolean(Constants.REMOTE_CONNECT_STATUS, false)
            .commit();
    LogTools.i(TAG, "BluetoothLeService before SaveUtils.loadArray");
    addressList = SaveUtils.loadArray(this, SP_NAME);  //存放连接的地址
    GetDeviceInfo();
    LogTools.i(TAG, "BluetoothLeService GetDeviceInfo");
}

/**
 * 获取设备信息 lstNeedConnectDevices
 */
private void GetDeviceInfo() {
    String connectedinfo = prefs.getString(
            Constants.REMOTE_CONNECTED_DEVICES, "");
    if (!connectedinfo.equals("")) {
        Gson gson = new Gson()
STM32通过蓝牙接收APP数据的实现方法如下: ### 选择合适的蓝牙模块 以蓝牙模块HC08为例,它是蓝牙4.0,BLE,主从一体模块,上电后启动需要150ms,默认波特率为9600,模块未连接时为AT指令模式,连接后为串口透传模式,空中速率为1Mbps,通信距离在空旷环境可达80米,工作电流方面主机未连21mA、已连9mA,从机未连8.5mA、已连9mA,睡眠电流为0.4uA [^4]。 ### 配置蓝牙模块 利用AT指令对蓝牙模块进行配置,AT指令结尾无需添加换行符,修改立即生效且掉电不丢失,修改成功时统一返回OK(查看信息类指令除外),不成功则不返回任何信息 [^4]。 ### 借助STM32 HAL库进行编程 STM32 HAL库提供了硬件抽象层,能简化编程,增强代码的可移植性易用性。编程过程涉及初始化、数据处理错误管理等步骤,具体可参考项目文件“遥控小车_V_20220414 - 173340.pro”,该文件为开发者提供了源代码配置,可用于构建烧录到STM32微控制器 [^1]。 ### 数据解析 使用Android stduio JAVA方式,在数据解析片段中,可根据特定规则对接收的数据进行解析。例如,ECBLE.onBLECharacteristicValueChange方法用于处理接收到的数据,当接收到的字符串包含特定字符(如“=”、“,”、“!”)时,可进一步提取关键信息并进行相应处理 [^3]。 ### 建立蓝牙连接 通过智能手机APP与基于STM32微控制器的蓝牙小车建立连接连接成功后,APP可向STM32发送指令调整参数 [^1]。 ### 数据接收与处理 在蓝牙透传模式下,从APP发送的数据会原封不动地传输到STM32。STM32接收到数据后,依据编程逻辑进行处理。例如在示例代码中,根据解析出的信息设置文本颜色显示内容 [^2][^3]。 以下是一个简单的数据解析示例代码(基于引用[3]): ```java ECBLE.onBLECharacteristicValueChange((String hex, String string) -> { runOnUiThread(() -> { @SuppressLint("SimpleDateFormat") String timeStr = new SimpleDateFormat("[HH:mm:ss,SSS]:").format(new Date(System.currentTimeMillis())); String nowStr = receiveDataTextView.getText().toString(); if (string.contains("=") && string.contains(",") && string.contains("!")) { String str1 = string.substring(string.indexOf("=") + 1, string.indexOf(",")); if (str1.contains("0")) { tv_11.setTextColor(Color.BLACK); tv_11.setText("正常"); } else { tv_11.setTextColor(Color.RED); tv_11.setText("报警"); } } }); }); ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值