我正在用 Java 编写一个应用程序,该应用程序将有助于使用现成的微 Controller 、传感器和 radio 创建无线传感器网络。每个传感器和 radio 很可能需要唯一的代码。我计划为每个平台创建框架,然后为每个传感器和 radio 编写模块化代码,可以插入这些框架。这将生成一个静态信息库,用于为这些传感器动态生成代码。
我不确定存储和组织这些数据的最佳方式是什么。我开始尝试为每个传感器创建类来封装其独特的属性,但使用对象进行数据存储似乎很奇怪。我觉得 SQL 会矫枉过正,因为数据并没有真正改变,而且我还想将所有内容都保留在版本控制中。我应该只使用平面文件吗? XML?我们非常欢迎任何有关如何构建此项目的建议。
最佳答案
我不会生成源代码,而是使用二进制文件。从概念上讲,就是这样。
如果插入或拔出设备,为什么源代码需要更改?只需编译二进制设备驱动程序库并将它们链接到主应用程序。 有一个汇编器,所以很可能有一个链接器。
如果没有链接器,而您被迫使用单一源文件,那么至少我们可以使用链接器的概念。
链接源代码
为了获得灵感和细节,我会稍微研究一下操作系统设计,了解设备驱动程序和IO设备的概念和网络套接字。我会用它来仔细查看将生成的源代码,以及如果设备发生更改,究竟会发生什么变化,然后修复它,以便尽可能少地(理想情况下无需更改)。
在(可能是嵌入式)系统上运行的应用程序代码应与设备驱动程序分开维护,因此这里是抽象需要开始的地方。它需要重构以将设备的细节抽象成抽象设备类。
所以这是第一步:重构生成的源代码以抽象出设备驱动程序的细节,这样你就有了一个主要的 通过符号调用函数的应用程序。
无论可用设备的数量和类型如何,这都允许主应用程序正常运行。
接下来,我将研究编译器理论,特别是符号解析和静态/动态链接的概念,以及 stub 。由于生成的源代码被重构,因此有一个主应用程序和一个设备驱动程序列表,剩下的就是使设备对应用程序可用。
插图
应用程序可以通过将主应用程序的源代码与设备驱动程序的源代码连接起来,生成要组装的源代码。
它还会提供一个 stub :一个小型库,提供迭代设备和询问它们的类的功能。
然后您的应用程序变得非常简单,在 *NIX 提示符下只需一行即可完成。无需 Java:
cat program stub drivers/foo drivers/bar > generated-source-or-binary
在最简单的形式中,程序
将包含对 stub
中的iterate_devices
标签的调用。
这是源和/或二进制图像的布局:
// application
main() {
for ( device in list_devices() ) {
switch ( device.class ) {
....
}
}
}
// stub
list_devices() {
for ( device = first; device != null; device += *cur )
yield device;
}
first: // drivers follow
// drivers/foo
dev_foo: .long dev_foo_end - . // size
....
dev_foo_end
// drivers/bar
dev_bar: .long dev_bar_end - .
....
dev_bar_end
组织驱动源
这不应该比包含文件的目录更复杂。
一个简单的方法是将它们包含在特定包的 .jar 中。例如,让一个类提供这样的驱动程序源:
package myapp.drivers;
public class DriverSource {
public static InputStream getDriverSource( String identifier ) {
return this.getClass().getClassLoader().getResourceAsStream(
this.getClass().getPackage().getName().replace('.', '/')
+ '/' + identifier + '.source'
);
}
}
需要将驱动源放在 myapp/drivers/{identifier}.source
中。在标准的 eclipse 项目中,您会将文件放在 src/myapp/drivers/
中。使用 Maven,您可以将它们放在 src/main/resources/myapp/drivers/
中。您也可以将它们放在另一个目录中,只要将它们作为资源复制到正确的包目录即可。
上述类还可以作为更复杂存储的基础:您可以查询远程服务并下载源文件,或者查询 SQL 数据库。但资源文件将是一个不错的开始。
关于java - 存储与应用程序捆绑的静态数据的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33458279/