星闪 (NearLink) 是由华为牵头与星闪联盟全栈原创的新一代无线短距通信技术,于 2020 年 9 月由 80 家单位共同发起成立星闪联盟。作为中国原创的无线短距通信标准,星闪技术于 2025 年 5 月被正式写入国际电信联盟 (ITU) 无线接入建议书,标志着星闪技术成功融入全球通信标准体系。与传统短距传输技术相比,星闪具有低时延、高可靠、高同步精度、支持多并发、高信息安全和低功耗等卓越技术特性。
SLE (Sparklink Low Energy) 是星闪技术提供的两种无线通信接口之一,另一种是 SLB (SparkLink Basic)。SLE 作为星闪低功耗接入技术,其技术内容由 T/XS 10002 2022 规定,可提供低成本、低功耗的空口接入。SLE 显著的特点是通过采用 Polar 信道编码提升传输可靠性,减少重传节省功耗,精简广播信道功能和业务以减少拥塞可能。
星闪技术提供了 SLB 和 SLE 两种无线通信接口,以满足不同场景下的通信需求:
SLB (SparkLink Basic,星闪基础接入技术):
SLE (Sparklink Low Energy,星闪低功耗接入技术):
SLE 设备支持通过直连模式与网关模式两种方式实现连接控制:
直连模式:手机等设备的智慧生活 App 可以直接连接星闪 SLE 设备,并将获取到的设备信息注册到 HarmonyOS Connect 云。直连模式只能在一定范围内对星闪 SLE 设备进行连接和控制,不支持远程控制与多设备联动。
网关模式:如果希望实现星闪 SLE 设备的远程控制与场景联动,则需要通过星闪 SLE 网关将设备接入网络。此时,用户可以通过手机应用 (比如智慧生活 App),发送控制指令,经过路由器,再经过网关,控制家中的设备。
根据星闪接入层的角色不同,星闪设备分为 G (Grant) 节点和 T (Terminal) 节点,每个 G 节点可以管理一定数量的 T 结点,G 节点以及与其连接的 T 节点共同组成一个通信域。
SLE 协议栈采用分层架构设计,主要包括以下几个层次:
物理层 (PHY):
数据链路层 (DLL):
应用层 (APL):
SLE 设备连接注册流程主要分为以下三个阶段:
1. 建立连接:主控设备与星闪设备之间使用华为通用 UUID,建立 SSAP 连接。
2. 代理注册:主控设备获取星闪设备的相关信息,并在云端代理注册。星闪设备接收并存储 AuthCode,用于数据传输过程的加密。该过程主要涉及以下服务:
3. 断开连接:主控设备与星闪设备之间断开 SSAP 连接。
主控设备与星闪设备之间的连接建立过程如下:
设备控制流程 (含数据加解密) 主要分为以下三个阶段:
1. 建立连接:主控设备与星闪设备建立 SSAP 连接。
2. 协商秘钥:主控设备与星闪设备创建会话并协商秘钥 (SN1、SN2)。
3. 加密传输:对于控制报文和响应报文,均需要经加密处理后再进行数据传输。传输结束后,断开 SSAP 连接。
数据传输均需使用 customSecData 服务,典型场景包括:查询设备状态、查询设备所有服务、查询设备信息、控制设备状态、设备主动上报等。
**
主控设备与星闪设备之间的数据传输过程如下:
SLE 提供了完善的安全机制,确保数据传输的安全性:
设备配对:推荐使用 Just Works 配对模式。Just Works 适用于无交互界面的星闪设备 (例如星闪耳机),由主控设备发起连接即可完成配对,用户无需在被连接的星闪设备上进行操作。
数据加密:SLE 支持多种加密方式,通过 Encry 字段指定:
秘钥协商:主控设备与星闪设备通过 createSession 服务创建会话并协商会话秘钥:
数据传输加密流程:
硬件要求:
软件要求:
开发环境配置步骤:
SLE 开发主要使用以下编程语言:
C/C++:
TypeScript/JavaScript:
其他语言:
NearLink Kit 提供了丰富的 API,用于与星闪设备进行交互:
广播相关 API:
设备连接 API:
数据传输 API:
安全相关 API:
广播是 SLE 设备发现的基础机制,通过广播,设备可以向周围环境宣告自己的存在和服务能力。
广播参数配置:
广播参数主要包括广播间隔、发射功率、服务 UUID、制造商数据和服务数据等。
let setting: advertising.AdvertisingSettings = {
interval: 5000, // 广播间隔,单位毫秒
power: advertising.TxPowerMode.ADV_TX_POWER_LOW // 发射功率
};
let manufactureDataUnit: advertising.ManufacturerData = {
manufacturerId: 4567, // 制造商ID
manufacturerData: new Uint8Array([1, 2, 3, 4]) // 制造商特定数据
};
let serviceDataUnit: advertising.ServiceData = {
serviceUuid: "37bea880-fc70-11ea-b720-000000001234", // 服务UUID
serviceData: new Uint8Array([0x01, 0x02, 0x03, 0x04]) // 服务数据
};
let advData: advertising.AdvertisingData = {
serviceUuids: ["37bea880-fc70-11ea-b720-000000001234"],
manufacturerData: [manufactureDataUnit],
serviceData: [serviceDataUnit]
};
let advertisingParams: advertising.AdvertisingParams = {
advertisingSettings: setting,
advertisingData: advData
};
启动与停止广播:
// 启动广播
advertising.startAdvertising(advertisingParams).then((advertisingId: number) => {
console.log('advertising id:', advertisingId);
}).catch((err: BusinessError) => {
console.error('errCode:', err.code, ', errMessage:', err.message);
});
// 停止广播
advertising.stopAdvertising(advertisingId).then(() => {
console.log("stop advertising success");
}).catch((err: BusinessError) => {
console.error('errCode:', err.code, ', errMessage:', err.message);
});
订阅广播状态变化:
advertising.on('advertisingStateChange', (data: advertising.AdvertisingStateChangeInfo) => {
console.log('advertisingId:', data.advertisingId);
console.log('advertisingState:', data.state);
});
设备扫描与发现:
// 开始扫描
scan.startScan({
serviceUuids: ["37bea880-fc70-11ea-b720-000000001234"]
}).then(() => {
console.log('start scan success');
}).catch((err: BusinessError) => {
console.error('start scan failed:', err.message);
});
// 停止扫描
scan.stopScan().then(() => {
console.log('stop scan success');
}).catch((err: BusinessError) => {
console.error('stop scan failed:', err.message);
});
// 订阅扫描结果
scan.on('scanResult', (result: scan.ScanResult) => {
console.log('device found:', result.deviceId);
console.log('device name:', result.deviceName);
console.log('rssi:', result.rssi);
console.log('advertisingData:', result.advertisingData);
});
设备连接是 SLE 通信的基础,通过连接,设备之间可以建立可靠的数据传输通道。
创建 SSAP 客户端:
let client = nearLink.createSSAPClient();
// 订阅连接状态变化
client.on('connectionStateChange', (state: SSAPClientState) => {
console.log('connection state changed:', state);
if (state === SSAPClientState.Connected) {
console.log('connected to device');
// 连接成功后可以进行服务发现和数据传输
} else if (state === SSAPClientState.Disconnected) {
console.log('disconnected from device');
}
});
// 连接到设备
client.connect(deviceId).then(() => {
console.log('connecting to device...');
}).catch((err: BusinessError) => {
console.error('connect failed:', err.message);
});
创建 SSAP 服务器:
let server = nearLink.createSSAPServer();
// 订阅连接请求
server.on('connectionRequest', (deviceId: string) => {
console.log('connection request from:', deviceId);
// 可以在此处实现自定义的连接验证逻辑
return true; // 返回true表示接受连接请求,返回false表示拒绝
});
// 订阅连接状态变化
server.on('connectionStateChange', (deviceId: string, state: SSAPServerState) => {
console.log('connection state changed for', deviceId, ':', state);
});
// 启动服务器
server.start().then(() => {
console.log('server started');
}).catch((err: BusinessError) => {
console.error('server start failed:', err.message);
});
服务发现:
// 发现设备上的服务
client.discoverServices().then((services: Service[]) => {
console.log('services discovered:', services.length);
services.forEach((service: Service) => {
console.log('service uuid:', service.uuid);
console.log('service name:', service.name);
// 发现服务后可以发现其特征
client.discoverCharacteristics(service).then((characteristics: Characteristic[]) => {
console.log('characteristics discovered for service', service.uuid, ':', characteristics.length);
characteristics.forEach((characteristic: Characteristic) => {
console.log('characteristic uuid:', characteristic.uuid);
console.log('characteristic properties:', characteristic.properties);
});
}).catch((err: BusinessError) => {
console.error('discover characteristics failed:', err.message);
});
});
}).catch((err: BusinessError) => {
console.error('discover services failed:', err.message);
});
设备认证与配对:
// 发起配对请求
client.pairDevice().then(() => {
console.log('pairing started');
}).catch((err: BusinessError) => {
console.error('pairing failed:', err.message);
});
// 订阅配对状态变化
client.on('pairingStateChange', (state: PairingState) => {
console.log('pairing state changed:', state);
if (state === PairingState.Completed) {
console.log('pairing completed successfully');
} else if (state === PairingState.Failed) {
console.log('pairing failed');
}
});
// 设置安全级别
client.setSecurityLevel(SecurityLevel.Authenticated).then(() => {
console.log('security level set to authenticated');
}).catch((err: BusinessError) => {
console.error('set security level failed:', err.message);
});
数据传输是 SLE 通信的核心功能,通过数据传输,设备之间可以交换各种信息和控制指令。
读取特征值:
client.readCharacteristic(characteristic).then((value: Uint8Array) => {
console.log('characteristic value:', value);
// 处理读取到的数据
}).catch((err: BusinessError) => {
console.error('read characteristic failed:', err.message);
});
写入特征值:
let value = new Uint8Array([0x01, 0x02, 0x03, 0x04]);
client.writeCharacteristic(characteristic, value).then(() => {
console.log('write successful');
}).catch((err: BusinessError) => {
console.error('write failed:', err.message);
});
订阅特征值变化:
client.startNotifyCharacteristic(characteristic).then(() => {
console.log('notify started');
}).catch((err: BusinessError) => {
console.error('start notify failed:', err.message);
});
client.on('characteristicValueChanged', (characteristic: Characteristic, value: Uint8Array) => {
console.log('characteristic value changed:', value);
// 处理变化后的数据
});
client.stopNotifyCharacteristic(characteristic).then(() => {
console.log('notify stopped');
}).catch((err: BusinessError) => {
console.error('stop notify failed:', err.message);
});
设备控制示例:
// 控制设备状态示例
let command = {
services: [
{
serviceId: "onoff",
properties: {
onoff: 0 // 0表示关闭,1表示打开
}
}
]
};
let commandJson = JSON.stringify(command);
let commandBuffer = new TextEncoder().encode(commandJson);
client.writeCharacteristic(controlCharacteristic, commandBuffer).then(() => {
console.log('control command sent');
}).catch((err: BusinessError) => {
console.error('send control command failed:', err.message);
});
SLE 提供了多种安全机制,确保数据传输的安全性。
基于 AuthCode 的加密:
// 获取AuthCode
let authCode = await getAuthCodeFromCloud(); // 从云端获取AuthCode
// 派生会话秘钥
let sn1 = crypto.getRandomValues(new Uint8Array(16));
let sn2 = crypto.getRandomValues(new Uint8Array(16));
let pskKey = pbkdf2(authCode, new Uint8Array([...sn1, ...sn2]), 1000, 16, 'sha256');
// 生成IV
let iv = crypto.getRandomValues(new Uint8Array(12));
// 加密数据
let plaintext = new TextEncoder().encode("secret message");
let ciphertext = await window.crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
pskKey,
plaintext
);
// 拼接payload
let payload = new Uint8Array([...iv, ...new Uint8Array(ciphertext)]);
// 发送加密数据
client.writeCharacteristic(secureCharacteristic, payload).then(() => {
console.log('secure message sent');
}).catch((err: BusinessError) => {
console.error('send secure message failed:', err.message);
});
基于会话秘钥的加密:
// 创建会话
let session = await client.createSession();
// 加密数据
let plaintext = new TextEncoder().encode("secret message");
let ciphertext = await session.encrypt(plaintext);
// 发送加密数据
client.writeCharacteristic(secureCharacteristic, ciphertext).then(() => {
console.log('secure message sent');
}).catch((err: BusinessError) => {
console.error('send secure message failed:', err.message);
});
安全数据传输示例:
// 启动安全传输
client.startSecureTransfer().then(() => {
console.log('secure transfer started');
}).catch((err: BusinessError) => {
console.error('start secure transfer failed:', err.message);
});
// 订阅安全状态变化
client.on('securityStateChange', (state: SecurityState) => {
console.log('security state changed:', state);
if (state === SecurityState.Secure) {
console.log('secure connection established');
// 在此处进行安全数据传输
}
});
// 发送安全数据
let secureData = new Uint8Array([0x01, 0x02, 0x03, 0x04]);
client.writeSecureCharacteristic(secureCharacteristic, secureData).then(() => {
console.log('secure data sent');
}).catch((err: BusinessError) => {
console.error('send secure data failed:', err.message);
});
下面以一个简单的星闪 LED 控制案例,演示 SLE 应用开发的全过程。
硬件准备:
软件架构:
本案例包含两个部分:SLE 服务器和 SLE 客户端。
服务器端代码 (SLE_LED_Server.c):
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_pwm.h"
#include "sle_api.h"
#define LED_GPIO 7 // LED连接的GPIO引脚
// LED控制状态
static int ledState = 0;
// 处理LED控制命令
static void HandleLEDCommand(uint8_t *data, uint16_t length) {
if (length < 7) {
return;
}
if (data[0] == 'R' && data[1] == 'L' && data[2] == 'E' && data[3] == 'D') {
if (data[5] == 'O' && data[6] == 'N') {
// 打开红灯
IoTGpioSetOutputVal(LED_GPIO, 1);
ledState = 1;
} else if (data[5] == 'O' && data[6] == 'F' && data[7] == 'F') {
// 关闭红灯
IoTGpioSetOutputVal(LED_GPIO, 0);
ledState = 0;
}
}
}
// 处理接收到的数据
static void OnDataReceived(uint8_t *data, uint16_t length) {
HandleLEDCommand(data, length);
}
// LED控制任务
static void LEDControlTask(void) {
// 初始化GPIO
IoTGpioInit(LED_GPIO);
IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
IoTGpioSetOutputVal(LED_GPIO, 0);
// 初始化SLE
sle_init();
// 注册数据接收回调函数
sle_register_data_callback(OnDataReceived);
// 启动SLE广播
sle_start_advertising();
while (1) {
osDelay(1000);
// 可以在此处添加其他任务处理
}
}
APP_FEATURE_INIT(LEDControlTask);
客户端端代码 (SLE_LED_Client.c):
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "sle_api.h"
// 处理接收到的数据
static void OnDataReceived(uint8_t *data, uint16_t length) {
// 可以在此处处理服务器返回的数据
}
// 客户端主任务
static void ClientTask(void) {
// 初始化SLE
sle_init();
// 注册数据接收回调函数
sle_register_data_callback(OnDataReceived);
// 扫描服务器
sle_start_scan();
while (1) {
osDelay(1000);
// 可以在此处添加其他任务处理
}
}
APP_FEATURE_INIT(ClientTask);
手机端控制应用:
// 导入NearLink Kit模块
import { advertising, scan, nearLink } from '@kit.NearLinkKit';
// 设备控制函数
async function controlLED(deviceId: string, state: boolean) {
let client = nearLink.createSSAPClient();
await client.connect(deviceId);
let command = state ? "RLED_ON" : "RLED_OFF";
let commandBuffer = new TextEncoder().encode(command);
// 假设已发现控制特征
let characteristic = getControlCharacteristic();
await client.writeCharacteristic(characteristic, commandBuffer);
await client.disconnect();
}
// 扫描并连接设备
async function findAndControlLED() {
await scan.startScan({ serviceUuids: ["led-control-service"] });
scan.once('scanResult', async (result) => {
await scan.stopScan();
await controlLED(result.deviceId, true); // 打开LED
await new Promise(resolve => setTimeout(resolve, 5000));
await controlLED(result.deviceId, false); // 关闭LED
});
}
// 使用示例
findAndControlLED();
下面以一个星闪温湿度监测案例,演示 SLE 在数据采集场景中的应用。
硬件准备:
软件架构:
本案例包含两个部分:星闪客户端 (采集温湿度数据) 和星闪网关 (接收数据并上传至云平台)。
客户端代码 (SLE_Client.c):
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_i2c.h"
#include "aht20.h"
#include "ssd1306.h"
#include "sle_api.h"
#define I2C_IDX 0 // I2C总线ID
#define OLED_RESET_PIN 10 // OLED复位引脚
float g_temp = 0.0f;
float g_humi = 0.0f;
// 初始化传感器和显示屏
static void InitSensorAndDisplay() {
// 初始化I2C
IoTI2cInit(I2C_IDX);
IoTI2cSetBaudrate(I2C_IDX, 400000);
// 初始化AHT20
AHT20Init(I2C_IDX);
// 初始化OLED
SSD1306_Init(OLED_RESET_PIN);
SSD1306_Clear();
}
// 更新显示屏内容
static void UpdateDisplay() {
char buffer[32];
SSD1306_GotoXY(0, 0);
SSD1306_Puts("Temp: ", Font_11x18, White);
sprintf(buffer, "%.1f C", g_temp);
SSD1306_Puts(buffer, Font_11x18, White);
SSD1306_GotoXY(0, 20);
SSD1306_Puts("Humi: ", Font_11x18, White);
sprintf(buffer, "%.1f %%", g_humi);
SSD1306_Puts(buffer, Font_11x18, White);
SSD1306_UpdateScreen();
}
// 温湿度采集任务
static void Aht20TestTask(void) {
uint32_t retval = 0;
// 初始化传感器和显示屏
InitSensorAndDisplay();
// 初始化SLE
sle_init();
// 启动SLE客户端
sle_start_client();
while (1) {
// 读取温湿度数据
retval = AHT20_GetMeasureResult(&g_temp, &g_humi);
if (retval == 0) {
// 更新显示屏
UpdateDisplay();
// 发送数据到服务器
char write_req_data[500];
int16_t len = sprintf(write_req_data,
"{\"services\": [{\"serviceId\": \"温湿度\",\"properties\": {\"温度\": %d, \"湿度\": %d}}]}",
(int)g_temp, (int)g_humi);
if (len != -1) {
sle_send_data((uint8_t*)write_req_data, len);
}
}
osDelay(5000); // 每5秒采集一次
}
}
APP_FEATURE_INIT(Aht20TestTask);
网关代码 (SLE_Server.c):
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifi.h"
#include "mqtt.h"
#include "sle_api.h"
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
// MQTT配置
#define MQTT_BROKER "mqtts://iot-mqtts.cn-north-4.myhuaweicloud.com:8883"
#define DEVICE_ID "YourDeviceId"
#define DEVICE_SECRET "YourDeviceSecret"
static MQTTClient client;
// 处理接收到的数据
static void OnDataReceived(uint8_t *data, uint16_t length) {
// 解析温湿度数据
// 这里可以添加数据处理逻辑
// 通过MQTT上传到云平台
publish(client,
"$oc/devices/XXXXXX_test1/sys/properties/report",
(char*)data);
}
// WiFi连接任务
static void WiFiTask(void) {
// 初始化WiFi
WifiInit();
// 连接到WiFi网络
while (1) {
if (WifiConnect(WIFI_SSID, WIFI_PASSWORD) == 0) {
printf("WiFi connected successfully\n");
break;
}
osDelay(1000);
}
// 初始化MQTT
mqtt_init();
// 启动SLE服务器
sle_init();
sle_register_data_callback(OnDataReceived);
sle_start_server();
while (1) {
osDelay(1000);
}
}
APP_FEATURE_INIT(WiFiTask);
数据上传到云平台:
int mqtt_init(void) {
int rc;
MQTTResponse ret;
MQTTClient_init_options ops;
ops.do_openssl_init = 0;
MQTTClient_global_init(&ops);
MQTTClient_createOptions create_opts = { {'M', 'Q', 'C', 'O'}, 0, MQTTVERSION_5 };
rc = MQTTClient_createWithOptions(&client, MQTT_BROKER, DEVICE_ID, MQTTCLIENT_PERSISTENCE_DEFAULT, NULL, &create_opts);
if (rc != MQTTCLIENT_SUCCESS) {
printf("Failed to create mqtt client, return code %d\n", rc);
return -1;
}
// 设置MQTT消息接受回调函数
MQTTClient_setCallbacks(client, NULL, NULL, on_message, NULL);
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer5;
conn_opts.username = DEVICE_ID;
conn_opts.password = DEVICE_SECRET;
MQTTProperties props = MQTTProperties_initializer;
MQTTProperties willProps = MQTTProperties_initializer;
ret = MQTTClient_connect5(client, &conn_opts, &props, &willProps);
if (ret.reasonCode == MQTTREASONCODE_SUCCESS) {
printf("Connected to MQTT Broker!\n");
} else {
printf("failed to connect to MQTT Broker, return code %d\n", (int8_t)ret.reasonCode);
MQTTResponse_free(ret);
return -1;
}
MQTTResponse_free(ret);
return 0;
}
星闪网关是连接星闪设备与外部网络的桥梁,实现星闪设备的远程控制与场景联动。
网关硬件架构:
网关软件架构:
+-------------------+
| 应用层 |
| (业务逻辑、协议转换) |
+-------------------+
| 服务层 |
| (设备管理、数据处理) |
+-------------------+
| 驱动层 |
| (星闪驱动、网络驱动) |
+-------------------+
| 硬件层 |
| (处理器、通信模块) |
+-------------------+
网关关键功能模块:
1. 设备管理模块:
2. 数据转发模块:
3. 协议转换模块:
4. 安全模块:
网关代码示例:
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifi.h"
#include "mqtt.h"
#include "sle_api.h"
#define WIFI_SSID "YourWiFiSSID"
#define WIFI_PASSWORD "YourWiFiPassword"
// MQTT配置
#define MQTT_BROKER "mqtts://iot-mqtts.cn-north-4.myhuaweicloud.com:8883"
#define DEVICE_ID "YourDeviceId"
#define DEVICE_SECRET "YourDeviceSecret"
static MQTTClient client;
// 处理星闪设备发送的数据
static void OnDeviceDataReceived(uint8_t *data, uint16_t length) {
// 解析设备数据
// 这里可以添加数据处理逻辑
// 通过MQTT上传到云平台
publish(client,
"$oc/devices/XXXXXX_test1/sys/properties/report",
(char*)data);
}
// 处理云平台下发的控制指令
static void OnCloudCommandReceived(char *topic, char *payload) {
// 解析控制指令
// 这里可以添加指令解析逻辑
// 发送控制指令到星闪设备
sle_send_control_command((uint8_t*)payload, strlen(payload));
}
// WiFi连接任务
static void WiFiTask(void) {
// 初始化WiFi
WifiInit();
// 连接到WiFi网络
while (1) {
if (WifiConnect(WIFI_SSID, WIFI_PASSWORD) == 0) {
printf("WiFi connected successfully\n");
break;
}
osDelay(1000);
}
// 初始化MQTT
mqtt_init();
// 初始化星闪
sle_init();
sle_register_data_callback(OnDeviceDataReceived);
sle_start_server();
while (1) {
osDelay(1000);
}
}
// MQTT初始化
int mqtt_init(void) {
int rc;
MQTTResponse ret;
MQTTClient_init_options ops;
ops.do_openssl_init = 0;
MQTTClient_global_init(&ops);
MQTTClient_createOptions create_opts = { {'M', 'Q', 'C', 'O'}, 0, MQTTVERSION_5 };
rc = MQTTClient_createWithOptions(&client, MQTT_BROKER, DEVICE_ID, MQTTCLIENT_PERSISTENCE_DEFAULT, NULL, &create_opts);
if (rc != MQTTCLIENT_SUCCESS) {
printf("Failed to create mqtt client, return code %d\n", rc);
return -1;
}
// 设置MQTT消息接受回调函数
MQTTClient_setCallbacks(client, NULL, NULL, OnCloudCommandReceived, NULL);
MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer5;
conn_opts.username = DEVICE_ID;
conn_opts.password = DEVICE_SECRET;
MQTTProperties props = MQTTProperties_initializer;
MQTTProperties willProps = MQTTProperties_initializer;
ret = MQTTClient_connect5(client, &conn_opts, &props, &willProps);
if (ret.reasonCode == MQTTREASONCODE_SUCCESS) {
printf("Connected to MQTT Broker!\n");
} else {
printf("failed to connect to MQTT Broker, return code %d\n", (int8_t)ret.reasonCode);
MQTTResponse_free(ret);
return -1;
}
MQTTResponse_free(ret);
return 0;
}
APP_FEATURE_INIT(WiFiTask);
SLE 作为低功耗接入技术,在应用开发中需要特别关注功耗优化。
低功耗设计原则:
功耗优化方法:
1. 优化广播参数:
// 设置低功耗广播参数
sle_set_advertising_interval(10000); // 10秒广播一次
sle_set_transmit_power(SLE_TX_POWER_LOW); // 低发射功率
2. 优化连接参数:
// 设置低功耗连接参数
sle_set_connection_interval(100); // 连接间隔100ms
sle_set_connection_timeout(200); // 连接超时200ms
sle_set_sleep_mode(SLE_SLEEP_MODE_DEEP); // 深度睡眠模式
3. 数据传输优化:
// 合并数据发送
uint8_t data[100];
int len = 0;
// 添加多个命令到缓冲区
len += sprintf((char*)data + len, "{\"cmd1\":\"value1\"}");
len += sprintf((char*)data + len, "{\"cmd2\":\"value2\"}");
// 发送合并后的数据
sle_send_data(data, len);
4. 电源管理优化:
// 进入低功耗模式
void EnterLowPowerMode() {
// 关闭不必要的外设
IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_IN);
// 设置处理器进入休眠模式
osKernelEnterSVC();
}
// 唤醒处理函数
void WakeupHandler() {
// 初始化外设
IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);
IoTGpioSetOutputVal(LED_GPIO, 0);
// 处理唤醒后的任务
// ...
}
5. 低功耗测试与分析:
测试环境:采用直流电源给Server端供电,串口给Client端供电并打开串口工具查看测试带宽
Server端:4M PHY测速时电流:10.5mA;2M PHY电流:9.8mA
Server端:非测速状态电流:4-6mA
SLE 提供了许多高级功能,可满足不同场景下的需求。
1. 高精度测距功能:
星闪将定位精度由传统无线技术的米级提升到分米级,依托领先的测距算法,有效克服人体遮挡、环境吸收和反射等因素叠加,解决测距结果不稳定、反复解闭锁的痛点。
// 初始化测距功能
sle_init_ranging();
// 启动测距
sle_start_ranging();
// 处理测距结果
void OnRangingResult(sle_ranging_result_t *result) {
printf("Distance: %d cm\n", result->distance);
printf("Angle: %d degrees\n", result->angle);
printf("RSSI: %d dBm\n", result->rssi);
}
// 注册测距回调函数
sle_register_ranging_callback(OnRangingResult);
2. 多设备并发控制:
SLE 支持多设备并发控制,可同时管理多个设备。
// 管理多个设备
sle_device_t devices[10];
int device_count = 0;
// 设备连接回调函数
void OnDeviceConnected(sle_device_t *device) {
// 添加设备到列表
devices[device_count++] = *device;
// 初始化设备
sle_init_device(device);
}
// 设备断开回调函数
void OnDeviceDisconnected(sle_device_t *device) {
// 从列表中移除设备
for (int i = 0; i < device_count; i++) {
if (devices[i].id == device->id) {
devices[i] = devices[--device_count];
break;
}
}
}
// 向所有设备发送命令
void SendCommandToAllDevices(uint8_t *data, uint16_t length) {
for (int i = 0; i < device_count; i++) {
sle_send_data_to_device(&devices[i], data, length);
}
}
3. 高速数据传输:
SLE 支持高速数据传输,最高速率可达 3.8Mbps。
// 设置高速传输模式
sle_set_phy_rate(SLE_PHY_RATE_4M); // 4Mbps速率
// 发送大数据包
uint8_t large_data[1024];
for (int i = 0; i < 1024; i++) {
large_data[i] = i;
}
// 分包发送
sle_send_large_data(large_data, 1024);
// 接收大数据包回调函数
void OnLargeDataReceived(uint8_t *data, uint16_t length) {
// 处理接收到的大数据
}
// 注册大数据接收回调函数
sle_register_large_data_callback(OnLargeDataReceived);
4. 低延迟传输:
SLE 支持低延迟传输,平均传输时延约为 30ms。
// 设置低延迟模式
sle_set_low_latency_mode(true);
// 发送紧急命令
uint8_t emergency_command[] = {0x01, 0x02, 0x03, 0x04};
sle_send_emergency_command(emergency_command, sizeof(emergency_command));
// 处理紧急响应
void OnEmergencyResponseReceived(uint8_t *data, uint16_t length) {
// 处理紧急响应
}
// 注册紧急响应回调函数
sle_register_emergency_response_callback(OnEmergencyResponseReceived);
SLE 可以与其他技术融合,实现更丰富的应用场景。
1. SLE 与鸿蒙系统融合:
以 OpenHarmony 为技术底座的 AI 全场景操作系统,可与星闪技术深度融合。
// 鸿蒙系统中的星闪应用示例
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "sle_api.h"
// 鸿蒙系统服务初始化
void InitHarmonyServices() {
// 初始化鸿蒙系统服务
SystemInit();
// 初始化星闪服务
sle_init();
// 注册数据回调函数
sle_register_data_callback(OnDataReceived);
// 启动星闪广播
sle_start_advertising();
}
// 应用入口
void main() {
InitHarmonyServices();
while (1) {
osDelay(1000);
}
}
APP_FEATURE_INIT(main);
2. SLE 与 PLC 控制融合:
使用星闪 H3863 开发板,通过星闪通讯协议 (SLE) 实现设备间的低延时通讯,并结合西门子 PLC 实现工业控制的应用。
// UART初始化函数
void UART_Init() {
// 配置UART参数
IoTUartInit(UART_PORT, 115200, UART_CONFIG_PARITY_NONE, UART_CONFIG_STOP_BITS_1, UART_CONFIG_DATA_BITS_8);
// 使能UART接收中断
IoTUartSetRecvCallback(UART_PORT, OnUartReceived);
}
// 处理接收到的数据
void OnDataReceived(uint8_t *data, uint16_t length) {
// 发送数据到PLC
IoTUartWrite(UART_PORT, data, length);
}
// 处理PLC返回的数据
void OnUartReceived(int32_t fd) {
uint8_t data[1024];
int32_t length = IoTUartRead(fd, data, sizeof(data));
if (length > 0) {
// 发送数据到星闪设备
sle_send_data(data, length);
}
}
// 主任务
void PLCControlTask(void) {
// 初始化UART
UART_Init();
// 初始化星闪
sle_init();
// 注册数据回调函数
sle_register_data_callback(OnDataReceived);
// 启动星闪客户端
sle_start_client();
while (1) {
osDelay(1000);
}
}
APP_FEATURE_INIT(PLCControlTask);
3. SLE 与无人机控制融合:
星闪无人机开发实战课,展示了星闪技术在无人机控制中的应用。
// 无人机控制任务
void DroneControlTask(void) {
// 初始化星闪
sle_init();
// 注册数据回调函数
sle_register_data_callback(OnControlCommandReceived);
// 启动星闪客户端
sle_start_client();
while (1) {
// 读取传感器数据
ReadSensors();
// 发送状态信息
SendStatus();
osDelay(100);
}
}
// 处理控制命令
void OnControlCommandReceived(uint8_t *data, uint16_t length) {
// 解析控制命令
DroneCommand command;
memcpy(&command, data, sizeof(DroneCommand));
// 执行控制命令
switch (command.type) {
case DRONE_COMMAND_TAKEOFF:
Takeoff();
break;
case DRONE_COMMAND_LAND:
Land();
break;
case DRONE_COMMAND_MOVE:
Move(command.x, command.y, command.z);
break;
case DRONE_COMMAND_ROTATE:
Rotate(command.angle);
break;
}
}
APP_FEATURE_INIT(DroneControlTask);
星闪 SLE 作为新一代低功耗无线通信技术,具有以下特点:
技术优势:
应用场景:
开发特点:
随着星闪技术的不断发展和完善,未来将呈现以下趋势:
技术发展趋势:
应用发展趋势:
生态发展趋势:
对于想要学习和实践星闪 SLE 开发的开发者,提出以下建议:
学习路径:
实践资源:
开发建议:
随着星闪技术的不断发展和完善,相信会有越来越多的开发者加入到星闪生态建设中来,共同推动星闪技术的创新和应用。