BLE private address、static address、public address的区别和应用场景
BLE(Bluetooth Low Energy)设备可以使用三种类型的MAC地址:私有地址、静态地址和公共地址。下面是它们之间的区别和应用场景:
私有地址:私有地址是在设备上动态生成的,可以更好地保护用户的隐私。BLE设备的私有地址可以是随机或公开的。随机私有地址会在一定时间间隔内变化,而公开私有地址只会在设备重启时变化。私有地址只在设备与其他设备通信时使用,而且每个设备都有自己的私有地址。应用场景包括:广告、扫描和连接。
静态地址:静态地址是由设备制造商预定义的,通常不会改变。使用静态地址可以让设备更容易被跟踪,因为它们是固定的。静态地址通常用于在设备与应用程序之间建立永久连接。应用场景包括:连接。
公共地址:公共地址由IEEE(Institute of Electrical and Electronics Engineers)分配,并且是全球唯一的。公共地址通常用于广告和扫描,但它们也可以用于连接。应用场景包括:广告、扫描和连接。
总的来说,私有地址更安全,因为它们在通信之间会更改,从而使跟踪更加困难。但是,静态地址在某些情况下也很有用,例如在需要设备与应用程序之间建立稳定连接的情况下。公共地址是全球唯一的,因此可以用于跨设备通信。具体应用场景需要根据实际需求来选择。
C# BLE上位机串口软件
使用 C# 开发 BLE 上位机串口通信软件
创建项目并安装必要的 NuGet 包
为了创建能够与低功耗蓝牙 (BLE) 设备以及通过串口与其他设备通信的应用程序,首先需要设置开发环境。这通常涉及使用 Visual Studio 或其他支持 .NET 的 IDE 来建立新的 Windows 应用程序项目。
对于 BLE 功能的支持,可以利用 Windows.Devices.Bluetooth
命名空间下的类库[^2]:
Install-Package Microsoft.Windows.SDK.Contracts
而对于串口操作,则可以通过 System.IO.Ports.SerialPort
类来进行管理[^1]。
初始化 BluetoothLE 并扫描附近设备
下面是一个简单的例子展示如何初始化蓝牙 LE 和查找附近的广播设备:
using System;
using System.Threading.Tasks;
using Windows.Devices.Bluetooth.Advertisement;
public class BleScanner {
private readonly BluetoothLEAdvertisementWatcher _watcher;
public BleScanner() {
_watcher = new BluetoothLEAdvertisementWatcher();
SetupWatcherEvents();
}
private void SetupWatcherEvents() {
_watcher.Received += OnAdvertisementReceived;
_watcher.Stopped += OnWatcherStopped;
}
public async Task StartScanningAsync() {
await StopScanningAsync(); // Ensure watcher is not running before starting.
Console.WriteLine("Starting to scan...");
_watcher.Start();
}
private static async Task StopScanningAsync() {
if (_watcher.Status != BluetoothLEAdvertisementWatcherStatus.Created &&
_watcher.Status != BluetoothLEAdvertisementWatcherStatus.Stopped) {
await Task.Delay(10); // Give some time for the status change.
_watcher.Stop();
}
}
private void OnAdvertisementReceived(
BluetoothLEAdvertisementWatcher sender,
BluetoothLEAdvertisementReceivedEventArgs args) {
var deviceName = string.IsNullOrWhiteSpace(args.Advertisement.LocalName)
? "Unknown"
: args.Advertisement.LocalName;
Console.WriteLine($"Found {deviceName} with address: {args.BluetoothAddress}");
}
private void OnWatcherStopped(object sender, BluetoothLEAdvertisementWatcherStoppedEventArgs e){
Console.WriteLine("Scan stopped.");
}
}
这段代码展示了怎样启动一个广告观察者 _watcher
, 当接收到一个新的 BLE 广告时触发回调函数,并打印发现的设备名称及其地址。
连接到特定的 BLE 设备并与之交互
一旦找到了目标设备,就可以尝试连接它并通过读取/写入特征值与其互动。这里假设已经获得了想要连接的目标设备对象 (BluetoothLEDevice
) 及其服务 UUIDs 和 Characteristic IDs.
// Assuming you have a valid BluetoothLEDevice instance named 'targetDevice'
var serviceId = Guid.Parse("your-service-id-here");
var characteristicId = Guid.Parse("your-characteristic-id-here");
await targetDevice.GetGattServicesForUuidAsync(serviceId).AsTask().ContinueWith(async task => {
foreach(var service in task.Result.Services){
var characteristics = await service.GetAllCharacteristicsAsync();
foreach(var chara in characteristics.Characteristics){
if(chara.Uuid == characteristicId){
// Now we can interact with this specific characteristic...
break; // Exit loop once found our desired characteristic
}
}
return true;
}
return false;
});
以上片段说明了获取指定的服务和特性之后可能执行的操作流程;实际应用中还需要考虑错误处理等问题。
实现串口通信部分
当涉及到串口通讯时,可以直接实例化 SerialPort
对象来配置 COM 端口号、波特率等参数:
using System.IO.Ports;
class SerialCommunicationExample{
private SerialPort serialPort;
public SerialCommunicationExample(){
serialPort = new SerialPort("COM3", 9600);
ConfigureSerialPortSettings(serialPort);
OpenConnection();
}
private void ConfigureSerialPortSettings(SerialPort port){
port.DataBits = 8;
port.StopBits = StopBits.One;
port.Parity = Parity.None;
port.Handshake = Handshake.None;
port.ReadTimeout = 500;
port.WriteTimeout = 500;
}
private void OpenConnection(){
try{
if(!serialPort.IsOpen){
serialPort.Open();
Console.WriteLine("Successfully opened connection on "+serialPort.PortName+".");
}else{
throw new InvalidOperationException("The specified port is already open.");
}
}catch(Exception ex){
Console.Error.WriteLine(ex.Message);
}
}
}
此段代码定义了一个用于打开选定端口的方法,并设置了基本的数据传输属性如数据位数、停止位数目及奇偶校验模式。
qt开发安卓appBLE蓝牙成品
使用 Qt 开发 Android 应用程序并集成 BLE 蓝牙通信
创建项目结构
为了创建一个支持BLE蓝牙通信的Qt应用程序,首先需要设置好项目的CMakeLists.txt文件和其他配置文件。确保在AndroidManifest.xml
中声明必要的权限。
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<!-- For Bluetooth scanning -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Required since Android 6.0 -->
动态请求位置权限
自Android 6.0起,在运行时还需动态获取用户的同意来访问位置信息以便于执行蓝牙扫描操作[^2]。这可以通过调用QAndroidJniObject类的方法实现:
#include <QAndroidJniObject>
// ...
void requestLocationPermission()
{
QAndroidJniObject activity = QNativeInterface::QAndroidApplication::context();
if (activity.isValid()) {
QStringList permissions;
permissions << "android.permission.ACCESS_FINE_LOCATION";
QList<int> grantResults;
int result = static_cast<jint>(QAndroidJniObject::callStaticMethod(
"com/qt/android/Permissions",
"requestPermissionsSync",
"(Landroid/app/Activity;[Ljava/lang/String;)[I",
activity.object(),
QJavaListToJArray(permissions).object()));
grantResults.append(result);
// Handle permission results...
}
}
初始化蓝牙模块
接下来初始化Qt中的Bluetooth模块,并准备开始搜索附近的BLE设备。这里展示了一个简单的例子用于启动扫描过程[^1]:
#include <QLowEnergyController>
#include <QLowEnergyScanParameters>
class BleManager : public QObject {
public:
explicit BleManager(QObject *parent = nullptr);
private slots:
void startScanning();
private:
QLowEnergyController* controller_;
};
BleManager::BleManager(QObject *parent)
: QObject(parent), controller_(nullptr) {}
void BleManager::startScanning() {
auto adapterInfo = QBluetoothLocalDevice().allDevices().first(); // Choose first available adapter
QLowEnergyScanParameters params;
params.setInterval(0x20); // Scan interval in units of 0.625 ms.
params.setWindow(0x10); // Scan window within the scan interval to enable active scanning.
foreach(const QBluetoothDeviceInfo &deviceInfo, QBluetoothDeviceDiscoveryAgent::discoveredDevices()){
qDebug()<<"Found device:"<<deviceInfo.name()<<deviceInfo.address();
}
discoveryAgent->setLowEnergyDiscoveryTimeout(5000); // Set timeout after which no more devices will be discovered
discoveryAgent->start(QBluetoothDeviceDiscoveryAgent::LowEnergyMethod);
}
此代码片段展示了如何使用Qt框架下的QLowEnergyController
和QBluetoothDeviceDiscoveryAgent
来进行BLE设备发现流程。注意这里的超时时间可以根据具体需求调整。
相关推荐
















