您的位置:

使用Python编写Android BLE数据交互程序

随着智能设备的普及和物联网的发展,BLE成为了一种非常受欢迎的物联网传输协议。本文将会介绍使用Python编写Android BLE数据交互程序的方法。我们将涉及到BLE的基本概念、Android BLE的使用方法以及Python编写BLE程序的实现。我们希望这篇文章可以帮助你更加深入地了解BLE,并且可以在编写基于BLE的应用程序时提供一些帮助。

一、BLE简介

BLE全称是Bluetooth Low Energy,它是蓝牙4.0技术的一部分。与传统的蓝牙技术相比,BLE技术有更低的功耗、更低的成本以及更短的连接时间。BLE被广泛应用于智能手表、智能家居、传感器等物联网设备。BLE设备通常被分为两种角色:中心角色(central)和外围角色(peripheral)。中心角色通常是智能手机、电脑等主设备,负责发现和管理周围的BLE外围设备,完成数据的读写、通知等操作。而外围设备通常是没有网络连接、资源受限的,它们一般被静默地工作,等待来自中心设备的交互请求。BLE的交互过程使用GATT(Generic Attribute Profile)协议进行。

二、Android BLE的使用

在2013年的Google I/O大会上,Google推出了Android 4.3(Jelly Bean)版本,引入了对BLE设备的支持。Android BLE API可以用来使Android设备成为BLE中心角色或者外围角色,以此来与其他BLE设备进行数据交互。

在Android平台上,单独使用BLE进行测试是非常困难的,因为Android机器的内核是基于Java的,而Java本身不支持BLE的底层操作,而是通过JNI调用C++代码实现。因此,Android BLE API提供了一组高层次的Java API,可以根据我们的需求对BLE设备进行连接、读写、设置通知等操作。下面是一个基本的Android BLE程序。


//Connection activity
public class ConnectionActivity extends AppCompatActivity {

    private BluetoothAdapter mBluetoothAdapter;
    private BluetoothDevice mBluetoothDevice;
    private BluetoothGatt mBluetoothGatt;

    private Button mConnectButton;
    private Button mDisconnectButton;

    private static final UUID HUMIDITY_SERVICE_UUID =
            UUID.fromString("00001812-0000-1000-8000-00805f9b34fb");

    private static final UUID HUMIDITY_CHARACTERISTIC_UUID =
            UUID.fromString("00002A6F-0000-1000-8000-00805f9b34fb");

    private BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                mBluetoothGatt.discoverServices();
            }
        }

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {
            if (status == BluetoothGatt.GATT_SUCCESS) {
                BluetoothGattService service = gatt.getService(HUMIDITY_SERVICE_UUID);
                BluetoothGattCharacteristic characteristic = service.getCharacteristic(HUMIDITY_CHARACTERISTIC_UUID);
                gatt.setCharacteristicNotification(characteristic, true);
            }
        }

        @Override
        public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
            Log.d("TAG", "onCharacteristicChanged");
            byte[] value = characteristic.getValue();
            //做一些数据处理操作
        }
    };

    private View.OnClickListener mConnectButtonClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mBluetoothGatt = mBluetoothDevice.connectGatt(ConnectionActivity.this,
                    false, mGattCallback);
        }
    };

    private View.OnClickListener mDisconnectButtonClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mBluetoothGatt.disconnect();
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_connection);

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

        mConnectButton = (Button) findViewById(R.id.connect_button);
        mConnectButton.setOnClickListener(mConnectButtonClickListener);

        mDisconnectButton = (Button) findViewById(R.id.disconnect_button);
        mDisconnectButton.setOnClickListener(mDisconnectButtonClickListener);

        mBluetoothDevice = mBluetoothAdapter.getRemoteDevice("00:11:22:33:44:55");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mBluetoothGatt.disconnect();
        mBluetoothGatt.close();
    }
}

在程序中,我们使用了BluetoothGattCallback回调方法来处理BLE设备状态、服务发现和特征读写等事件。在程序启动的时候,我们通过UUID获取到了设备和服务的唯一标识符,并在onServicesDiscovered方法中对服务所拥有的特征进行了注册,并开启了通知。当设备有数据更新时,onCharacteristicChanged方法便会被调用。需要注意的是,代码的注释部分需要根据实际项目进行修改。

三、Python编写BLE程序

使用Python编写BLE程序相较于Android原生的BLE程序开发会稍微复杂一些。我们需要使用Python的BLE库bluepy,结合Linux系统下的BLE开发包bluez或者Windows系统下的libbluetooth实现BLE数据交互。bluepy支持通过Python代码来实现BLE设备的连接、读写以及通知等操作。下面是一个基本的Python BLE程序:


from bluepy.btle import Peripheral, UUID
from bluepy import btle

