医疗设备的无线通信:BLE在患者监护中的低功耗设计——数据包、连接可靠性

文章目录


每日一句正能量

家是停靠的港湾,不是争辩的战场;是温暖的归宿,不是输赢的擂台。

家在外人看来也许普通,但对家人而言应是避难所。把家当成"战场"或"擂台",非要分出对错、高低,最后赢了道理,输了感情。在家里,情永远比理重要。


一、引言:无线化医疗的"最后一公里"

全球医疗物联网(IoMT)市场规模预计2025年突破1800亿美元。在患者监护领域,无线通信技术正从"锦上添花"变为"刚需"------从ICU床旁监护到家庭慢病管理,从院内查房到远程医疗,无线化让患者摆脱了线缆束缚,实现了连续、舒适、实时的生命体征监测。

蓝牙低功耗(Bluetooth Low Energy, BLE) 凭借其超低功耗、低成本、小体积、标准化的优势,已成为医疗无线通信的首选技术。据蓝牙技术联盟统计,2024年蓝牙医疗设备出货量超过5亿台,其中BLE占比超过90%。

然而,BLE在医疗场景中的应用远非"插上模块就能用"。患者监护对数据完整性、连接可靠性、实时性、安全性 有严苛要求,而BLE的设计初衷是周期性、小数据量的传感器应用。本文将从协议栈架构、数据包设计、连接可靠性、低功耗优化四个维度,深入讲解BLE在患者监护中的工程实践。


二、BLE患者监护系统架构

2.1 系统架构总览

上图展示了BLE医疗设备在家庭场景中的典型应用:患者佩戴的无线监护设备通过BLE连接手机APP,数据经云端传输至医生端。

上图展示了BLE与经典蓝牙的核心区别:BLE专为物联网设计,功耗极低(mA级),而经典蓝牙面向音频传输,功耗较高(100mA级)。

上图展示了基于Nordic nRF52840的BLE健康监测可穿戴设备,集成了多种传感器和BLE 5.0通信。

上图展示了CenTrak的BLE医疗定位与监护系统,体现了BLE在医疗环境中的实际部署。

上图展示了BLE协议栈的完整分层架构,从应用层的Profile到物理层的Radio。

上图展示了不同BLE模块的射频参数对比,包括发射功率、接收灵敏度、休眠电流等关键指标。

上图展示了BLE在医疗行业的10个落地案例,从体温贴片到智能药盒。

上图展示了BLE患者监护系统的完整架构,从患者端设备到云端平台的全链路设计。

系统组成

组件 功能 典型芯片
患者端设备 传感器采集 + BLE从机 nRF52840, CC2640R2F, DA14531
接收设备 手机APP/床边监护仪/网关 iOS/Android, nRF52840
云端平台 数据存储 + AI分析 + 报警 AWS/Azure/阿里云

关键指标

  • 续航:CR2032纽扣电池(225mAh)连续工作7天
  • 峰值电流:<15mA(RF发射时)
  • 平均电流:<50μA(占空比<0.1%)
  • 连接可靠性:丢包率<1%,延迟<100ms

三、BLE协议栈与数据包设计

3.1 BLE 5.0协议栈分层

上图展示了BLE 5.0协议栈的完整分层架构,以及LL层数据包的详细结构。

协议栈分层

层级 功能 医疗应用要点
应用层 GATT Profile(心率、血氧、血压等) 使用标准UUID + 自定义扩展
GATT层 特征值(Characteristic)管理 Notify/Indicate实时推送
ATT层 属性协议(读/写/通知) 句柄(Handle)映射
L2CAP层 逻辑链路控制 + 数据分段 MTU协商(默认23B→最大512B)
HCI层 主机控制器接口 串口/SPI/USB
LL层 链路层(状态机 + 信道跳频) 连接事件管理
PHY层 物理层(2.4GHz + 调制) 1Mbps/2Mbps/LE Coded

3.2 LL数据包结构

