【Io开发笔记】机智云智能浇花器实战(3)-自动生成代码移植
第一篇内容:总体设计/系统功能介绍/机智云自助开发平台-开发利器GAgent等等点击下载:【Io开发笔记】机智云智能浇花器实战(1)-基础Demo实现
第二篇内容:
继电器实现/功能测试/DHT11驱动代码实现/OLED屏幕显示传感器数据/中文字模制作等等
点击下载:机智云智能浇花器实战(2)-基础Demo实现
一,BH1750光照传感器原理图
https://club.gizwits.com/data/attachment/forum/202207/25/153519t9xjz3zyaexya94s.png.thumb.jpg
二,BH1750传感器代码
[*]#include "bh1750.h"
[*]#include "delay.h"
[*]
[*]uint8_t BUF; //接收数据缓存区
[*]int mcy; //进位标志
[*]
[*]/**开始信号**/
[*]void BH1750_Start()
[*]{
[*]BH1750_SDA_H; //拉高数据线
[*]BH1750_SCL_H; //拉高时钟线
[*]Delay_nus(5); //延时
[*]GPIO_ResetBits(BH1750_PORT, BH1750_SDA_PIN); //产生下降沿
[*]Delay_nus(5); //延时
[*]GPIO_ResetBits(BH1750_PORT, BH1750_SCL_PIN); //拉低时钟线
[*]}
[*]
[*]/***停止信号***/
[*]void BH1750_Stop()
[*]{
[*] BH1750_SDA_L; //拉低数据线
[*] BH1750_SCL_H; //拉高时钟线
[*] Delay_nus(5); //延时
[*] GPIO_SetBits(BH1750_PORT, BH1750_SDA_PIN); //产生上升沿
[*] Delay_nus(5); //延时
[*]}
[*]
[*]/******************
[*]发送应答信号
[*]入口参数:ack (0:ACK 1:NAK)
[*]******************/
[*]void BH1750_SendACK(int ack)
[*]{
[*] GPIO_InitTypeDef GPIO_InitStruct;
[*]
[*]GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
[*]GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
[*]GPIO_InitStruct.GPIO_Pin = BH1750_SDA_PIN;
[*]GPIO_Init(BH1750_PORT, &GPIO_InitStruct);
[*]
[*] if(ack == 1) //写应答信号
[*] BH1750_SDA_H;
[*] else if(ack == 0)
[*] BH1750_SDA_L;
[*] else
[*] return;
[*]BH1750_SCL_H; //拉高时钟线
[*]Delay_nus(5); //延时
[*]BH1750_SCL_L; //拉低时钟线
[*]Delay_nus(5); //延时
[*]}
[*]
[*]/******************
[*]接收应答信号
[*]******************/
[*]int BH1750_RecvACK()
[*]{
[*]GPIO_InitTypeDef GPIO_InitStruct;
[*]
[*]GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;/*这里一定要设成输入上拉,否则不能读出数据*/
[*]GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
[*]GPIO_InitStruct.GPIO_Pin=BH1750_SDA_PIN;
[*]GPIO_Init(BH1750_PORT,&GPIO_InitStruct);
[*]
[*]BH1750_SCL_H; //拉高时钟线
[*]Delay_nus(5); //延时
[*] if(GPIO_ReadInputDataBit(BH1750_PORT,BH1750_SDA_PIN)==1)//读应答信号
[*] mcy = 1 ;
[*]else
[*] mcy = 0 ;
[*]BH1750_SCL_L; //拉低时钟线
[*]Delay_nus(5); //延时
[*]GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;
[*]GPIO_Init(BH1750_PORT,&GPIO_InitStruct);
[*] return mcy;
[*]}
[*]
[*]/******************
[*]向IIC总线发送一个字节数据
[*]******************/
[*]void BH1750_SendByte(uint8_t dat)
[*]{
[*]uint8_t i;
[*]for (i=0; i<8; i++) //8位计数器
[*]{
[*] if( 0X80 & dat )
[*] GPIO_SetBits(BH1750_PORT,BH1750_SDA_PIN);
[*] else
[*] GPIO_ResetBits(BH1750_PORT,BH1750_SDA_PIN);
[*] dat <<= 1;
[*] BH1750_SCL_H; //拉高时钟线
[*] Delay_nus(5); //延时
[*] BH1750_SCL_L; //拉低时钟线
[*] Delay_nus(5); //延时
[*]}
[*]BH1750_RecvACK();
[*]}
[*]
[*]uint8_t BH1750_RecvByte()
[*]{
[*]uint8_t i;
[*]uint8_t dat = 0;
[*]uint8_t bit;
[*]
[*]GPIO_InitTypeDef GPIO_InitStruct;
[*]
[*]GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IPU; /*这里一定要设成输入上拉,否则不能读出数据*/
[*]GPIO_InitStruct.GPIO_Pin = BH1750_SDA_PIN;
[*]GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
[*]GPIO_Init(BH1750_PORT,&GPIO_InitStruct );
[*]
[*]GPIO_SetBits(BH1750_PORT,BH1750_SDA_PIN); //使能内部上拉,准备读取数据,
[*]for (i=0; i<8; i++) //8位计数器
[*]{
[*] dat <<= 1;
[*] BH1750_SCL_H; //拉高时钟线
[*] Delay_nus(5); //延时
[*]
[*] if( SET == GPIO_ReadInputDataBit(BH1750_PORT,BH1750_SDA_PIN))
[*] bit = 0X01;
[*] else
[*] bit = 0x00;
[*] dat |= bit; //读数据
[*] BH1750_SCL_L; //拉低时钟线
[*] Delay_nus(5); //延时
[*]}
[*] GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
[*]GPIO_Init(BH1750_PORT, &GPIO_InitStruct );
[*]return dat;
[*]}
[*]
[*]void Single_Write_BH1750(uint8_t REG_Address)
[*]{
[*]BH1750_Start(); //起始信号
[*]BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
[*]BH1750_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页
[*]//BH1750_SendByte(REG_data); //内部寄存器数据,请参考中文pdf22页
[*]BH1750_Stop(); //发送停止信号
[*]}
[*]
[*]//初始化BH1750,根据需要请参考pdf进行修改**
[*]void BH1750_Init()
[*]{
[*]GPIO_InitTypeDef GPIO_InitStruct;
[*] /*开启GPIOB的外设时钟*/
[*]RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
[*]GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
[*]GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
[*]GPIO_InitStruct.GPIO_Pin = BH1750_SDA_PIN | BH1750_SCL_PIN ;
[*]GPIO_Init(BH1750_PORT,&GPIO_InitStruct);
[*]
[*]Single_Write_BH1750(0x01);
[*]Delay_nms(180); //延时180ms
[*]}
[*]
[*]//连续读出BH1750内部数据
[*]void mread(void)
[*]{
[*]uint8_t i;
[*]BH1750_Start(); //起始信号
[*]BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号
[*]
[*] for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF
[*]{
[*] BUF = BH1750_RecvByte(); //BUF存储0x32地址中的数据
[*] if (i == 3)
[*] {
[*] BH1750_SendACK(1); //最后一个数据需要回NOACK
[*] }
[*] else
[*] {
[*] BH1750_SendACK(0); //回应ACK
[*] }
[*]}
[*]BH1750_Stop(); //停止信号
[*]Delay_nms(5);
[*]}
[*]
[*]float Read_BH1750(void)
[*]{
[*]int dis_data; //变量
[*] float temp1;
[*] float temp2;
[*] Single_Write_BH1750(0x01); // power on
[*] Single_Write_BH1750(0x10); // H- resolution mode
[*] Delay_nms(180); //延时180ms
[*] mread(); //连续读出数据,存储在BUF中
[*] dis_data=BUF;
[*] dis_data=(dis_data<<8)+BUF; //合成数据
[*] temp1=dis_data/1.2;
[*] temp2=10*dis_data/1.2;
[*] temp2=(int)temp2%10;
[*] return temp1;
[*]}
[*]
[*]
复制代码
[*]#ifndef __BH1750_H__
[*]#define __BH1750_H__
[*]
[*]#include "STM32f10x.h"
[*]
[*]/*
[*] 定义器件在IIC总线中的从地址,根据ALTADDRESS地址引脚不同修改
[*] ALTADDRESS引脚接地时地址为0x46, 接电源时地址为0xB8
[*]*/
[*]#define SlaveAddress 0x46
[*]#define BH1750_PORT GPIOB
[*]#define BH1750_SCL_PIN GPIO_Pin_1
[*]#define BH1750_SDA_PIN GPIO_Pin_0
[*]
[*]#define BH1750_SCL_H GPIO_SetBits(BH1750_PORT,BH1750_SCL_PIN)
[*]#define BH1750_SCL_L GPIO_ResetBits(BH1750_PORT,BH1750_SCL_PIN)
[*]
[*]#define BH1750_SDA_H GPIO_SetBits(BH1750_PORT,BH1750_SDA_PIN)
[*]#define BH1750_SDA_L GPIO_ResetBits(BH1750_PORT,BH1750_SDA_PIN)
[*]
[*]
[*]
[*]extern uint8_t BUF; //接收数据缓存区
[*]extern int dis_data; //变量
[*]extern int mcy; //表示进位标志位
[*]
[*]void BH1750_Init(void);
[*]void conversion(uint32_t temp_data);
[*]voidSingle_Write_BH1750(uint8_t REG_Address); //单个写入数据
[*]uint8_t Single_Read_BH1750(uint8_t REG_Address); //单个读取内部寄存器数据
[*]voidmread(void); //连续的读取内部寄存器数据
[*]float Read_BH1750(void);
[*]
[*]
[*]#endif
[*]
[*]
[*]
复制代码
BH1750传感器代码说明
https://club.gizwits.com/data/attachment/forum/202207/25/153656a7mcnpk1p0mcw2w0.png.thumb.jpg
核心板单独测试程序在PB0PB1管脚是完全正常,不知道是不是核心板的PB2上接了什么暂时还未排查出来问题,如果你是用开发板或者是自己设计的项目板的话,那么程序是直接可以使用的程序依然按照PB0PB1保留。
https://club.gizwits.com/data/attachment/forum/202207/25/153717uckzkqi0yossw0xk.png.thumb.jpg
三,机智云自助开发平台数据点创建
机智云官方网站:https://www.gizwits.com/
步骤1,创建产品
https://club.gizwits.com/data/attachment/forum/202207/25/153812z6622712dzzd3qyv.png.thumb.jpg
创建好后就会有基本信息
https://club.gizwits.com/data/attachment/forum/202207/25/153829oknxzbcbj58k348r.png.thumb.jpg
步骤2,填写机智云产品ProductKey
https://club.gizwits.com/data/attachment/forum/202207/25/153844w11a130ejsz6vs0z.png.thumb.jpg
这两个信息比较重要最好是保存下来
[*]
[*]Product Key :9c8a5a8e38344fb4af14b6db0f5b1df7
[*]
[*]Product Secret :45c86d8c6a2a4b1dac7d68df54f6e4f0
[*]
[*]
复制代码
步骤3,定义自己的数据点
https://club.gizwits.com/data/attachment/forum/202207/25/153923k0un7n0mn6nq0cqm.png.thumb.jpg
只读:就是只允许赋值数据传感器赋值给平台平台只能读取
可写:就是数据可以被修改继电器的开关状态平台可以修改
四,MCU开发
https://club.gizwits.com/data/attachment/forum/202207/25/154209jyqfvmy2vm0y7kx2.png.thumb.jpg
mcu开发注意事项平台选Common其实就是STM32F103x平台
https://club.gizwits.com/data/attachment/forum/202207/25/154221o2n88srytns3msrs.png.thumb.jpg
1,生成代码包
https://club.gizwits.com/data/attachment/forum/202207/25/154311fdmfmakbs49fag1e.png.thumb.jpg
2,下载自动生成的代码包
https://club.gizwits.com/data/attachment/forum/202207/25/154448op161rdxdrazfnof.png.thumb.jpg
3,机智云Gizwits协议移植
https://club.gizwits.com/data/attachment/forum/202207/25/154504s1zk11hquzj4uuuq.png.thumb.jpg
https://club.gizwits.com/data/attachment/forum/202207/25/154516pkkokszskpus2zx1.png.thumb.jpg
https://club.gizwits.com/data/attachment/forum/202207/25/154526p11a9lymea40ny9g.png.thumb.jpg
https://club.gizwits.com/data/attachment/forum/202207/25/154536tdsnqbzbij1q7jmj.png.thumb.jpg
这两个文件夹要添加到自己的工程
https://club.gizwits.com/data/attachment/forum/202207/25/154551zbf3rbb43xfjbggg.png.thumb.jpg
这是添加的文件夹以及文件的目录
4,修改gizwits_product.c
[*]#include <stdio.h>
[*]#include <string.h>
[*]#include "gizwits_product.h"
[*]#include "usart3.h"
[*]
[*]static uint32_t timerMsCount;
[*]uint8_t aRxBuffer;
[*]dataPoint_t currentDataPoint;
[*]uint8_t wifi_flag;
[*]
[*]//存放事件处理API接口函数
[*]int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *gizdata, uint32_t len)
[*]{
[*]uint8_t i = 0;
[*]dataPoint_t *dataPointPtr = (dataPoint_t *)gizdata;
[*]moduleStatusInfo_t *wifiData = (moduleStatusInfo_t *)gizdata;
[*]protocolTime_t *ptime = (protocolTime_t *)gizdata;
[*]
[*]#if MODULE_TYPE
[*]gprsInfo_t *gprsInfoData = (gprsInfo_t *)gizdata;
[*]#else
[*]moduleInfo_t *ptModuleInfo = (moduleInfo_t *)gizdata;
[*]#endif
[*]
[*]if((NULL == info) || (NULL == gizdata))
[*]{
[*] return -1;
[*]}
[*]
[*]for(i=0; i<info->num; i++)
[*]{
[*] switch(info->event)
[*] {
[*] case EVENT_Relay_1:
[*] currentDataPoint.valueRelay_1 = dataPointPtr->valueRelay_1;
[*] GIZWITS_LOG("Evt: EVENT_Relay_1 %d \n", currentDataPoint.valueRelay_1);
[*] if(0x01 == currentDataPoint.valueRelay_1)
[*] {
[*] currentDataPoint.valueRelay_1 = 1;
[*]
[*] }
[*] else
[*] {
[*] currentDataPoint.valueRelay_1 = 0;
[*]
[*] }
[*] break;
[*] case WIFI_SOFTAP:
[*] break;
[*] case WIFI_AIRLINK:
[*] break;
[*] case WIFI_STATION:
[*] break;
[*] case WIFI_CON_ROUTER:
[*]
[*] break;
[*] case WIFI_DISCON_ROUTER:
[*]
[*] break;
[*] case WIFI_CON_M2M:
[*] wifi_flag = 1; //WiFi连接标志
[*] break;
[*] case WIFI_DISCON_M2M:
[*] wifi_flag = 0; //WiFi断开标志
[*] break;
[*] case WIFI_RSSI:
[*] GIZWITS_LOG("RSSI %d\n", wifiData->rssi);
[*] break;
[*] case TRANSPARENT_DATA:
[*] GIZWITS_LOG("TRANSPARENT_DATA \n");
[*] //user handle , Fetch data from , size is
[*] break;
[*] case WIFI_NTP:
[*] GIZWITS_LOG("WIFI_NTP : [%d-%d-%d %02d:%02d:%02d][%d] \n",ptime->year,ptime->month,ptime->day,ptime->hour,ptime->minute,ptime->second,ptime->ntp);
[*] break;
[*] case MODULE_INFO:
[*] GIZWITS_LOG("MODULE INFO ...\n");
[*] #if MODULE_TYPE
[*] GIZWITS_LOG("GPRS MODULE ...\n");
[*] //Format By gprsInfo_t
[*] #else
[*] GIZWITS_LOG("WIF MODULE ...\n");
[*] //Format By moduleInfo_t
[*] GIZWITS_LOG("moduleType : [%d] \n",ptModuleInfo->moduleType);
[*] #endif
[*] break;
[*] default:
[*] break;
[*] }
[*]}
[*]
[*]return 0;
[*]}
[*]
[*]
[*]void userHandle(void)
[*]{
[*]/*
[*] currentDataPoint.valueTemp = ;//Add Sensor Data Collection
[*] currentDataPoint.valueHumi = ;//Add Sensor Data Collection
[*] currentDataPoint.valueLight_Intensity = ;//Add Sensor Data Collection
[*]*/
[*]}
[*]void userInit(void)
[*]{
[*] memset((uint8_t*)¤tDataPoint, 0, sizeof(dataPoint_t));
[*] currentDataPoint.valueRelay_1 = 0;
[*] currentDataPoint.valueTemp = 0;
[*] currentDataPoint.valueHumi = 0;
[*] currentDataPoint.valueLight_Intensity = 0;
[*]}
[*]
[*]void gizTimerMs(void)
[*]{
[*] timerMsCount++;
[*]}
[*]
[*]uint32_t gizGetTimerCount(void)
[*]{
[*] return timerMsCount;
[*]}
[*]
[*]void mcuRestart(void)
[*]{
[*] __set_FAULTMASK(1);
[*] NVIC_SystemReset();
[*]}
[*]
[*]void TIMER_IRQ_FUN(void)
[*]{
[*]gizTimerMs();
[*]}
[*]
[*]void UART_IRQ_FUN(void)
[*]{
[*]uint8_t value = 0;
[*]gizPutData(&value, 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(USART3,buf);
[*] while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //循环发送,直到发送完毕
[*] if(i >=2 && buf == 0xFF)
[*] {
[*] USART_SendData(USART3, 0x55);
[*] while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET); //循环发送,直到发送完毕
[*] }
[*] }
[*] return len;
[*]}
[*]
[*]
复制代码
5,修改
[*]#ifndef _GIZWITS_PRODUCT_H
[*]#define _GIZWITS_PRODUCT_H
[*]
[*]#ifdef __cplusplus
[*]extern "C" {
[*]#endif
[*]
[*]#include <stdint.h>
[*]//#include "stm32f1xx.h"
[*]#include "gizwits_protocol.h"
[*]
[*]/**
[*]* MCU software version
[*]*/
[*]#define SOFTWARE_VERSION "03030000"
[*]/**
[*]* MCU hardware version
[*]*/
[*]#define HARDWARE_VERSION "03010100"
[*]
[*]
[*]/**
[*]* Communication module model
[*]*/
[*]#define MODULE_TYPE 0 //0,WIFI ;1,GPRS
[*]
[*]
[*]/**@name TIM3 related macro definition
[*]* @{
[*]*/
[*]#define TIMER TIM3
[*]#define TIMER_IRQ TIM3_IRQn
[*]#define TIMER_RCC RCC_APB1Periph_TIM3
[*]#define TIMER_IRQ_FUN TIM3_IRQHandler
[*]/**@} */
[*]
[*]/**@name USART related macro definition
[*]* @{
[*]*/
[*]#define UART_BAUDRATE 9600
[*]#define UART_PORT 2
[*]#define UART USART2
[*]#define UART_IRQ USART2_IRQn
[*]#define UART_IRQ_FUN USART2_IRQHandler
[*]
[*]#if (UART_PORT == 1)
[*]#define UART_GPIO_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_GPIO_CLK RCC_APB2Periph_GPIOA
[*]
[*]#define UART_AFIO_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_AFIO_CLK RCC_APB2Periph_AFIO
[*]
[*]#define UART_CLK_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_CLK RCC_APB2Periph_USART1
[*]
[*]#define UART_GPIO_PORT GPIOA
[*]#define UART_RxPin GPIO_Pin_10
[*]#define UART_TxPin GPIO_Pin_9
[*]#endif
[*]
[*]#if (UART_PORT == 2)
[*]#define UART_GPIO_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_GPIO_CLK RCC_APB2Periph_GPIOA
[*]
[*]#define UART_AFIO_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_AFIO_CLK RCC_APB2Periph_AFIO
[*]
[*]#define UART_CLK_Cmd RCC_APB1PeriphClockCmd
[*]#define UART_CLK RCC_APB1Periph_USART2
[*]
[*]#define UART_GPIO_PORT GPIOA
[*]#define UART_RxPin GPIO_Pin_3
[*]#define UART_TxPin GPIO_Pin_2
[*]#endif
[*]
[*]
[*]#if (UART_PORT == 3)
[*]
[*]#define UART_GPIO_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_GPIO_CLK RCC_APB2Periph_GPIOC
[*]
[*]#define UART_AFIO_Cmd RCC_APB2PeriphClockCmd
[*]#define UART_AFIO_CLK RCC_APB2Periph_AFIO
[*]
[*]#define UART_CLK_Cmd RCC_APB1PeriphClockCmd
[*]#define UART_CLK RCC_APB1Periph_USART3
[*]
[*]#define UART_GPIO_PORT GPIOC
[*]#define UART_RxPin GPIO_Pin_11
[*]#define UART_TxPin GPIO_Pin_10
[*]
[*]#endif
[*]/**@} */
[*]
[*]/** User area the current device state structure*/
[*]extern dataPoint_t currentDataPoint;
[*]
[*]void gizTimerMs(void);
[*]uint32_t gizGetTimerCount(void);
[*]void timerInit(void);
[*]void uartInit(void);
[*]
[*]void userInit(void);
[*]void userHandle(void);
[*]void mcuRestart(void);
[*]
[*]int32_t uartWrite(uint8_t *buf, uint32_t len);
[*]int8_t gizwitsEventProcess(eventInfo_t *info, uint8_t *data, uint32_t len);
[*]
[*]#ifdef __cplusplus
[*]}
[*]#endif
[*]
[*]#endif
[*]
[*]
复制代码
5,修改gizwits_product.h
Listitem
Listitem
Listitem
Listitem
Listitem
[*]/**
[*]***************************
[*]* @file gizwits_protocol.c
[*]* @brief Corresponding gizwits_product.c header file (including product hardware and software version definition)
[*]* @author Gizwits
[*]* @date 2017-07-19
[*]* @version V03030000
[*]* @copyright Gizwits
[*]*
[*]* @note 机智云.只为智能硬件而生
[*]* Gizwits Smart Cloudfor Smart Products
[*]* 链接|增值ֵ|开放|中立|安全|自有|自由|生态
[*]* www.gizwits.com
[*]*
[*]***************************/
[*]//#include "ringBuffer.h"
[*]//#include "gizwits_product.h"
[*]//#include "dataPointTools.h"
[*]#include "delay.h"
[*]/** Protocol global variables **/
[*]//gizwitsProtocol_t gizwitsProtocol;
[*]//extern dataPoint_t currentDataPoint;
[*]//extern uint8_t wifi_flag;
[*]
[*]/**@name The serial port receives the ring buffer implementation
[*]* @{
[*]*/
[*]rb_t pRb; ///< Ring buffer structure variable
[*]static uint8_t rbBuf; ///< Ring buffer data cache buffer
[*]
[*]
[*]/**@} */
[*]
[*]/**
[*]* @brief Write data to the ring buffer
[*]* @param buf : buf adress
[*]* @param len : byte length
[*]* @return correct : Returns the length of the written data
[*] failure : -1
[*]*/
[*]int32_t gizPutData(uint8_t *buf, uint32_t len)
[*]{
[*] int32_t count = 0;
[*]
[*] if(NULL == buf)
[*] {
[*] GIZWITS_LOG("ERR: gizPutData buf is empty \n");
[*] return -1;
[*] }
[*]
[*] count = rbWrite(&pRb, buf, len);
[*] if(count != len)
[*] {
[*] GIZWITS_LOG("ERR: Failed to rbWrite \n");
[*] return -1;
[*] }
[*]
[*] return count;
[*]}
[*]
[*]
[*]
[*]/**
[*]* @brief Protocol header initialization
[*]*
[*]* @param head : Protocol header pointer
[*]*
[*]* @return 0, success; other, failure
[*]*/
[*]static int8_t gizProtocolHeadInit(protocolHead_t *head)
[*]{
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("ERR: gizProtocolHeadInit head is empty \n");
[*] return -1;
[*] }
[*]
[*] memset((uint8_t *)head, 0, sizeof(protocolHead_t));
[*] head->head = 0xFF;
[*] head->head = 0xFF;
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief Protocol ACK check processing function
[*]*
[*]* @param data : data adress
[*]* @param len : data length
[*]*
[*]* @return 0, suceess; other, failure
[*]*/
[*]static int8_t gizProtocolWaitAck(uint8_t *gizdata, uint32_t len)
[*]{
[*] if(NULL == gizdata)
[*] {
[*] GIZWITS_LOG("ERR: data is empty \n");
[*] return -1;
[*] }
[*]
[*] memset((uint8_t *)&gizwitsProtocol.waitAck, 0, sizeof(protocolWaitAck_t));
[*] memcpy((uint8_t *)gizwitsProtocol.waitAck.buf, gizdata, len);
[*] gizwitsProtocol.waitAck.dataLen = (uint16_t)len;
[*]
[*] gizwitsProtocol.waitAck.flag = 1;
[*] gizwitsProtocol.waitAck.sendTime = gizGetTimerCount();
[*]
[*] return 0;
[*]}
[*]/**
[*]* @brief generates "controlled events" according to protocol
[*]
[*]* @param issuedData: Controlled data
[*]* @param info: event queue
[*]* @param dataPoints: data point data
[*]* @return 0, the implementation of success, non-0, failed
[*]*/
[*]static int8_t ICACHE_FLASH_ATTR gizDataPoint2Event(gizwitsIssued_t *issuedData, eventInfo_t *info, dataPoint_t *dataPoints)
[*]{
[*] if((NULL == issuedData) || (NULL == info) ||(NULL == dataPoints))
[*] {
[*] GIZWITS_LOG("gizDataPoint2Event Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] /** Greater than 1 byte to do bit conversion **/
[*] if(sizeof(issuedData->attrFlags) > 1)
[*] {
[*] if(-1 == gizByteOrderExchange((uint8_t *)&issuedData->attrFlags,sizeof(attrFlags_t)))
[*] {
[*] GIZWITS_LOG("gizByteOrderExchange Error\n");
[*] return -1;
[*] }
[*] }
[*]
[*] if(0x01 == issuedData->attrFlags.flagRelay_1)
[*] {
[*] info->event = EVENT_Relay_1;
[*] info->num++;
[*] dataPoints->valueRelay_1 = gizStandardDecompressionValue(Relay_1_BYTEOFFSET,Relay_1_BITOFFSET,Relay_1_LEN,(uint8_t *)&issuedData->attrVals.wBitBuf,sizeof(issuedData->attrVals.wBitBuf));
[*] }
[*]
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief contrasts the current data with the last data
[*]*
[*]* @param cur: current data point data
[*]* @param last: last data point data
[*]*
[*]* @return: 0, no change in data; 1, data changes
[*]*/
[*]static int8_t ICACHE_FLASH_ATTR gizCheckReport(dataPoint_t *cur, dataPoint_t *last)
[*]{
[*] int8_t ret = 0;
[*] static uint32_t lastReportTime = 0;
[*] uint32_t currentTime = 0;
[*]
[*] if((NULL == cur) || (NULL == last))
[*] {
[*] GIZWITS_LOG("gizCheckReport Error , Illegal Param\n");
[*] return -1;
[*] }
[*] currentTime = gizGetTimerCount();
[*] if(last->valueRelay_1 != cur->valueRelay_1)
[*] {
[*] GIZWITS_LOG("valueRelay_1 Changed\n");
[*] ret = 1;
[*] }
[*]
[*] if(last->valueTemp != cur->valueTemp)
[*] {
[*] if(currentTime - lastReportTime >= REPORT_TIME_MAX)
[*] {
[*] GIZWITS_LOG("valueTemp Changed\n");
[*] ret = 1;
[*] }
[*] }
[*] if(last->valueHumi != cur->valueHumi)
[*] {
[*] if(currentTime - lastReportTime >= REPORT_TIME_MAX)
[*] {
[*] GIZWITS_LOG("valueHumi Changed\n");
[*] ret = 1;
[*] }
[*] }
[*] if(last->valueLight_Intensity != cur->valueLight_Intensity)
[*] {
[*] if(currentTime - lastReportTime >= REPORT_TIME_MAX)
[*] {
[*] GIZWITS_LOG("valueLight_Intensity Changed\n");
[*] ret = 1;
[*] }
[*] }
[*]
[*] if(1 == ret)
[*] {
[*] lastReportTime = gizGetTimerCount();
[*] }
[*] return ret;
[*]}
[*]
[*]/**
[*]* @brief User data point data is converted to wit the cloud to report data point data
[*]*
[*]* @param dataPoints: user data point data address
[*]* @param devStatusPtr: wit the cloud data point data address
[*]*
[*]* @return 0, the correct return; -1, the error returned
[*]*/
[*]static int8_t ICACHE_FLASH_ATTR gizDataPoints2ReportData(dataPoint_t *dataPoints , devStatus_t *devStatusPtr)
[*]{
[*] if((NULL == dataPoints) || (NULL == devStatusPtr))
[*] {
[*] GIZWITS_LOG("gizDataPoints2ReportData Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] gizMemset((uint8_t *)devStatusPtr->wBitBuf,0,sizeof(devStatusPtr->wBitBuf));
[*]
[*] gizStandardCompressValue(Relay_1_BYTEOFFSET,Relay_1_BITOFFSET,Relay_1_LEN,(uint8_t *)devStatusPtr,dataPoints->valueRelay_1);
[*] gizByteOrderExchange((uint8_t *)devStatusPtr->wBitBuf,sizeof(devStatusPtr->wBitBuf));
[*]
[*] devStatusPtr->valueTemp = gizY2X(Temp_RATIO,Temp_ADDITION, dataPoints->valueTemp);
[*] devStatusPtr->valueHumi = gizY2X(Humi_RATIO,Humi_ADDITION, dataPoints->valueHumi);
[*] devStatusPtr->valueLight_Intensity = gizY2X(Light_Intensity_RATIO,Light_Intensity_ADDITION, dataPoints->valueLight_Intensity);
[*]
[*]
[*]
[*]
[*] return 0;
[*]}
[*]
[*]
[*]/**
[*]* @brief This function is called by the GAgent module to receive the relevant protocol data from the cloud or APP
[*]* @param inData The protocol data entered
[*]* @param inLen Enter the length of the data
[*]* @param outData The output of the protocol data
[*]* @param outLen The length of the output data
[*]* @return 0, the implementation of success, non-0, failed
[*]*/
[*]static int8_t gizProtocolIssuedProcess(char *did, uint8_t *inData, uint32_t inLen, uint8_t *outData, uint32_t *outLen)
[*]{
[*] uint8_t issuedAction = inData;
[*]
[*] if((NULL == inData)||(NULL == outData)||(NULL == outLen))
[*] {
[*] GIZWITS_LOG("gizProtocolIssuedProcess Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] if(NULL == did)
[*] {
[*] memset((uint8_t *)&gizwitsProtocol.issuedProcessEvent, 0, sizeof(eventInfo_t));
[*] switch(issuedAction)
[*] {
[*] case ACTION_CONTROL_DEVICE:
[*] gizDataPoint2Event((gizwitsIssued_t *)&inData, &gizwitsProtocol.issuedProcessEvent,&gizwitsProtocol.gizCurrentDataPoint);
[*] gizwitsProtocol.issuedFlag = ACTION_CONTROL_TYPE;
[*] outData = NULL;
[*] *outLen = 0;
[*] break;
[*]
[*] case ACTION_READ_DEV_STATUS:
[*] if(0 == gizDataPoints2ReportData(&gizwitsProtocol.gizLastDataPoint,&gizwitsProtocol.reportData.devStatus))
[*] {
[*] memcpy(outData+1, (uint8_t *)&gizwitsProtocol.reportData.devStatus, sizeof(gizwitsReport_t));
[*] outData = ACTION_READ_DEV_STATUS_ACK;
[*] *outLen = sizeof(gizwitsReport_t)+1;
[*] }
[*] else
[*] {
[*] return -1;
[*] }
[*] break;
[*] case ACTION_W2D_TRANSPARENT_DATA:
[*] memcpy(gizwitsProtocol.transparentBuff, &inData, inLen-1);
[*] gizwitsProtocol.transparentLen = inLen - 1;
[*]
[*] gizwitsProtocol.issuedProcessEvent.event = TRANSPARENT_DATA;
[*] gizwitsProtocol.issuedProcessEvent.num++;
[*] gizwitsProtocol.issuedFlag = ACTION_W2D_TRANSPARENT_TYPE;
[*] outData = NULL;
[*] *outLen = 0;
[*] break;
[*]
[*] default:
[*] break;
[*] }
[*] }
[*]
[*] return 0;
[*]}
[*]/**
[*]* @brief The protocol sends data back , P0 ACK
[*]*
[*]* @param head : Protocol head pointer
[*]* @param data : Payload data
[*]* @param len : Payload data length
[*]* @param proFlag : DID flag ,1 for Virtual sub device did ,0 for single product or gateway
[*]*
[*]* @return : 0,Ack success;
[*]* -1,Input Param Illegal
[*]* -2,Serial send faild
[*]*/
[*]static int32_t gizProtocolIssuedDataAck(protocolHead_t *head, uint8_t *gizdata, uint32_t len, uint8_t proFlag)
[*]{
[*] int32_t ret = 0;
[*] uint8_t tx_buf;
[*] uint32_t offset = 0;
[*] uint8_t sDidLen = 0;
[*] uint16_t data_len = 0;
[*] uint8_t *pTxBuf = tx_buf;
[*] if(NULL == gizdata)
[*] {
[*] GIZWITS_LOG("data Is Null \n");
[*] return -1;
[*] }
[*]
[*]
[*] if(0x1 == proFlag)
[*] {
[*] sDidLen = *((uint8_t *)head + sizeof(protocolHead_t));
[*] data_len = 5 + 1 + sDidLen + len;
[*] }
[*] else
[*] {
[*] data_len = 5 + len;
[*] }
[*] GIZWITS_LOG("len = %d , sDidLen = %d ,data_len = %d\n", len,sDidLen,data_len);
[*] *pTxBuf ++= 0xFF;
[*] *pTxBuf ++= 0xFF;
[*] *pTxBuf ++= (uint8_t)(data_len>>8);
[*] *pTxBuf ++= (uint8_t)(data_len);
[*] *pTxBuf ++= head->cmd + 1;
[*] *pTxBuf ++= head->sn;
[*] *pTxBuf ++= 0x00;
[*] *pTxBuf ++= proFlag;
[*] offset = 8;
[*] if(0x1 == proFlag)
[*] {
[*] *pTxBuf ++= sDidLen;
[*] offset += 1;
[*] memcpy(&tx_buf,(uint8_t *)head+sizeof(protocolHead_t)+1,sDidLen);
[*] offset += sDidLen;
[*] pTxBuf += sDidLen;
[*]
[*] }
[*] if(0 != len)
[*] {
[*] memcpy(&tx_buf,gizdata,len);
[*] }
[*] tx_buf = gizProtocolSum( tx_buf , (data_len+4));
[*]
[*] ret = uartWrite(tx_buf, data_len+4);
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("uart write error %d \n", ret);
[*] return -2;
[*] }
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief Report data interface
[*]*
[*]* @param action : PO action
[*]* @param data : Payload data
[*]* @param len : Payload data length
[*]*
[*]* @return : 0,Ack success;
[*]* -1,Input Param Illegal
[*]* -2,Serial send faild
[*]*/
[*]static int32_t gizReportData(uint8_t action, uint8_t *gizdata, uint32_t len)
[*]{
[*] int32_t ret = 0;
[*] protocolReport_t protocolReport;
[*]
[*] if(NULL == gizdata)
[*] {
[*] GIZWITS_LOG("gizReportData Error , Illegal Param\n");
[*] return -1;
[*] }
[*] gizProtocolHeadInit((protocolHead_t *)&protocolReport);
[*] protocolReport.head.cmd = CMD_REPORT_P0;
[*] protocolReport.head.sn = gizwitsProtocol.sn++;
[*] protocolReport.action = action;
[*] protocolReport.head.len = exchangeBytes(sizeof(protocolReport_t)-4);
[*] memcpy((gizwitsReport_t *)&protocolReport.reportData, (gizwitsReport_t *)gizdata,len);
[*] protocolReport.sum = gizProtocolSum((uint8_t *)&protocolReport, sizeof(protocolReport_t));
[*]
[*] ret = uartWrite((uint8_t *)&protocolReport, sizeof(protocolReport_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] return -2;
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&protocolReport, sizeof(protocolReport_t));
[*]
[*] return ret;
[*]}/**
[*]* @brief Datapoints reporting mechanism
[*]*
[*]* 1. Changes are reported immediately
[*]
[*]* 2. Data timing report , 600000 Millisecond
[*]*
[*]*@param currentData : Current datapoints value
[*]* @return : NULL
[*]*/
[*]static void gizDevReportPolicy(dataPoint_t *currentData)
[*]{
[*] static uint32_t lastRepTime = 0;
[*] uint32_t timeNow = gizGetTimerCount();
[*]
[*] if((1 == gizCheckReport(currentData, (dataPoint_t *)&gizwitsProtocol.gizLastDataPoint)))
[*] {
[*] GIZWITS_LOG("changed, report data\n");
[*] if(0 == gizDataPoints2ReportData(currentData,&gizwitsProtocol.reportData.devStatus))
[*] {
[*] gizReportData(ACTION_REPORT_DEV_STATUS, (uint8_t *)&gizwitsProtocol.reportData.devStatus, sizeof(devStatus_t)); }
[*] memcpy((uint8_t *)&gizwitsProtocol.gizLastDataPoint, (uint8_t *)currentData, sizeof(dataPoint_t));
[*] }
[*]
[*] if((0 == (timeNow % (600000))) && (lastRepTime != timeNow))
[*] {
[*] GIZWITS_LOG("Info: 600S report data\n");
[*] if(0 == gizDataPoints2ReportData(currentData,&gizwitsProtocol.reportData.devStatus))
[*] {
[*] gizReportData(ACTION_REPORT_DEV_STATUS, (uint8_t *)&gizwitsProtocol.reportData.devStatus, sizeof(devStatus_t));
[*] }
[*] memcpy((uint8_t *)&gizwitsProtocol.gizLastDataPoint, (uint8_t *)currentData, sizeof(dataPoint_t));
[*]
[*] lastRepTime = timeNow;
[*] }
[*]}
[*]
[*]/**
[*]* @brief Get a packet of data from the ring buffer
[*]*
[*]* @param rb : Input data address
[*]* @param data : Output data address
[*]* @param len : Output data length
[*]*
[*]* @return : 0,Return correct ;-1,Return failure;-2,Data check failure
[*]*/
[*]static int8_t gizProtocolGetOnePacket(rb_t *rb, uint8_t *gizdata, uint16_t *len)
[*]{
[*] int32_t ret = 0;
[*] uint8_t sum = 0;
[*] int32_t i = 0;
[*] uint8_t tmpData;
[*] uint8_t tmpLen = 0;
[*] uint16_t tmpCount = 0;
[*] static uint8_t protocolFlag = 0;
[*] static uint16_t protocolCount = 0;
[*] static uint8_t lastData = 0;
[*] static uint8_t debugCount = 0;
[*] uint8_t *protocolBuff = gizdata;
[*] protocolHead_t *head = NULL;
[*]
[*] if((NULL == rb) || (NULL == gizdata) ||(NULL == len))
[*] {
[*] GIZWITS_LOG("gizProtocolGetOnePacket Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] tmpLen = rbCanRead(rb);
[*] if(0 == tmpLen)
[*] {
[*] return -1;
[*] }
[*]
[*] for(i=0; i<tmpLen; i++)
[*] {
[*] ret = rbRead(rb, &tmpData, 1);
[*] if(0 != ret)
[*] {
[*] if((0xFF == lastData) && (0xFF == tmpData))
[*] {
[*] if(0 == protocolFlag)
[*] {
[*] protocolBuff = 0xFF;
[*] protocolBuff = 0xFF;
[*] protocolCount = 2;
[*] protocolFlag = 1;
[*] }
[*] else
[*] {
[*] if((protocolCount > 4) && (protocolCount != tmpCount))
[*] {
[*] protocolBuff = 0xFF;
[*] protocolBuff = 0xFF;
[*] protocolCount = 2;
[*] }
[*] }
[*] }
[*] else if((0xFF == lastData) && (0x55 == tmpData))
[*] {
[*] }
[*] else
[*] {
[*] if(1 == protocolFlag)
[*] {
[*] protocolBuff = tmpData;
[*] protocolCount++;
[*]
[*] if(protocolCount > 4)
[*] {
[*] head = (protocolHead_t *)protocolBuff;
[*] tmpCount = exchangeBytes(head->len)+4;
[*] if(protocolCount == tmpCount)
[*] {
[*] break;
[*] }
[*] }
[*] }
[*] }
[*]
[*] lastData = tmpData;
[*] debugCount++;
[*] }
[*] }
[*]
[*] if((protocolCount > 4) && (protocolCount == tmpCount))
[*] {
[*] sum = gizProtocolSum(protocolBuff, protocolCount);
[*]
[*] if(protocolBuff == sum)
[*] {
[*] memcpy(gizdata, protocolBuff, tmpCount);
[*] *len = tmpCount;
[*] protocolFlag = 0;
[*]
[*] protocolCount = 0;
[*] debugCount = 0;
[*] lastData = 0;
[*]
[*] return 0;
[*] }
[*] else
[*] {
[*] return -2;
[*] }
[*] }
[*]
[*] return 1;
[*]}
[*]
[*]
[*]
[*]/**
[*]* @brief Protocol data resend
[*]
[*]* The protocol data resend when check timeout and meet the resend limiting
[*]
[*]* @param none
[*]*
[*]* @return none
[*]*/
[*]static void gizProtocolResendData(void)
[*]{
[*] int32_t ret = 0;
[*]
[*] if(0 == gizwitsProtocol.waitAck.flag)
[*] {
[*] return;
[*] }
[*]
[*] GIZWITS_LOG("Warning: timeout, resend data \n");
[*]
[*] ret = uartWrite(gizwitsProtocol.waitAck.buf, gizwitsProtocol.waitAck.dataLen);
[*] if(ret != gizwitsProtocol.waitAck.dataLen)
[*] {
[*] GIZWITS_LOG("ERR: resend data error\n");
[*] }
[*]
[*] gizwitsProtocol.waitAck.sendTime = gizGetTimerCount();
[*]}
[*]
[*]/**
[*]* @brief Clear the ACK protocol message
[*]*
[*]* @param head : Protocol header address
[*]*
[*]* @return 0, success; other, failure
[*]*/
[*]static int8_t gizProtocolWaitAckCheck(protocolHead_t *head)
[*]{
[*] protocolHead_t *waitAckHead = (protocolHead_t *)gizwitsProtocol.waitAck.buf;
[*]
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("ERR: data is empty \n");
[*] return -1;
[*] }
[*]
[*] if(waitAckHead->cmd+1 == head->cmd)
[*] {
[*] memset((uint8_t *)&gizwitsProtocol.waitAck, 0, sizeof(protocolWaitAck_t));
[*] }
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief Send general protocol message data
[*]*
[*]* @param head : Protocol header address
[*]*
[*]* @return : Return effective data length;-1,return failure
[*]*/
[*]static int32_t gizProtocolCommonAck(protocolHead_t *head)
[*]{
[*] int32_t ret = 0;
[*] protocolCommon_t ack;
[*]
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("ERR: gizProtocolCommonAck data is empty \n");
[*] return -1;
[*] }
[*] memcpy((uint8_t *)&ack, (uint8_t *)head, sizeof(protocolHead_t));
[*] ack.head.cmd = ack.head.cmd+1;
[*] ack.head.len = exchangeBytes(sizeof(protocolCommon_t)-4);
[*] ack.sum = gizProtocolSum((uint8_t *)&ack, sizeof(protocolCommon_t));
[*]
[*] ret = uartWrite((uint8_t *)&ack, sizeof(protocolCommon_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] return ret;
[*]}
[*]
[*]/**
[*]* @brief ACK processing function
[*]
[*]* Time-out 200ms no ACK resend,resend two times at most
[*]
[*]* @param none
[*]*
[*]* @return none
[*]*/
[*]static void gizProtocolAckHandle(void)
[*]{
[*] if(1 == gizwitsProtocol.waitAck.flag)
[*] {
[*] if(SEND_MAX_NUM > gizwitsProtocol.waitAck.num)
[*] {
[*] // Time-out no ACK resend
[*] if(SEND_MAX_TIME < (gizGetTimerCount() - gizwitsProtocol.waitAck.sendTime))
[*] {
[*] GIZWITS_LOG("Warning:gizProtocolResendData %d %d %d\n", gizGetTimerCount(), gizwitsProtocol.waitAck.sendTime, gizwitsProtocol.waitAck.num);
[*] gizProtocolResendData();
[*] gizwitsProtocol.waitAck.num++;
[*] }
[*] }
[*] else
[*] {
[*] memset((uint8_t *)&gizwitsProtocol.waitAck, 0, sizeof(protocolWaitAck_t));
[*] }
[*] }
[*]}
[*]
[*]/**
[*]* @brief Protocol 4.1 WiFi module requests device information
[*]*
[*]* @param head : Protocol header address
[*]*
[*]* @return Return effective data length;-1,return failure
[*]*/
[*]static int32_t gizProtocolGetDeviceInfo(protocolHead_t * head)
[*]{
[*] int32_t ret = 0;
[*] protocolDeviceInfo_t deviceInfo;
[*]
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("gizProtocolGetDeviceInfo Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] gizProtocolHeadInit((protocolHead_t *)&deviceInfo);
[*] deviceInfo.head.cmd = ACK_GET_DEVICE_INFO;
[*] deviceInfo.head.sn = head->sn;
[*] memcpy((uint8_t *)deviceInfo.protocolVer, protocol_VERSION, 8);
[*] memcpy((uint8_t *)deviceInfo.p0Ver, P0_VERSION, 8);
[*] memcpy((uint8_t *)deviceInfo.softVer, SOFTWARE_VERSION, 8);
[*] memcpy((uint8_t *)deviceInfo.hardVer, HARDWARE_VERSION, 8);
[*] memcpy((uint8_t *)deviceInfo.productKey, PRODUCT_KEY, strlen(PRODUCT_KEY));
[*] memcpy((uint8_t *)deviceInfo.productSecret, PRODUCT_SECRET, strlen(PRODUCT_SECRET));
[*] memset((uint8_t *)deviceInfo.devAttr, 0, 8);
[*] deviceInfo.devAttr |= DEV_IS_GATEWAY<<0;
[*] deviceInfo.devAttr |= (0x01<<1);
[*] deviceInfo.ninableTime = exchangeBytes(NINABLETIME);
[*] deviceInfo.head.len = exchangeBytes(sizeof(protocolDeviceInfo_t)-4);
[*] deviceInfo.sum = gizProtocolSum((uint8_t *)&deviceInfo, sizeof(protocolDeviceInfo_t));
[*]
[*] ret = uartWrite((uint8_t *)&deviceInfo, sizeof(protocolDeviceInfo_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] return ret;
[*]}
[*]
[*]/**
[*]* @brief Protocol 4.7 Handling of illegal message notification
[*]
[*]* @param head: Protocol header address
[*]* @param errno : Illegal message notification type
[*]* @return 0, success; other, failure
[*]*/
[*]static int32_t gizProtocolErrorCmd(protocolHead_t *head,errorPacketsType_t errno)
[*]{
[*] int32_t ret = 0;
[*] protocolErrorType_t errorType;
[*]
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("gizProtocolErrorCmd Error , Illegal Param\n");
[*] return -1;
[*] }
[*] gizProtocolHeadInit((protocolHead_t *)&errorType);
[*] errorType.head.cmd = ACK_ERROR_PACKAGE;
[*] errorType.head.sn = head->sn;
[*]
[*] errorType.head.len = exchangeBytes(sizeof(protocolErrorType_t)-4);
[*] errorType.error = errno;
[*] errorType.sum = gizProtocolSum((uint8_t *)&errorType, sizeof(protocolErrorType_t));
[*]
[*] ret = uartWrite((uint8_t *)&errorType, sizeof(protocolErrorType_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] return ret;
[*]}
[*]
[*]/**
[*]* @brief Protocol 4.13 Get and process network time
[*]*
[*]* @param head : Protocol header address
[*]*
[*]* @return 0, success; other, failure
[*]*/
[*]static int8_t gizProtocolNTP(protocolHead_t *head)
[*]{
[*] protocolUTT_t *UTTInfo = (protocolUTT_t *)head;
[*]
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("ERR: NTP is empty \n");
[*] return -1;
[*] }
[*]
[*] memcpy((uint8_t *)&gizwitsProtocol.TimeNTP,(uint8_t *)UTTInfo->time, (7 + 4));
[*] gizwitsProtocol.TimeNTP.year = exchangeBytes(gizwitsProtocol.TimeNTP.year);
[*] gizwitsProtocol.TimeNTP.ntp =exchangeWord(gizwitsProtocol.TimeNTP.ntp);
[*]
[*] gizwitsProtocol.NTPEvent.event = WIFI_NTP;
[*] gizwitsProtocol.NTPEvent.num++;
[*]
[*] gizwitsProtocol.issuedFlag = GET_NTP_TYPE;
[*]
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief Protocol 4.4 Device MCU restarts function
[*]
[*]* @param none
[*]* @return none
[*]*/
[*]static void gizProtocolReboot(void)
[*]{
[*] uint32_t timeDelay = gizGetTimerCount();
[*]
[*] /*Wait 600ms*/
[*] while((gizGetTimerCount() - timeDelay) <= 600);
[*] mcuRestart();
[*]}
[*]
[*]/**
[*]* @brief Protocol 4.5 :The WiFi module informs the device MCU of working status about the WiFi module
[*]
[*]* @param status WiFi module working status
[*]* @return none
[*]*/
[*]static int8_t gizProtocolModuleStatus(protocolWifiStatus_t *status)
[*]{
[*] static wifiStatus_t lastStatus;
[*]
[*] if(NULL == status)
[*] {
[*] GIZWITS_LOG("gizProtocolModuleStatus Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] status->ststus.value = exchangeBytes(status->ststus.value);
[*]
[*] //OnBoarding mode status
[*] if(lastStatus.types.onboarding != status->ststus.types.onboarding)
[*] {
[*] if(1 == status->ststus.types.onboarding)
[*] {
[*] if(1 == status->ststus.types.softap)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_SOFTAP;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("OnBoarding: SoftAP or Web mode\n");
[*] }
[*]
[*] if(1 == status->ststus.types.station)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_AIRLINK;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("OnBoarding: AirLink mode\n");
[*] }
[*] }
[*] else
[*] {
[*] if(1 == status->ststus.types.softap)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_SOFTAP;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("OnBoarding: SoftAP or Web mode\n");
[*] }
[*]
[*] if(1 == status->ststus.types.station)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_STATION;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("OnBoarding: Station mode\n");
[*] }
[*] }
[*] }
[*]
[*] //binding mode status
[*] if(lastStatus.types.binding != status->ststus.types.binding)
[*] {
[*] lastStatus.types.binding = status->ststus.types.binding;
[*] if(1 == status->ststus.types.binding)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_OPEN_BINDING;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: in binding mode\n");
[*] }
[*] else
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_CLOSE_BINDING;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: out binding mode\n");
[*] }
[*] }
[*]
[*] //router status
[*] if(lastStatus.types.con_route != status->ststus.types.con_route)
[*] {
[*] lastStatus.types.con_route = status->ststus.types.con_route;
[*] if(1 == status->ststus.types.con_route)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_CON_ROUTER;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: connected router\n");
[*] }
[*] else
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_DISCON_ROUTER;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: disconnected router\n");
[*] }
[*] }
[*]
[*] //M2M server status
[*] if(lastStatus.types.con_m2m != status->ststus.types.con_m2m)
[*] {
[*] lastStatus.types.con_m2m = status->ststus.types.con_m2m;
[*] if(1 == status->ststus.types.con_m2m)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_CON_M2M;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: connected m2m\n");
[*] }
[*] else
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_DISCON_M2M;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: disconnected m2m\n");
[*] }
[*] }
[*]
[*] //APP status
[*] if(lastStatus.types.app != status->ststus.types.app)
[*] {
[*] lastStatus.types.app = status->ststus.types.app;
[*] if(1 == status->ststus.types.app)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_CON_APP;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: app connect\n");
[*] }
[*] else
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_DISCON_APP;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: no app connect\n");
[*] }
[*] }
[*]
[*] //test mode status
[*] if(lastStatus.types.test != status->ststus.types.test)
[*] {
[*] lastStatus.types.test = status->ststus.types.test;
[*] if(1 == status->ststus.types.test)
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_OPEN_TESTMODE;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: in test mode\n");
[*] }
[*] else
[*] {
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_CLOSE_TESTMODE;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] GIZWITS_LOG("WiFi status: out test mode\n");
[*] }
[*] }
[*]
[*] gizwitsProtocol.wifiStatusEvent.event = WIFI_RSSI;
[*] gizwitsProtocol.wifiStatusEvent.num++;
[*] gizwitsProtocol.wifiStatusData.rssi = status->ststus.types.rssi;
[*] GIZWITS_LOG("RSSI is %d \n", gizwitsProtocol.wifiStatusData.rssi);
[*]
[*] gizwitsProtocol.issuedFlag = WIFI_STATUS_TYPE;
[*]
[*] return 0;
[*]}
[*]
[*]
[*]/**@name Gizwits User API interface
[*]* @{
[*]*/
[*]
[*]/**
[*]* @brief gizwits Protocol initialization interface
[*]
[*]* Protocol-related timer, serial port initialization
[*]
[*]* Datapoint initialization
[*]
[*]* @param none
[*]* @return none
[*]*/
[*]void gizwitsInit(void)
[*]{
[*] pRb.rbCapacity = RB_MAX_LEN;
[*] pRb.rbBuff = rbBuf;
[*] if(0 == rbCreate(&pRb))
[*] {
[*] GIZWITS_LOG("rbCreate Success \n");
[*] }
[*] else
[*] {
[*] GIZWITS_LOG("rbCreate Faild \n");
[*] }
[*]
[*] memset((uint8_t *)&gizwitsProtocol, 0, sizeof(gizwitsProtocol_t));
[*]}
[*]
[*]/**
[*]* @brief WiFi configure interface
[*]
[*]* Set the WiFi module into the corresponding configuration mode or reset the module
[*]
[*]* @param mode :0x0, reset the module ;0x01, SoftAp mode ;0x02, AirLink mode ;0x03, Production test mode; 0x04:allow users to bind devices
[*]
[*]* @return Error command code
[*]*/
[*]int32_t gizwitsSetMode(uint8_t mode)
[*]{
[*] int32_t ret = 0;
[*] protocolCfgMode_t cfgMode;
[*] protocolCommon_t setDefault;
[*]
[*] switch(mode)
[*] {
[*] case WIFI_RESET_MODE:
[*] gizProtocolHeadInit((protocolHead_t *)&setDefault);
[*] setDefault.head.cmd = CMD_SET_DEFAULT;
[*] setDefault.head.sn = gizwitsProtocol.sn++;
[*] setDefault.head.len = exchangeBytes(sizeof(protocolCommon_t)-4);
[*] setDefault.sum = gizProtocolSum((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] ret = uartWrite((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] break;
[*] case WIFI_SOFTAP_MODE:
[*] gizProtocolHeadInit((protocolHead_t *)&cfgMode);
[*] cfgMode.head.cmd = CMD_WIFI_CONFIG;
[*] cfgMode.head.sn = gizwitsProtocol.sn++;
[*] cfgMode.cfgMode = mode;
[*] cfgMode.head.len = exchangeBytes(sizeof(protocolCfgMode_t)-4);
[*] cfgMode.sum = gizProtocolSum((uint8_t *)&cfgMode, sizeof(protocolCfgMode_t));
[*] ret = uartWrite((uint8_t *)&cfgMode, sizeof(protocolCfgMode_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*] gizProtocolWaitAck((uint8_t *)&cfgMode, sizeof(protocolCfgMode_t));
[*] break;
[*] case WIFI_AIRLINK_MODE:
[*] gizProtocolHeadInit((protocolHead_t *)&cfgMode);
[*] cfgMode.head.cmd = CMD_WIFI_CONFIG;
[*] cfgMode.head.sn = gizwitsProtocol.sn++;
[*] cfgMode.cfgMode = mode;
[*] cfgMode.head.len = exchangeBytes(sizeof(protocolCfgMode_t)-4);
[*] cfgMode.sum = gizProtocolSum((uint8_t *)&cfgMode, sizeof(protocolCfgMode_t));
[*] ret = uartWrite((uint8_t *)&cfgMode, sizeof(protocolCfgMode_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*] gizProtocolWaitAck((uint8_t *)&cfgMode, sizeof(protocolCfgMode_t));
[*] break;
[*] case WIFI_PRODUCTION_TEST:
[*] gizProtocolHeadInit((protocolHead_t *)&setDefault);
[*] setDefault.head.cmd = CMD_PRODUCTION_TEST;
[*] setDefault.head.sn = gizwitsProtocol.sn++;
[*] setDefault.head.len = exchangeBytes(sizeof(protocolCommon_t)-4);
[*] setDefault.sum = gizProtocolSum((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] ret = uartWrite((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] break;
[*] case WIFI_NINABLE_MODE:
[*] gizProtocolHeadInit((protocolHead_t *)&setDefault);
[*] setDefault.head.cmd = CMD_NINABLE_MODE;
[*] setDefault.head.sn = gizwitsProtocol.sn++;
[*] setDefault.head.len = exchangeBytes(sizeof(protocolCommon_t)-4);
[*] setDefault.sum = gizProtocolSum((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] ret = uartWrite((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] break;
[*] case WIFI_REBOOT_MODE:
[*] gizProtocolHeadInit((protocolHead_t *)&setDefault);
[*] setDefault.head.cmd = CMD_REBOOT_MODULE;
[*] setDefault.head.sn = gizwitsProtocol.sn++;
[*] setDefault.head.len = exchangeBytes(sizeof(protocolCommon_t)-4);
[*] setDefault.sum = gizProtocolSum((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] ret = uartWrite((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&setDefault, sizeof(protocolCommon_t));
[*] break;
[*] default:
[*] GIZWITS_LOG("ERR: CfgMode error!\n");
[*] break;
[*] }
[*]
[*] return ret;
[*]}
[*]
[*]/**
[*]* @brief Get the the network time
[*]
[*]* Protocol 4.13:"Device MCU send" of "the MCU requests access to the network time"
[*]
[*]* @param none
[*]* @return none
[*]*/
[*]void gizwitsGetNTP(void)
[*]{
[*] int32_t ret = 0;
[*] protocolCommon_t getNTP;
[*]
[*] gizProtocolHeadInit((protocolHead_t *)&getNTP);
[*] getNTP.head.cmd = CMD_GET_NTP;
[*] getNTP.head.sn = gizwitsProtocol.sn++;
[*] getNTP.head.len = exchangeBytes(sizeof(protocolCommon_t)-4);
[*] getNTP.sum = gizProtocolSum((uint8_t *)&getNTP, sizeof(protocolCommon_t));
[*] ret = uartWrite((uint8_t *)&getNTP, sizeof(protocolCommon_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&getNTP, sizeof(protocolCommon_t));
[*]}
[*]
[*]
[*]/**
[*]* @brief Get Module Info
[*]
[*]*
[*]
[*]* @param none
[*]* @return none
[*]*/
[*]void gizwitsGetModuleInfo(void)
[*]{
[*] int32_t ret = 0;
[*] protocolGetModuleInfo_t getModuleInfo;
[*]
[*] gizProtocolHeadInit((protocolHead_t *)&getModuleInfo);
[*] getModuleInfo.head.cmd = CMD_ASK_MODULE_INFO;
[*] getModuleInfo.head.sn = gizwitsProtocol.sn++;
[*] getModuleInfo.type = 0x0;
[*] getModuleInfo.head.len = exchangeBytes(sizeof(protocolGetModuleInfo_t)-4);
[*] getModuleInfo.sum = gizProtocolSum((uint8_t *)&getModuleInfo, sizeof(protocolGetModuleInfo_t));
[*] ret = uartWrite((uint8_t *)&getModuleInfo, sizeof(protocolGetModuleInfo_t));
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck((uint8_t *)&getModuleInfo, sizeof(protocolGetModuleInfo_t));
[*]}
[*]
[*]
[*]/**
[*]* @brief Module Info Analyse
[*]*
[*]* @param head :
[*]*
[*]* @return 0, Success, , other,Faild
[*]*/
[*]static int8_t gizProtocolModuleInfoHandle(protocolHead_t *head)
[*]{
[*] protocolModuleInfo_t *moduleInfo = (protocolModuleInfo_t *)head;
[*]
[*] if(NULL == head)
[*] {
[*] GIZWITS_LOG("NTP is empty \n");
[*] return -1;
[*] }
[*]
[*] memcpy((uint8_t *)&gizwitsProtocol.wifiModuleNews,(uint8_t *)&moduleInfo->wifiModuleInfo, sizeof(moduleInfo_t));
[*]
[*] gizwitsProtocol.moduleInfoEvent.event = MODULE_INFO;
[*] gizwitsProtocol.moduleInfoEvent.num++;
[*]
[*] gizwitsProtocol.issuedFlag = GET_MODULEINFO_TYPE;
[*]
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief Protocol handling function
[*]
[*]*
[*]
[*]* @param currentData :The protocol data pointer
[*]* @return none
[*]*/
[*]int32_t gizwitsHandle(dataPoint_t *currentData)
[*]{
[*] int8_t ret = 0;
[*]#ifdef PROTOCOL_DEBUG
[*] uint16_t i = 0;
[*]#endif
[*] uint8_t ackData;
[*] uint16_t protocolLen = 0;
[*] uint32_t ackLen = 0;
[*] protocolHead_t *recvHead = NULL;
[*] char *didPtr = NULL;
[*] uint16_t offset = 0;
[*]
[*]
[*] if(NULL == currentData)
[*] {
[*] GIZWITS_LOG("GizwitsHandle Error , Illegal Param\n");
[*] return -1;
[*] }
[*]
[*] /*resend strategy*/
[*] gizProtocolAckHandle();
[*] ret = gizProtocolGetOnePacket(&pRb, gizwitsProtocol.protocolBuf, &protocolLen);
[*]
[*] if(0 == ret)
[*] {
[*] GIZWITS_LOG("Get One Packet!\n");
[*]
[*]#ifdef PROTOCOL_DEBUG
[*] GIZWITS_LOG("WiFi2MCU[%4d:%4d]: ", gizGetTimerCount(), protocolLen);
[*] for(i=0; i<protocolLen;i++)
[*] {
[*] GIZWITS_LOG("%02x ", gizwitsProtocol.protocolBuf);
[*] }
[*] GIZWITS_LOG("\n");
[*]#endif
[*]
[*] recvHead = (protocolHead_t *)gizwitsProtocol.protocolBuf;
[*] switch (recvHead->cmd)
[*] {
[*] case CMD_GET_DEVICE_INTO:
[*] gizProtocolGetDeviceInfo(recvHead);
[*] break;
[*] case CMD_ISSUED_P0:
[*] GIZWITS_LOG("flag %x %x \n", recvHead->flags, recvHead->flags);
[*] //offset = 1;
[*]
[*] if(0 == gizProtocolIssuedProcess(didPtr, gizwitsProtocol.protocolBuf+sizeof(protocolHead_t)+offset, protocolLen-(sizeof(protocolHead_t)+offset+1), ackData, &ackLen))
[*] {
[*] gizProtocolIssuedDataAck(recvHead, ackData, ackLen,recvHead->flags);
[*] GIZWITS_LOG("AckData : \n");
[*] }
[*] break;
[*] case CMD_HEARTBEAT:
[*] gizProtocolCommonAck(recvHead);
[*] break;
[*] case CMD_WIFISTATUS:
[*] gizProtocolCommonAck(recvHead);
[*] gizProtocolModuleStatus((protocolWifiStatus_t *)recvHead);
[*] break;
[*] case ACK_REPORT_P0:
[*] case ACK_WIFI_CONFIG:
[*] case ACK_SET_DEFAULT:
[*] case ACK_NINABLE_MODE:
[*] case ACK_REBOOT_MODULE:
[*] gizProtocolWaitAckCheck(recvHead);
[*] break;
[*] case CMD_MCU_REBOOT:
[*] gizProtocolCommonAck(recvHead);
[*] GIZWITS_LOG("report:MCU reboot!\n");
[*]
[*] gizProtocolReboot();
[*] break;
[*] case CMD_ERROR_PACKAGE:
[*] break;
[*] case ACK_PRODUCTION_TEST:
[*] gizProtocolWaitAckCheck(recvHead);
[*] GIZWITS_LOG("Ack PRODUCTION_MODE success \n");
[*] break;
[*] case ACK_GET_NTP:
[*] gizProtocolWaitAckCheck(recvHead);
[*] gizProtocolNTP(recvHead);
[*] GIZWITS_LOG("Ack GET_UTT success \n");
[*] break;
[*] case ACK_ASK_MODULE_INFO:
[*] gizProtocolWaitAckCheck(recvHead);
[*] gizProtocolModuleInfoHandle(recvHead);
[*] GIZWITS_LOG("Ack GET_Module success \n");
[*] break;
[*]
[*] default:
[*] gizProtocolErrorCmd(recvHead,ERROR_CMD);
[*] GIZWITS_LOG("ERR: cmd code error!\n");
[*] break;
[*] }
[*] }
[*] else if(-2 == ret)
[*] {
[*] //Check failed, report exception
[*] recvHead = (protocolHead_t *)gizwitsProtocol.protocolBuf;
[*] gizProtocolErrorCmd(recvHead,ERROR_ACK_SUM);
[*] GIZWITS_LOG("ERR: check sum error!\n");
[*] return -2;
[*] }
[*]
[*] switch(gizwitsProtocol.issuedFlag)
[*] {
[*] case ACTION_CONTROL_TYPE:
[*] gizwitsProtocol.issuedFlag = STATELESS_TYPE;
[*] gizwitsEventProcess(&gizwitsProtocol.issuedProcessEvent, (uint8_t *)&gizwitsProtocol.gizCurrentDataPoint, sizeof(dataPoint_t));
[*] memset((uint8_t *)&gizwitsProtocol.issuedProcessEvent,0x0,sizeof(gizwitsProtocol.issuedProcessEvent));
[*] break;
[*] case WIFI_STATUS_TYPE:
[*] gizwitsProtocol.issuedFlag = STATELESS_TYPE;
[*] gizwitsEventProcess(&gizwitsProtocol.wifiStatusEvent, (uint8_t *)&gizwitsProtocol.wifiStatusData, sizeof(moduleStatusInfo_t));
[*] memset((uint8_t *)&gizwitsProtocol.wifiStatusEvent,0x0,sizeof(gizwitsProtocol.wifiStatusEvent));
[*] break;
[*] case ACTION_W2D_TRANSPARENT_TYPE:
[*] gizwitsProtocol.issuedFlag = STATELESS_TYPE;
[*] gizwitsEventProcess(&gizwitsProtocol.issuedProcessEvent, (uint8_t *)gizwitsProtocol.transparentBuff, gizwitsProtocol.transparentLen);
[*] break;
[*] case GET_NTP_TYPE:
[*] gizwitsProtocol.issuedFlag = STATELESS_TYPE;
[*] gizwitsEventProcess(&gizwitsProtocol.NTPEvent, (uint8_t *)&gizwitsProtocol.TimeNTP, sizeof(protocolTime_t));
[*] memset((uint8_t *)&gizwitsProtocol.NTPEvent,0x0,sizeof(gizwitsProtocol.NTPEvent));
[*] break;
[*] case GET_MODULEINFO_TYPE:
[*] gizwitsProtocol.issuedFlag = STATELESS_TYPE;
[*] gizwitsEventProcess(&gizwitsProtocol.moduleInfoEvent, (uint8_t *)&gizwitsProtocol.wifiModuleNews, sizeof(moduleInfo_t));
[*] memset((uint8_t *)&gizwitsProtocol.moduleInfoEvent,0x0,sizeof(moduleInfo_t));
[*] break;
[*] default:
[*] break;
[*] }
[*]
[*] gizDevReportPolicy(currentData);
[*]
[*] return 0;
[*]}
[*]
[*]/**
[*]* @brief gizwits report transparent data interface
[*]
[*]* The user can call the interface to complete the reporting of private protocol data
[*]
[*]* @param data :Private protocol data
[*]* @param len:Private protocol data length
[*]* @return 0,success ;other,failure
[*]*/
[*]int32_t gizwitsPassthroughData(uint8_t * gizdata, uint32_t len)
[*]{
[*] int32_t ret = 0;
[*] uint8_t tx_buf;
[*] uint8_t *pTxBuf = tx_buf;
[*] uint16_t data_len = 6+len;
[*] if(NULL == gizdata)
[*] {
[*] GIZWITS_LOG(" gizwitsPassthroughData Error \n");
[*] return (-1);
[*] }
[*]
[*] *pTxBuf ++= 0xFF;
[*] *pTxBuf ++= 0xFF;
[*] *pTxBuf ++= (uint8_t)(data_len>>8);//len
[*] *pTxBuf ++= (uint8_t)(data_len);
[*] *pTxBuf ++= CMD_REPORT_P0;//0x1b cmd
[*] *pTxBuf ++= gizwitsProtocol.sn++;//sn
[*] *pTxBuf ++= 0x00;//flag
[*] *pTxBuf ++= 0x00;//flag
[*] *pTxBuf ++= ACTION_D2W_TRANSPARENT_DATA;//P0_Cmd
[*]
[*] memcpy(&tx_buf,gizdata,len);
[*] tx_buf = gizProtocolSum( tx_buf , (data_len+4));
[*]
[*] ret = uartWrite(tx_buf, data_len+4);
[*] if(ret < 0)
[*] {
[*] GIZWITS_LOG("ERR: uart write error %d \n", ret);
[*] }
[*]
[*] gizProtocolWaitAck(tx_buf, data_len+4);
[*]
[*] return 0;
[*]}
[*]
[*]
[*]void gziwits_Task(dataPoint_t * currentDataPoint)
[*]{
[*] static uint32_t Timer=0;
[*] if(SoftTimer(Timer,5000))
[*] {
[*] gizwitsHandle(currentDataPoint);
[*] Timer=GetSoftTimer();
[*] }
[*]}
[*]
[*]
[*]/**@} */
[*]
[*]
复制代码
修改gizwits_protocol.h
[*]#ifndef _GIZWITS_PROTOCOL_H
[*]#define _GIZWITS_PROTOCOL_H
[*]
[*]#ifdef __cplusplus
[*]extern "C" {
[*]#endif
[*]
[*]#include <stdint.h>
[*]#include <stdbool.h>
[*]#include <stdio.h>
[*]#include <stdlib.h>
[*]#include <string.h>
[*]#include "common.h"
[*]
[*]
[*]#define SEND_MAX_TIME 200 ///< 200ms resend
[*]#define SEND_MAX_NUM 2 ///< resend times
[*]
[*]#define protocol_VERSION "00000004" ///< protocol version
[*]#define P0_VERSION "00000002" ///< P0 protocol version
[*]
[*]/**@name Product Key
[*]* @{
[*]*/
[*]#define PRODUCT_KEY "9c8a5a8e38344fb4af14b6db0f5b1df7"
[*]/**@} */
[*]/**@name Product Secret
[*]* @{
[*]*/
[*]#define PRODUCT_SECRET "45c86d8c6a2a4b1dac7d68df54f6e4f0"
[*]
[*]/**@name Device status data reporting interval
[*]* @{
[*]*/
[*]#define REPORT_TIME_MAX 6000 //6S
[*]/**@} */
[*]
[*]#define CELLNUMMAX 7
[*]
[*]
[*]/**@name Whether the device is in the control class, 0 means no, 1 means yes
[*]* @{
[*]*/
[*]#define DEV_IS_GATEWAY 0
[*]/**@} */
[*]
[*]/**@name Binding time
[*]* @{
[*]*/
[*]#define NINABLETIME0
[*]/**@} */
[*]
[*]
[*]
[*]#define MAX_PACKAGE_LEN (sizeof(devStatus_t)+sizeof(attrFlags_t)+20) ///< Data buffer maximum length
[*]#define RB_MAX_LEN (MAX_PACKAGE_LEN*2) ///< Maximum length of ring buffer
[*]
[*]/**@name Data point related definition
[*]* @{
[*]*/
[*]#define Relay_1_BYTEOFFSET 0
[*]#define Relay_1_BITOFFSET 0
[*]#define Relay_1_LEN 1
[*]
[*]#define Temp_RATIO 1
[*]#define Temp_ADDITION 0
[*]#define Temp_MIN 0
[*]#define Temp_MAX 100
[*]#define Humi_RATIO 1
[*]#define Humi_ADDITION 0
[*]#define Humi_MIN 0
[*]#define Humi_MAX 100
[*]#define Light_Intensity_RATIO 1
[*]#define Light_Intensity_ADDITION 0
[*]#define Light_Intensity_MIN 0
[*]#define Light_Intensity_MAX 100
[*]/**@} */
[*]
[*]/** Writable data points Boolean and enumerated variables occupy byte size */
[*]#define COUNT_W_BIT 1
[*]
[*]
[*]
[*]
[*]
[*]
[*]
[*]/** Event enumeration */
[*]typedef enum
[*]{
[*]WIFI_SOFTAP = 0x00, ///< WiFi SOFTAP configuration event
[*]WIFI_AIRLINK, ///< WiFi module AIRLINK configuration event
[*]WIFI_STATION, ///< WiFi module STATION configuration event
[*]WIFI_OPEN_BINDING, ///< The WiFi module opens the binding event
[*]WIFI_CLOSE_BINDING, ///< The WiFi module closes the binding event
[*]WIFI_CON_ROUTER, ///< The WiFi module is connected to a routing event
[*]WIFI_DISCON_ROUTER, ///< The WiFi module has been disconnected from the routing event
[*]WIFI_CON_M2M, ///< The WiFi module has a server M2M event
[*]WIFI_DISCON_M2M, ///< The WiFi module has been disconnected from the server M2M event
[*]WIFI_OPEN_TESTMODE, ///< The WiFi module turns on the test mode event
[*]WIFI_CLOSE_TESTMODE, ///< The WiFi module turns off the test mode event
[*]WIFI_CON_APP, ///< The WiFi module connects to the APP event
[*]WIFI_DISCON_APP, ///< The WiFi module disconnects the APP event
[*]WIFI_RSSI, ///< WiFi module RSSI event
[*]WIFI_NTP, ///< Network time event
[*]MODULE_INFO, ///< Module information event
[*]TRANSPARENT_DATA, ///< Transparency events
[*]EVENT_Relay_1,
[*]EVENT_TYPE_MAX ///< Enumerate the number of members to calculate (user accidentally deleted)
[*]} EVENT_TYPE_T;
[*]
[*]/** P0 Command code */
[*]typedef enum
[*]{
[*] ACTION_CONTROL_DEVICE = 0x01, ///< Protocol 4.10 WiFi Module Control Device WiFi Module Send
[*] ACTION_READ_DEV_STATUS = 0x02, ///< Protocol 4.8 WiFi Module Reads the current status of the device WiFi module sent
[*] ACTION_READ_DEV_STATUS_ACK= 0x03, ///< Protocol 4.8 WiFi Module Read Device Current Status Device MCU Reply
[*] ACTION_REPORT_DEV_STATUS = 0x04, ///< Protocol 4.9 device MCU to the WiFi module to actively report the current status of the device to send the MCU
[*] ACTION_W2D_TRANSPARENT_DATA = 0x05, ///< WiFi to device MCU transparent
[*] ACTION_D2W_TRANSPARENT_DATA = 0x06, ///< Device MCU to WiFi
[*]} actionType_t;
[*]
[*]/** Protocol network time structure */
[*]typedef struct
[*]{
[*] uint16_t year;
[*] uint8_t month;
[*] uint8_t day;
[*] uint8_t hour;
[*] uint8_t minute;
[*] uint8_t second;
[*] uint32_t ntp;
[*]}protocolTime_t;
[*]
[*]
[*]/** WiFi Module configuration parameters*/
[*]typedef enum
[*]{
[*]WIFI_RESET_MODE = 0x00, ///< WIFI module reset
[*]WIFI_SOFTAP_MODE, ///< WIFI module softAP modeF
[*]WIFI_AIRLINK_MODE, ///< WIFI module AirLink mode
[*]WIFI_PRODUCTION_TEST, ///< MCU request WiFi module into production test mode
[*]WIFI_NINABLE_MODE, ///< MCU request module to enter binding mode
[*]WIFI_REBOOT_MODE, ///< MCU request module reboot
[*]}WIFI_MODE_TYPE_T;
[*]
[*]/** The protocol event type*/
[*]typedef enum
[*]{
[*]STATELESS_TYPE = 0x00, ///< Stateless type
[*]ACTION_CONTROL_TYPE, ///< Protocol 4.10 :WiFi module control device event
[*]WIFI_STATUS_TYPE, ///< Protocol 4.5 :WiFi module inform the device MCU of the change event of the WiFi module status
[*]ACTION_W2D_TRANSPARENT_TYPE, ///< Protocol WiFi to device MCU transparent event
[*]GET_NTP_TYPE, ///< Protocol 4.13 :The MCU requests access to the network time event
[*]GET_MODULEINFO_TYPE, ///< Protocol 4.9 :The MCU get module information event
[*]PROTOCOL_EVENT_TYPE_MAX ///< Count enumerated member (User donot delete)
[*]} PROTOCOL_EVENT_TYPE_T;
[*]
[*]/** Protocol command code */
[*]typedef enum
[*]{
[*] CMD_GET_DEVICE_INTO = 0x01, ///< Protocol:3.1
[*] ACK_GET_DEVICE_INFO = 0x02, ///< Protocol:3.1
[*]
[*] CMD_ISSUED_P0 = 0x03, ///< Protocol:3.2 3.3
[*] ACK_ISSUED_P0 = 0x04, ///< Protocol:3.2 3.3
[*]
[*] CMD_REPORT_P0 = 0x05, ///< Protocol:3.4
[*] ACK_REPORT_P0 = 0x06, ///< Protocol:3.4
[*]
[*] CMD_HEARTBEAT = 0x07, ///< Protocol:3.5
[*] ACK_HEARTBEAT = 0x08, ///< Protocol:3.5
[*]
[*] CMD_WIFI_CONFIG = 0x09, ///< Protocol:3.6
[*] ACK_WIFI_CONFIG = 0x0A, ///< Protocol:3.6
[*]
[*] CMD_SET_DEFAULT = 0x0B, ///< Protocol:3.7
[*] ACK_SET_DEFAULT = 0x0C, ///< Protocol:3.7
[*]
[*] CMD_WIFISTATUS = 0x0D, ///< Protocol:3.8
[*] ACK_WIFISTATUS = 0x0E, ///< Protocol:3.8
[*]
[*] CMD_MCU_REBOOT = 0x0F, ///< Protocol:4.1
[*] ACK_MCU_REBOOT = 0x10, ///< Protocol:4.1
[*]
[*] CMD_ERROR_PACKAGE = 0x11, ///< Protocol:3.9
[*] ACK_ERROR_PACKAGE = 0x12, ///< Protocol:3.9
[*]
[*] CMD_PRODUCTION_TEST = 0x13, ///< Protocol:
[*] ACK_PRODUCTION_TEST = 0x14, ///< Protocol:
[*]
[*] CMD_NINABLE_MODE = 0x15, ///< Protocol:3.10
[*] ACK_NINABLE_MODE = 0x16, ///< Protocol:3.10
[*]
[*] CMD_GET_NTP = 0x17, ///< Protocol:4.3
[*] ACK_GET_NTP = 0x18, ///< Protocol:4.3
[*]
[*]
[*] CMD_ASK_BIGDATA = 0x19, ///< Protocol:4.4
[*] ACK_ASK_BIGDATA = 0x1A, ///< Protocol:4.4
[*]
[*] CMD_BIGDATA_READY = 0x1B, ///< Protocol:4.5
[*] ACK_BIGDATA_READY = 0x1C, ///< Protocol:4.5
[*]
[*] CMD_BIGDATA_SEND = 0x1D, ///< Protocol:4.6
[*] ACK_BIGDATA_SEND = 0x1E, ///< Protocol:4.6
[*]
[*] CMD_S_STOP_BIGDATA_SEND = 0x1F, ///< Protocol:4.7
[*] ACK_S_STOP_BIGDATA_SEND = 0x20, ///< Protocol:4.7
[*]
[*] CMD_D_STOP_BIGDATA_SEND = 0x27, ///< Protocol:4.8
[*] ACK_D_STOP_BIGDATA_SEND = 0x28, ///< Protocol:4.8
[*]
[*] CMD_ASK_MODULE_INFO = 0x21, ///< Protocol:4.9
[*] ACK_ASK_MODULE_INFO = 0x22, ///< Protocol:4.9
[*]
[*] CMD_ASK_AFFAIR_HANDLE = 0x23, ///< Protocol:4.10
[*] ACK_ASK_AFFAIR_HANDLE = 0x24, ///< Protocol:4.10
[*]
[*] CMD_AFFAIR_RESULT = 0x25, ///< Protocol:4.10
[*] ACK_AFFAIR_RESULT = 0x26, ///< Protocol:4.10
[*]
[*] CMD_REBOOT_MODULE = 0x29, ///< Protocol:3.11
[*] ACK_REBOOT_MODULE = 0x2A, ///< Protocol:3.11
[*]
[*] CMD_CONNECT_M2M = 0x2D, ///< Protocol:for Virtualization
[*] ACK_CONNECT_M2M = 0x2E, ///< Protocol:for Virtualization
[*]
[*] CMD_CONNECT_M2M_BACK = 0x2F, ///< Protocol:for Virtualization
[*] ACK_CONNECT_M2M_BACK = 0x30, ///< Protocol:for Virtualization
[*]
[*] CMD_UPLOAD_DATA = 0x31, ///< Protocol:for Virtualization
[*] ACK_UPLOAD_DATA = 0x32, ///< Protocol:for Virtualization
[*]
[*] CMD_UPLOAD_DATA_BACK = 0x33, ///< Protocol:for Virtualization
[*] ACK_UPLOAD_DATA_BACK = 0x34, ///< Protocol:for Virtualization
[*]
[*] CMD_DISCONNECT_M2M = 0x35, ///< Protocol:for Virtualization
[*] ACK_DISCONNECT_M2M = 0x36, ///< Protocol:for Virtualization
[*]
[*] CMD_DISCONNECT_M2M_BACK = 0x37, ///< Protocol:for Virtualization
[*] ACK_DISCONNECT_M2M_BACK = 0x38, ///< Protocol:for Virtualization
[*]
[*] CMD_RESET_SIMULATOR = 0x39, ///< Protocol:for Virtualization
[*] ACK_RESET_SIMULATOR = 0x3A, ///< Protocol:for Virtualization
[*]
[*] CMD_RESET_SIMULATOR_BACK = 0x3B, ///< Protocol:for Virtualization
[*] ACK_RESET_SIMULATOR_BACK = 0x3C, ///< Protocol:for Virtualization
[*]} PROTOCOL_CMDTYPE;
[*]
[*]/** Illegal message type*/
[*]typedef enum
[*]{
[*] ERROR_ACK_SUM = 0x01, ///< check error
[*] ERROR_CMD = 0x02, ///< Command code error
[*] ERROR_OTHER = 0x03, ///< other
[*]} errorPacketsType_t;
[*]
[*]typedef enum
[*]{
[*] EXE_SUCESS = 0x00,
[*] EXE_FAILE = 0x01,
[*]} execute_result;
[*]
[*]#pragma pack(1)
[*]
[*]/** User Area Device State Structure */
[*]typedef struct {
[*]bool valueRelay_1;
[*]uint32_t valueTemp;
[*]uint32_t valueHumi;
[*]uint32_t valueLight_Intensity;
[*]} dataPoint_t;
[*]
[*]
[*]/** Corresponding to the protocol "4.10 WiFi module control device" in the flag " attr_flags" */
[*]typedef struct {
[*]uint8_t flagRelay_1:1;
[*]} attrFlags_t;
[*]
[*]
[*]/** Corresponding protocol "4.10 WiFi module control device" in the data value "attr_vals" */
[*]
[*]typedef struct {
[*]uint8_t wBitBuf;
[*]} attrVals_t;
[*]
[*]/** The flag "attr_flags (1B)" + data value "P0 protocol area" in the corresponding protocol "4.10 WiFi module control device"attr_vals(6B)" */
[*]typedef struct {
[*] attrFlags_t attrFlags;
[*] attrVals_tattrVals;
[*]}gizwitsIssued_t;
[*]
[*]/** Corresponding protocol "4.9 Device MCU to the WiFi module to actively report the current state" in the device status "dev_status(11B)" */
[*]
[*]typedef struct {
[*]uint8_t wBitBuf;
[*]uint8_t valueTemp;
[*]uint8_t valueHumi;
[*]uint8_t valueLight_Intensity;
[*]} devStatus_t;
[*]
[*]
[*]
[*]/** Event queue structure */
[*]typedef struct {
[*] uint8_t num; ///< Number of queue member
[*] uint8_t event; ///< Queue member event content
[*]}eventInfo_t;
[*]
[*]
[*]
[*]/** wifiSignal strength structure */
[*]typedef struct {
[*] uint8_t rssi; ///< WIFI signal strength
[*]}moduleStatusInfo_t;
[*]
[*]/** Protocol standard header structure */
[*]typedef struct
[*]{
[*] uint8_t head; ///< The head is 0xFFFF
[*] uint16_t len; ///< From cmd to the end of the entire packet occupied by the number of bytes
[*] uint8_t cmd; ///< command
[*] uint8_t sn; ///<
[*] uint8_t flags; ///< flag,default is 0
[*]} protocolHead_t;
[*]
[*]/** 4.1 WiFi module requests the device information protocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t protocolVer; ///< Protocol version
[*] uint8_t p0Ver; ///< p0 Protocol version
[*] uint8_t hardVer; ///< Hardware version
[*] uint8_t softVer; ///< Software version
[*] uint8_t productKey; ///< Product key
[*] uint16_t ninableTime; ///< Binding time(second)
[*] uint8_t devAttr; ///< Device attribute
[*] uint8_t productSecret; ///< Product secret
[*] uint8_t sum; ///< checksum
[*]} protocolDeviceInfo_t;
[*]
[*]/** Protocol common data frame(4.2、4.4、4.6、4.9、4.10) protocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t sum; ///< checksum
[*]} protocolCommon_t;
[*]
[*]/** 4.3 The device MCU informs the WiFi module of the configuration modeprotocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t cfgMode; ///< Configuration parameters
[*] uint8_t sum; ///< checksum
[*]} protocolCfgMode_t;
[*]
[*]/** 4.13 The MCU requests the network timeprotocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t time; ///< Hardware version
[*] uint8_t ntp_time; ///< Software version
[*] uint8_t sum; ///< checksum
[*]} protocolUTT_t;
[*]
[*]/** WiFi module working status*/
[*]typedef union
[*]{
[*] uint16_t value;
[*] struct
[*] {
[*] uint16_t softap:1;
[*] uint16_t station:1;
[*] uint16_t onboarding:1;
[*] uint16_t binding:1;
[*] uint16_t con_route:1;
[*] uint16_t con_m2m:1;
[*] uint16_t reserve1:2;
[*] uint16_t rssi:3;
[*] uint16_t app:1;
[*] uint16_t test:1;
[*] uint16_t reserve2:3;
[*] }types;
[*]
[*]} wifiStatus_t;
[*]
[*]/** WiFi status type :protocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] wifiStatus_t ststus; ///< WIFI status
[*] uint8_t sum; ///< checksum
[*]} protocolWifiStatus_t;
[*]
[*]/** Protocol common data frame(4.9) :protocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t type; ///< Information Type
[*] uint8_t sum; ///< checksum
[*]} protocolGetModuleInfo_t;
[*]
[*]typedef struct
[*]{
[*] uint8_t moduleType; ///< Information Type
[*] uint8_t serialVer; ///< Serial port protocol version
[*] uint8_t hardVer; ///< Hardware version
[*] uint8_t softVer; ///< Software version
[*] uint8_t mac; ///< mac
[*] uint8_t ip; ///< ip
[*] uint8_t devAttr; ///< Device attribute
[*]} moduleInfo_t;
[*]
[*]/** Protocol common data frame(4.9) :protocol structure */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] moduleInfo_t wifiModuleInfo; ///< WIFI module information
[*] uint8_t sum; ///< checksum
[*]} protocolModuleInfo_t;
[*]
[*]
[*]/** GPRS information of base station */
[*]typedef struct
[*]{
[*] uint16_t LAC_ID; ///<LAC area ID
[*] uint16_t CellID; ///<Base station ID
[*] uint8_t RSSI; ///<Signal strength of base station
[*]} gprsCellInfo_t;
[*]
[*]
[*]/** 3.19 The basic information of the GPRS communication module*/
[*]typedef struct
[*]{
[*] uint8_t Type;//2G/3g/4g
[*] uint8_t Pro_ver;//Universal serial port protocol version
[*] uint8_t Hard_ver;//Hardware version
[*] uint8_t Soft_ver;//Software version
[*] uint8_t Device_attribute;//Device attribute
[*] uint8_t IMEI;//string
[*] uint8_t IMSI;//string
[*] uint8_t MCC;//Mobile country code
[*] uint8_t MNC;//Mobile network code
[*] uint8_t CellNum;//Number of base station
[*] uint8_t CellInfoLen;//Information length of base station
[*] gprsCellInfo_t GPRS_CellINFO;
[*]}gprsInfo_t;
[*]
[*]/** 4.7 Illegal message notification :protocol structure*/
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t error; ///< error value
[*] uint8_t sum; ///< checksum
[*]} protocolErrorType_t;
[*]
[*]
[*]/** P0 message header */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol standard header structure
[*] uint8_t action; ///< p0 command
[*]} protocolP0Head_t;
[*]
[*]
[*]/** protocol “4.9 The device MCU reports the current status to the WiFi module” device status "dev_status(11B)"*/
[*]typedef struct {
[*]
[*] devStatus_t devStatus; ///< Stores the device status data
[*]}gizwitsReport_t;
[*]
[*]/** resend strategy structure */
[*]typedef struct {
[*] uint8_t num; ///< resend times
[*] uint8_t flag; ///< 1,Indicates that there is a need to wait for the ACK;0,Indicates that there is no need to wait for the ACK
[*] uint8_t buf; ///< resend data buffer
[*] uint16_t dataLen; ///< resend data length
[*] uint32_t sendTime; ///< resend time
[*]} protocolWaitAck_t;
[*]
[*]/** 4.8 WiFi read device datapoint value , device ack use this struct */
[*]typedef struct
[*]{
[*] protocolHead_t head; ///< Protocol head
[*] uint8_t action; ///< p0 action
[*] gizwitsReport_t reportData; ///< p0 data
[*] uint8_t sum; ///< Checksum
[*]} protocolReport_t;
[*]
[*]
[*]/** Protocol main and very important struct */
[*]typedef struct
[*]{
[*] uint8_t issuedFlag; ///< P0 action type
[*] uint8_t protocolBuf; ///< Protocol data handle buffer
[*] uint8_t transparentBuff; ///< Transparent data storage area
[*] uint32_t transparentLen; ///< Transmission data length
[*]
[*] uint32_t sn; ///< Message SN
[*] uint32_t timerMsCount; ///< Timer Count
[*] protocolWaitAck_t waitAck; ///< Protocol wait ACK data structure
[*]
[*] eventInfo_t issuedProcessEvent; ///< Control events
[*] eventInfo_t wifiStatusEvent; ///< WIFI Status events
[*] eventInfo_t NTPEvent; ///< NTP events
[*] eventInfo_t moduleInfoEvent; ///< Module Info events
[*]
[*] gizwitsReport_t reportData; ///< The protocol reports data for standard product
[*] dataPoint_t gizCurrentDataPoint; ///< Current device datapoints status
[*] dataPoint_t gizLastDataPoint; ///< Last device datapoints status
[*] moduleStatusInfo_t wifiStatusData; ///< WIFI signal intensity
[*] protocolTime_t TimeNTP; ///< Network time information
[*]#if MODULE_TYPE
[*] gprsInfo_t gprsInfoNews;
[*]#else
[*] moduleInfo_twifiModuleNews; ///< WIFI module Info
[*]#endif
[*]
[*]
[*]}gizwitsProtocol_t;
[*]
[*]#pragma pack()
[*]
[*]/**@name Gizwits user API interface
[*]* @{
[*]*/
[*]
[*]extern uint32_t gizGetTimerCount(void);
[*]
[*]void gizwitsInit(void);
[*]int32_t gizwitsSetMode(uint8_t mode);
[*]void gizwitsGetNTP(void);
[*]int32_t gizwitsHandle(dataPoint_t *currentData);
[*]int32_t gizwitsPassthroughData(uint8_t * gizdata, uint32_t len);
[*]void gizwitsGetModuleInfo(void);
[*]int32_t gizPutData(uint8_t *buf, uint32_t len);
[*]
[*]
[*]/*添加用户自定义的函数**/
[*]void gziwits_Task(dataPoint_t * currentDataPoint);
[*]
[*]/**@} */
[*]#ifdef __cplusplus
[*]}
[*]#endif
[*]
[*]#endif
[*]
[*]
复制代码
6,Utils直接移植无需修改
https://club.gizwits.com/data/attachment/forum/202207/25/155201gd0lopzk1vbwr9gb.png.thumb.jpg
7,添加TIM3定时器代码驱动
[*]#include "tim3.h"
[*]#include "gizwits_product.h"
[*]
[*]void TIM3_Config(uint16_t psc,uint16_t arr)
[*]{
[*] RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
[*]
[*] TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
[*] TIM_TimeBaseStructure.TIM_Period = arr;
[*] TIM_TimeBaseStructure.TIM_Prescaler = psc;
[*] TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
[*] TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
[*] TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
[*]
[*] TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );
[*]
[*]NVIC_InitTypeDef NVIC_InitStructure;
[*] NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
[*] NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
[*] NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
[*] NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
[*] NVIC_Init(&NVIC_InitStructure);
[*] TIM_Cmd(TIM3, ENABLE);
[*]}
[*]/*用户实现的定时器接口*/
[*]void TIM3_IRQHandler(void)
[*]{
[*] if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
[*] {
[*] TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
[*] gizTimerMs();
[*] }
[*]}
[*]/*******************/
[*]//void TIMER_IRQ_FUN(void)
[*]//{
[*]//gizTimerMs();
[*]//}
[*]/*******************/
[*]
[*]
[*]## 添加UART3串口通信代码驱动
[*]
[*]```c
[*]#include "usart3.h"
[*]#include "gizwits_product.h"
[*]
[*]void USART3_Init(uint32_t BaudRate)
[*]{
[*] RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //GPIOB时钟
[*] RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
[*]
[*] USART_DeInit(USART3);//复位串口3
[*] GPIO_InitTypeDef GPIO_InitStructure;
[*]
[*]
[*]GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
[*] GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //USART3_TX PB10
[*] GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
[*] GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
[*]
[*]
[*] GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //USART3_RX PB11
[*] GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
[*] GPIO_Init(GPIOB, &GPIO_InitStructure);
[*]
[*] USART_InitTypeDef USART_InitStructure;
[*] USART_InitStructure.USART_BaudRate = BaudRate; //波特率一般设置为9600;
[*] USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
[*] USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
[*] USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
[*] USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
[*] USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
[*]
[*] USART_Init(USART3, &USART_InitStructure); //初始化串口3
[*]
[*]
[*] USART_Cmd(USART3, ENABLE); //使能串口
[*]
[*]
[*]USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开启中断
[*]
[*]NVIC_InitTypeDef NVIC_InitStructure;
[*] NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
[*] NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
[*] NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
[*] NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
[*] NVIC_Init(&NVIC_InitStructure);
[*]
[*]}
[*]/*用户实现的中断服务函数接口*/
[*]void USART3_IRQHandler(void)
[*]{
[*] uint8_t Recv_Data;
[*] if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
[*] {
[*] Recv_Data = USART_ReceiveData(USART3);
[*] gizPutData(&Recv_Data, 1);
[*] }
[*]}
[*]/*********************/
[*]//void UART_IRQ_FUN(void)
[*]//{
[*]//uint8_t value = 0;
[*]//gizPutData(&value, 1);
[*]//}
[*]/*********************/
[*]
复制代码
8,修改关键函数的函数体,封装各模块的初始化
五,机智云初始化函数封装
成功联网
https://club.gizwits.com/data/attachment/forum/202207/25/155338jp3khqklkkvuhm2t.png.thumb.jpg
设备上线显示
https://club.gizwits.com/data/attachment/forum/202207/25/155352u6624f767zv44www.png.thumb.jpg
效果展示
https://club.gizwits.com/data/attachment/forum/202207/25/155430q5j8jbvi13e3788b.png.thumb.jpg
页:
[1]