隨著智能設備的普及和物聯網的發展,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/zh-tw/n/148872.html