阿信 发表于 2024-1-26 11:44:48

毕业设计攻略 | 机智云平台的应用指南

毕业设计攻略 | 机智云平台的应用指南


机智云官网https://www.gizwits.com/登录或者注册登录云平台进入开发者中心创建智能产品选择合适的方案类型我这里选择自定义方案自定义方案创建一个产品(WiFi单品)



定义自己需要的数据点(彩灯为例)



下载自己手机上使用的调试APP



给自己的WiFi模组刷入官方
1、准备官方的固件



2、准备烧写软件
ESP8266烧写软件非机智云提供

3、进行烧写



自动生成代码选择通用平台,生成代码可移植性更高。下载代码&代码移植,参考最新版开发指南适配到自己的平台







官方移植参考
API 介绍
void gizwitsInit(void)
gizwits 协议初始化接口。
用户调用该接口可以完成 Gizwits 协议相关初始化(包括协议相关定时器、串口的初始化)。
void gizwitsSetMode(uint8_t mode)
参数 mode:WIFI_MODE_TYPE_T 枚举值
参数为 WIFI_RESET_MODE,恢复模组出厂配置接口,调用会清空所有配置参数,恢
复到出厂默认配置。
参数为 WIFI_SOFTAP_MODE 或 WIFI_AIRLINK_MODE,配置模式切换接口,支持SoftAP 和 AirLink 模式。
参数为 WIFI_SOFTAP_MODE 时配置模组进入 SoftAp 模式,
参数为 WIFI_AIRLINK_MODE 配置模组进入 AirLink 模式。
参数为 WIFI_PRODUCTION_TEST,模组进入产测模式。
参 数 为 WIFI_NINABLE_MODE , 模 组 进 入 可 绑 定 模 式 , 可 绑 定 时 间 为
NINABLETIME(gizwits_protocol.h 中**),默认为 0,表示模组永久可绑定。
void gizwitsGetNTP(void)
获取 NTP 时间接口。
用户调用该接口可以获取当前网络时间,MCU 发起请求,模组回复后将产生 WIFI_NTP
事件,用户可在 gizwitsEventProcess 函数中进行相应处理。
void gizwitsHandle(dataPoint_t *dataPoint)
参数 dataPoint:用户设备数据点。
该函数中完成了相应协议数据的处理及数据上报的等相关操作。
int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t
len)
参数 info:事件队列
参数 data:数据
参数 len :数据长度
用户数据处理函数,包括 wifi 状态更新事件和控制事件。
a) Wifi 状态更新事件
WIFI_开头的事件为 wifi 状态更新事件,data 参数仅在 WIFI_RSSI 有效,data 值为
RSSI 值,数据类型为 uint8_t,取值范围 0~7。
b) 控制事件
与数据点相关,本版本代码会打印相关事件信息,相关数值也一并打印输出,用户
只需要做命令的具体执行即可。
int32_t gizwitsPassthroughData(uint8_t *data, uint32_t len)
参数 data:数据
参数 len :数据长度
用户调用该接口可以完成私有协议数据的上报。
3 移植
MCU 通用平台版代码对硬件平台的要求:
平台支持两个串口接口(至少一个),一个负责与 wifi 模组间的数据收发(必须),一个用于调试信息打印(可复用数据收发串口)。
平台支持定时器功能(1ms 精确定时)。
平台支持至少 2K 的 RAM 空间(太少会导致数据协议的处理异常)。
自动化代码生成工具已经根据用户定义的产品数据点信息,生成了对应的机智云串口协议层代码,用户需要移植代码到自己的工程中,完成设备的接入工作。

程序结构框图如下:
gizwits 逻辑和程序主流程已经帮用户实现,图中用黄色小注标明的部分待用户实现并完成代码的移植。
用户的移植工作主要分以下几个方面进行。
实现串口 A 驱动
MCU 方案需要用户实现一个串口,用于设备 MCU 与 WIFI 模组之间数据通信。用户首先需要实现串口接收中断服务函数接口 UART_IRQ_FUN(),该接口调用 gizPutData()函数实
现串口数据的接收并且写入协议层数据缓冲区。另外,用户需要实现串口的发送接口,
uartWrite()函数调用该接口实现设备数据的发送。需要特别注意的是 gizwits_product.c 文件
中 uartWrite()函数是伪函数,用户需根据自己实现的串口发送接口完善 uartWrite(),请注意
相关注释信息,以防出错。

