按《TR-069_Amendment-6.pdf》的规定,CPE在如下时机都要向ACS发起Inform:
1.CPE部署后首次连接网络
这种情况跟"2.CPE上电或者恢复出厂"中的"恢复出厂"处理相同
2.CPE上电或者恢复出厂:
CPE上电时,procd以easycwmpd -f --boot启动,inform发"1 BOOT",代码如下:
if (start_event & START_BOOT) {
cwmp_add_event(EVENT_BOOT, NULL, 0, EVENT_BACKUP);
cwmp_add_inform_timer();
}
CPE恢复出厂时,因为/etc/easycwmp/.backup.xml内容为空,所以如下代码会增加"0 BOOTSTRAP"事件,同"1 BOOT"一起Inform。
void backup_check_acs_url(void)
{
mxml_node_t *b;
b = mxmlFindElement(backup_tree, backup_tree, "acs_url", NULL, NULL, MXML_DESCEND);
if (!b || (b->child && b->child->type == MXML_OPAQUE && b->child->value.opaque &&
strcmp(config->acs->url, b->child->value.opaque) != 0)) {
backup_add_acsurl(config->acs->url);
}
}
3.每个"PeriodicInformInterval":
按《TR-069_Amendment-6.pdf》的规定,每个"2 PERIODIC"的发送的时间减去"PeriodicInformTime",必须是"PeriodicInformInterval"整数倍,所以第一个"2 PERIODIC"时间需要通过如下代码计算出来,也导致第一个"2 PERIODIC"和"1 BOOT"的间隔是变化的。
void cwmp_periodic_inform_init(void)
{
uloop_timeout_cancel(&periodic_inform_timer);
if (config->acs->periodic_enable && config->acs->periodic_interval) {
if (config->acs->periodic_time != -1){
log_message(NAME, L_NOTICE, "init periodic inform: reference time = %ld, interval = %d\n", config->acs->periodic_time, config->acs->periodic_interval);
uloop_timeout_set(&periodic_inform_timer, cwmp_periodic_inform_time() * SECDTOMSEC);
}
else {
log_message(NAME, L_NOTICE, "init periodic inform: reference time = n/a, interval = %d\n", config->acs->periodic_interval);
uloop_timeout_set(&periodic_inform_timer, config->acs->periodic_interval * SECDTOMSEC);
}
}
}
后续的"2 PERIODIC"就是每"PeriodicInformInterval"上报一次了,代码如下:
static void cwmp_periodic_inform(struct uloop_timeout *timeout)
{
if (config->acs->periodic_enable && config->acs->periodic_interval) {
uloop_timeout_set(&periodic_inform_timer, config->acs->periodic_interval * SECDTOMSEC);
}
if (config->acs->periodic_enable) {
cwmp_add_event(EVENT_PERIODIC, NULL, 0, EVENT_BACKUP);
cwmp_add_inform_timer();
}
}