[Zigbee] 基于zigbee命令解释器实现

[复制链接]
1344|26
 楼主| qcliu 发表于 2020-2-2 10:53 | 显示全部楼层 |阅读模式
zigbee的参数比较多例如panid、channel等参数需要配置,第一种是通过在代码的配置文件里写好,第二种就是通过串口发送命令实现参数配置,类似玉AT指令。然后从网上参考了他人的例子,以及自己实际情况修改。上篇**是实现的是将串口数据提取出来保存到nv数据库。接下来实现命令方式。

首先定义一个结构体,其作用是包含一个命令的信息
typedef struct {
                                char  const *cmd_name;//命令名称
                                char max_args;//最大参数数目
                                void (*handle)(void * cmd_arg);//命令回调函数
                                //char *help;//帮助信息(根据需要添加)
}cmd_list_struct;


再定义一个结构体,其作用是将接收到的命令解析出来存入的地方
typedef struct{
                                char processed_buf[CMD_BUF_LEN];//储存加工后的命令
                                uint8 cmd_arg[ARG_NUM];//保存命令的参数
}cmd_analyze_struct;


结构体定义
cmd_list_struct cmd_list[]={
               {"panid",0,Panid_get},
                {"cpanid",1,Panid_changle},
                {"channel",0,Channel_get},
                {"cchannel",1,Channel_changel},
               {"rset",0,rset},
};



cmd_analyze_struct cmd_analyze;
char cmd_arg_analyze(char *rec_buf,int len);//将接收到数据做处理,提取出命令及参数
void Cmd_Analyze(void);//匹配命令,如果是该命令,将调用其回调函数 void Panid_get(void *cmd_arg); void Panid_changle(void *cmd_arg); void Channel_get(void *cmd_arg); void Channel_changel(void *cmd_arg); void rset(void *cmd_arg);


 楼主| qcliu 发表于 2020-2-2 10:53 | 显示全部楼层
好,接下来是命令的分析
char cmd_arg_analyze(char *rec_buf, int len)  
{  
   char i;  
   char blank_space_flag=0;    //空格标志  
   char arg_num=0;             //参数数目  
   char index[ARG_NUM];        //有效参数首个数字的数组索引  
   char cunt=0;
   char cunt1=0;
    /*先做一遍分析,找出参数的数目,以及参数段的首个数字所在rec_buf数组中的下标*/  
    for(i=0;i<len;i++)  
    {  
       if(rec_buf[i]==0x20)        //为空格  
       {  
           blank_space_flag=1;               
           continue;  
       }  
        else if(rec_buf[i]==0x00 ||rec_buf[i]==0x21)   //结束符
       {
           blank_space_flag=0;
           break;  
       }  
       else  
       {  
           if(blank_space_flag==1)  
           {  

                if(arg_num < ARG_NUM)  
                {  
                  cmd_analyze.cmd_arg[cunt++] = rec_buf[i];//将参数提取出出来保存到结构体中
                }  
                else  
                {  
                    return -1;      //参数个数太多  
                }  
           }
           if(blank_space_flag == 0)
          {
                cmd_analyze.processed_buf[cunt1++]=rec_buf[i+1];//将命令提取出来保存在结构体中
          }
       }  
    }
          return arg_num;
}



 楼主| qcliu 发表于 2020-2-2 10:54 | 显示全部楼层
现在是实现命令的匹配

void Cmd_Analyze(void)
{       
        char i;
                        for(i=0;i<sizeof(cmd_list)/sizeof(cmd_list[0]);i++)
                                {
                                        if(!strncmp(cmd_analyze.processed_buf,cmd_list.cmd_name,strlen(cmd_list.cmd_name)))
                                                {
                                                        cmd_list.handle((void *)cmd_analyze.cmd_arg);
                                        }
                        }              
}


基本一个命令解释器就这样实现,摆脱if else

gwsan 发表于 2020-3-1 10:10 | 显示全部楼层
非常感谢楼主分享
kxsi 发表于 2020-3-1 10:14 | 显示全部楼层
非常感谢楼主分享
nawu 发表于 2020-3-1 10:52 | 显示全部楼层
非常感谢楼主分享
tfqi 发表于 2020-3-1 10:59 | 显示全部楼层
非常感谢楼主分享
10299823 发表于 2020-3-6 16:09 | 显示全部楼层
如何由协调器向终端采集节点发送命令呢?
jimmhu 发表于 2020-3-6 16:09 | 显示全部楼层
zigbee读属性的命令也是由zcl相关的任务处理吗
lihuami 发表于 2020-3-6 16:09 | 显示全部楼层
ZigBee模块的AT指令都一样吗?
xiaoyaozt 发表于 2020-3-6 16:10 | 显示全部楼层
协议指令集和协议栈模板有什么关系
uptown 发表于 2020-3-6 16:10 | 显示全部楼层
zigbee的节点接收到指令后,怎么传
cehuafan 发表于 2020-3-6 16:10 | 显示全部楼层
Zigbee的Zstack2007如何软件复位?
usysm 发表于 2020-3-6 16:10 | 显示全部楼层
zigbee通过网关就可以实现云端互联互通。
jkl21 发表于 2020-3-6 16:11 | 显示全部楼层
如何提高cc2530每条指令的执行速度?
wwppd 发表于 2020-3-6 16:11 | 显示全部楼层
zigbee节点地址怎么确定?  
maqianqu 发表于 2020-3-6 16:11 | 显示全部楼层
zigbee转串口设备协议栈的开发难度如何?
usysm 发表于 2020-3-6 16:11 | 显示全部楼层
在ZIGBEE中如何通过串口来设置节点的逻辑类型
10299823 发表于 2020-3-6 16:11 | 显示全部楼层
ZigBee可以发广播命令吗?  
cehuafan 发表于 2020-3-6 16:11 | 显示全部楼层
zigbee读属性的命令也是由zcl相关的任务处理吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

3317

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部