目录
单个DP点上报函数:mcu_dp_xxx_update()//xxx为数据类型
DP下发函数:dp_download_master_mode_handle()
移植平台提供的mcu_sdk文件夹中的文件
如以下涂鸦云平台提供的手册如此操作即可
通过厂家封装好的函数进行配网
/**
* @brief MCU设置wifi工作模式
* @param[in] {mode} 进入的模式
* @ref 0(SMART_CONFIG):进入smartconfig模式
* @ref 1(AP_CONFIG):进入AP模式
* @return Null
* @note 1:MCU主动调用
* 2:成功后,可判断set_wifi_config_state是否为TRUE;TRUE表示为设置wifi工作模式成功
* 3:如果为模块自处理模式,MCU无须调用该函数
*/
void mcu_set_wifi_mode(unsigned char mode)
{
unsigned char length = 0;
set_wifimode_flag = SET_WIFICONFIG_ERROR;
length = set_wifi_uart_byte(length, mode);
wifi_uart_write_frame(WIFI_MODE_CMD, MCU_TX_VER, length);
}
先调用mcu_set_wifi_mode(1)进入smartconfig模式
/**
* @brief MCU主动获取当前wifi工作状态
* @param Null
* @return wifi work state
* - SMART_CONFIG_STATE: smartconfig配置状态
* - AP_STATE: AP配置状态
* - WIFI_NOT_CONNECTED: WIFI配置成功但未连上路由器
* - WIFI_CONNECTED: WIFI配置成功且连上路由器
* - WIFI_CONN_CLOUD: WIFI已经连接上云服务器
* - WIFI_LOW_POWER: WIFI处于低功耗模式
* - SMART_AND_AP_STATE: WIFI smartconfig&AP 模式
* @note 如果为模块自处理模式,MCU无须调用该函数
*/
unsigned char mcu_get_wifi_work_state(void)
{
return wifi_work_state;
}
用mcu_get_wifi_work_state()获取ap配网的实时进度,根据需求对不同进度作出不同效果。主要运用有四种模式 * - AP_STATE: AP配置状态
* - WIFI_NOT_CONNECTED: WIFI配置成功但未连上路由器
* - WIFI_CONNECTED: WIFI配置成功且连上路由器
* - WIFI_CONN_CLOUD: WIFI已经连接上云服务器
然后在手机上先连好自家wifi,到app中输入该wifi的名称密码,然后连接涂鸦云wifi模块的热点,等待配对成功即可。
DP功能上报下发的实现
所有dp点上报功能函数:all_data_update()
但在该函数里面我们要调用我们所有单个dp点的上报函数,比如:enum型的主机模式的上报dp点函数和string型的报警函数(报警函数初始值为0)
如下表示
void all_data_update(void)
{
mcu_all_dp_update();
}
void mcu_all_dp_update()
{
mcu_dp_enum_update(DPID_MASTER_MODE,pStuSystemMode->ID,STR_GATEWAY_ITSELF_ID,my_strlen(STR_GATEWAY_ITSELF_ID)); //枚举型数据上报;
mcu_dp_string_update(DPID_ALARM_ACTIVE," ",sizeof(" "),STR_GATEWAY_ITSELF_ID,my_strlen(STR_GATEWAY_ITSELF_ID)); //STRING型数据上报;
}
单个DP点上报函数:mcu_dp_xxx_update()//xxx为数据类型
如我定义了一个主机模式的enum型的结构体所以是mcu_dp_enum_update(DPID_MASTER_MODE,pStuSystemMode->ID,
STR_GATEWAY_ITSELF_ID,my_strlen(STR_GATEWAY_ITSELF_ID)
/**
* @brief enum型dp数据上传( 记录型状态实时上报(带时间) )
* @param[in] {dpid} id号
* @param[in] {value} 当前dp值
* @param[in] {sub_id_buf} 存放子设备id的首地址
* @param[in] {sub_id_len} 子设备id长度
* @param[in] {p_time_data} 时间数据
* @param[in] {time_data_len} 时间数据长度
* @return Null
* @note MCU需要自行调用该功能
*/
unsigned char mcu_dp_enum_update_record(unsigned char dpid,unsigned char value,unsigned char *sub_id_buf,unsigned char sub_id_len, \
unsigned char p_time_data[], unsigned char time_data_len);
类似定义在mcu_api.h文件里面找
DP下发函数:dp_download_master_mode_handle()
该函数不用调用,只需要单片机在其中处理下发的数据即可,为了方便移植我们在其中调用了一个回调函数,是从app层调用的。
protocol.c中的函数
static unsigned char dp_download_master_mode_handle(const unsigned char value[], unsigned short length, unsigned char *sub_id_buf, unsigned char sub_id_len)
{
//示例:当前DP类型为ENUM
unsigned char ret;
unsigned char master_mode;
master_mode = mcu_get_dp_download_enum(value,length);
if(ServeiEventCBS)
{
ServeiEventCBS(WF_HOST_STATE,&master_mode);
}
switch(master_mode) {
case 0:
/*****************************************************************************
//dp数据处理前需要判断是哪一个子设备id的dp
//例如用户的网关下面有两个子设备id,一个是"1234"另一个是"5678"
if(my_strcmp(sub_id_buf,"1234") == 0){
}else if(my_strcmp(sub_id_buf,"5678") == 0){
}
//若子设备id是“0000”,则表示网关本身的dp
*****************************************************************************/
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
break;
}
//处理完DP数据后应有反馈
ret = mcu_dp_enum_update(DPID_MASTER_MODE, master_mode, sub_id_buf, sub_id_len);
if(ret == SUCCESS)
return SUCCESS;
else
return ERROR;
}
//回调函数注册函数
void ServerEventCBSRegister(ServerEvent_CallBack pCBS)
{
if(pCBS)
{
ServeiEventCBS = pCBS;
}
}
protocol.h中定义回调函数指针,和回调函数注册函数
typedef enum
{
WF_HOST_STATE, //主机状态
WF_TIME, //时间
WF_CONNECT_STATE, //WiFi模组连接状态
}WIFI_MSG_TYPE;
typedef void (*ServerEvent_CallBack)(WIFI_MSG_TYPE type,unsigned char *pData);
void ServerEventCBSRegister(ServerEvent_CallBack pCBS);
app.c中注册和定义被调用的函数
static void ServerEventHandle(WIFI_MSG_TYPE type,unsigned char *pData)
{
switch(type)
{
case WF_HOST_STATE: //主机状态
if(*pData == 0)
{
SystemMode_Change(SYSTEM_MODE_ENARM);
}else if(*pData == 1)
{
SystemMode_Change(SYSTEM_MODE_HOMEARM);
}else if(*pData == 2)
{
SystemMode_Change(SYSTEM_MODE_DISARM);
}
break;
}
}
void AppInit(void)
{
hal_OledInit();
hal_BeepInit();
hal_eepromInit();
ParaInit();
menuInit();
QueueEmpty(RFDRcvMsg);
QueueEmpty(DtcTriggerIDMsg);
hal_KeyScanCBSRegister(KeyEventHandle);
hal_RFCRcvCBSRegister(RfdRcvHandle);
/**********************************************************/
//注册回调函数
ServerEventCBSRegister(ServerEventHandle);
/**********************************************************/
stuSystemtime.year = 2021;
stuSystemtime.mon = 5;
stuSystemtime.day = 18;
stuSystemtime.hour = 21;
stuSystemtime.min = 20;
stuSystemtime.week = 2;
pStuSystemMode = &stu_Sysmode[SYSTEM_MODE_ENARM];
}