使用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程序的开发,从而实现智能设备与手机或电脑之间的数据交互。

原创文章,作者:QHFN,如若转载,请注明出处:https://www.506064.com/n/148872.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QHFNQHFN
上一篇 2024-11-04 17:49
下一篇 2024-11-04 17:49

相关推荐

  • Python周杰伦代码用法介绍

    本文将从多个方面对Python周杰伦代码进行详细的阐述。 一、代码介绍 from urllib.request import urlopen from bs4 import Bea…

    编程 2025-04-29
  • Python列表中负数的个数

    Python列表是一个有序的集合,可以存储多个不同类型的元素。而负数是指小于0的整数。在Python列表中,我们想要找到负数的个数,可以通过以下几个方面进行实现。 一、使用循环遍历…

    编程 2025-04-29
  • 如何查看Anaconda中Python路径

    对Anaconda中Python路径即conda环境的查看进行详细的阐述。 一、使用命令行查看 1、在Windows系统中,可以使用命令提示符(cmd)或者Anaconda Pro…

    编程 2025-04-29
  • Python计算阳历日期对应周几

    本文介绍如何通过Python计算任意阳历日期对应周几。 一、获取日期 获取日期可以通过Python内置的模块datetime实现,示例代码如下: from datetime imp…

    编程 2025-04-29
  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • python强行终止程序快捷键

    本文将从多个方面对python强行终止程序快捷键进行详细阐述,并提供相应代码示例。 一、Ctrl+C快捷键 Ctrl+C快捷键是在终端中经常用来强行终止运行的程序。当你在终端中运行…

    编程 2025-04-29
  • Python清华镜像下载

    Python清华镜像是一个高质量的Python开发资源镜像站,提供了Python及其相关的开发工具、框架和文档的下载服务。本文将从以下几个方面对Python清华镜像下载进行详细的阐…

    编程 2025-04-29
  • Python程序需要编译才能执行

    Python 被广泛应用于数据分析、人工智能、科学计算等领域,它的灵活性和简单易学的性质使得越来越多的人喜欢使用 Python 进行编程。然而,在 Python 中程序执行的方式不…

    编程 2025-04-29
  • Python字典去重复工具

    使用Python语言编写字典去重复工具,可帮助用户快速去重复。 一、字典去重复工具的需求 在使用Python编写程序时,我们经常需要处理数据文件,其中包含了大量的重复数据。为了方便…

    编程 2025-04-29

发表回复

登录后才能评论