BLE数据链路层(LL)数据包是射频传输的最小单元:

字段 长度 说明
前导码(Preamble) 1B 0x55或0xAA,时钟同步
访问地址(Access Address) 4B 连接标识符,随机生成
PDU Header 2B LLID + NESN + SN + MD + CP + Length
Payload 0~251B L2CAP + ATT + GATT数据
MIC 4B AES-CCM消息完整性校验(加密时)
CRC 3B 24位循环冗余校验

关键优化

  1. 数据长度扩展(DLE):BLE 4.2+支持Payload从27B扩展到251B,减少包头开销占比

    • 23B Payload时:包头开销 = (1+4+2+4+3)/23 = 56%
    • 251B Payload时:包头开销 = (1+4+2+4+3)/251 = 5.6%
  2. 2Mbps PHY:BLE 5.0支持2Mbps速率,RF发射时间减半,功耗降低

  3. LE Coded PHY:S=2(500kbps)或S=8(125kbps),通过前向纠错(FEC)扩展覆盖范围

3.3 GATT服务设计

c 复制代码
/**
 * @file ble_gatt_service.c
 * @brief 患者监护GATT服务定义(BLE从机)
 * @note 基于nRF5 SDK / Zephyr RTOS
 */

#include <stdint.h>
#include <string.h>

/* ==================== 服务UUID定义 ==================== */
// 标准UUID(16bit)
#define BLE_UUID_HEART_RATE_SERVICE         0x180D
#define BLE_UUID_DEVICE_INFORMATION_SERVICE 0x180A
#define BLE_UUID_BATTERY_SERVICE            0x180F

// 自定义UUID(128bit)
#define BLE_UUID_PATIENT_MONITOR_SERVICE    {0x00, 0x00, 0x2A, 0x5F, 0x00, 0x00, 0x10, 0x00, \
                                              0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}

/* ==================== 特征值定义 ==================== */
typedef struct {
n    uint16_t handle;          // 属性句柄
n    uint16_t uuid;            // UUID
n    uint8_t  properties;       // 属性(Read/Write/Notify/Indicate)
n    uint16_t maxLen;           // 最大长度
n    uint8_t  *pValue;          // 数据指针
n} GATT_Characteristic_t;

// 心率测量特征值(Notify)
static uint8_t heartRateValue[2] = {0x06, 0x40};  // Flags + HR=64
static GATT_Characteristic_t charHeartRate = {
n    .handle = 0x0012,
n    .uuid = 0x2A37,
n    .properties = GATT_PROP_NOTIFY,  // 免ACK推送
n    .maxLen = 2,
n    .pValue = heartRateValue
n};

// 血氧饱和度特征值(Notify)
static uint8_t spo2Value[5] = {0x00, 0x64, 0x00, 0x00, 0x00};  // SpO2=100%
static GATT_Characteristic_t charSpO2 = {
n    .handle = 0x0015,
n    .uuid = 0x2A5E,
n    .properties = GATT_PROP_NOTIFY,
n    .maxLen = 5,
n    .pValue = spo2Value
n};

// 血压特征值(Indicate - 需要ACK确认)
static uint8_t bloodPressureValue[7] = {0x00, 0x78, 0x00, 0x50, 0x00, 0x48, 0x00};  // 120/80/72
static GATT_Characteristic_t charBloodPressure = {
n    .handle = 0x0018,
n    .uuid = 0x2A35,
n    .properties = GATT_PROP_INDICATE,  // 需ACK,保证送达
n    .maxLen = 7,
n    .pValue = bloodPressureValue
n};

// 电池电量特征值(Read)
static uint8_t batteryLevel = 85;  // 85%
static GATT_Characteristic_t charBattery = {
n    .handle = 0x001B,
n    .uuid = 0x2A19,
n    .properties = GATT_PROP_READ,
n    .maxLen = 1,
n    .pValue = &batteryLevel
n};

