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

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

一、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();
        
好的,以下是一个Android手机App扫描连接蓝牙设备并发送数据的代码示例: 首先,我们需要添加蓝牙权限和依赖库到AndroidManifest.xml和build.gradle文件中。 ```xml <!-- AndroidManifest.xml --> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <!-- build.gradle --> dependencies { implementation 'com.android.support:appcompat-v7:28.0.0' implementation 'com.android.support:design:28.0.0' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:support-v4:28.0.0' implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.android.support:recyclerview-v7:28.0.0' implementation 'io.reactivex.rxjava2:rxjava:2.2.10' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.jakewharton.rxbinding2:rxbinding:2.2.0' } ``` 接下来,我们创建一个MainActivity,并添加蓝牙连接数据发送的逻辑。 ```java public class MainActivity extends AppCompatActivity { private static final int REQUEST_ENABLE_BT = 1; private BluetoothAdapter bluetoothAdapter; private BluetoothDevice device; private BluetoothSocket socket; private InputStream inputStream; private OutputStream outputStream; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bluetoothAdapter = BluetoothAdapter.getDefaultAdapter(); if (bluetoothAdapter == null) { Toast.makeText(this, "Device doesn't support Bluetooth", Toast.LENGTH_SHORT).show(); finish(); } if (!bluetoothAdapter.isEnabled()) { Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT); } findViewById(R.id.btn_scan).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { scanDevices(); } }); findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { sendData(); } }); } private void scanDevices() { IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(receiver, filter); if (bluetoothAdapter.isDiscovering()) { bluetoothAdapter.cancelDiscovery(); } bluetoothAdapter.startDiscovery(); } private final BroadcastReceiver receiver = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (BluetoothDevice.ACTION_FOUND.equals(action)) { BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); if (device.getName().equals("Bluetooth Device Name")) { MainActivity.this.device = device; bluetoothAdapter.cancelDiscovery(); } } } }; private void sendData() { if (device == null) { Toast.makeText(this, "No device connected", Toast.LENGTH_SHORT).show(); return; } try { socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB")); socket.connect(); inputStream = socket.getInputStream(); outputStream = socket.getOutputStream(); String data = "Hello World"; outputStream.write(data.getBytes()); Toast.makeText(this, "Data sent successfully", Toast.LENGTH_SHORT).show(); } catch (IOException e) { Toast.makeText(this, "Failed to send data", Toast.LENGTH_SHORT).show(); } } @Override protected void onDestroy() { super.onDestroy(); if (bluetoothAdapter != null) { bluetoothAdapter.cancelDiscovery(); } try { if (socket != null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 以上代码中,我们首先检查设备是否支持蓝牙,并启动蓝牙。 然后,我们添加了扫描设备和发送数据的逻辑。在扫描设备的过程中,我们注册了一个广播接收器来获取蓝牙设备列表。在发送数据的过程中,我们先创建一个蓝牙Socket连接,然后获取输入输出流,并将数据发送到设备中。 注意,需要替换代码中的“Bluetooth Device Name”和UUID为你自己的设备名称和UUID。 希望这个例子能够帮助你开始蓝牙开发。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值