当前位置: 首页 > 工具软件 > EasyCwmp > 使用案例 >

EasyCwmp分析——Inform

顾宣
2023-12-01

标准规定的Inform时机

按《TR-069_Amendment-6.pdf》的规定,CPE在如下时机都要向ACS发起Inform:

  1. CPE部署后首次连接网络
  2. CPE上电或者恢复出厂
  3. 每个"PeriodicInformInterval"
  4. "ScheduleInform"
  5. 收到ACS的"Connection Request"
  6. ACS的URL修改
  7. 当需要上报的参数变化
  8. 当有"active notification"属性的参数被ACS之外的媒介修改时
  9. 当上传或者下载结束时
  10. 当失败的Session Retry时

EasyCwmp的实现

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();
	}
}

 类似资料: