内部实现:
init_Parameter通过eCWMP_tINITOBJ构建TR98对象树
cwmp_init_userdata初始化全局参数user_data(含notify链表初始化)
cwmp_webserver_init初始化serverSoap(含服务器端口的初始化,用于反向连接)
子线程cwmp_webclient正向连接发起
主体cwmp_process 监听msgqueue消息队列并处理对应消息,其中最主要的2点:
对于event事件:使用SIGALARM信号(间隔1s)触发MSG_TIMER消息检查全局是否存在event事件,有则发起上报
对于正向回报:在发起正向连接后,使用IO异步(SIGIO + FIOASYNC ioctl)触发MSG_RECV消息实现报文的接收
主线程cwmp_webserver_loop反向连接监听
反向连接通过fget回调函数(cwmp_web_get)设置event事件(6 conn req),上面已经描述cwmp_process逻辑会检查event
其他重要点:
关于debug:需要设置CWMP_FLAG bit 0x1,未设置时将标准输入输出直接重定向到/dev/null,需要重启进程生效
关于反向链接:需要设置CWMP_FLAG2 bit 0x1
支持stun服务器(stun服务器的好处:udp协议轻量级,实现nat穿透)
支持TR181/tr098(181支撑程度有待有待进一步了解)
notify通知实现:
对于设置notify的属性单独保存
被动通知在于每个inform报文都会检查属性关联的value值是否改变做对应处理
主动通知需要外部触发MSG_ACTIVE_NOTIFY消息,内部再检查active属性的value是否改变做对应处理