// 报警状态特征值(Notify - 高优先级)
static uint8_t alarmStatus[4] = {0x00, 0x00, 0x00, 0x00};
static GATT_Characteristic_t charAlarm = {
n    .handle = 0x001E,
n    .uuid = 0xFF01,  // 自定义UUID
n    .properties = GATT_PROP_NOTIFY,
n    .maxLen = 4,
n    .pValue = alarmStatus
n};

/**
 * @brief 发送传感器数据(Notify方式)
n * @note 医疗场景优先使用Notify(免ACK),Indicate仅用于关键数据
n */
bool bleSendSensorData(uint8_t *data, uint16_t len, uint16_t charHandle)
{
n    // 检查连接状态
n    if (!isConnected()) {
n        return false;
n    }
n    
n    // 检查数据长度(不超过MTU-3)
n    uint16_t maxPayload = getMTU() - 3;  // ATT Header占3B
n    if (len > maxPayload) {
n        // 数据过长,需要分段发送
n        return bleSendLongData(data, len, charHandle);
n    }
n    
n    // 构建ATT通知包
n    uint8_t attPacket[256];
n    attPacket[0] = ATT_OP_HANDLE_VALUE_NOTIFICATION;  // 0x1B
n    attPacket[1] = (uint8_t)(charHandle & 0xFF);
n    attPacket[2] = (uint8_t)(charHandle >> 8);
n    memcpy(&attPacket[3], data, len);
n    
n    // 通过L2CAP发送
n    return l2capSend(attPacket, len + 3);
n}

/**
 * @brief 批量发送多个传感器数据(聚合优化)
n * @note 减少连接事件数量,降低功耗
n */
bool bleSendAggregatedData(SensorData_t *sensors, uint8_t count)
{
n    // 聚合数据包格式
n    typedef struct __attribute__((packed)) {
n        uint32_t timestamp;      // 时间戳
n        uint8_t  hr;             // 心率
n        uint8_t  spo2;           // 血氧
n        uint16_t sbp;            // 收缩压
n        uint16_t dbp;            // 舒张压
n        int16_t  temp;           // 体温(×0.01°C)
n        uint8_t  status;         // 状态位
n    } AggregatedPacket_t;
n    
n    AggregatedPacket_t packet;
n    packet.timestamp = getTimestamp();
n    packet.hr = sensors[0].heartRate;
n    packet.spo2 = sensors[0].spo2;
n    packet.sbp = sensors[0].systolicBP;
n    packet.dbp = sensors[0].diastolicBP;
n    packet.temp = (int16_t)(sensors[0].temperature * 100);
n    packet.status = sensors[0].alarmFlags;
n    
n    // 发送聚合包(18B Payload)
n    return bleSendSensorData((uint8_t *)&packet, sizeof(packet), charSpO2.handle);
n}

四、连接事件与低功耗设计

4.1 连接事件时序

上图展示了BLE连接事件的时序:在每个连接间隔内,主从设备在预定时间窗口内交换数据,其余时间进入休眠。

连接事件参数

参数 范围 说明 医疗场景建议
Connection Interval 7.5ms ~ 4s 连接事件间隔 50ms(标准监护)/ 1s(低功耗长期)
Slave Latency 0 ~ 499 从机可跳过的事件数 3(允许跳过3个事件)
Supervision Timeout 100ms ~ 32s 连接超时 500ms(6×Interval)

功耗计算公式

I a v g = T t x × I t x + T r x × I r x + T s l e e p × I s l e e p T i n t e r v a l I_{avg} = \frac{T_{tx} \times I_{tx} + T_{rx} \times I_{rx} + T_{sleep} \times I_{sleep}}{T_{interval}} Iavg=TintervalTtx×Itx+Trx×Irx+Tsleep×Isleep

示例(Interval=50ms, Latency=3):

  • 每4个间隔(200ms)唤醒1次
  • 唤醒时间:5ms(Tx+Rx+ACK)
  • 休眠时间:195ms
  • 平均电流 = (5ms×12mA + 195ms×3μA) / 200ms ≈ 0.3mA

