1.移除 IOT 控制协议 已被MCP控制方式替代 2.修复助眠仪等级控制失败问题

This commit is contained in:
helloyifa 2025-07-11 01:24:10 +08:00
parent d54fd916e7
commit 3c32679dbb
14 changed files with 14 additions and 650 deletions

View File

@ -676,7 +676,7 @@ static void handle_system_event(key_event_t event)
app_start(); app_start();
init_bat_timer(); init_bat_timer();
// spi_led_init(); // spi_led_init();
bk_printf("VER:%s\r\n","1.0.6"); bk_printf("VER:%s\r\n",APPLICATION_VERSION);
#endif #endif
#endif #endif

View File

@ -49,7 +49,7 @@ static ReturnValue sleep_helper_set_mode_callback(const PropertyList* properties
} }
static ReturnValue sleep_helper_set_level_callback(const PropertyList* properties) { static ReturnValue sleep_helper_set_level_callback(const PropertyList* properties) {
Property* level_prop = property_list_get_by_name(properties, "mode"); Property* level_prop = property_list_get_by_name(properties, "level");
if (!level_prop || property_get_type(level_prop) != PROPERTY_TYPE_INTEGER) { if (!level_prop || property_get_type(level_prop) != PROPERTY_TYPE_INTEGER) {
return return_value_create_string("{\"error\":\"Invalid level parameter\"}"); return return_value_create_string("{\"error\":\"Invalid level parameter\"}");
} }
@ -248,7 +248,7 @@ void app_mcp_init(){
PropertyList* props = property_list_create(); PropertyList* props = property_list_create();
Property* brightness_prop = property_create_integer("brightness", false, 0, true, 0, 100); Property* brightness_prop = property_create_integer("brightness", false, 0, true, 0, 100);
property_list_add_property(props, brightness_prop); property_list_add_property(props, brightness_prop);
mcp_server_add_tool_with_params(mcp_server, "self.screen.set_brightness", "Set screen brightness", props, set_brightness_callback); mcp_server_add_tool_with_params(mcp_server, "self.light.set_brightness", "设置拍拍灯的灯光亮度", props, set_brightness_callback);
} }
// 添加拍照工具 // 添加拍照工具
//{ //{

View File

@ -80,7 +80,7 @@ enum ListeningMode {
* BLE设置灯光常亮时异常问题 * BLE设置灯光常亮时异常问题
*/ */
#define APPLICATION_VERSION "1.1.6" #define APPLICATION_VERSION "1.1.8"
#define APPLICATION_DEFULT_OTA_URL "https://xiaozhi.xa-poka.com/xiaozhi/ota/" #define APPLICATION_DEFULT_OTA_URL "https://xiaozhi.xa-poka.com/xiaozhi/ota/"
#define APPLICATION_CONFIG_KEY_AI_URL "ai_url" #define APPLICATION_CONFIG_KEY_AI_URL "ai_url"
/** /**

View File

@ -927,21 +927,7 @@ int rtc_websocket_send_text(transport web_socket, void *str, enum MsgType msgtyp
break;} break;}
case BEKEN_RTC_SEND_IOT_DESC:{
extern char *getGlobalSessionId(void);
cJSON* iot_desc = (cJSON*)thing_gen_iot_descriptors(getGlobalSessionId());
char *message = cJSON_PrintUnformatted(iot_desc);
if (message == NULL)
{
cJSON_Delete(iot_desc);
return -1;
}
LOGI("iot -->(len:%d) %s\n",strlen(message),message);
int ret = websocket_client_send_text(web_socket, message, strlen(message), 10*1000);
LOGE("send iot desc ret:%d \n",ret);
cJSON_Delete(iot_desc);
break;}
default: default:
BK_LOGE("WebSocket", "Unsupported message type"); BK_LOGE("WebSocket", "Unsupported message type");
return -1; return -1;

View File

@ -44,91 +44,6 @@ int lamp_get_bright(){
return ws2812_get_brightness(); return ws2812_get_brightness();
} }
cJSON* iot_lamp_get_device_desc(){
cJSON *lamp_desc = cJSON_CreateObject();
cJSON_AddStringToObject(lamp_desc, "name", IOT_LAMP_DEVICE_NAME);
cJSON_AddStringToObject(lamp_desc, "description", "这是拍拍灯");
cJSON *properties = cJSON_CreateObject();
//定义brightness 属性
cJSON *brightness = cJSON_CreateObject();
cJSON_AddStringToObject(brightness, "description", "当前亮度百分比");
cJSON_AddStringToObject(brightness, "type", "number");
//添加brightness属性到properties
cJSON_AddItemToObjectCS(properties,"brightness",brightness);
//定义battery 属性
cJSON *battery = cJSON_CreateObject();
cJSON_AddStringToObject(battery, "description", "当前电量百分比");
cJSON_AddStringToObject(battery, "type", "number");
cJSON_AddItemToObjectCS(properties,IOT_LAMP_DEVICE_PARAM_BATTERY,battery);
//添加properties 到lamp_desc 描述
cJSON_AddItemToObjectCS(lamp_desc,"properties",properties);
//定义version属性
cJSON *version = cJSON_CreateObject();
cJSON_AddStringToObject(version, "description", "当前拍拍灯软件版本");
cJSON_AddStringToObject(version, "type", "string");
//添加brightness属性到properties
cJSON_AddItemToObjectCS(properties,"version",version);
//添加properties 到lamp_desc 描述
cJSON_AddItemToObjectCS(lamp_desc,"properties",properties);
//定义方法methods
cJSON *methods = cJSON_CreateObject();
//定义一个设置亮度的方法
/*"SetBrightness": {
"description": "设置亮度",
"parameters": {
"brightness": {
"description": "0到100之间的整数",
"type": "number"
}
}
}
*/
cJSON *SetBrightness = cJSON_CreateObject();
cJSON_AddStringToObject(SetBrightness, "description", "打开关闭灯光以及设置亮度");
cJSON *parameters = cJSON_CreateObject();
cJSON *p_brightness = cJSON_CreateObject();
cJSON_AddStringToObject(p_brightness, "type", "number");
cJSON_AddStringToObject(p_brightness, "description", "0到100之间的整数 0表示关灯 非0表示打开,默认100");
cJSON_AddItemToObjectCS(parameters,IOT_LAMP_DEVICE_PARAM_BRIGHTNESS,p_brightness);
cJSON_AddItemToObjectCS(SetBrightness,"parameters",parameters);
//cJSON_AddStringToObject(SetBrightness, "type", "number");
cJSON_AddItemToObjectCS(methods,IOT_LAMP_DEVICE_FUNS_SET_BRIGHTNESS,SetBrightness);
cJSON *methods_ota = cJSON_CreateObject();
//[警告:此操作将导致设备完全关闭,请慎重使用]
cJSON_AddStringToObject(methods_ota, "description", "升级拍拍灯最新软件[必须要用户二次确认]");
//cJSON_AddStringToObject(SetBrightness, "type", "number");
cJSON_AddItemToObjectCS(methods,IOT_LAMP_DEVICE_OTA,methods_ota);
cJSON_AddItemToObjectCS(lamp_desc,"methods",methods);
//打印一下描述
//char *json_desc = cJSON_Print(lamp_desc);
//LOGE("lamp_desc-->%s\n",json_desc);
//cJSON_Delete(lamp_desc);
return lamp_desc;
}
void iot_lamp_report_state(int brightness){ void iot_lamp_report_state(int brightness){
} }
@ -305,39 +220,3 @@ __exit:
return ret; return ret;
} }
void iot_lamp_parser_invoke(char* cmd,char * paramters_json){
//设置亮度
if (strcmp(cmd, "SetBrightness") == 0)
{
//获取亮度值
cJSON* params = cJSON_Parse(paramters_json);
if(params == NULL) return;
// {"brightness": 60}
int brightness = cJSON_GetObjectItem(params, IOT_LAMP_DEVICE_PARAM_BRIGHTNESS)->valueint;
LOGE("invoke brightness-->%d\n",brightness);
if(brightness == 0){
ws2812_led_clear_all();
}else{
//ws2812_set_all_led(0xFFFFFF,brightness);
ws2812_set_all_led_brightness(brightness);
}
//thing_report_iot_state_number(IOT_LAMP_DEVICE_NAME,IOT_LAMP_DEVICE_PARAM_BRIGHTNESS,brightness);
cJSON_Delete(params);
}
else if (strcmp(cmd, IOT_LAMP_DEVICE_OTA) == 0){
LOGE("invoke ota !!\n");
//电量低于25 不允许执行OTA
int battery = battery_get_percent();
if(battery < 25){
LOGE("power low bat:%d ,don't ota !!\n",battery);
app_event_send_msg(APP_EVT_LOW_VOLTAGE, 0);
return ;
}
iot_lamp_check_ota();
//ws2812_led_start_ota();
//https_ota_start();
}
}

View File

@ -34,8 +34,6 @@ void lamp_deinit();
*/ */
int lamp_get_bright(); int lamp_get_bright();
cJSON * iot_lamp_get_device_desc();
void iot_lamp_parser_invoke(char* cmd,char * paramters_json);
int iot_lamp_check_ota(); int iot_lamp_check_ota();
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -272,7 +272,6 @@ void sleep_helper_set_mode(sleep_mode mode){
sleep_msg_t msg; sleep_msg_t msg;
msg.mode = mode; msg.mode = mode;
rtos_push_to_queue(&sleep_helper_msg_que, &msg, BEKEN_NO_WAIT); rtos_push_to_queue(&sleep_helper_msg_que, &msg, BEKEN_NO_WAIT);
//thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,mode);
} }
} }
@ -339,7 +338,6 @@ void sleep_helper_set_level(sleep_model_level level){
LOGE("sleep_helper period_cycle s %d duty_cycle %d\n",config.period_cycle,config.duty_cycle); LOGE("sleep_helper period_cycle s %d duty_cycle %d\n",config.period_cycle,config.duty_cycle);
bk_pwm_set_init_signal_low(pwm_chan); bk_pwm_set_init_signal_low(pwm_chan);
bk_pwm_set_period_duty(pwm_chan,&config); bk_pwm_set_period_duty(pwm_chan,&config);
//thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_LEVEL,level);
} }
} }
@ -375,7 +373,6 @@ int sleep_helper_open(){
//默认模式1 //默认模式1
sleep_helper_set_mode(SLEEP_MODE_1); sleep_helper_set_mode(SLEEP_MODE_1);
sleep_helper_start_timer(); sleep_helper_start_timer();
//thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,SLEEP_MODE_1);
return 0; return 0;
} }
@ -389,117 +386,8 @@ void sleep_helper_close(){
// 关闭电源输出 // 关闭电源输出
bk_gpio_set_output_low(GPIO_44); bk_gpio_set_output_low(GPIO_44);
bk_gpio_set_output_low(GPIO_45); bk_gpio_set_output_low(GPIO_45);
//thing_report_iot_state_number(IOT_SLEEP_HELPER_DEVICE_NAME,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,0);
} }
cJSON* iot_sleep_helper_get_device_desc()
{
cJSON *sleep_helper_desc = cJSON_CreateObject();
cJSON_AddStringToObject(sleep_helper_desc, "name", IOT_SLEEP_HELPER_DEVICE_NAME);
cJSON_AddStringToObject(sleep_helper_desc, "description", "这是助眠仪(睡眠辅助仪器)");
cJSON *properties = cJSON_CreateObject();
//mode 属性
cJSON *mode = cJSON_CreateObject();
cJSON_AddStringToObject(mode, "description", "当前工作模式 0表示关闭 1-3表示3种不同的模式");
cJSON_AddStringToObject(mode, "type", "number");
//添加mode属性到properties
cJSON_AddItemToObjectCS(properties,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,mode);
//level 属性
cJSON *param_level = cJSON_CreateObject();
cJSON_AddStringToObject(param_level, "description", "当前工作等级");
cJSON_AddStringToObject(param_level, "type", "number");
//添加mode属性到properties
cJSON_AddItemToObjectCS(properties,IOT_SLEEP_HELPER_DEVICE_PARAM_LEVEL,param_level);
//添加properties speaker_desc 描述
cJSON_AddItemToObjectCS(sleep_helper_desc,"properties",properties);
//定义方法methods
cJSON *methods = cJSON_CreateObject();
//设置模式的方法
cJSON *setMode = cJSON_CreateObject();
cJSON_AddStringToObject(setMode, "description", "设置助眠仪工作模式");
cJSON *parameters = cJSON_CreateObject();
cJSON *p_mode = cJSON_CreateObject();
cJSON_AddStringToObject(p_mode, "type", "number");
cJSON_AddStringToObject(p_mode, "description", "1到3之间的整数");
cJSON_AddItemToObjectCS(parameters,IOT_SLEEP_HELPER_DEVICE_PARAM_MODE,p_mode);
cJSON_AddItemToObjectCS(setMode,"parameters",parameters);
cJSON_AddItemToObjectCS(methods,IOT_SLEEP_HELPER_DEVICE_FUNS_SET_MODE,setMode);
//设置工作等级的方法
cJSON *setLevel = cJSON_CreateObject();
cJSON_AddStringToObject(setLevel, "description", "设置助眠仪工作等级强度");
cJSON *parameters_set_level = cJSON_CreateObject();
cJSON *p_level = cJSON_CreateObject();
cJSON_AddStringToObject(p_level, "type", "number");
cJSON_AddStringToObject(p_level, "description", "1到9之间的整数");
cJSON_AddItemToObjectCS(parameters_set_level,IOT_SLEEP_HELPER_DEVICE_PARAM_LEVEL,p_level);
cJSON_AddItemToObjectCS(setLevel,"parameters",parameters_set_level);
cJSON_AddItemToObjectCS(methods,IOT_SLEEP_HELPER_DEVICE_FUNS_SET_LEVEL,setLevel);
//打开助眠仪
cJSON *methods_open = cJSON_CreateObject();
cJSON_AddStringToObject(methods_open, "description", "打开助眠仪");
cJSON_AddItemToObjectCS(methods,IOT_SLEEP_HELPER_DEVICE_OPEN,methods_open);
//打开助眠仪
cJSON *methods_close = cJSON_CreateObject();
cJSON_AddStringToObject(methods_close, "description", "关闭助眠仪");
cJSON_AddItemToObjectCS(methods,IOT_SLEEP_HELPER_DEVICE_CLOSE,methods_close);
cJSON_AddItemToObjectCS(sleep_helper_desc,"methods",methods);
//打印一下描述
//char *json_desc = cJSON_Print(speaker_desc);
//LOGE("speaker_desc-->%s\n",json_desc);
//cJSON_Delete(speaker_desc);
return sleep_helper_desc;
}
void iot_sleep_helper_parser_invoke(char* cmd,char * paramters_json){
LOGE("iot_sleep_helper_parser_invoke :%s\n",paramters_json);
cJSON* params = cJSON_Parse(paramters_json);
if(params == NULL){
LOGE("params == NULL\n");
//return;
}
//设置模式
if (strcmp(cmd, IOT_SLEEP_HELPER_DEVICE_FUNS_SET_MODE) == 0)
{
// {"mode": 60}
int mode = cJSON_GetObjectItem(params, "mode")->valueint;
LOGE("mode :%d\n",mode);
sleep_helper_set_mode(mode);
}
if (strcmp(cmd, IOT_SLEEP_HELPER_DEVICE_FUNS_SET_LEVEL) == 0)
{
// {"level": 60}
int level = cJSON_GetObjectItem(params, "level")->valueint;
LOGE("level :%d\n",level);
sleep_helper_set_level(level);
}
if (strcmp(cmd, IOT_SLEEP_HELPER_DEVICE_OPEN) == 0)
{
sleep_helper_open();
}
if (strcmp(cmd, IOT_SLEEP_HELPER_DEVICE_CLOSE) == 0)
{
sleep_helper_close();
}
cJSON_Delete(params);
}
void sleep_helper_init(){ void sleep_helper_init(){
bk_pwm_driver_init(); bk_pwm_driver_init();

View File

@ -76,8 +76,6 @@ int sleep_helper_get_level();
int sleep_helper_get_work_timeout(); int sleep_helper_get_work_timeout();
void sleep_helper_deinit(); void sleep_helper_deinit();
cJSON * iot_sleep_helper_get_device_desc();
void iot_sleep_helper_parser_invoke(char* cmd,char * paramters_json);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -160,48 +160,6 @@ uint32_t speaker_volume_get_level_count()
#endif #endif
cJSON* iot_speaker_get_device_desc()
{
cJSON *speaker_desc = cJSON_CreateObject();
cJSON_AddStringToObject(speaker_desc, "name", IOT_SPEAKER_DEVICE_NAME);
cJSON_AddStringToObject(speaker_desc, "description", "音量调节");
cJSON *properties = cJSON_CreateObject();
//volume 属性
cJSON *volume = cJSON_CreateObject();
cJSON_AddStringToObject(volume, "description", "当前设备音量 0-100");
cJSON_AddStringToObject(volume, "type", "number");
//添加brightness属性到properties
cJSON_AddItemToObjectCS(properties,IOT_SPEAKER_DEVICE_PARAM_VOL,volume);
//添加properties speaker_desc 描述
cJSON_AddItemToObjectCS(speaker_desc,"properties",properties);
//定义方法methods
cJSON *methods = cJSON_CreateObject();
cJSON *setVolume = cJSON_CreateObject();
cJSON_AddStringToObject(setVolume, "description", "设置音量和声音大小");
cJSON *parameters = cJSON_CreateObject();
cJSON *p_volume = cJSON_CreateObject();
cJSON_AddStringToObject(p_volume, "type", "number");
cJSON_AddStringToObject(p_volume, "description", "0到100之间的整数");
cJSON_AddItemToObjectCS(parameters,"volume",p_volume);
cJSON_AddItemToObjectCS(setVolume,"parameters",parameters);
//cJSON_AddStringToObject(SetBrightness, "type", "number");
cJSON_AddItemToObjectCS(methods,IOT_SPEAKER_DEVICE_FUNS_SET_VOL,setVolume);
cJSON_AddItemToObjectCS(speaker_desc,"methods",methods);
//打印一下描述
//char *json_desc = cJSON_Print(speaker_desc);
//LOGE("speaker_desc-->%s\n",json_desc);
//cJSON_Delete(speaker_desc);
return speaker_desc;
}
void speaker_set_volume(int volume) void speaker_set_volume(int volume)
{ {
if (volume >= 0 && volume <= 100) if (volume >= 0 && volume <= 100)
@ -212,23 +170,3 @@ void speaker_set_volume(int volume)
//thing_report_iot_state_number(IOT_SPEAKER_DEVICE_NAME, IOT_SPEAKER_DEVICE_PARAM_VOL, volume); //thing_report_iot_state_number(IOT_SPEAKER_DEVICE_NAME, IOT_SPEAKER_DEVICE_PARAM_VOL, volume);
} }
} }
void iot_speaker_parser_invoke(char* cmd,char * paramters_json){
LOGE("iot_speaker_parser_invoke :%s\n",paramters_json);
//设置音量
if (strcmp(cmd, "setVolume") == 0)
{
//获取亮度值
cJSON* params = cJSON_Parse(paramters_json);
if(params == NULL){
LOGE("params == NULL\n");
return;
}
// {"volume": 60}
int volume = cJSON_GetObjectItem(params, "volume")->valueint;
LOGE("volume :%d\n",volume);
speaker_set_volume(volume);
cJSON_Delete(params);
}
}

