栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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:%sn",aRxBuffer);
				LED2(1);
				LED3(1);
				LED4(1);
			}
			else	if(FindStr((char*)aRxBuffer,"LEDOFF")==1)
			{
				//printf("Receive data:%sn",aRxBuffer);
				LED2(0);
				LED3(0);
				LED4(0);
			}
			else
			{
			
			}
			memset(aRxBuffer,'', sizeof(aRxBuffer));
			
		
	}
	
		
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353671.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号