Android手机作为BLE主机(客户端)

        本文章主要介绍物联网短距离无线通信的技术之一低功耗蓝牙技术BLE,主要应用领域为智能穿戴设备,一般情况下需要手机端实现BLE上位机(主机、客户端)。以下介绍基于HC05/BT05蓝牙串口透传模块+MCU(STM32F103VET6),当然对于TI的CC2541、乐鑫的ESP32,本工程同样适用!

        首先介绍两个重要概念,ServiceUUID(服务UUID)与CharacteristicUUID(特征UUID),ServiceUUID我们可以理解为一个班级,这个班级主要负责数据传输的工作,当然班级内部有许多学生,有的学生负责接收数据(特征值的通知功能),有的学生负责发送数据(写特征值),所以BLE进行一次数据传输时,我们需要指定一个班级(ServiceUUID)和若干学生(CharacteristicUUID),对于HC05/BT05蓝牙串口透传模块,由于其已经输入固件,所以CharacteristicUUID通常是一个人(也就是说接收数据与发送数据的是同一个同学);而对于CC2541、ESP32等我们可以直接编程的芯片通过需要指定两个CharacteristicUUID(特征值通知、写特征值)

 1、设置HC05/BT05

通过串口调试助手或者MCU的串口配置HC05/BT05处于从机模式,设备名称任意设置,ServiceUUID为FFF0,CharacteristicUUID为FFF6        

2、 Android代码中作相应的替换

3、接收数据

 此处我通过STM32采集的温湿度数据,通过串口发送给HC05/BT05,所以接收数据时,要严格按照STM32中的数据进行。Android中程序如下:

public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            byte[] desData = characteristic.getValue();
            String temp_str, humi_str;
            temp_str =  getStringSensorData(desData[0])+"."+getStringSensorData(desData[1])+" ℃";
            humi_str =  getStringSensorData(desData[2])+"."+getStringSensorData(desData[3])+" %";
            Log.i(TAG, " >>>>>温度为:" + temp_str);
            Log.i(TAG, " >>>>>湿度为:" + humi_str);
            temp.setText(temp_str);
            humi.setText(humi_str);
        }

 STM32中透传程序如下:

void BLE_Printf()
{
	u8 sendbuf[4];
	sendbuf[0] = (int)temp_int;
	sendbuf[1] = (int)temp_deci;
	sendbuf[2] = (int)humi_int;
	sendbuf[3] = (int)humi_deci;
	if(BLE_State()==1)
	{
		SendSensorData(sendbuf ,4);
	}
	else
	{
		
	}
}

4、 发送数据(控制指令)

此处我通过手机端发送控制指令控制STM32连接的LED灯,Android中代码如下:

public void KeyEvent() {
        swh_led.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                if (swh_led.isChecked()) {
                  String  data = "LEDON";
                  sendLeData(data.getBytes());
                } else {
                    String  data = "LEDOFF";
                    sendLeData(data.getBytes());
                }
            }
        });
        btn_ble.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (mConnectionState) {
                    cancelDialog.show();
                    cancelDialog.setMessage(getString(list_disconnecting_ble));
                    mHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            cancelDialog.dismiss();
                        }
                    }, 1000);
                    mConnectionState = false;
                    //btn_ble.setText(getString(R.string.list_connect_ble));
                    if (mBluetoothGatt != null) {
                        mBluetoothGatt.disconnect();
                    }
                } else {
                    scanLeDevice(true);
                }


            }
        });
    }

STM32中的程序如下:

void LED_Control(void)
{
		if(ReceiveState == 1)
		{
			RxCounter=0;
			ReceiveState=0;
			if(FindStr((char*)aRxBuffer,"LEDON")==1)
			{
				//printf("Receive Data:%s\n",aRxBuffer);
				LED2(1);
				LED3(1);
				LED4(1);
			}
			else	if(FindStr((char*)aRxBuffer,"LEDOFF")==1)
			{
				//printf("Receive Data:%s\n",aRxBuffer);
				LED2(0);
				LED3(0);
				LED4(0);
			}
			else
			{
			
			}
			memset(aRxBuffer,'\0', sizeof(aRxBuffer));
			
		
	}
	
		
}

以上就是BLE模块与手机蓝牙进行双向通信的简单过程,有兴趣的可以下载Android工程的完整代码如下https://download.csdn.net/download/baidu_40311265/35088959

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Android 手机蓝牙与 BLE 设备建立连接的代码示例: 1. 在 AndroidManifest.xml 文件中添加蓝牙权限: ```xml <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> ``` 2. 在 Activity 中初始化 BluetoothAdapter 对象: ```java private BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); ``` 3. 扫描 BLE 设备并建立连接: ```java // 扫描时间 10 秒 private static final long SCAN_PERIOD = 10000; // 扫描回调 private final BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) { // 根据设备名称或 MAC 地址过滤 if (device.getName() != null && device.getName().startsWith("BLE")) { // 停止扫描 bluetoothAdapter.stopLeScan(leScanCallback); // 建立连接 device.connectGatt(MainActivity.this, false, gattCallback); } } }; // GATT 回调 private final 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) { // 连接断开 Log.i(TAG, "Disconnected from GATT server."); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { // 服务发现成功,可以进行数据交互 Log.i(TAG, "Services discovered."); } else { Log.w(TAG, "onServicesDiscovered received: " + status); } } @Override public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) { if (status == BluetoothGatt.GATT_SUCCESS) { // 读取特征值成功 Log.i(TAG, "Characteristic read successfully."); } else { Log.w(TAG, "Characteristic read failed: " + status); } } }; // 开始扫描 BLE 设备 private void scanBLEDevice() { if (bluetoothAdapter == null) { Log.w(TAG, "Bluetooth not supported."); return; } // 如果正在扫描,则先停止扫描 bluetoothAdapter.stopLeScan(leScanCallback); // 开始扫描 bluetoothAdapter.startLeScan(leScanCallback); // 扫描 SCAN_PERIOD 后停止扫描 new Handler().postDelayed(new Runnable() { @Override public void run() { bluetoothAdapter.stopLeScan(leScanCallback); } }, SCAN_PERIOD); } ``` 注意:在建立连接之前需要先扫描 BLE 设备,扫描到符合条件的设备后才能进行连接。在连接建立成功后,需要调用 `discoverServices()` 方法发现设备的服务,然后才能进行数据交互。以上代码仅供参考,实际开发中需要根据具体需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值