View File

@ -12,8 +12,6 @@ extern "C" {
void speaker_volume_init(); void speaker_volume_init();
cJSON* iot_speaker_get_device_desc();
void iot_speaker_parser_invoke(char* cmd,char * paramters_json);
/** /**
* *
*/ */

View File

@ -25,258 +25,7 @@
#define LOGW(...) BK_LOGW(TAG, ##__VA_ARGS__) #define LOGW(...) BK_LOGW(TAG, ##__VA_ARGS__)
#define LOGE(...) BK_LOGE(TAG, ##__VA_ARGS__) #define LOGE(...) BK_LOGE(TAG, ##__VA_ARGS__)
#define LOGD(...) BK_LOGD(TAG, ##__VA_ARGS__) #define LOGD(...) BK_LOGD(TAG, ##__VA_ARGS__)
extern rtc_session *__get_beken_rtc(void);
extern char *getGlobalSessionId(void);
extern bool g_connected_flag;
static beken_queue_t thing_msg_que = NULL;
static beken_thread_t thing_thread_hdl = NULL;
static int thing_start = 0;
typedef struct
{
int type ;
char *data;
int data_len;
} thing_msg_t;
cJSON* thing_gen_iot_descriptors(char *session_id)
{
// 1.判断数据合法
// 2.发送给服务器
cJSON *messageRoot = cJSON_CreateObject();
cJSON_AddStringToObject(messageRoot, "session_id", session_id);
cJSON_AddStringToObject(messageRoot, "type", "iot");
cJSON_AddBoolToObject(messageRoot, "update", true);
cJSON *descriptorArray = cJSON_CreateArray();
#ifdef IOT_LAMP
cJSON* lamp_desc = iot_lamp_get_device_desc();
//cJSON_AddItemToArray(descriptorArray, cJSON_Duplicate(descriptor, 1));
cJSON_AddItemToArray(descriptorArray, lamp_desc);
#endif
#ifdef IOT_SPEAKER
cJSON* speaker_desc = iot_speaker_get_device_desc();
//cJSON_AddItemToArray(descriptorArray, cJSON_Duplicate(descriptor, 1));
cJSON_AddItemToArray(descriptorArray, speaker_desc);
#endif
#ifdef IOT_SLEEP_HELPER
cJSON* sleep_helper_desc = iot_sleep_helper_get_device_desc();
cJSON_AddItemToArray(descriptorArray, sleep_helper_desc);
#endif
cJSON_AddItemToObject(messageRoot, "descriptors", descriptorArray);
return messageRoot;
}
//{"session_id":"14c23594","type":"iot","update":true,"states":[{"name":"AudioSpeaker","state":{"volume":50}}]}
void thing_report_iot_state(char * device,char * properties_key, char* state){
cJSON *messageRoot = cJSON_CreateObject();
cJSON_AddStringToObject(messageRoot, "session_id", getGlobalSessionId());
cJSON_AddStringToObject(messageRoot, "type", "iot");
cJSON_AddBoolToObject(messageRoot, "update", true);
cJSON *stateArray = cJSON_CreateArray();
cJSON *states_desc = cJSON_CreateObject();
cJSON_AddStringToObject(states_desc, "name", device);
//cJSON *state_obj = cJSON_CreateObject();
//{"volume":50}
cJSON *param = cJSON_CreateObject();
cJSON_AddStringToObject(param, properties_key, state);
//"state":{"volume":50}}
cJSON_AddItemToObjectCS(states_desc,"state",param);
cJSON_AddItemToArray(stateArray, states_desc);
cJSON_AddItemToObject(messageRoot, "states", stateArray);
char *message = cJSON_PrintUnformatted(messageRoot);
LOGE("iot -->(len:%d) %s\n",strlen(message),message);
//将数据发送到队列 使用线程发送
if (thing_msg_que != NULL)
{
thing_msg_t msg;
msg.type = 0;
msg.data = os_malloc(strlen(message)+1);
strcpy(msg.data, message);
msg.data_len = strlen(message);
rtos_push_to_queue(&thing_msg_que, &msg, BEKEN_NO_WAIT);
}
//rtc_session *beken_rtc = __get_beken_rtc();
//transport bk_rtc_ws = beken_rtc->bk_rtc_client;
//websocket_client_send_text(bk_rtc_ws, message, strlen(message), 10*1000);
cJSON_Delete(messageRoot);
}
void thing_report_iot_state_number(char * device,char * properties_key, int state){
cJSON *messageRoot = cJSON_CreateObject();
cJSON_AddStringToObject(messageRoot, "session_id", getGlobalSessionId());
cJSON_AddStringToObject(messageRoot, "type", "iot");
cJSON_AddBoolToObject(messageRoot, "update", true);
cJSON *stateArray = cJSON_CreateArray();
cJSON *states_desc = cJSON_CreateObject();
cJSON_AddStringToObject(states_desc, "name", device);
//cJSON *state_obj = cJSON_CreateObject();
//{"volume":50}
cJSON *param = cJSON_CreateObject();
cJSON_AddNumberToObject(param, properties_key, state);
//"state":{"volume":50}}
cJSON_AddItemToObjectCS(states_desc,"state",param);
cJSON_AddItemToArray(stateArray, states_desc);
cJSON_AddItemToObject(messageRoot, "states", stateArray);
char *message = cJSON_PrintUnformatted(messageRoot);
LOGE("iot -->(len:%d) %s\n",strlen(message),message);
//rtc_session *beken_rtc = __get_beken_rtc();
//transport bk_rtc_ws = beken_rtc->bk_rtc_client;
//websocket_client_send_text(bk_rtc_ws, message, strlen(message), 10*1000);
//将数据发送到队列 使用线程发送
if (thing_msg_que != NULL)
{
thing_msg_t msg;
msg.type = 0;
msg.data = os_malloc(strlen(message)+1);
strcpy(msg.data, message);
msg.data_len = strlen(message);
rtos_push_to_queue(&thing_msg_que, &msg, BEKEN_NO_WAIT);
}
cJSON_Delete(messageRoot);
}
/**
* IOT指令,
* :
*
* {
"type": "iot",
"commands": [
{
"name": "lamp",
"method": "SetBrightness",
"parameters": {
"brightness": 50
}
}
]
}
*/
void thing_iot_invoke(char *iot_json){
cJSON* iot_invoke = cJSON_Parse(iot_json);
cJSON *commands = cJSON_GetObjectItem(iot_invoke, "commands");
// 检查是否为数组类型
if (commands ==NULL && !cJSON_IsArray(commands)) {
cJSON_Delete(iot_invoke);
return ;
}
// 遍历数组并打印元素
int arraySize = cJSON_GetArraySize(commands);
for (int i = 0; i < arraySize; i++) {
cJSON *item = cJSON_GetArrayItem(commands, i);
char *name = cJSON_GetObjectItem(item, "name")->valuestring;
char *method = cJSON_GetObjectItem(item, "method")->valuestring;
cJSON *parameters = cJSON_GetObjectItem(item, "parameters");
char *str_parameters =cJSON_PrintUnformatted(parameters);
LOGE("cmd:%s method:%s\n",name,method);
//灯光指令
if (strcmp(name, "lamp") == 0)
{
iot_lamp_parser_invoke(method,str_parameters);
}
//扬声器指令
if (strcmp(name, "speaker") == 0)
{
iot_speaker_parser_invoke(method,str_parameters);
}
//睡眠仪指令
if (strcmp(name, IOT_SLEEP_HELPER_DEVICE_NAME) == 0)
{
iot_sleep_helper_parser_invoke(method,str_parameters);
}
}
// 释放内存
cJSON_Delete(iot_invoke);
}
// AddStringProperty
// AddNumberProperty
// AddBooleanProperty
// AddMethod
/**
* IOT
*/
static void thing_thread_task(void *arg)
{
bk_err_t ret = BK_OK;
while(thing_start){
thing_msg_t msg;
ret = rtos_pop_from_queue(&thing_msg_que, &msg, BEKEN_WAIT_FOREVER);
if (kNoErr == ret)
{
switch (msg.type)
{
// 发送数据到平台
case 0:
{
//没有连接平台的情况下 不允许发送数据
if(!g_connected_flag){
break;
}
rtc_session *beken_rtc = __get_beken_rtc();
if(beken_rtc == NULL){
break;
}
transport bk_rtc_ws = beken_rtc->bk_rtc_client;
websocket_client_send_text(bk_rtc_ws, msg.data, msg.data_len, 10*1000);
os_free(msg.data);
break;
}
}
}
}
/* delete msg queue */
ret = rtos_deinit_queue(&thing_msg_que);
if (ret != kNoErr)
{
bk_printf("delete spi_led_msg_que fail\n");
}
thing_msg_que = NULL;
/* delete task */
if(thing_thread_hdl!= NULL) {
rtos_delete_thread(&thing_thread_hdl);
thing_thread_hdl = NULL;
}
bk_printf("delete thing_thread_hdl task\n");
}
void thing_report_device_state(){
//上报当前软件版本
thing_report_iot_state(IOT_LAMP_DEVICE_NAME,"version", APPLICATION_VERSION);
//上报当前亮度
thing_report_iot_state_number(IOT_LAMP_DEVICE_NAME,IOT_LAMP_DEVICE_PARAM_BRIGHTNESS,lamp_get_bright());
//上报当前音量
thing_report_iot_state_number(IOT_SPEAKER_DEVICE_NAME,IOT_SPEAKER_DEVICE_PARAM_VOL,speaker_volume_get_current());
//上报当前电量
thing_report_iot_state_number(IOT_LAMP_DEVICE_NAME,IOT_LAMP_DEVICE_PARAM_BATTERY,battery_get_percent());
//thing_report_iot_state_number(IOT_SPEAKER_DEVICE_NAME,IOT_SPEAKER_DEVICE_PARAM_VOL,volume*10);
}
void thing_init() void thing_init()
{ {
#ifdef IOT_LAMP #ifdef IOT_LAMP
@ -289,28 +38,13 @@ void thing_init()
#ifdef IOT_SLEEP_HELPER #ifdef IOT_SLEEP_HELPER
sleep_helper_init(); sleep_helper_init();
//sleep_helper_set_mode(SLEEP_MODE_1);
#endif #endif
thing_start = 1;
bk_err_t ret = BK_OK;
ret = rtos_init_queue(&thing_msg_que, "thing_msg_que", sizeof(thing_msg_t), 5);
if (ret != kNoErr)
{
bk_printf("create thing_msg_que queue fail\n");
}
ret = rtos_create_thread(&thing_thread_hdl,
4,
"spi_led",
(beken_thread_function_t)thing_thread_task,
5 * 1024,
NULL);
if (ret != kNoErr)
{
thing_thread_hdl = NULL;
}
} }
void thing_deinit(){ void thing_deinit(){
thing_start = 0; lamp_deinit();
sleep_helper_deinit();
//speaker_volume_deinit();
} }

View File

@ -20,48 +20,3 @@
void thing_init(); void thing_init();
void thing_deinit(); void thing_deinit();
cJSON * thing_create(char * name,char *description);
/*
"theme": {
"description": "主题",
"type": "string"
},*/
cJSON * thing_add_string_property(char * name,char *description);
/*
"theme": {
"description": "主题",
"type": "string"
},*/
cJSON * thing_add_number_property(char * name,char *description);
/**
* # Sending IoT descriptors
[{"name":"AudioSpeaker","description":"The audio speaker of the device","properties":{"volume":{"description":"Current audio volume value","type":"number"}},"methods":{"set_volume":{"description":"Set the audio volume","parameters":{"volume":{"description":"An integer between 0 and 100","type":"number"}}}}},{"name":"Lamp","description":"A test lamp","properties":{"power":{"description":"Whether the lamp is on","type":"boolean"}},"methods":{"turn_on":{"description":"Turn on the lamp","parameters":{}},"turn_off":{"description":"Turn off the lamp","parameters":{}}}}]
# Sending IoT states
{"session_id":"14c23594","type":"iot","update":true,"states":[{"name":"AudioSpeaker","state":{"volume":50}}]}
*/
//AddStringProperty
//AddNumberProperty
//AddBooleanProperty
//AddMethod
void thing_report_iot_state(char * device,char * properties_key, char* state);
void thing_report_iot_state_number(char * device,char * properties_key, int state);
/**
* IOT
*/
cJSON* thing_gen_iot_descriptors(char *session_id);
/**
* IOT指令,
*/
void thing_iot_invoke(char *iot_json);
/**
*
*/
void thing_report_device_state();

View File

@ -598,7 +598,7 @@ int demo_network_auto_reconnect(bool val) // val true means from disconnect to r
app_event_send_msg(APP_EVT_RECONNECT_NETWORK, 0); app_event_send_msg(APP_EVT_RECONNECT_NETWORK, 0);
network_disc_evt_posted = 0; network_disc_evt_posted = 0;
} }
BK_LOGE(TAG, "bbbbbbbbbbb\n"); BK_LOGE(TAG, "demo_sta_app_init ssid:%s\n",(char *)info.sta_ssid);
demo_sta_app_init((char *)info.sta_ssid, (char *)info.sta_pwd); demo_sta_app_init((char *)info.sta_ssid, (char *)info.sta_pwd);
return 0x71l; return 0x71l;
} }