LIGHT_CHARACTERISTIC_UUID = UUID("6E400003-B5A3-F393-E0A9-E50E24DCCA9E")

class CustomDelegate(btle.DefaultDelegate):
    def __init__(self, params):
        btle.DefaultDelegate.__init__(self)

    def handleNotification(self, cHandle, data):
        #处理收到的数据
        print(data.decode())

if __name__ == "__main__":
    try:
        #连接设备
        p = Peripheral("00:11:22:33:44:55")
        #获取服务
        services = p.getServices()
        print(services)
        #获取特征
        lightCharacteristic = p.getCharacteristics(uuid=LIGHT_CHARACTERISTIC_UUID)[0]
        #注册通知
        p.setDelegate(CustomDelegate(None))
        p.writeCharacteristic(lightCharacteristic.valHandle + 2, b"\x01\x00")
        #等待收取通知
        while True:
            if p.waitForNotifications(1.0):
                continue
            print("Waiting...")
    except Exception as e:
        print("Connection error:", e)
        #断开设备
        p.disconnect()

在程序中,我们通过Peripheral类连接BLE设备,并通过UUID来获取设备中的服务和特征,最后对特征注册通知并在while循环中等待特征的值改变。需要注意的是,bluepy库仅支持Linux系统下的BLE开发包bluez和Windows系统下的libbluetooth,我们需要在实际开发中进行库的选择。

结语

本文介绍了使用Python编写Android BLE数据交互程序的方法。我们简要介绍了BLE的基本概念以及Android BLE的使用方法,之后我们提供了基本的Android BLE程序和Python BLE程序。在实际开发中,我们可以根据自己的需求选取合适的工具和库进行BLE程序的开发,从而实现智能设备与手机或电脑之间的数据交互。

使用Python编写Android BLE数据交互程序

2023-05-14
Android BLE编程详解

2023-05-18
Android BLE蓝牙开发详解

2023-05-19
Python编写ADB接口,实现与Android设备的交互

2023-05-14
使用Python编写Android平台上的RTSP视频流应用

2023-05-14
使用Python编写Android AudioTrack播放

一、背景介绍 Android AudioTrack是Android中用于播放音频的一个类,它可以播放各种类型的音频文件,而且在播放声音时具有非常低的延迟。在本文中,我们将介绍如何使用Python编写一

2023-12-08
使用Python编写Android地图应用程序

2023-05-14
用Python编写Qt交叉编译工具,简化Qt for And

2023-05-14
使用Python在Android设备上实现蓝牙连接和数据传输

2023-05-14
Android 4.3:全面升级的新版本

2023-05-23
通过Python为Android应用添加交互功能

在移动应用开发中,添加交互功能对于提升用户体验是非常重要的。而Python作为一种高效、易学、可读性强的编程语言,可以为Android应用添加交互功能提供便利。本文将从下面的几个方面对如何通过Pyth

2023-12-08
Android BLE蓝牙开发实践:提高连接稳定性的方法

蓝牙低功耗(BLE)技术在智能硬件领域已经得到广泛应用,其最大的优势是低功耗。在BLE连接过程中,连接稳定性是一个非常关键的问题,因为连接不稳定会导致数据传输的中断,影响智能设备的使用体验。本文将介绍

2023-12-08
使用Python编写Android Camera2 API应

一、简介 Android设备的Camera2 API为应用程序开发者提供了更多控制相机操作的接口,例如控制曝光、对焦、ISO以及白平衡等参数,以及更精确地获取像素值。 而使用Python编写的Came

2023-12-08
用Python编写Android ADB接口驱动程序

一、什么是ADB接口驱动程序? ADB(Android Debug Bridge)是Android平台开发和调试的工具,ADB接口驱动程序则是Android设备与PC之间数据传输的桥梁。开发者和用户常

2023-12-08
使用Python编写Android录音线程

2023-05-14
使用Python编写自动化Android设备测试ADB命令

Android Debug Bridge (adb)是一个旨在帮助开发人员进行Android设备测试和调试的命令行工具。在本文中,我们将介绍如何使用Python编写ADB命令以进行自动化Android

2023-12-08
Android JS交互详解

2023-05-21
Android应用程序开发要点

2023-05-14
Python Android Binding:让Python

一、介绍 Python Android Binding是一种将Python脚本编译成Java字节码以在Android上运行的工具。该工具可以让开发者快速的将现有的Python应用程序或代码移植到And

2023-12-08
使用Python编写Android网格布局的技巧

在Android应用程序中,网格布局是一种非常流行的布局方式,它可以让应用程序在不同的屏幕尺寸和方向上自适应地显示。Python作为一种强大的编程语言,可以通过使用一些库和框架来帮助我们快速地创建网格

2023-12-08