打印
[Zigbee]

基于zigbee命令解释器实现

[复制链接]
803|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 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
5
kxsi| | 2020-3-1 10:14 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
6
nawu| | 2020-3-1 10:52 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
tfqi| | 2020-3-1 10:59 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
8
10299823| | 2020-3-6 16:09 | 只看该作者
如何由协调器向终端采集节点发送命令呢?

使用特权

评论回复
9
jimmhu| | 2020-3-6 16:09 | 只看该作者
zigbee读属性的命令也是由zcl相关的任务处理吗

使用特权

评论回复
10
lihuami| | 2020-3-6 16:09 | 只看该作者
ZigBee模块的AT指令都一样吗?

使用特权

评论回复
11
xiaoyaozt| | 2020-3-6 16:10 | 只看该作者
协议指令集和协议栈模板有什么关系

使用特权

评论回复
12
uptown| | 2020-3-6 16:10 | 只看该作者
zigbee的节点接收到指令后,怎么传

使用特权

评论回复
13
cehuafan| | 2020-3-6 16:10 | 只看该作者
Zigbee的Zstack2007如何软件复位?

使用特权

评论回复
14
usysm| | 2020-3-6 16:10 | 只看该作者
zigbee通过网关就可以实现云端互联互通。

使用特权

评论回复
15
jkl21| | 2020-3-6 16:11 | 只看该作者
如何提高cc2530每条指令的执行速度?

使用特权

评论回复
16
wwppd| | 2020-3-6 16:11 | 只看该作者
zigbee节点地址怎么确定?  

使用特权

评论回复
17
maqianqu| | 2020-3-6 16:11 | 只看该作者
zigbee转串口设备协议栈的开发难度如何?

使用特权

评论回复
18
usysm| | 2020-3-6 16:11 | 只看该作者
在ZIGBEE中如何通过串口来设置节点的逻辑类型

使用特权

评论回复
19
10299823| | 2020-3-6 16:11 | 只看该作者
ZigBee可以发广播命令吗?  

使用特权

评论回复
20
cehuafan| | 2020-3-6 16:11 | 只看该作者
zigbee读属性的命令也是由zcl相关的任务处理吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

3308

帖子

4

粉丝