Commit 5880d2e5 authored by 尹佳钦's avatar 尹佳钦

kk_lan新增get ccu info

parent 4f152160
......@@ -22,6 +22,7 @@
#include "kk_voice_panel_handle.h"
#include "kk_lan_node_db.h"
#include "kk_oldccu_msg.h"
#include "kk_login_handle.h"
const char DM_MSG_TO_MIDDWARE[] = "{\"msgtype\":\"%s\",\"productCode\":\"%s\",\"deviceCode\":\"%s\"}";
......@@ -355,6 +356,12 @@ static void kk_handle_del_history_info(char *key)
free(send_data);
}
int kk_data_handle(cJSON *json,int sockfd)
{
cJSON *opcode = NULL;
......@@ -379,6 +386,9 @@ int kk_data_handle(cJSON *json,int sockfd)
if(key != NULL){
kk_handle_del_history_info(key->valuestring);
}
}else if(strcmp(opcode->valuestring,GET_CCU_INFO) == 0){
char *send_data = _kk_data_create(KK_THING_SERVICE_GET_CCU_INFO,"*","*","*");
kk_ipc_send(IPC_APP2MID, send_data, strlen(send_data)+1);
}
#ifdef VOICE_SUPPORT
else if(strcmp(opcode->valuestring,VOICE_VOLUME_CTRL) == 0){
......@@ -863,6 +873,26 @@ static int kk_client_info_push_handle(cJSON *payload)
free(pData);
return 0;
}
static int kk_get_ccu_info_handle(cJSON *param)
{
cJSON *root = cJSON_CreateObject();
cJSON_AddStringToObject(root, "nodeid", "*");
cJSON_AddStringToObject(root, "opcode", "GET_CCU_INFO");
cJSON_AddStringToObject(root, "status", "success");
cJSON_AddItemToObject(root, "arg", param);
char *data = cJSON_Print(root);
kk_send_data_to_sdk(data);
cJSON_Delete(root);
free(data);
return 0;
}
void KK_Data_FromMid(void* str,int len, char* chalMark)
{
cJSON *json = NULL;
......@@ -893,6 +923,14 @@ void KK_Data_FromMid(void* str,int len, char* chalMark)
}
msgtype = cJSON_GetObjectItem(info, MSG_TYPE_STR);
//
if(strstr(msgtype->valuestring,KK_THING_SERVICE_GET_CCU_INFO_REPLY)!= NULL){
INFO_PRINT("getCCUInfo_reply!!!");
kk_get_ccu_info_handle(payload);
return;
}
productCode = cJSON_GetObjectItem(info, MSG_PRODUCT_CODE_STR);
deviceCode= cJSON_GetObjectItem(info, MSG_DEVICE_CODE_STR);
......
......@@ -253,7 +253,6 @@ int main(int argc, char* argv[])
while(1){
if(kk_sync_timer_is_running()==0&&g_sync_flag!=0){
char *send_data = NULL;
......
#ifndef KK_OPCODE_H_
#define KK_OPCODE_H_
#define KK_THING_SERVICE_GET_CCU_INFO "/thing/service/getCCUInfo"
#define KK_THING_SERVICE_GET_CCU_INFO_REPLY "/thing/service/getCCUInfo_reply"
#define SYNC_MSG_TYPE "/thing/service/syncinfo"
#define SYNC_MSG_TYPE_REPLY "/thing/service/syncinfo_reply"
#define SYNCPUSH_MSG_TYPE "/thing/service/syncinfopush"
......@@ -38,6 +41,8 @@
#define GET_HISTORY_MSG_TYPE "/thing/service/historyAlarm"
#define DEL_HISTORY_MSG_TYPE "/thing/service/delAlarm"
#define GET_CCU_CLIENT_INFO "GET_CCU_CLIENT_INFO"
#define GET_CCU_INFO "GET_CCU_INFO"
......
......@@ -18,6 +18,7 @@
#include "kk_area_handle.h"
#include "kk_sync_data.h"
#include "kk_motor_bind_db.h"
#include "cJSON.h"
//const char DM_URI_SYS_PREFIX[] DM_READ_ONLY = "/sys/%s/%s/";
......@@ -1765,3 +1766,100 @@ int dm_mgr_subdev_delete(_IN_ char deviceCode[DEVICE_CODE_MAXLEN])
return SUCCESS_RETURN;
}
cJSON *dm_mgr_get_ccu_info(void)
{
dm_mgr_ctx *ctx = _dm_mgr_get_ctx();
dm_mgr_dev_node_t *node = NULL;
dm_mgr_dev_node_t *n = NULL;
kk_tsl_t *shadow = NULL;
int property_number;
kk_tsl_data_t *properties;
cJSON *root = cJSON_CreateObject();
cJSON *args = cJSON_CreateObject();
cJSON *hue_gw_list = cJSON_CreateArray();
cJSON *gw_list = cJSON_CreateArray();
_dm_mgr_mutex_lock();
/* CCU */
list_for_each_entry_safe(node,n, &ctx->dev_list, linked_list, dm_mgr_dev_node_t) {
if (node->dev_type == KK_DM_DEVICE_CCU) {
shadow = node->dev_shadow;
property_number = shadow->property_number;
for(int i=0;i<property_number;i++){
properties = &shadow->properties[i];
if(properties->identifier==NULL)
continue ;
if(strcmp(properties->identifier,"lanIPAddress")==0){
cJSON_AddStringToObject(args,"local_ip",properties->data_value.value);
}
if(strcmp(properties->identifier,"wanState")==0){
cJSON_AddNumberToObject(args,"wan_status",properties->data_value.value_int);
}
if(strcmp(properties->identifier,"iotCloudState")==0){
cJSON_AddNumberToObject(args,"cloud_status",properties->data_value.value_int);
}
}
break;
}
}
/* GW */
list_for_each_entry_safe(node,n, &ctx->dev_list, linked_list, dm_mgr_dev_node_t) {
if (node->dev_type == KK_DM_DEVICE_GATEWAY) {
shadow = node->dev_shadow;
property_number = shadow->property_number;
cJSON *gw_list_item = cJSON_CreateObject();
cJSON_AddStringToObject(gw_list_item,"gw_name",node->deviceCode);//网关MAC。
cJSON_AddNumberToObject(gw_list_item,"gw_type",2);//网关类型
//cJSON_AddStringToObject(gw_list_item,"download_version",);//网关下载版本
for(int i=0;i<property_number;i++){
properties = &shadow->properties[i];
if(properties->identifier==NULL)
continue ;
if(strcmp(properties->identifier,"lanIPAddress")==0){
cJSON_AddStringToObject(gw_list_item,"gw_ip",properties->data_value.value);//网关链路状况
}
if(strcmp(properties->identifier,"Version")==0){
char *ptr = strchr(properties->data_value.value,'_');
if(ptr==NULL){
cJSON_AddStringToObject(gw_list_item,"run_version",properties->data_value.value);//网关当前运行版本
cJSON_AddStringToObject(gw_list_item,"download_version",properties->data_value.value);//网关当前运行版本
}else{
char verBuf[32];
memset(verBuf,0,32);
memcpy(verBuf,properties->data_value.value,ptr-(char*)properties->data_value.value);
cJSON_AddStringToObject(gw_list_item,"run_version",verBuf);//网关当前运行版本
cJSON_AddStringToObject(gw_list_item,"download_version",verBuf);//网关当前运行版本
}
}
}
cJSON_AddItemToArray(gw_list,gw_list_item);
}
}
_dm_mgr_mutex_unlock();
cJSON_AddItemToObject(args,"hue_gw_list",hue_gw_list);
cJSON_AddItemToObject(args,"gw_list",gw_list);
cJSON_AddItemToObject(root,"arg",args);
cJSON_AddStringToObject(root,"nodeid","*");
cJSON_AddStringToObject(root,"opcode","GET_CCU_INFO");
cJSON_AddStringToObject(root,"status","success");
return root;
}
......@@ -126,5 +126,6 @@ int dm_mgr_get_gw_deviceCode(_OU_ dm_mgr_dev_node_t **node);
void dm_mgr_resubscribe(void);
int kk_get_pid(char *productId);
int dm_mgr_ccu_heartbeat_cloud(_IN_ int devid);
cJSON *dm_mgr_get_ccu_info(void);
#endif
......@@ -7,6 +7,9 @@
#include "kk_log.h"
#include "kk_utils.h"
#include "kk_sync_data.h"
#include "kk_scene_handle.h"
int HAL_Get_ccuid(_OU_ char *device_code);
const char DM_MSG_REQUEST[] DM_READ_ONLY = "{\"msgId\":\"%s\",\"version\":\"%s\",\"params\":%s,\"time\":\"%lld\",\"method\":\"%s\"}";
const char DM_MSG_INFO[] DM_READ_ONLY = "{\"msgtype\":\"%s\",\"productCode\":\"%s\",\"deviceCode\":\"%s\"}";
......@@ -21,6 +24,7 @@ void kk_sendData2app(void *info, void *payload,int isAsync){
cJSON_AddItemToObject(root, "payload",payloadObj);
buf = cJSON_Print(root);
cJSON_Minify(buf);
if(isAsync){
dm_queue_msg_insert4(buf);
......@@ -1041,7 +1045,9 @@ static int _kk_property_handle(kk_dm_property_e_t *pro,int type,char* identifier
return 0;
}
int dm_msg_thing_property_post_by_identify(char *deviceCode,cJSON *params)
int dm_msg_thing_property_post_by_identify(char *productCode,char *deviceCode,cJSON *params)
{
int res = 0;
int nums = 0;
......@@ -1231,6 +1237,21 @@ int dm_msg_thing_property_post_by_identify(char *deviceCode,cJSON *params)
cJSON_AddItemToObject(rootData,propertyInfoBuf[idx].info[i].property, subroot);
}
}
//红外幕帘/人体传感器
if(is_BodySensor_dev(productCode)){
//char buf[24] = {0};
//int val = bodySensor_find(productCode,atoi(epIdx));
//snprintf(buf,sizeof(buf),"%d",val);
cJSON *MotionAlarmState = cJSON_GetObjectItem(rootData,"MotionAlarmState");
if(MotionAlarmState->type==cJSON_Number &&
MotionAlarmState->valueint==1){
cJSON_AddStringToObject(rootData,"BodySensorNoActive","0");
}
}
char* outstr = cJSON_Print(rootData);
dm_mgr_upstream_thing_property_post(node->devid,outstr,strlen(outstr),0);
cJSON_Delete(rootData);
......
......@@ -145,6 +145,8 @@ typedef struct {
#define KK_THING_SERVICE_UNBIND_MOTORS_REPLY "/thing/service/unBindMotors_reply"
#define KK_THING_SERVICE_QUERY_BIND_MOTORS "/thing/service/queryBindMotors"
#define KK_THING_SERVICE_QUERY_BIND_MOTORS_REPLY "/thing/service/queryBindMotors_reply"
#define KK_THING_SERVICE_GET_CCU_INFO "/thing/service/getCCUInfo"
#define KK_THING_SERVICE_GET_CCU_INFO_REPLY "/thing/service/getCCUInfo_reply"
void kk_sendData2app(void *info, void *payload,int isAsync);
int dm_msg_thing_sub_register(_IN_ char productCode[DEVICE_CODE_MAXLEN], _IN_ char deviceCode[DEVICE_CODE_MAXLEN],
......@@ -154,7 +156,7 @@ int dm_msg_thing_topo_add(_IN_ char productCode[PRODUCT_CODE_MAXLEN],
_IN_ char deviceCode[DEVICE_CODE_MAXLEN], _IN_ char mac[DEVICE_MAC_MAXLEN],
_OU_ dm_msg_request_t *request);
int dm_msg_ccu_property_post(dm_mgr_dev_node_t *node);
int dm_msg_thing_property_post_by_identify(char *deviceCode,cJSON *params);
int dm_msg_thing_topo_delete(_IN_ char deviceCode[DEVICE_CODE_MAXLEN],_OU_ dm_msg_request_t *request);
int dm_msg_thing_topo_get(_OU_ dm_msg_request_t *request);
int dm_msg_thing_list_found(_IN_ char deviceCode[DEVICE_CODE_MAXLEN],
......@@ -182,7 +184,7 @@ int dm_msg_scene_event_post(const char *identifier,kk_tsl_t *dev_shadow,const ch
int dm_msg_thing_service_post(const char *deviceCode, const char *identifier);
int dm_msg_thing_property_post_all(char *deviceCode);
int dm_msg_ccu_property_post(dm_mgr_dev_node_t *node);
int dm_msg_thing_property_post_by_identify(char *deviceCode,cJSON *params);
int dm_msg_thing_property_post_by_identify(char *productCode,char *deviceCode,cJSON *params);
int kk_msg_execute_property_set(const char *productCode,const char *deviceCode,const char* params,const char *fatherDeviceCode);
int kk_msg_execute_property_get(dm_mgr_dev_node_t *node);
int kk_msg_parse_productType(char *str,char *productType);
......
......@@ -1400,7 +1400,6 @@ static int kk_service_getScreenInfo_handle(cJSON *inforoot,cJSON *param,cJSON *m
cJSON_AddItemToObject(payload, "params", paramInfo);
char *payload11=cJSON_Print(payload);
printf("------------------------------>payload11:%s\n",payload11);
kk_sendData2app(infff,payload11,0);
free(payload11);
free(infff);
......
......@@ -791,6 +791,33 @@ int kk_dm_device_subdev_filter(char *data)
}
static int kk_get_ccu_info_reply(cJSON *param,char *msgType)
{
int res = 0;
int i = 0,num = 0;
SensorType_t *pList = NULL;
char version[VERSION_MAXLEN] = {0};
if(param == NULL){
return INVALID_PARAMETER;
}
cJSON *info = cJSON_CreateObject();
cJSON_AddStringToObject(info, MSG_TYPE_STR, msgType);
char *infff=cJSON_Print(info);
cJSON *payload = cJSON_CreateObject();
cJSON_AddItemToObject(payload, "params", param);
char *payload11=cJSON_Print(payload);
kk_sendData2app(infff,payload11,0);
free(payload11);
free(infff);
cJSON_Delete(payload);
cJSON_Delete(info);
return res;
}
/************************************************************
*功能描述:nanomsg数据回调,app to mid
*输入参数:data:从app 层发来的数据
......@@ -821,6 +848,7 @@ void mid_cb(void* data, int len){
}
deviceCode = cJSON_GetObjectItem(info_root, MSG_DEVICE_CODE_STR);
type = cJSON_GetObjectItem(info_root, MSG_TYPE_STR);
if (deviceCode == NULL || type == NULL){
ERROR_PRINT(" params [%s] or [%s] can't find \n",MSG_DEVICE_CODE_STR, MSG_TYPE_STR);
cJSON_Delete(json);
......@@ -832,6 +860,15 @@ void mid_cb(void* data, int len){
cJSON_Delete(json);
return;
}
if (strcmp(type->valuestring, KK_THING_SERVICE_GET_CCU_INFO)==0){
cJSON *param = dm_mgr_get_ccu_info();
kk_get_ccu_info_reply(param,KK_THING_SERVICE_GET_CCU_INFO_REPLY);
cJSON_Delete(json);
return;
}
/*****属性设置需要先检测设置参数是否超出物模型给定范围*******/
if (strcmp(type->valuestring, KK_THING_SERVICE_PROPERTY_SET)==0){
res = kk_property_set_data_check(payload,deviceCode->valuestring);
......@@ -1163,17 +1200,6 @@ static int kk_subDevice_property_handle(cJSON *info,cJSON *payload,char *deviceC
free(infff);
return 0;
}
static int _kk_subDevice_online_to_app(cJSON *info,cJSON *payload)
{
char *payload11=cJSON_Print(payload);
char *infff=cJSON_Print(info);
printf("------------------------payload11:%s\n",payload11);
printf("------------------------infff:%s\n",infff);
kk_sendData2app(infff,payload11,0);
free(payload11);
free(infff);
return 0;
}
static int kk_indoorAir_online_handle(dm_mgr_dev_node_t *node ,char *deviceCode,int epNum)
{
int idx = 0;
......@@ -1345,17 +1371,14 @@ void kk_platMsg_handle(void* data, char* chalMark){
cJSON *epNumJson = cJSON_GetObjectItem(jsonPay, "epNum");
if(epNumJson == NULL) goto error;
kk_indoorAir_online_handle(search_node,devCode->valuestring,epNumJson->valueint);
_kk_subDevice_online_to_app(info,payload);
}else if(strcmp(search_node->productType,KK_DM_AIR_SWITCH_GATEWAY_TYPE) == 0){
cJSON *epNumJson = cJSON_GetObjectItem(jsonPay, "epNum");
if(epNumJson == NULL) goto error;
kk_subAirSwitch_online_handle(search_node,devCode->valuestring,epNumJson->valueint);
_kk_subDevice_online_to_app(info,payload);
}else if(strcmp(search_node->productType,KK_DM_FRESHAIR_GATEWAY_TYPE) == 0){
cJSON *epNumJson = cJSON_GetObjectItem(jsonPay, "epNum");
if(epNumJson == NULL) goto error;
kk_subFreshair_online_handle(search_node,devCode->valuestring,epNumJson->valueint);
_kk_subDevice_online_to_app(info,payload);
}
}
else if (strstr(msgType->valuestring, KK_THING_TOPO_BATCH_ADD_MSG) != NULL){
......@@ -1405,15 +1428,12 @@ void kk_platMsg_handle(void* data, char* chalMark){
}
char* outstr = cJSON_Print(payload);
kk_tsl_property_set_by_shadow(search_node->dev_shadow, outstr, strlen(outstr)+1);
dm_msg_thing_property_post_by_identify(info_dcode->valuestring,jsonPay);
proCode = cJSON_GetObjectItem(info, MSG_PRODUCT_CODE_STR);
if(strcmp(proCode->valuestring,"3053")&&
strcmp(proCode->valuestring,"3042")){
//如果带version,代表的是快照信息,快照信息不需要触发iftt
cJSON *version = cJSON_GetObjectItem(jsonPay, "version");
if(version == NULL){
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
dm_msg_thing_property_post_by_identify(proCode->valuestring,info_dcode->valuestring,jsonPay);
if(is_BodySensor_dev(proCode->valuestring)==0){
kk_scene_iftt_check(info_dcode->valuestring,jsonPay);
}
free(outstr);
}
......@@ -1979,5 +1999,7 @@ int main(const int argc, const char **argv)
kk_platMsg_dispatch();
BodySensorTrigger_check();
}
}
......@@ -606,6 +606,19 @@ typedef struct BodySensorNoActive{
static BodySensorNoActive* pBodySensor = NULL;
int is_BodySensor_dev(const char *productCode)
{
if(productCode!=NULL){
if(strcmp(productCode,"3053")==0 ||
strcmp(productCode,"3049")==0 ||
strcmp(productCode,"3043")==0 ||
strcmp(productCode,"3042")==0){
return 1;
}
}
return 0;
}
int bodySensor_delete(int scene_id)
{
BodySensorNoActive *ptr = NULL,*pre = NULL;
......@@ -639,6 +652,8 @@ int bodySensor_insert(const char *deviceCode,int ep,int noActive_time,int scene_
if(deviceCode==NULL){
return 0;
}
INFO_PRINT("\n\n---------------->BodySensorNoActive insert<----------------\n\n");
INFO_PRINT("deviceCode=%s,ep=%d,noActive_time=%d,scene_id=%d\n",deviceCode,ep,noActive_time,scene_id);
if(pBodySensor==NULL){
pBodySensor = (BodySensorNoActive*)malloc(sizeof(BodySensorNoActive));
......@@ -648,6 +663,11 @@ int bodySensor_insert(const char *deviceCode,int ep,int noActive_time,int scene_
pBodySensor->noActive_time = noActive_time;
pBodySensor->scene_id=scene_id;
if(noActive_time){
pBodySensor->alarm_time = time(NULL);
pBodySensor->report_time = pBodySensor->alarm_time + (pBodySensor->noActive_time*60);
}
}else{
ptr = pBodySensor;
while(ptr){
......@@ -661,12 +681,36 @@ int bodySensor_insert(const char *deviceCode,int ep,int noActive_time,int scene_
ptr->ep = ep;
ptr->noActive_time = noActive_time;
ptr->scene_id=scene_id;
if(noActive_time){
ptr->alarm_time = time(NULL);
ptr->report_time = ptr->alarm_time + (ptr->noActive_time*60);
}
pre->next = ptr;
}
return 1;
}
int bodySensor_find(const char *deviceCode,int ep)
{
BodySensorNoActive *ptr = NULL;
if(deviceCode==NULL){
return 0;
}
ptr = pBodySensor;
while(ptr){
if(ptr->ep==ep&&strcmp(deviceCode,ptr->deviceCode)==0){
return ptr->noActive_time;
}
ptr=ptr->next;
}
return 0;
}
int bodySensor_load(void)
{
int res = FAIL_RETURN;
......@@ -696,7 +740,6 @@ int bodySensor_load(void)
}
int kk_scene_query_body_sensor_trigger_info(const char *deviceCode,int scene_id)
{
int res = FAIL_RETURN;
......@@ -741,18 +784,67 @@ int kk_scene_query_body_sensor_trigger_info(const char *deviceCode,int scene_id)
}
void BodySensorNoActive_report(char *deviceCode,int noAct)
{
char buf[256] = {0};
char val[12] = {0};
char msgId[32] = {0};
dm_mgr_dev_node_t *node = NULL;
int res = dm_mgr_get_device_by_devicecode(deviceCode,&node);
if(res!=SUCCESS_RETURN){
return ;
}
cJSON *payload = cJSON_CreateObject();
cJSON *params = cJSON_CreateObject();
cJSON_AddStringToObject(payload,"method", "thing.event.property.post");
iotx_report_id(msgId);
cJSON_AddStringToObject(payload,"msgId",msgId);
snprintf(val,sizeof(val),"%d",noAct);
cJSON_AddStringToObject(params,"BodySensorNoActive", val);
cJSON_AddNumberToObject(params,"MotionAlarmState", 0);
//cJSON_AddNumberToObject(params,"Battery", 0);
//cJSON_AddNumberToObject(params,"DismantleState", 0);
cJSON_AddItemToObject(payload,"params", params);
cJSON_AddNumberToObject(payload,"time", HAL_GetTime_ms());
cJSON_AddStringToObject(payload,"version", "1.0");
cJSON *info = cJSON_CreateObject();
cJSON_AddStringToObject(info, MSG_TYPE_STR, "/thing/event/property/post");
cJSON_AddStringToObject(info, MSG_DEVICE_CODE_STR, node->deviceCode);
cJSON_AddStringToObject(info, MSG_PRODUCT_CODE_STR, node->productCode);
char *infff=cJSON_Print(info);
char *payload11=cJSON_Print(payload);
kk_sendData2app(infff,payload11,0);
free(payload11);
free(infff);
cJSON_Delete(payload);
cJSON_Delete(info);
}
int BodySensorTrigger_check(void)
{
BodySensorNoActive *ptr = NULL;
time_t cur_time = time(NULL);
ptr = pBodySensor;
while(ptr){
if(ptr->report_time!=0 &&cur_time>=ptr->report_time){
ptr->report_time = 0;
DEBUG_PRINT("\n\n ------------------>222 \n\n");
DEBUG_PRINT("\n\n -------BodySensorNoActive report----------->\n\n");
kk_scene_query_body_sensor_trigger_info(ptr->deviceCode,ptr->scene_id);
//上报
BodySensorNoActive_report(ptr->deviceCode,ptr->noActive_time);
}
ptr=ptr->next;
}
......@@ -772,12 +864,17 @@ int BodySensorTrigger_report(const char *deviceCode,int ep,cJSON *param)
while(ptr){
if(!strcmp(ptr->deviceCode,deviceCode)){
if(ptr->noActive_time){
if(ptr->report_time){
INFO_PRINT("\n\n ------------------>BodySensorNoActive time update\n");
}else{
INFO_PRINT("\n\n ------------------>BodySensorNoActive time calc\n");
}
ptr->alarm_time = time(NULL);
ptr->report_time = ptr->alarm_time + (ptr->noActive_time*60);
printf("\n\n ------------------>111,ptr->alarm_time=%d,ptr->report_time=%d \n\n",ptr->alarm_time,ptr->report_time);
INFO_PRINT("\n\nptr->alarm_time=%d,ptr->report_time=%d \n\n",ptr->alarm_time,ptr->report_time);
}else{
printf("\n\n ------------------>000 \n\n");
INFO_PRINT("\n\n ------------------>BodySensorNoActive time 0\n\n");
//...
}
flag = 1;
......
......@@ -85,5 +85,8 @@ int kk_scene_parse_scene_action(const cJSON* str,const char *sceneId,int isUpdat
int kk_scene_execute_quickpanel(const char *buttonId,char *deviceCode);
int kk_scene_action_add(const char *gwdeviceCode,const char *sceneId,kk_scene_action_detail_t detail);
int BodySensorTrigger_check(void);
int bodySensor_find(const char *deviceCode,int ep);
int is_BodySensor_dev(const char *productCode);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment