由于项目需要,我要用STM32处理手机发去的命令,格式是HTTP的get方法,如下:
192.168.16.160/?control=lamp&led=1&cl=6500&pr=1000&ms=0&al=1&tm=08.15&delay=60&$
就是说要把等于号后面的值都解析出来,在网上没找到比较满意的做法,于是自己写了一个函数来做解析。
/************************************************************
需要解析的url如下:
192.168.16.160/?control=lamp&led=1&cl=6500&pr=1000&ms=0&al=1&tm=08.15&delay=60&$
在代码里面默认已经将其存储在了 net_data.net_buff 里面
************************************************************/
char *get_net_info(char *info_name){
//以一个字段为例 : control=lamp&(整条信息) 输入 control 输出 lamp
char endFlag ='&'; // 整条信息的结束符号
char *startAdd= NULL; // 整条信息的起始地址
char *endAdd= NULL; // 整条信息的结束地址
int offsetLen; // 键的偏移量(control=)
char *conclusionStartAdd= NULL; // 所需信息的起始地址
int conclusionLen; // 所需信息的长度
char conclusion[8]=""; // 函数的返回值
char *conclusion1= NULL; // 辅助的指针
conclusion1=conclusion; // 把返回值的地址给辅助指针
startAdd = strstr((const char*)net_data.net_buff,info_name); // 获得整条信息的起始地址 即c的地址
offsetLen = strlen(info_name)+1; //获得键的偏移量 “control=” 地址增加8
endAdd = strchr(startAdd+offsetLen, endFlag); // 获得整条信息的结束地址 即&的地址
conclusionLen=endAdd-startAdd-offsetLen; //获得所需信息的长度 &的地址-c的地址-键的偏移量=4
conclusionStartAdd=startAdd+offsetLen; //获得所需信息的起始地址 lamp里面l的地址
conclusion1=strncpy(conclusion,conclusionStartAdd,conclusionLen); //获得最终的函数返回值
return conclusion1;
}
//在主函数中调用的时候:
int main(void){
char control_name[8]="";
char *control_name1=NULL;
control_name1=get_net_info("control"); //输入 control
*control_name=*strcpy(control_name,control_name1);
printf("control_name: %s \r\n ",control_name); //输出 lamp
}
本人c语言基础不是太好,对数组和指针的理解也不够,所以用到了 char *conclusion1= NULL; 和 char *control_name1=NULL;这两个辅助的指针来完成这个功能。
比如再写一句
delay_name1=get_net_info("delay");
就能得到delay这个键的值 60