无线通信技术全景
智能硬件产品的无线连接能力决定了它的使用场景和体验。不同无线技术覆盖的距离、带宽、功耗差异巨大,选错通信方案是项目返工的主要原因之一。
核心指标对比
| 技术 | 频段 | 速率 | 距离 | 功耗 | 成本 | 网络拓扑 |
|---|---|---|---|---|---|---|
| WiFi 4/5/6 | 2.4/5GHz | 最高 1Gbps | 50-100m 室内 | 高(100-500mA) | $1-3 | 星型 |
| Bluetooth 5.x | 2.4GHz | 最高 2Mbps | 10-100m | 低(1-10mA) | $0.5-2 | 星型/ mesh |
| LoRa | Sub-1GHz | 0.3-50kbps | 2-15km | 极低(10-50mA) | $2-5 | 星型 |
| NFC | 13.56MHz | 106-424kbps | <10cm | 被动(无电池) | $0.3-1 | 点对点 |
| Zigbee | 2.4GHz | 250kbps | 10-100m | 低 | $1-3 | Mesh |
| UWB | 3.1-10.6GHz | 最高 27Mbps | 10-30m | 中 | $3-8 | 点对点 |
WiFi
适用于需要高带宽或直连云端的设备。智能家居中的摄像头、音箱、家电几乎都用 WiFi。
优点:不依赖网关,直接连接路由器就能上云;速率高,支持 OTA 固件升级。 缺点:功耗高,配对体验差,对路由器质量有依赖。
// ESP32 WiFi 连接示例 (ESP-IDF)
#include "esp_wifi.h"
#include "esp_event.h"
void wifi_init_sta(void) {
esp_netif_t *netif = esp_netif_create_default_wifi_sta();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_event_handler_instance_t instance_any_id;
esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID,
wifi_event_handler, NULL, &instance_any_id);
wifi_config_t wifi_config = {
.sta = {
.ssid = CONFIG_WIFI_SSID,
.password = CONFIG_WIFI_PASSWORD,
},
};
esp_wifi_set_mode(WIFI_MODE_STA);
esp_wifi_set_config(WIFI_IF_STA, &wifi_config);
esp_wifi_start();
esp_wifi_connect();
}
void wifi_event_handler(void* arg, esp_event_base_t base,
int32_t event_id, void* data) {
if (event_id == WIFI_EVENT_STA_GOT_IP) {
ip_event_got_ip_t* event = (ip_event_got_ip_t*) data;
printf("获取IP: " IPSTR "\n", IP2STR(&event->ip_info.ip));
}
}
配对方案:
- 蓝牙辅助配网 — 设备通过 BLE 广播,App 扫描后发送 WiFi 凭据
- SmartConfig — App 加密 SSID/密码到 UDP 包中广播
- WPS — 按键配对,安全性较低
- SoftAP — 设备自己发 WiFi,手机连上去配置
BLE (Bluetooth Low Energy)
BLE 已经取代经典蓝牙成为 IoT 的主流短距无线方案。
优点:功耗极低,手机原生支持,配对体验好。 缺点:速率有限,距离不如 WiFi。
# MicroPython BLE 广播
import bluetooth
import struct
import time
ble = bluetooth.BLE()
ble.active(True)
# 配置广播数据:设备名称 + 温湿度
def advertise(temp, hum):
name = b"ESP32_Sensor"
adv_data = struct.pack(
'<HB',
0x1234, # 公司ID
0x02 # 数据类型标识
) + struct.pack('<ff', temp, hum)
ble.gap_advertise(
100, # 广播间隔(ms)
adv_data + name
)
while True:
advertise(25.3, 60.1)
time.sleep(0.1)
// ESP32 BLE 服务器 (Arduino)
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
BLEService *service;
BLECharacteristic *tempChar;
void setup_ble() {
BLEDevice::init("SmartSensor");
BLEServer *server = BLEDevice::createServer();
service = server->createService("180A");
tempChar = service->createCharacteristic(
"2A1C",
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_NOTIFY
);
service->start();
BLEAdvertising *adv = BLEDevice::getAdvertising();
adv->addServiceUUID("180A");
adv->start();
}
void loop() {
float temp = read_temperature();
tempChar->setValue(temp);
tempChar->notify(); // 通知客户端更新
delay(10000);
}
BLE Mesh
BLE Mesh 基于节点中继转发,能覆盖整个建筑。适合智能灯控等大规模设备网络。
LoRa 与 LoRaWAN
LoRa 提供公里级的低速率通信,是户外传感器网络的理想选择。
优点:超远距离,穿墙能力极强,单网关可覆盖整个小区。 缺点:速率极低,不能传音视频;需要 LoRaWAN 网关。
# LoRa 节点发送 (PyCom LoPy + MicroPython)
from network import LoRa
import socket
import time
lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.AS923)
# 连接网关(OTAA 入网)
app_eui = bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
app_key = bytes([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
lora.join(activation=LoRa.OTAA, auth=(app_eui, app_key), timeout=0)
while not lora.has_joined():
time.sleep(2.5)
s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
s.setsockopt(socket.SOL_LORA, socket.SO_DR, 5) # 速率参数
s.setblocking(False)
# 发送数据
s.send(bytes([0x01, 0x02, 0x03]))
NFC (Near Field Communication)
NFC 基于 RFID 技术,通信距离在 10cm 以内。应用场景包括:手机碰一碰配网、产品防伪验证、制造阶段写入序列号和密钥。NFC 芯片通常不需要电池,由读卡器电磁场供电。
选型决策树
- 直连云服务器 → WiFi 或 4G Cat.1
- 与手机通信(大流量) → WiFi 或 BLE 2M PHY
- 与手机通信(小数据) → BLE
- 户外城市远距离 → LoRaWAN / NB-IoT
- 野外远距离 → LoRa / 卫星
- 近场配对/标签 → NFC
常见无线调试问题
信号差:用频谱仪或手机 WiFi Analyzer 检查信道占用情况,天线远离金属和地平面。连接不稳定:检查供电是否充足(WiFi 发射时电流峰值可能超过 500mA),检查软件中的重连机制。功耗高:检查是否频繁发送小包数据(尽量批量化发送),确认关闭了不必要的广播模式。
小结
无线选型的核心是匹配带宽、距离和功耗。追求用户体验用 WiFi/BLE,追求覆盖用 LoRa,追求低成本和近场用 NFC。不管选哪种方案,都需要尽早做无线性能测试,不要等到产品定型了才发现信号覆盖不达标。