4.2 低功耗优化策略

c 复制代码
/**
 * @file ble_low_power.c
 * @brief BLE低功耗优化:连接参数动态调整 + 外设电源管理
 */

#include <stdint.h>
#include <stdbool.h>

/* ==================== 连接参数配置 ==================== */
typedef struct {
n    uint16_t minInterval;      // 最小连接间隔 (×1.25ms)
n    uint16_t maxInterval;      // 最大连接间隔
n    uint16_t slaveLatency;     // 从机延迟
n    uint16_t supervisionTimeout; // 监督超时 (×10ms)
n} ConnectionParams_t;

// 场景化连接参数
static const ConnectionParams_t PARAMS_ICU = {
n    .minInterval = 6,    // 7.5ms
n    .maxInterval = 6,
n    .slaveLatency = 0,
n    .supervisionTimeout = 10  // 100ms
n};

static const ConnectionParams_t PARAMS_STANDARD = {
n    .minInterval = 40,   // 50ms
n    .maxInterval = 40,
n    .slaveLatency = 3,
n    .supervisionTimeout = 50  // 500ms
n};

static const ConnectionParams_t PARAMS_LOW_POWER = {
n    .minInterval = 800,  // 1s
n    .maxInterval = 800,
n    .slaveLatency = 29,
n    .supervisionTimeout = 600  // 6s
n};

/**
 * @brief 根据场景动态切换连接参数
n */
void bleUpdateConnectionParams(Scenario_t scenario)
{
n    const ConnectionParams_t *params;
n    switch (scenario) {
n        case SCENARIO_ICU:
n            params = &PARAMS_ICU;
n            break;
n        case SCENARIO_STANDARD:
n            params = &PARAMS_STANDARD;
n            break;
n        case SCENARIO_LOW_POWER:
n            params = &PARAMS_LOW_POWER;
n            break;
n        default:
n            params = &PARAMS_STANDARD;
n    }
n    
n    // 发送L2CAP连接参数更新请求
n    l2capConnectionParamUpdateReq(params);
n}

/* ==================== 外设电源管理 ==================== */
typedef struct {
n    bool sensorPowerEnabled;
n    bool adcPowerEnabled;
n    bool ledPowerEnabled;
n    uint32_t lastActivityTime;
n} PowerManager_t;

PowerManager_t g_powerManager = {0};

/**
 * @brief 传感器按需供电
n * @note 仅在采样前上电,采样后立即断电
n */
void sensorPowerControl(bool enable)
n{
n    if (enable && !g_powerManager.sensorPowerEnabled) {
n        // 上电序列
n        GPIO_SetBits(SENSOR_PWR_GPIO, SENSOR_PWR_PIN);  // 使能LDO
n        delayMs(5);  // 等待传感器稳定
n        g_powerManager.sensorPowerEnabled = true;
n    } else if (!enable && g_powerManager.sensorPowerEnabled) {
n        // 断电序列
n        GPIO_ResetBits(SENSOR_PWR_GPIO, SENSOR_PWR_PIN);
n        g_powerManager.sensorPowerEnabled = false;
n    }
n}

/**
 * @brief 低功耗模式进入
n */
void enterLowPowerMode(void)
n{
n    // 1. 关闭RF
n    radioDisable();
n    
n    // 2. 关闭外设
n    sensorPowerControl(false);
n    adcPowerControl(false);
n    ledPowerControl(false);
n    
n    // 3. 配置GPIO(避免浮空漏电流)
n    configureGPIOForSleep();
n    
n    // 4. 进入System ON模式(RAM保持,RTC运行)
n    // 或 System OFF模式(最低功耗,仅GPIO唤醒)
n    if (isConnected()) {
n        systemOnSleep();  // 保持连接
n    } else {
n        systemOffSleep(); // 广播/等待连接
n    }
n}

