对涂鸦云平台所购买的wifi模块移植连入涂鸦云平台

目录

移植平台提供的mcu_sdk文件夹中的文件

 通过厂家封装好的函数进行配网

DP功能上报下发的实现

所有dp点上报功能函数:all_data_update()

单个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];
	
	
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值