组保留的标签 余下为需要删除的标签
unset($oldtag[$key]);
}
}
}
if (!empty($oldtag)) {
$tagids = array();
foreach ($oldtag as $tagid => $tagname) {
$tagids[] = $tagid;
}
well_oldtag_delete($tagids, $tid);
}
$r = well_tag_process($tid, $fid, $create_tag, $tagarr);
return $r;
}
// 删除标签和绑定的主题
function well_oldtag_delete($tagids, $tid)
{
$pagesize = count($tagids);
$arrlist = well_tag_find_by_tagids($tagids, 1, $pagesize);
$delete_tagids = array(); // 删除
$tagids = array();
$n = 0;
foreach ($arrlist as $val) {
++$n;
if (1 == $val['count']) {
// 只有一个主题
$delete_tagids[] = $val['tagid'];
} else {
$tagids[] = $val['tagid'];
}
}
!empty($delete_tagids) and well_tag_delete($delete_tagids);
$arlist = well_tag_thread_find_by_tid($tid, 1, $n);
if ($arlist) {
$ids = array();
foreach ($arlist as $val) $ids[] = $val['id'];
well_tag_thread_delete($ids);
}
!empty($tagids) and well_tag_update($tagids, array('count-' => 1));
}
// 标签数据处理 $arr=新提交的数组 $tagarr=保留的旧标签
function well_tag_process($tid, $fid, $new_tags = array(), $tagarr = array())
{
if (empty($tid)) return '';
// 新标签处理入库
if ($new_tags) {
$threadarr = array();
$tagids = array();
$i = 0;
$size = 5;
$n = count($tagarr);
$n = $n > $size ? $size : $size - $n;
foreach ($new_tags as $name) {
++$i;
$name = trim($name);
$name = stripslashes($name);
$name = strip_tags($name);
$name = str_replace(array(' ', '#', "@", "$", "%", "^", '&', '·', '<', '>', ';', '`', '~', '!', '¥', '……', ';', '?', '?', '-', '—', '_', '=', '+', '.', '{', '}', '|', ':', ':', '、', '/', '。', '[', ']', '【', '】', '‘', ' ', ' ', ' ', ' ', ' '), '', $name);
$name = htmlspecialchars($name, ENT_QUOTES);
if ($name && $i <= $n) {
// 查询标签
$read = well_tag_read_name($name);
if ($read) {
// 存在 count+1
$tagids[] = $read['tagid'];
} else {
// 入库
$arr = array('name' => $name, 'count' => 1);
$tagid = well_tag_create($arr);
FALSE === $tagid and message(-1, lang('create_failed'));
$read = array('tagid' => $tagid, 'name' => $name);
}
$tag_thread = array('tagid' => $read['tagid'], 'tid' => $tid);
$threadarr[] = $tag_thread;
$tagarr[$read['tagid']] = $read['name'];
}
}
!empty($threadarr) and tag_thread_big_insert($threadarr);
!empty($tagids) and well_tag_update($tagids, array('count+' => 1));
}
$json = empty($tagarr) ? '' : xn_json_encode($tagarr);
return $json;
}
?>
TR-软件玩家 - 软件改变生活!
TR
TR-069是由DSL论坛(www.dslforum.org)所开发的技术规范之一,其全称为“CPE广域网管理协议”。它提供了对下一代网络中家庭网络设备进行管理配置的通用框架和协议,用于从网络侧对家庭网络中的网关、路由器、机顶盒等设备进行远程集中管理。
这些设备不论是在最开始安装的时候还是在后期运行中的业务配置变更或是出现故障需要维护的时候,都需要通过管理接口对设备进行配置或是诊断。现阶段的设备大都提供在LAN侧的管理配置接口和界面,因此传统的做法是运营商的维护人员上门进行安装或调试设备,通过LAN侧管理接口做一些设备配置或故障诊断的工作。但是,这种一对一的人工服务方式显然运行效率不高而且需要花费大量的人力。随着运营商 家庭网络业务的开展,将会有大量的设备需要安置在用户家中,采用过去人工方式对这些设备进行维护和管理将会成为一个巨大的负担。
TR-069的出现正是为了解决这样一个服务难题,在TR-069所定义的框架中,主要包括两类逻辑设备:受管理的用户设备和管理服务器(ACS)。在家庭网络环境下,需要从网络侧进行配置和管理的设备,一般都是与运营商业务直接相关的设备,比如 家庭网关、机顶盒、IP电话终端等。而所有与用户设备相关的配置、诊断、升级等工作均由统一的管理服务器ACS来完成。
TR-069协议和规程
TR-069协议的基本思路是利用了在新一代Web服务中广泛使用的基于SOAP的RPC方法。其会话协议使用的是HTTP1.1协议,因此TR-069可以方便地使用在Web中使用的传送层安全技术,比如SSL/TLS。
TR-069协议栈的下面几层充分利用了现在Internet上广泛使用的 通信协议,比如TCP、HTTP、SOAP等。通过这些成熟的协议,ACS和用户设备之间可以方便地建立通信的基本通道。TR-069在SOAP之上定义了用于配置、查询、诊断等操作的特定的RPC方法,通信的两端(ACS和用户设备)都可以通过RPC调用来完成某个特定功能的执行和得到返回的结果。
用户设备和ACS之间的通信分为ACS发现阶段和连接建立阶段。在ACS发现阶段,用户设备需要得知ACS的URL或地址,这些信息可以是预配置在用户设备中的,也可以通过DHCP的选项来传送给用户设备。一旦用户设备得到ACS的URL或地址,用户设备可以在任何时候发起对ACS的连接。
在连接过程中,用户设备作为HTTP的客户端,其SOAP请求通过HTTPPOST发送给ACS;而ACS作为HTTP的服务端,其SOAP请求通过HTTPResponse发送给用户设备。在每一个HTTP请求中可以包含多个SOAP请求或响应。为了确保管理配置系统的安全,TR-069建议使用SSL/TLS对用户设备进行认证。如果不使用SSL/TLS,也应使用HTTP1.1中定义的认证方式对用户设备进行认证。
除了上面提到的方式,TR-069还明确了ACS可以向用户设备发起连接请求的规定,用于完成网络侧发起的异步配置动作等。
本文标签:
TR
发表评论