/**
 * @brief RTC唤醒回调(周期性采样)
n */
void rtcWakeupHandler(void)
n{
n    // 1. 唤醒系统
n    systemWakeup();
n    
n    // 2. 传感器上电
n    sensorPowerControl(true);
n    
n    // 3. 采集数据
n    SensorData_t data = readAllSensors();
n    
n    // 4. 传感器断电
n    sensorPowerControl(false);
n    
n    // 5. 缓存数据(等待连接事件发送)
n    bufferSensorData(&data);
n    
n    // 6. 如果连接中,触发连接事件提前唤醒
n    if (isConnected()) {
n        requestConnectionEvent();
n    }
n}

五、连接可靠性优化

5.1 自适应跳频(AFH)

上图展示了BLE的自适应跳频机制:主设备评估各信道质量,将干扰信道(如WiFi CH1/6/11占用的信道)标记为"坏信道",在跳频序列中跳过。

信道映射

  • 40个信道:3个广播信道(37,38,39)+ 37个数据信道(0~36)
  • 数据信道频率:2404 + 2×n MHz(n=0~36)
  • WiFi CH1:2412MHz(占用BLE CH0~CH4)
  • WiFi CH6:2437MHz(占用BLE CH16~CH20)
  • WiFi CH11:2462MHz(占用BLE CH29~CH33)

AFH实现

c 复制代码
/**
 * @brief 信道质量评估与AFH更新
n * @note 主设备每连接事件评估一次信道质量
n */
void updateChannelMap(void)
n{
n    static uint8_t channelQuality[37] = {0};  // 0=坏, 1=好
n    static uint8_t goodChannelCount = 37;
n    
n    // 获取当前连接事件的信道
n    uint8_t currentChannel = getCurrentDataChannel();
n    
n    // 评估该信道质量(基于RSSI和CRC错误率)
n    int8_t rssi = getRSSI();
n    bool crcOk = wasLastCRCPass();
n    
n    if (rssi < -80 || !crcOk) {
n        channelQuality[currentChannel] = 0;  // 标记为坏信道
n    } else {
n        channelQuality[currentChannel] = 1;  // 标记为好信道
n    }
n    
n    // 统计好信道数量
n    goodChannelCount = 0;
n    for (int i = 0; i < 37; i++) {
n        if (channelQuality[i]) goodChannelCount++;
n    }
n    
n    // 如果好信道少于2个,重置所有信道(避免全部标记为坏)
n    if (goodChannelCount < 2) {
n        memset(channelQuality, 1, 37);
n        goodChannelCount = 37;
n    }
n    
n    // 更新信道映射表(通过LL Control PDU发送给从机)
n    if (isMaster()) {
n        sendChannelMapUpdate(channelQuality, goodChannelCount);
n    }
n}

5.2 数据重传与流控

BLE LL层通过SN(Sequence Number)NESN(Next Expected Sequence Number) 实现简单的ACK/NACK机制:

  • SN:发送方当前包的序列号(0或1,1bit)
  • NESN:接收方期望收到的下一个序列号(0或1,1bit)

重传逻辑

  1. 发送方发送数据包,SN=当前值,NESN=期望收到的SN
  2. 接收方收到正确数据包,回复ACK(NESN翻转)
  3. 发送方未收到ACK(或收到NACK),重传上一包

医疗场景优化

c 复制代码
/**
 * @brief 医疗数据可靠传输(应用层重传)
n * @note LL层重传仅处理单包错误,应用层处理多包丢失
n */
typedef struct {
n    uint8_t sequence;           // 应用层序列号 0~255
n    uint32_t timestamp;         // 发送时间戳
n    uint8_t data[20];           // 数据缓存
n    uint8_t len;
n    bool acked;                 // 是否收到ACK
n} TxBuffer_t;

#define TX_BUFFER_SIZE  8
static TxBuffer_t txBuffer[TX_BUFFER_SIZE];
static uint8_t txHead = 0;
static uint8_t txTail = 0;

/**
 * @brief 发送数据(带应用层缓存)
n */
bool bleSendReliable(uint8_t *data, uint8_t len)
n{
n    // 检查缓存是否满
n    if ((txHead + 1) % TX_BUFFER_SIZE == txTail) {
n        return false;  // 缓存满,丢弃
n    }
n    
n    // 写入缓存
n    TxBuffer_t *buf = &txBuffer[txHead];
n    buf->sequence = getNextSequence();
n    buf->timestamp = getTickMs();
n    memcpy(buf->data, data, len);
n    buf->len = len;
n    buf->acked = false;
n    txHead = (txHead + 1) % TX_BUFFER_SIZE;
n    
n    // 发送(使用Indicate确保ACK)
n    return bleIndicate(data, len);
n}

/**
 * @brief 收到Indicate ACK回调
n */
void onIndicateAck(uint8_t sequence)
n{
n    // 标记对应序号的缓存为已确认
n    for (int i = txTail; i != txHead; i = (i + 1) % TX_BUFFER_SIZE) {
n        if (txBuffer[i].sequence == sequence) {
n            txBuffer[i].acked = true;
n            break;
n        }
n    }
n    
n    // 清理已确认的缓存
n    while (txTail != txHead && txBuffer[txTail].acked) {
n        txTail = (txTail + 1) % TX_BUFFER_SIZE;
n    }
n}

