XFS5152ce语音识别:
其是将一些特定的语言固定在芯片,然后我们只需要发送:
0XFD 0X00 0X01 0X10 //开启发送0x10,停止第4位发送0x1F
XFS5152ce就会自动识别匹配内部存在的语言,若有则返回识别的ID号:
0xFC [(0Xxx) (0Xxx)数据区长度] [0x01 识别ID号(0xXX)数据区]
XFS5152ce语音合成播报:
void XFS_FrameInfo(char *HZdata)
{
/****************需要发送的文本**********************************/
unsigned char Frame_Info[50]; //定义文本长度 xdata
unsigned int HZ_Length;
// unsigned int i=0;
HZ_Length =strlen(HZdata); //需要发送的文本长度
/*****************Ö¡¹Ì¶¨ÅäÖÃÐÅÏ¢**************************************/
Frame_Info[0] = 0xFD ; //帧头FD
Frame_Info[1] = 0x00 ; //数据区长度高字节
Frame_Info[2] = HZ_Length+2; //数据区长度低字节
Frame_Info[3] = 0x01 ; //命令字
Frame_Info[4] = 0x01; //文本编码格式
/*******************发送帧信息***************************************/
memcpy(&Frame_Info[5], HZdata, HZ_Length);
PrintCom(Frame_Info,5+HZ_Length); //发送帧数据
}
串口发送长串数据:
void PrintCom(uint8_t *DAT,uint8_t len)
{
uint8_t i;
for(i=0;i<len;i++)
{
USART_SendData(USART3,*DAT++);
while(USART_GetFlagStatus(USART3, USART_FLAG_TC)==RESET);
}
}
新大陆平台数据上传与解析:
解析平台数据做相应的任务:
先判断命令请求,再判断控制号,得到是控制台,解析控制台下发的数据,再执行任务,完成任务后,响应服务器
if(strstr((const char *)RxBuf, (const char *)"\"t\":5") != NULL)//是否为命令请求
{
if(strstr((const char *)RxBuf, (const char *)"\"apitag\":\"bool_work\"") != NULL)
//读取控制号对应为在平台上添加传感器时的标识名
{
if((strstr((const char *)RxBuf, (const char *)"\"data\":1") != NULL))//读取数据
{
//对应任务函数调用
duty();
//命令响应告诉服务器是否处理成功 status为0成功1失败
cmdid = USER_GetJsonValue((char *)RxBuf, (char *)"cmdid");
sprintf((char *)TxetBuf,"{\"t\":6,\"cmdid\":%s,\"status\":0,\"data\":1}",cmdid);
if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
{
printf("上传失败");
}
}
}
}
上传数据到新大陆平台:
先将数据上传到服务器,如果发送成功,则等待服务器响应,判断是否响应成功,如果响应成功,则上传成功。
并且上传的格式有三种:
总格式:
{
"t": 3, //固体数字3,代表数据上报
"datatype":1 //具体为datas属性内的 传感数据格式类型,如下
//= 1:JSON格式1字符串;
//= 2:JSON格式2字符串;
//= 3:JSON格式3字符串;
"datas": //有三种
"msgid": 123 //消息编号由客户端生成的一个用于表示该条报文的编号,用于服务器下发“上报响应”时原
//样带回
}
该属性根据datatype类型的不同,可以上报多个传感器数据,也可以上报同一传感器的多条数据,其中
apitag1为传感的标识名,value为传感值,可以是数字、浮点、字符串等
数据类型为1(JSON格式1字符串):
"datas":
{
"apitag1": "value1",
"apitag2": value2,
…
}
数据类型为2(JSON格式2字符串):
apitag1与value数据格式同上,datetime1须是yyyy-mm-dd hh:mm:ss格式
"datas":
{
"apitag1":{"datetime1":"value1"},
"apitag2": {"datetime2":"value2"},
…
}
数据类型为3(JSON格式3字符串)示例:
value数据格式同上,
dt须是yyyy-mm-dd hh:mm:ss格式
"datas":
[
{
"apitag":"temperature",
"datapoints":
[
{
"dt":"2018-01-22 22:22:22", //可选
"value": 36.5 //数字浮点字符串
}
]
},
{
"apitag": "location",
"datapoints":
[…]
},
{ … }
]
int8_t ESP8266_SendSensor(char *SensorTag, char *TimeStr, uint16_t sensor)
{
uint8_t TryGo = 0;
int8_t error = 0;
uint8_t TxetBuf[MAX_AT_TX_LEN];
memset(TxetBuf,0x00,MAX_AT_TX_LEN);//清空缓存
sprintf((char *)TxetBuf,"{\"t\":3,\"datatype\":2,\"datas\":{\"%s\":{\"%s\":%d}},\"msgid\":001}",SensorTag, TimeStr, sensor);
if(ESP8266_IpSend((char *)TxetBuf, strlen((char *)TxetBuf)) < 0)
{//发送失败
error=-1;
}
else
{ //发送成功
for(TryGo = 0; TryGo<50; TryGo++)//最多等待50*10=500ms
{
if(strstr((const char *)AT_RX_BUF, (const char *)"\"status\":0") == NULL)//检查响应状态是否为成功;
{
error = -1;
}
else
{
error = 0;
break;
}
delay_ms(10);
}
}
ClrAtRxBuf(); //清空缓存区
return error;
}
在这中间其中有几个函数值得关注如:
memset(TxetBuf,0x00,MAX_AT_TX_LEN);//清空缓存
sprintf((char *)TxetBuf,"{\"t\":6,\"cmdid\":%s,\"status\":0,\"data\":1}",cmdid);
strstr((const char *)RxBuf, (const char *)"\"t\":5")