具有网络功能的嵌入式产品的控制一般是通过发送命令完成的,命令对应的值一般分为单值命令和结构体块数据两类。举例如下:
/*define two commands*/ #define CMDA 0x0f #define CMDB 0x0e /*define a value*/ int a = 0; /*define a struct*/ struct B{ int b; int c; char d[4]; }b; /*send CMDA with a single value*/ send(CMDA, &a, sizeof(int)); /*sendCMDB with struct data*/ send(CMDB, &b, sizeof(struct B));
如果我们要设计一个网页控制系统,需要满足以下需求:
需求1:网页上的控件与设备里面的参数一一对应,无论是单值还是结构体中的成员;
具体情况如下:
/* 假设网页上有一个输入框,它绑定一个命令号,如果该命令号是单值,直接绑定该值; 如果该命令号是个结构体,我们需要寻求一种方法将结构体成员与该网页控件对应,更改该控件的值就可以直接反应到结构体的成员中。 */
在这里,我把我设计的解决方案分享一下。
首先,指定结构体中的成员变量,我采用了类似Xpath的概念,此处我就把它简称为Spath(Struct member path),与Xpath相区别。
那么Spath是怎么样指定结构体中的成员的呢?
以前面结构体B为例,Spath举例如下:
/*represent member b*/ /B/b /*represent member c*/ /B/c /*represent member d*/ /B/d
以/开始紧跟结构体名,直到最终成员结束。
此时,我们可以用cmd和Spath区别开不同的结构体成员了,如果我们将cmd和Spath提交给CGI程序处理,/B/c这个Spath指定了结构体的第二个成员变量,那么我们可以更新或者读取B结构体二进制数据中的对应的值。但是,这一过程是人工去判断的,具体说是CGI编程人员去判断的,那么这个工作量是相当大的,而且如果结构体变化,CGI也会修改并重新编译。一点都不灵活。
为了优化这个过程,使全程自动化,我引入了动态结构体的概念。
什么是动态结构体?
/* 简单点说,动态结构体的成员是在运行时确定的,不是在编译时确定的。我们都知道C/C++结构体都是声明后在编译时内存大小和成员位置就已经确定好了,我们不能在运行时去动态的为结构体添加一个成员,当然开辟一块新内存去操作也是可以做到的,这个办法不在此次讨论之内。我这里说的动态结构体就是可以在运行时增删改查结构体成员。 */
动态结构体的原理是什么?
/*动态结构体的核心是一个hash表,将结构体的成员名字,类型定义到一个配置文件中,我选择的是json格式。 { “B”:[ {"name":"b","type":"int"}, {"name":"c","type":"int"}, {"name":"d","type":"array","subtype":"char","length":4} ] } 注意:这里结构体定义需要按照成员的顺序定义 运行时,程序读取配置,将配置信息存在hash表中,生成结构体,这时解析Spath就可以找到对应成员在结构体中的位置。即使结构体更改,也不用重新编译程序,更改结构体配置文件就可以。 */
相关推荐
本文档详细介绍了嵌入式linux中字符设备的cdev结构体的知识,通俗易懂,适合学习。
网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体网络编程之发送结构体...
Linux运维-嵌入式物联网开发教程-指针管理结构体.mp4
Linux运维-嵌入式物联网开发教程-结构体与指针.mp4
讲解区分结构体与结构体数组:结构体的引出、结构体变量的定义和引用、结构体数组
CSocket 结构体传送网页资料 CSocket 结构体传送网页资料 CSocket 结构体传送网页资料
13 结构体与共同体
C语言结构体与共用体,C语言结构体与共用体的使用方法介绍
1、结构体 2、文件IO 3、进程 作业:1、使用文件IO,实现文件的拷贝 2、分析程序运行结果,并写明原因 int main() { printf("hello world"); int i; for(i = 0; i ; i++) { fork(); } }
重点阐述数据结构: 结构体与链表,深入详解数据结构。
C#实现结构体与数组间的转换,包括:同时支持大小端;支持自定义数据类型;支持数组类型结构体成员,带单元测试
13 结构体与共同体实验
描述:为了解决java与C结构通信过程中结构体解析问题。 主要功能:能友好的用java处理任何发送的C结构体对象,并且能发送java对象转换成C结构体接收的二进制。 功能说明 1、基于spring框架开发 2、对于结构体定义...
c语言结构体与共用体学习教案.pptx
详细介绍c语言结构体与公用体, ppt课件
结构体与链表的课件,供小白使用,其中包括有链表的创建,链表节点的插入,节点的删除,链表的展示。不过其中讲解得有些大概,需要有一定的c语言基础,及对指针有一定的了解。
C语言之结构体详细讲解,电子教程,ppt教程,C语言——结构体
详细解析数组、结构体与指针的区别及用法,适于初学者
结构体与指针
1,结构体。 2,链表。 3,结构体与链表的应用。