/**
 * @brief 超时重传检查(每100ms执行)
n */
void checkRetransmission(void)
n{
n    uint32_t now = getTickMs();
n    for (int i = txTail; i != txHead; i = (i + 1) % TX_BUFFER_SIZE) {
n        if (!txBuffer[i].acked && (now - txBuffer[i].timestamp) > 200) {
n            // 超时重传(最多3次)\n            static uint8_t retryCount[TX_BUFFER_SIZE] = {0};
n            if (retryCount[i] < 3) {\n                bleIndicate(txBuffer[i].data, txBuffer[i].len);\n                retryCount[i]++;\n                txBuffer[i].timestamp = now;\n            } else {\n                // 重传失败,触发报警\n                triggerAlarm(ALARM_BLE_DISCONNECTED);\n            }\n        }\n    }\n}

5.3 连接参数配置对比

上图展示了不同医疗场景下的BLE连接参数配置与性能对比。

场景 连接间隔 从机延迟 监督超时 平均电流 延迟 适用
高实时监护 7.5ms 0 100ms ~500μA <20ms ICU/手术室
标准监护 50ms 3 500ms ~80μA <200ms 普通病房
低功耗长期 1s 29 6s ~15μA <2s 家庭/社区
远程遥测 4s 99 30s ~8μA <10s 慢病管理

六、数据安全与合规

6.1 BLE安全机制

上图展示了BLE的LE Secure Connections配对流程,以及患者监护数据包的完整格式。

配对流程(LE Secure Connections)

  1. 配对请求:主从设备交换IO能力、认证要求
  2. 公钥交换:ECDH P-256椭圆曲线密钥交换
  3. 认证:Passkey Entry(6位数字)或Numeric Comparison(用户确认)
  4. LTK生成:Long Term Key(128bit AES密钥)
  5. 加密启动:使用LTK加密后续通信
  6. 数据加密:AES-CCM模式,MIC=4B

医疗数据安全要求

要求 实现 合规标准
数据加密 AES-128-CCM HIPAA/FDA
身份认证 配对 + Passkey ISO 27001
完整性校验 MIC (4B) 防止篡改
防重放攻击 序列号 + 时间戳 ---
白名单过滤 仅响应配对设备 防扫描攻击

6.2 数据包格式设计

c 复制代码
/**
 * @brief 患者监护自定义数据包(应用层协议)
n */
typedef struct __attribute__((packed)) {
n    uint16_t preamble;        // 0xAA55 帧头\n    uint8_t  version;          // 协议版本\n    uint8_t  sequence;         // 序列号(防重放)\n    uint32_t timestamp;        // 时间戳(秒级)\n    uint8_t  heartRate;        // 心率 (BPM)\n    uint8_t  spo2;             // 血氧 (%)\n    uint16_t systolicBP;       // 收缩压 (mmHg)\n    uint16_t diastolicBP;      // 舒张压 (mmHg)\n    int16_t  temperature;      // 体温 (×0.01°C)\n    uint8_t  respirationRate;  // 呼吸率 (BPM)\n    uint8_t  alarmFlags;       // 报警状态位\n    uint16_t crc16;            // CRC16校验\n    uint32_t mic;              // AES-CCM MIC (4B)\n} PatientMonitorPacket_t;

// 总长度: 24B\n// 有效载荷: 18B\n// 包头开销: 6B (25%)\n// 启用DLE后效率: 18/251 = 92%(多包聚合时)

七、总结与展望

本文从协议栈、数据包、连接可靠性、低功耗四个维度,系统讲解了BLE在患者监护中的工程实践:

  1. 协议栈优化:GATT服务设计 + DLE扩展 + 2Mbps PHY,提升传输效率
  2. 数据包设计:聚合发送 + Notify优先 + 自定义协议,降低功耗和延迟
  3. 连接可靠性:AFH跳频 + SN/NESN重传 + 应用层缓存,确保数据完整性
  4. 低功耗设计:动态连接参数 + 外设按需供电 + 休眠模式,实现7天续航

未来发展方向

  • BLE 5.3/5.4:增强广播同步(PAwR)、带响应的周期性广播,支持大规模传感器网络
  • LE Audio:虽然面向音频,但其Isochronous Channels可扩展至实时医疗数据流
  • AoA/AoD定位:蓝牙到达角/出发角技术,实现患者院内精准定位
  • Thread+Matter:与BLE互补,实现家庭医疗设备的跨生态互联

对于嵌入式开发者而言,掌握BLE不仅是进入医疗物联网的必备技能,更是理解"低功耗无线通信"这一通用工程领域的最佳实践。


转载自:https://blog.csdn.net/u014727709/article/details/162707480

欢迎 👍点赞✍评论⭐收藏,欢迎指正

相关推荐
欢乐熊嵌入式编程1 个月前
第2讲:什么是优秀的软件架构?
stm32·单片机·freertos·低功耗蓝牙·嵌入式架构·efr32
墨染倾城殇3 个月前
冷链、资产与家居物联场景下,小型低功耗蓝牙模组的选型与工程实践
低功耗蓝牙·蓝牙5.1·家居物联方案·ble 5.1
wotaifuzao4 个月前
从128-bit到16-bit:BLE UUID背后的带宽战争与架构设计
性能优化·蓝牙·uuid·低功耗蓝牙·架构设计·嵌入式开发·ble
Wireless_Link4 个月前
BLE核心协议,ATT(Attribute Protocol)概念介绍
低功耗蓝牙·attribute·ble att·ble属性协议·蓝牙att
飞易通6 个月前
蓝牙双模+ Wi-Fi 6为物联网赋能
物联网·蓝牙模块·低功耗蓝牙·wifi 6·蓝牙双模
----云烟----6 个月前
低功耗蓝牙建立连接过程-详解
低功耗蓝牙·连接
墨染倾城殇7 个月前
蓝牙车钥匙方案:低功耗蓝牙模块引领科技与生活完美融合
科技·嵌入式硬件·生活·蓝牙模块·低功耗蓝牙·车钥匙解决方案
墨染倾城殇7 个月前
FSC-HC05蓝牙模块:高性能无线连接的核心解决方案
蓝牙模块·低功耗蓝牙·hc05·飞易通科技
墨染倾城殇7 个月前
FSC-BW246蓝牙Wi-Fi组合模块 | 云打印物联网解决方案 | 低功耗双模连接
蓝牙模块·低功耗蓝牙·飞易通