0

编辑:我知道,经过一些研究,这个问题是由电话表中的 IMEI 字段引起的,如果我们使用调制解调器池(如带有 16 端口的 wavecome),gammu 只会检测到一个 IMEI

我有 1 个调制解调器与 16 个 sim 卡端口连接,每个配置都连接到我服务器上的同一个数据库,发送和接收短信都像魅力一样工作,每个端口都有 smsd 服务,比如

gammu-smsd -c /etc/gammu-smsdrc-modem1 --pid /var/run/gammu-smsdrc-modem1 --daemon
gammu-smsd -c /etc/gammu-smsdrc-modem2 --pid /var/run/gammu-smsdrc-modem2 --daemon

每个端口都有自己的 PhoneID,例如modem1modem2,问题是为什么 gammu 数据库中的电话表不断用最后运行的 gammu-smsd 服务替换数据?

例如:如果我运行第一个配置,那么电话表将包含所有信息,例如信号,来自第一个端口的 IMEI,但是当我运行来自第一个端口的第二个 gammu-smsd 数据时,将消失,从第二个端口配置更改

这是我来自 modem1 /etc/gammu-smsdrc-modem1 的 smsdrc 配置

[gammu]
port = /dev/ttyUSB0
model =
connection = at115200
synchronizetime = yes
logfile = /var/log/gammu-smsdrc-modem1
logformat = nothing
use_locking =
gammuloc =

[smsd]
service=sql
logfile=/var/log/gammu-smsdrc-modem1
debuglevel=0
Driver=native_mysql
User=root
Password=root
PC=localhost
Database=test
PhoneID=modem1

这是我来自 modem2 /etc/gammu-smsdrc-modem2 的 smsd 配置

[gammu]
port = /dev/ttyUSB1
model =
connection = at115200
synchronizetime = yes
logfile = /var/log/gammu-smsdrc-modem2
logformat = nothing
use_locking =
gammuloc =

[smsd]
service=sql
logfile=/var/log/gammu-smsdrc-modem2
debuglevel=0
Driver=native_mysql
User=root
Password=root
PC=localhost
Database=test
PhoneID=modem2
4

1 回答 1

-1

在阅读了 gammu 的 API Doc 之后,我明白了,是的,就像第一个一样,因为我使用一个带有 16 端口 sim 卡的调制解调器,gammu 只检测单个 IMEI,即使调制解调器有 16 个端口,快速回答我的问题是没有可配置的文件可以处理这个问题,所以我们必须从smsd/services/sql.c

if (SMSDSQL_option(Config, SQL_QUERY_DELETE_PHONE, "delete_phone",
    "DELETE FROM phones WHERE ", ESCAPE_FIELD("IMEI"), " = %I", NULL) != ERR_NONE) {
    return ERR_UNKNOWN;
}

.......
.......
.......

if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_RECEIVED, "update_received",
    "UPDATE phones SET ",
        ESCAPE_FIELD("Received"), " = ", ESCAPE_FIELD("Received"), " + 1"
        " WHERE ", ESCAPE_FIELD("IMEI"), " = %I", NULL) != ERR_NONE) {
    return ERR_UNKNOWN;
}

最终代码将是

if (SMSDSQL_option(Config, SQL_QUERY_DELETE_PHONE, "delete_phone",
    "DELETE FROM phones WHERE ", ESCAPE_FIELD("ID"), " = %P", NULL) != ERR_NONE) {
    return ERR_UNKNOWN;
}

.......
.......
.......

if (SMSDSQL_option(Config, SQL_QUERY_UPDATE_RECEIVED, "update_received",
    "UPDATE phones SET ",
        ESCAPE_FIELD("Received"), " = ", ESCAPE_FIELD("Received"), " + 1"
        " WHERE ", ESCAPE_FIELD("ID"), " = %P", NULL) != ERR_NONE) {
    return ERR_UNKNOWN;
}

并像往常一样重新编译gammu,并修改电话表以将ID设置为主键,我不是c专家,希望有人可以做出好的改变以获得更好的结果,但对我来说这足以用于临时使用。

于 2017-08-04T21:05:07.263 回答