下面以 STM32F103C8T6 平台为例,本例使用 USART2 与模组通信,串口初始化不在
此罗列,中断服务函数和串口发送报文函数实现如下:
/**

@brief USART2 串口中断服务函数
接收功能,用于接收与 WiFi 模组间的串口协议数据
@param none * @return none /
void UART_IRQ_FUN(void)
{
uint8_t value = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
value = USART_ReceiveData(USART2);
gizPutData(&value, 1);
}
}
/*
@brief 串口写操作,发送数据报文(报文数据中遇 0xFF 需要用 0x55 转义)到 WiFi 模组
@param buf : 数据地址
@param len : 数据长度
@return : 正确返回有效数据长度;-1,错误返回
/
int32_t uartWrite(uint8_t buf, uint32_t len)
{
uint32_t i = 0;
if(NULL == buf)
{
return -1;
}
for(i=0; i<len; i++)
{
USART_SendData(UART, buf);
while (USART_GetFlagStatus(UART, USART_FLAG_TXE) == RESET);
if(i >=2 && buf == 0xFF)
{
USART_SendData(UART,0x55);
while (USART_GetFlagStatus(UART, USART_FLAG_TXE) == RESET);
}
}
return len;
}
实现定时器
协议层使用到了一个系统时间,该事件单位为毫秒,所以要求用户实现一个毫秒定时器,
并且实现中断服务函数 TIMER_IRQ_FUN(),该函数调用 gizTimerMs()实现协议层系统时间
的维护。
下面以 STM32F103C8T6 平台为例,本例使用 TIM3 实现时间维护,定时器初始化不在
此罗列,中断服务函数实现如下:
/
@brief 定时器 TIM3 中断处理函数
@param none * @return none /
void TIMER_IRQ_FUN(void)
{
if (TIM_GetITStatus(TIMER, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIMER, TIM_IT_Update );
gizTimerMs();
}
}
实现芯片复位函数
根据串口协议文档规定,模组可以发送命令复位设备 MCU,所以用户需要实现
mcuRestart()接口完成设备的复位。
下面以 STM32F103C8T6 平台为例,本例使用 TIM3 实现时间维护,定时器初始化不在
此罗列,中断服务函数实现如下:
/*
@brief MCU 复位函数
@param none * @return none /
void mcuRestart(void)
{ __set_FAULTMASK(1);
NVIC_SystemReset();
}
实现串口打印驱动
如果用户需要打印日志调试信息,要求用户实现 printf 函数。协议层将用 GIZWITS_LOG
宏替代 printf,进行相关信息的打印。如果用户不使用日志调试,那么需要将协议层相关日
志打印部分的代码屏蔽掉方可运行。如果用户不使用日志调试,遇到问题请咨询机智云工程
师。
下面以 STM32F103C8T6 平台为例,本例使用 USART1 实现串口打印,串口初始化不
在此罗列,printf 重定向实现如下:
#ifdef GNUC
#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE f)
#endif
/
@brief printf 打印重定向
@param none * @return none /
PUTCHAR_PROTOTYPE
{
USART_SendData(USART1,(u8)ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
return ch;
}
实现配置入网
模组支持 SoftAp 和 AirLink 两种方式配置入网,相应接口为 gizwitsSetMode(),建议采
用按键的方式,相应的按键动作触发执行具体的模式设置。
另外,可以通过 gizwitsSetMode()接口复位模组,恢复默认出厂设置。
下面以 STM32F103C8T6 平台为例,本例使用按键方式实现配置入网和控制模组复位功
能,按键初始化不在此罗列,按键触发操作实现如下:
/*
key1 按键长按处理
@param none * @return none /
void key1LongPress(void)
{
printf(“KEY1 PRESS LONG ,Wifi Reset\n”);
gizwitsSetMode(WIFI_RESET_MODE);
}
/*
key2 按键短按处理
@param none * @return none /
void key2ShortPress(void)
{
printf(“KEY2 PRESS ,Soft AP mode\n”);
gizwitsSetMode(WIFI_SOFTAP_MODE);
}
/*
key2 按键长按处理
@param none * @return none */
void key2LongPress(void)
{
//AirLink mode
printf(“KEY2 PRESS LONG ,AirLink mode\n”);
gizwitsSetMode(WIFI_AIRLINK_MODE);
}
实现下行动作执行
数 据 点 方 式 将 转 换 成 数 据 点 事 件 , 开 发 者 只 需 要 在 gizwits_product.c 文 件 的
gizwitsEventProcess()相应事件下作具体处理即可。
下面使用 STM32F103C8T6 平台,以微信宠物屋实现 APP 控制电机转动为例,
motorStatus()函数是需要开发者自己实现,其他代码自动化工具会帮助开发者生成,
gizwitsEventProcess()函数省略其他代码段,案例如下:
case EVENT_MOTOR_SPEED:
currentDataPoint.valueMotor_Speed = dataPointPtr->valueMotor_Speed;
GIZWITS_LOG(“Evt:EVENT_MOTOR_SPEED %d\n”,currentDataPoint.valueMotor_Speed);
motorStatus(currentDataPoint.valueMotor_Speed);
break;
实现上行数据采集
该工程代码默认在 Gizwits/gizwits_product.c 文件中 userHandle()函数实现传感器数
据采集,并且该函数在 while 循环执行,原则上用户只需要关心如何采集数据。特别提醒,
默认 while 循环执行速度较快,需要针对不同的需求,用户可调整数据点数据的采集周期和
接口实现位置,预防由于传感器数据采集过快引发的不必要的问题。数据点变量的初始化见
Gizwits/gizwits_product.c 文件 userInit 函数,待用户完善。
下面使用 STM32F103C8T6 平台,以微信宠物屋实现红外探测为例,irHandle()函数是需
要开发者自己实现,其他代码自动化工具会帮助开发者生成,案例如下:
void userHandle(void)
{
currentDataPoint.valueInfrared = irHandle();
}
实现模组状态处理
参考接口 gizwitsEventProcess(),本版软件已经将 wifi 状态数据转换成了 event,开发者
仅关注相应事件即可。用户可以通过获取到的 WIFI 状态做相应的逻辑处理。
下面使用 STM32F103C8T6 平台,以微信宠物屋实现配置入网后接收到网络连接到路由
器关闭 RGB 灯为例,ledRgbControl()函数是需要开发者自己实现,其他代码自动化工具会
帮助开发者生成,gizwitsEventProcess()函数省略其他代码段,案例如下:
case WIFI_CON_M2M:
ledRgbControl(0,0,0);
break;







页: [1]
查看完整版本: 毕业设计攻略 | 机智云平台的应用指南