添加本地ble控制的支持, 但是存在不能控制色温和亮度
This commit is contained in:
@ -1,6 +1,13 @@
|
||||
/*
|
||||
* Copyright (c) Huawei Technologies Co., Ltd. 2020-2022. All rights reserved.
|
||||
* Description: 蓝牙SDK提供demo示例代码(此文件为DEMO,需集成方适配修改)
|
||||
*
|
||||
* BLE本地控制功能增强:
|
||||
* - 增加完整的智能照明设备控制功能
|
||||
* - 支持亮度、色温、场景模式、渐变时长、色温模式控制
|
||||
* - 复用hilink_device.c中的fast_report统一上报机制
|
||||
* - 根据连接模式(BLE/云端)自动选择上报方式(BLE_SendCustomData/HILINK_ReportCharState)
|
||||
* - 确保BLE和云端控制逻辑的完全一致性
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
@ -39,8 +46,28 @@
|
||||
#define CHECKSUM_REPORT "{\"data\":{\"checkSum\":\"%s\"},\"sid\":\"checkSum\"}"
|
||||
#endif
|
||||
|
||||
// 外部设备控制函数声明 - 引用device_module.c中的实际设备控制逻辑
|
||||
extern int myhandle_put_brightness(const char* svc_id, const char* payload, unsigned int len);
|
||||
extern int myhandle_put_cct(const char* svc_id, const char* payload, unsigned int len);
|
||||
extern int myhandle_put_lightMode(const char* svc_id, const char* payload, unsigned int len);
|
||||
extern int myhandle_put_switch(const char* svc_id, const char* payload, unsigned int len);
|
||||
extern int myhandle_put_progressSwitch(const char* svc_id, const char* payload, unsigned int len);
|
||||
extern int myhandle_put_colourMode(const char* svc_id, const char* payload, unsigned int len);
|
||||
extern int myhandle_get_brightness(const char* svc_id, const char* in, unsigned int in_len, char** out, unsigned int* out_len);
|
||||
extern int myhandle_get_cct(const char* svc_id, const char* in, unsigned int in_len, char** out, unsigned int* out_len);
|
||||
extern int myhandle_get_lightMode(const char* svc_id, const char* in, unsigned int in_len, char** out, unsigned int* out_len);
|
||||
extern int myhandle_get_switch(const char* svc_id, const char* in, unsigned int in_len, char** out, unsigned int* out_len);
|
||||
extern int myhandle_get_progressSwitch(const char* svc_id, const char* in, unsigned int in_len, char** out, unsigned int* out_len);
|
||||
extern int myhandle_get_colourMode(const char* svc_id, const char* in, unsigned int in_len, char** out, unsigned int* out_len);
|
||||
|
||||
// 引用统一的上报机制
|
||||
extern int fast_report(const char* svc_id);
|
||||
extern void set_connection_mode(connection_mode_t mode);
|
||||
extern connection_mode_t get_connection_mode(void);
|
||||
|
||||
|
||||
//static bool g_switch = 0;
|
||||
int sid_switch;
|
||||
// int sid_switch; // 注释掉,现在使用实际设备控制函数
|
||||
static bool g_autoUpdate = 0;
|
||||
static int ble_adv_time = 0;
|
||||
static HILINK_BT_DevInfo g_btDevInfo = {0};
|
||||
@ -210,18 +237,11 @@ int getDeviceVersion(char* *firmwareVer, char* *softwareVer, char* *hardwareVer)
|
||||
|
||||
//#if (HILINK_NETCFG_MODE != SOFTAP_MODE)
|
||||
|
||||
static void ReporSwitchStatus(void)
|
||||
{
|
||||
char buff[128] = { 0 };
|
||||
int ret = snprintf_s(buff, sizeof(buff), sizeof(buff) - 1, SWITCH_REPORT, sid_switch);
|
||||
if (ret <= 0) {
|
||||
HILINK_SAL_NOTICE("ReporSwitchStatus snprintf_s ret:%d\r\n", ret);
|
||||
return;
|
||||
}
|
||||
unsigned int buffLen = strlen(buff);
|
||||
ret = BLE_SendCustomData(CUSTOM_SEC_DATA, (const unsigned char *)buff, buffLen);
|
||||
HILINK_SAL_NOTICE("BLE_SendCustomData:%s len:%u,ret:%d\r\n", buff, buffLen, ret);
|
||||
}
|
||||
// static void ReporSwitchStatus(void)
|
||||
// {
|
||||
// set_connection_mode(CONN_MODE_BLE); // 设置为BLE模式
|
||||
// fast_report("switch");
|
||||
// }
|
||||
|
||||
static void ReporAutoUpdateStatus(void)
|
||||
{
|
||||
@ -295,8 +315,27 @@ static BLE_InitPara g_bleInitParam = {
|
||||
static int BleHandleCustomDataGet(const char *sid)
|
||||
{
|
||||
HILINK_SAL_NOTICE("get %s svc\r\n", sid);
|
||||
|
||||
// 设置为BLE模式并使用统一的fast_report机制
|
||||
set_connection_mode(CONN_MODE_BLE);
|
||||
|
||||
if (strcmp(sid, "switch") == 0) {
|
||||
ReporSwitchStatus();
|
||||
fast_report("switch");
|
||||
return 0;
|
||||
} else if (strcmp(sid, "brightness") == 0) {
|
||||
fast_report("brightness");
|
||||
return 0;
|
||||
} else if (strcmp(sid, "cct") == 0) {
|
||||
fast_report("cct");
|
||||
return 0;
|
||||
} else if (strcmp(sid, "lightMode") == 0) {
|
||||
fast_report("lightMode");
|
||||
return 0;
|
||||
} else if (strcmp(sid, "progressSwitch") == 0) {
|
||||
fast_report("progressSwitch");
|
||||
return 0;
|
||||
} else if (strcmp(sid, "colourMode") == 0) {
|
||||
fast_report("colourMode");
|
||||
return 0;
|
||||
} else if (strcmp(sid, "update") == 0) {
|
||||
ReporAutoUpdateStatus();
|
||||
@ -311,23 +350,48 @@ static int BleHandleCustomDataGet(const char *sid)
|
||||
}
|
||||
|
||||
// 参考链接 https://device.harmonyos.com/cn/docs/devicepartner/DevicePartner-Guides/device-development-ble-specifications-control-0000001482432154
|
||||
// 添加全量状态上报接口,供外部调用
|
||||
void BLE_ReportAllDeviceStatus(void)
|
||||
{
|
||||
if (ble_sdk_running) {
|
||||
// 设置为BLE模式
|
||||
set_connection_mode(CONN_MODE_BLE);
|
||||
|
||||
// 使用统一的fast_report机制上报所有服务状态
|
||||
fast_report("switch");
|
||||
fast_report("brightness");
|
||||
fast_report("cct");
|
||||
fast_report("lightMode");
|
||||
fast_report("progressSwitch");
|
||||
fast_report("colourMode");
|
||||
|
||||
HILINK_SAL_NOTICE("BLE reported all device status using fast_report\r\n");
|
||||
}
|
||||
}
|
||||
|
||||
static int BleHandleCustomData(const char *buff, unsigned int len)
|
||||
{
|
||||
if (strcmp((char *)buff, "{}") == 0) {
|
||||
/* 上报全量数据 */
|
||||
ReporSwitchStatus();
|
||||
set_connection_mode(CONN_MODE_BLE); // 设置为BLE模式
|
||||
fast_report("switch");
|
||||
fast_report("brightness");
|
||||
fast_report("cct");
|
||||
fast_report("lightMode");
|
||||
fast_report("progressSwitch");
|
||||
fast_report("colourMode");
|
||||
#ifdef CONFIG_SUPPORT_HILINK_INDIE_UPGRADE
|
||||
ReporFwvCheckSum();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
int ret = -1;
|
||||
|
||||
|
||||
cJSON *json = cJSON_Parse(buff);
|
||||
if (json == NULL) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
set_connection_mode(CONN_MODE_BLE); // 设置为BLE模式
|
||||
do {
|
||||
cJSON *sidItem = cJSON_GetObjectItem(json, "sid");
|
||||
cJSON *dataItem = cJSON_GetObjectItem(json, "data");
|
||||
@ -340,10 +404,15 @@ static int BleHandleCustomData(const char *buff, unsigned int len)
|
||||
break;
|
||||
}
|
||||
|
||||
if (strcmp(sidItem->valuestring, "allservices") == 0) {
|
||||
if (strcmp(sidItem->valuestring, "allservices") == 0 || strcmp(sidItem->valuestring, "getStateinfo") == 0) {
|
||||
/* H5 连接上时会给设备发送allservices, 设备需要给H5同步全量状态 */
|
||||
HILINK_SAL_NOTICE("sync dev status\r\n");
|
||||
ReporSwitchStatus();
|
||||
fast_report("switch");
|
||||
fast_report("brightness");
|
||||
fast_report("cct");
|
||||
fast_report("lightMode");
|
||||
fast_report("progressSwitch");
|
||||
fast_report("colourMode");
|
||||
#ifdef CONFIG_SUPPORT_HILINK_INDIE_UPGRADE
|
||||
ReporFwvCheckSum();
|
||||
#endif
|
||||
@ -358,15 +427,76 @@ static int BleHandleCustomData(const char *buff, unsigned int len)
|
||||
ret = 0;
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "switch") == 0) {
|
||||
cJSON *item = cJSON_GetObjectItem(dataItem, "on");
|
||||
if (item == NULL) {
|
||||
HILINK_SAL_NOTICE("on json null\r\n");
|
||||
break;
|
||||
// 使用实际的设备控制函数
|
||||
char *data_str = cJSON_Print(dataItem);
|
||||
if (data_str != NULL) {
|
||||
ret = myhandle_put_switch("switch", data_str, strlen(data_str));
|
||||
if (ret == 0) {
|
||||
fast_report("switch"); // 控制成功后上报状态
|
||||
}
|
||||
ret = 0;
|
||||
free(data_str);
|
||||
}
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "brightness") == 0) {
|
||||
// 亮度控制
|
||||
char *data_str = cJSON_Print(dataItem);
|
||||
if (data_str != NULL) {
|
||||
ret = myhandle_put_brightness("brightness", data_str, strlen(data_str));
|
||||
if (ret == 0) {
|
||||
fast_report("brightness"); // 控制成功后上报状态
|
||||
}
|
||||
ret = 0;
|
||||
free(data_str);
|
||||
}
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "cct") == 0) {
|
||||
// 色温控制
|
||||
char *data_str = cJSON_Print(dataItem);
|
||||
if (data_str != NULL) {
|
||||
ret = myhandle_put_cct("cct", data_str, strlen(data_str));
|
||||
if (ret == 0) {
|
||||
fast_report("cct"); // 控制成功后上报状态
|
||||
}
|
||||
ret = 0;
|
||||
free(data_str);
|
||||
}
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "lightMode") == 0) {
|
||||
// 场景模式控制
|
||||
char *data_str = cJSON_Print(dataItem);
|
||||
if (data_str != NULL) {
|
||||
ret = myhandle_put_lightMode("lightMode", data_str, strlen(data_str));
|
||||
if (ret == 0) {
|
||||
fast_report("lightMode"); // 控制成功后上报状态
|
||||
}
|
||||
ret = 0;
|
||||
free(data_str);
|
||||
}
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "progressSwitch") == 0) {
|
||||
// 渐变时长控制
|
||||
char *data_str = cJSON_Print(dataItem);
|
||||
if (data_str != NULL) {
|
||||
ret = myhandle_put_progressSwitch("progressSwitch", data_str, strlen(data_str));
|
||||
if (ret == 0) {
|
||||
fast_report("progressSwitch"); // 控制成功后上报状态
|
||||
}
|
||||
ret = 0;
|
||||
free(data_str);
|
||||
}
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "colourMode") == 0) {
|
||||
// 色温模式控制
|
||||
char *data_str = cJSON_Print(dataItem);
|
||||
if (data_str != NULL) {
|
||||
ret = myhandle_put_colourMode("colourMode", data_str, strlen(data_str));
|
||||
if (ret == 0) {
|
||||
fast_report("colourMode"); // 控制成功后上报状态
|
||||
}
|
||||
ret = 0;
|
||||
free(data_str);
|
||||
}
|
||||
sid_switch = item->valueint;
|
||||
HILINK_Printf("DEMO: Hilink receive a switch cmd, on = %d\r\n", sid_switch);
|
||||
ReporSwitchStatus(); // 连上手机蓝牙时,发的第一个cjson数据。同步一次设备状态
|
||||
ret = 0;
|
||||
break;
|
||||
} else if (strcmp(sidItem->valuestring, "update") == 0) {
|
||||
cJSON *item = cJSON_GetObjectItem(dataItem, "autoUpdateOn");
|
||||
@ -395,11 +525,11 @@ static int BleRcvCustomData(unsigned char *buff, unsigned int len)
|
||||
HILINK_SAL_NOTICE("buff is NULL\r\n");
|
||||
return -1;
|
||||
}
|
||||
HILINK_SAL_NOTICE("custom data, len: %u, data: %s", len, buff);
|
||||
HILINK_SAL_NOTICE("custom data, len: %u, data: %s\n", len, buff);
|
||||
|
||||
/* 处理自定义数据 */
|
||||
if (BleHandleCustomData((const char *)buff, len) != 0) {
|
||||
HILINK_SAL_NOTICE("BleHandleCustomData fail");
|
||||
HILINK_SAL_NOTICE("BleHandleCustomData fail\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ extern "C" {
|
||||
|
||||
#define DEVICE_HIVERSION "1.0.0"
|
||||
/* 设备固件版本号 */
|
||||
#define FIRMWARE_VER "1.0.6"
|
||||
#define FIRMWARE_VER "1.0.7"
|
||||
/* 设备硬件版本号 */
|
||||
#define HARDWARE_VER "1.0.0"
|
||||
/* 设备软件版本号 */
|
||||
|
@ -409,6 +409,24 @@ int handle_get_cmd(const char* svc_id, const char* in, unsigned int in_len, char
|
||||
return function(svc_id, in, in_len, out,out_len);
|
||||
}
|
||||
|
||||
// 全局连接模式变量
|
||||
static connection_mode_t g_connection_mode = CONN_MODE_CLOUD;
|
||||
|
||||
// 设置连接模式的接口
|
||||
void set_connection_mode(connection_mode_t mode)
|
||||
{
|
||||
if( mode != g_connection_mode) {
|
||||
g_connection_mode = mode;
|
||||
HILINK_Printf("Connection mode changed to: %s\r\n", (mode == CONN_MODE_BLE) ? "BLE" : "CLOUD");
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前连接模式
|
||||
connection_mode_t get_connection_mode(void)
|
||||
{
|
||||
return g_connection_mode;
|
||||
}
|
||||
|
||||
// 快速上报函数,用于上报服务状态信息
|
||||
int fast_report(const char* svc_id)
|
||||
{
|
||||
@ -416,11 +434,31 @@ int fast_report(const char* svc_id)
|
||||
int len;
|
||||
int err = handle_get_cmd(svc_id, NULL, 0, &payload, (unsigned int *)&len);
|
||||
if(err != 0) {
|
||||
HILINK_Printf("get msg from %s failed \r\n", svc_id);
|
||||
return err;
|
||||
HILINK_Printf("get msg from %s failed \r\n", svc_id);
|
||||
return err;
|
||||
}
|
||||
|
||||
// 根据当前连接模式选择上报方式
|
||||
if (g_connection_mode == CONN_MODE_BLE) {
|
||||
// BLE模式:使用BLE_SendCustomData
|
||||
char buff[256] = {0};
|
||||
int ret = snprintf_s(buff, sizeof(buff), sizeof(buff) - 1, "{\"data\":%s,\"sid\":\"%s\"}", payload, svc_id);
|
||||
if (ret > 0) {
|
||||
err = BLE_SendCustomData(CUSTOM_SEC_DATA, (const unsigned char *)buff, strlen(buff)); // 0x03 = CUSTOM_SEC_DATA
|
||||
HILINK_Printf("BLE report %s result is %d, data:[%s] \r\n", svc_id, err, buff);
|
||||
} else {
|
||||
err = -1;
|
||||
HILINK_Printf("BLE report %s snprintf failed\r\n", svc_id);
|
||||
}
|
||||
} else {
|
||||
// 云端模式:使用HILINK_ReportCharState
|
||||
err = HILINK_ReportCharState(svc_id, payload, len);
|
||||
HILINK_Printf("CLOUD report %s result is %d, payload:%s \r\n", svc_id, err, payload);
|
||||
}
|
||||
|
||||
if (payload) {
|
||||
free(payload);
|
||||
}
|
||||
err = HILINK_ReportCharState(svc_id, payload, len);
|
||||
HILINK_Printf("report %s result is %d, payload:%s \r\n", svc_id, err, payload);
|
||||
return err;
|
||||
}
|
||||
/*
|
||||
@ -446,6 +484,9 @@ int HILINK_PutCharState(const char *svcId, const char *payload, unsigned int len
|
||||
}
|
||||
cJSON_Delete(json);
|
||||
|
||||
// 设置为云端连接模式
|
||||
set_connection_mode(CONN_MODE_CLOUD);
|
||||
|
||||
int err = handle_put_cmd(svcId, payload, len);
|
||||
e_printf("[HILINK_PutCharState] 控制指令处理完成,返回值: %d\r\n", err);
|
||||
return err;
|
||||
@ -510,6 +551,10 @@ int HILINK_GetCharState(const char *svcId, const char *in, unsigned int inLen, c
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 设置为云端连接模式
|
||||
set_connection_mode(CONN_MODE_CLOUD);
|
||||
|
||||
#ifdef CONFIG_SUPPORT_HILINK_INDIE_UPGRADE
|
||||
if (strcmp(svcId, "checkSum") == 0) {
|
||||
return GetFwvCheckSum(out, outLen);
|
||||
|
@ -186,6 +186,19 @@ void HILINK_NotifyDevStatus(int status);
|
||||
*/
|
||||
int HILINK_ProcessBeforeRestart(int flag);
|
||||
|
||||
// 连接模式枚举定义
|
||||
typedef enum {
|
||||
CONN_MODE_CLOUD = 0, // 云端连接模式
|
||||
CONN_MODE_BLE = 1 // BLE本地连接模式
|
||||
} connection_mode_t;
|
||||
|
||||
// 连接模式管理接口
|
||||
void set_connection_mode(connection_mode_t mode);
|
||||
connection_mode_t get_connection_mode(void);
|
||||
|
||||
// 快速上报接口
|
||||
int fast_report(const char* svc_id);
|
||||
|
||||
#ifdef __cplusplus
|
||||
#if __cplusplus
|
||||
}
|
||||
|
BIN
output/SR_light-LPT262_hilink-20250706-1.0.7.fwpkg
Normal file
BIN
output/SR_light-LPT262_hilink-20250706-1.0.7.fwpkg
Normal file
Binary file not shown.
BIN
output/package(SR_light-LPT262_hilink-20250706-1.0.7).zip
Normal file
BIN
output/package(SR_light-LPT262_hilink-20250706-1.0.7).zip
Normal file
Binary file not shown.
Reference in New Issue
Block a user