随着智能设备的普及和物联网的发展,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程序的开发,从而实现智能设备与手机或电脑之间的数据交互。