我的问题很难说,但我试试。
我有一个模块 ztc_config,它从我的网络中的一些传感器读取响应。为了阅读这个响应,我编写了一个 C 类 query.c,它是这样的:
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include "data.h"
#include "modules.h"
void query(hash_t* params) {
record_t* rec;
timestamp_t ts;
timestamp_t rec_ts;
uint32_t sec;
uint32_t usec;
timestamp_t now;
timestamp_t start;
timestamp_t end;
char* startime;
char* endtime;
// Coordinator, opgroup and Opcode specified by the client
uint64_t netid = 0;
uint8_t opcode_group = 0;
uint8_t opcode = 0;
char* par;
now = mdl_now();
/* set the start and end time based on query parameters */
startime = hash_get(params, "start");
if(startime != NULL)
start = mdl_parse_timestr(startime, now);
else
start = now;
endtime = hash_get(params, "end");
if(endtime != NULL)
end = mdl_parse_timestr(endtime, now);
else
end = ~0;
// Network id is required
par = hash_get(params, "netid");
if(par == NULL) {
mdl_print("netid required\n");
exit(1);
}
netid = strtoull(par, NULL, 10);
par = hash_get(params, "opcode_group");
if(par == NULL) {
mdl_print("opcode_group required\n");
exit(1);
}
opcode_group = strtoul(par, NULL, 10);
par = hash_get(params, "opcode");
if(par == NULL) {
mdl_print("opcode required\n");
exit(1);
}
opcode = strtoul(par, NULL, 10);
/* seek in the bytestream */
mdl_seek(start);
while((rec = (record_t* ) mdl_next(&ts)) != NULL) {
uint64_t val;
//float fval;
/* reached end time ? */
if(ts > end) break;
rec_ts = NTOHLL(rec->ts);
sec = TS2SEC(rec_ts);
usec = TS2USEC(rec_ts);
// Only print records with the wanted net and opcodes
if((netid != 0) && (netid != NTOHLL(rec->net_id)))
continue;
if((opcode_group != 0) && (opcode_group != ntohl(rec->opcode_group)))
continue;
if((opcode != 0) && (opcode != ntohl(rec->opcode)))
continue;
val = NTOHLL(rec->payload);
mdl_print("%u %llu %u %u %u %d\n", sec, NTOHLL(rec->net_id), rec->op_code_group, rec->op_code, rec->payloadlength, val);
}
}
例如,当我访问此链接时,我会这样做:
http://localhost:44444/ztc_config?netid=2459546910990453036&opcode_group=164&opcode=224&start=-5m&end=-1s
在页面中,我只看到最后 5 分钟内来自 netid 2459546910990453036 和 opcode_group 164(十六进制 A4)和操作码 224(十六进制 E0)的记录。
但是我的 query.c 类有问题。所以如果我访问这个链接
http://localhost:44444/ztc_config?netid=0&opcode_group=0&opcode=0&start=-5m&end=-1s
我有最后 5 分钟内的所有记录。
但是,如果我更改任何 opcode_group 或 opcode 值,我什么也得不到……
有什么建议么?错误在哪里?
非常感谢。
编辑
我尝试像这样更改两个变量 opcode_group 和 opcode 的名称:
....
uint8_t op_code_group =0;
uint8_t op_code =0;
....
....
op_code_group = strtoul(par, NULL, 10);
....
op_code = strtoul(par, NULL, 10);
这样我写:
if ((op_code_group != 0) && (op_code_group != ntohl(rec->opcode_group))) continue;
if ((op_code != 0) && (op_code != ntohl(rec->opcode))) continue;
这应该是一个过滤器。在另一种情况下,具有相同的变量名称,条件为真,但值始终是初始化值 = 0。或者不是?
这个解决方案无论如何都不起作用...... :(请帮助我!