问候!收到节流错误后需要 Kannel 特定行为:
- 停止发送任何消息 60 秒。
此功能是通过编辑源文件 smsc_smpp.c 实现的:
#define SMPP_THROTTLING_SLEEP_TIME 60
- 超时后,不发送队列中的下一条消息,而是发送收到错误的消息。
也就是说,如果您发送消息“1”、“2”、“3”、“4”、“5”,并在消息“3”上收到节流错误,那么 Kannel 将在超时后发送消息“4”,然后是“5”,然后才是“3”。
收到节流错误后,Kannel 必须发送“3”,然后是“4”,然后是“5”。这样消息“3”在队列的开头出现,而不是在结尾。
谷歌搜索发现了很多类似的问题,但没有有效的解决方案。例如:
该问题已通过以下方式解决:
SMPP 节流错误处理
但是,此更改不会影响多部分消息的各个部分的发送顺序。要解决此问题,您需要通过
sms.c添加sms_priority_compare比较sms.id。将消息分成几部分时,sms_split此 ID 使用uuid_generate(part->sms.id). 最终函数sms_priority_compare如下所示:我在 2016 年 11 月 11 日的回答中的解决方案一直有效,直到出现 Message Queue Full 错误消息。根据 SMS 中心的请求,当收到 MQF 错误时应发送以下消息。
总要求:
解决方案:
SMPP_THROTTLING_SLEEP_TIME正如我在问题中所写,超时持续时间是使用smsc_smpp.csms.c在函数的文件中,sms_priority_compare我们按时间更改顺序。我们还为复合消息添加按 id 排序:改成
默认情况下,Kannel 在出现任何错误时将消息放在队列的末尾。
smsc/smsc_smpp.c为了单独跟踪 TE,我们更改文件中的函数smpp_status_to_smscconn_failure_reason:在
收到 MQF 后,我们更改消息时间。否则,当 TE 收到已收到 MQF 并移动到队列末尾的消息时,它们将被移动到队列的前面。在块
smsc/smsc_smpp.c中函数的文件中,我们更改:handle_pducase submit_sm_resp:在
当我们收到 TE 错误时,我们将消息放在队列的头部。为此,在我们更改
bb_smscconn.c函数的文件中:bb_smscconn_send_failed在
同样,您需要更改功能
handle_split:在