View File

@ -566,7 +566,7 @@ void rtc_websocket_msg_handle(char *json_text, unsigned int size)
// 解析服务器下发的IOT 指令 // 解析服务器下发的IOT 指令
else if (strcmp(type->valuestring, "iot") == 0) else if (strcmp(type->valuestring, "iot") == 0)
{ {
thing_iot_invoke(json_text); //thing_iot_invoke(json_text);
} }
else if (strcmp(type->valuestring, "llm") == 0) else if (strcmp(type->valuestring, "llm") == 0)
{ {
@ -809,16 +809,6 @@ void rtc_websocket_event_handler(void *event_handler_arg, char *event_base, int3
rtos_delay_milliseconds(100); rtos_delay_milliseconds(100);
rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START_LISTEN); rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START_LISTEN);
//2025.07.07
//rtos_delay_milliseconds(100);
//rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_IOT_DESC);
//rtos_delay_milliseconds(20);
//thing_report_device_state();
// rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_START_LISTEN);
// rtos_delay_milliseconds(200);
// rtc_websocket_send_text(client, (void *)(&audio_info), BEKEN_RTC_SEND_LISTEN);
break; break;
case WEBSOCKET_EVENT_DISCONNECTED: case WEBSOCKET_EVENT_DISCONNECTED:
//bk_printf("WEBSOCKET_EVENT_DISCONNECTED~~~~\n"); //bk_printf("WEBSOCKET_EVENT_DISCONNECTED~~~~\n");