IM开发者的零基础通信技术入门(十五):理解定位技术,一篇就够

作者:JackJiang2024.09.13 10:13浏览量:33

简介:本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。

【来源申明】本文引用了微信公众号“鲜枣课堂”的《老司机揭秘手机定位技术,这下彻底明白啦!》文章内容。为了更好的内容呈现,下文在引用和收录时内容有改动,转载时请注明原文来源信息,尊重原作者的劳动。

1、系列文章引言

1.1适合谁来阅读?

本系列文章尽量使用最浅显易懂的文字、图片来组织内容,力求通信技术零基础的人群也能看懂。但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获。如果您大学学习过《计算机网络》这门课,那么一定不要错过本系列文章。

特别推荐即时通讯开发者来阅读,因为针对移动弱网的问题,确实可以找到很多有价值的答案。

友情提示:本系列文章可能涉及以下通信技术范畴,如您有兴趣,也可自行系统地学习:

技术交流:

(本文已同步发布于:http://www.52im.net/thread-2428-1-1.html)

1.2本系列文章的初衷

作为即时通讯(IM、消息推送等应用场景)相关技术的开发者人员来说,似乎了解跨专业的通信技术(这是大学通信工程专业类学生的学习内容),有点过于深入和底层了,因为一般来说熟练掌握逻辑层的TCP\IP相关协议、网络编程相关的应用技术就差不多能胜任这方面的本职工作了。

没错,确实是这样。但在开发IM、推送这类应用系统时,尤其在移动网络下,各种弱网问题,让人非常痛苦。

典型的弱网问题,比如:

1)频繁掉线;
2)丢包严重;
3)网络抖动;
4)网络延迟;
……..
那么,针对以上现象,怎么才能有底气的跟老板、客户、产品经理地解释以下问题?

1)导致这些现象的根本原因到底是什么?
2)怎么跟老板解释,要搞定在高铁上用好音视频聊天功能很困难?
3)怎么跟客户解释P2P在3G、4G甚至5G网络下的成功率问题?
4)怎么向客户说明,商场或人多场合下,明明信号很好,但你的APP确用不了?
…….
你说这些都是网络问题,APP代码无能为力。那么,你倒是讲讲到底是什么样的网络问题?能把人讲信服了,就可以甩锅给网络,不然只能是APP代码背锅了。现实吧!

所以,我们还是老老实实花点功夫来研究研究通信技术吧(通信技术直面的是网络通信物理层),至少遇到问题,不说给别人,至少给自已找到一个说的过去的解释。这才是一个优秀程序员的修养!

1.3本系列文章的价值

网上能找到的通信技术资料都太过专业或太不专业,要么都是搞网络工程方面的内行人编写的(内容专业但很枯燥难懂),要么就是外行的IT开发人员写的(很少见,且价值不大,因为不够专业,所以内容并不准确,参考价值很有限)。

既能让外行的普通程序员看懂,还能准确地讲明白通信技术知识,这样的资料简直比找金矿还难。因为普通程序员能接触到的网络编程、网络通信方面的资料多针对数据通信的逻辑层(比如:tcpip、socket等知识范畴),而通信技术涉及的是数据通信的物理层(交换机、路由器、天线、网络制式等),某种意义上来说,这是完全不同的技术方向。

好消息是,经过长时间的资料搜集,终于有了本系列文章,希望能给你带来帮助。

1.4拓展阅读

即时通讯网之前已经整理过《移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》、《移动端IM开发者必读(二):史上最全移动弱网络优化方法总结》、《现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》这几篇初涉通信层的文章,但都因技术广度和深度有限,能带给读者的帮助比较局限。如果您看过这几篇文章,那么一定不要错过本次的《IM开发者的零基础通信技术入门》系列文章。

另外,如果您对最基本的程序员本该掌握的网络编程知识都还不怎么了解的话,建议首先阅读《网络编程懒人入门系列文章》、《脑残式网络编程入门系列》,以及更高深一点的《不为人知的网络编程系列文章》。

1.5番外:通信技术女神镇楼

▲ 史上最高颜值科学杂志封面,人物为 “CDMA之母”——海蒂·拉玛(一个被演艺事业耽误的科学女神)

2、本系列文章目录

《IM开发者的零基础通信技术入门(一):通信交换技术的百年发展史(上)》

《IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)》

《IM开发者的零基础通信技术入门(三):国人通信方式的百年变迁》

《IM开发者的零基础通信技术入门(四):手机的演进,史上最全移动终端发展史》

《IM开发者的零基础通信技术入门(五):1G到5G,30年移动通信技术演进史》

《IM开发者的零基础通信技术入门(六):移动终端的接头人——“基站”技术》

《IM开发者的零基础通信技术入门(七):移动终端的千里马——“电磁波”》

《IM开发者的零基础通信技术入门(八):零基础,史上最强“天线”原理扫盲》

《IM开发者的零基础通信技术入门(九):无线通信网络的中枢——“核心网”》

《IM开发者的零基础通信技术入门(十):零基础,史上最强5G技术扫盲》

《IM开发者的零基础通信技术入门(十一):为什么WiFi信号差?一文即懂!》

《IM开发者的零基础通信技术入门(十二):上网卡顿?网络掉线?一文即懂!》

《IM开发者的零基础通信技术入门(十三):手机信号差?一文即懂!》

《IM开发者的零基础通信技术入门(十四):高铁上无线上网有多难?一文即懂!》

《IM开发者的零基础通信技术入门(十五):理解定位技术,一篇就够》(* 本文)

3、本文内容概述

对于IM开发者来说,用户的地理位置、附近的人这类功能,都需要用到手机的定位技术。不过,当用户、产品经理、测试人员使用这类功能,有某些情况下定位不出结果或者定位不准时,这锅是要程序员来背吗?显然不是。

▲ 微信这个超级IM里的“位置”、“附近的人”、“摇一摇”都是基于定位技术实现的

那么,定位技术到底是怎么实现的?技术原理怎样?有哪些局限性?貌似我们平时也没有做更多了解,既然这样,那就跟着本文来一窥究竟吧。

4、定位技术,应用广泛

今天我们所处的移动互联网时代,手机成了每个人的生活标配。这些手机里,安装了形形色色的APP,提供了各种服务,彻底改变了我们的生活。

这些服务里面,就包括我们今天的主角——定位。

每一个人,每一件物品,在这个地球上都有一个空间位置信息,这就是定位。它非常重要,我们靠它来找到这个人或这件物。

自从有人类文明开始,地图就被发明出来,用于标示位置信息。但是,因为技术手段的落后,人们只能通过参照物来“佛系”定位。

▲ 佛系定位,跟着感觉走

后来,有了罗盘、指南针,人类的定位能力不断进步,定位的精度也不断提升。

▲ 郑和下西洋,采用“牵星术”进行定位

进入现代之后,随着社会的进步和科技的发展,定位技术更是突飞猛进。我们几乎可以丈量和定位世界的每一个角落。

▲ 世界地图

用于定位的设备和技术,也逐步从航海航空、测绘救灾、军事国防等「高大上」的领域,渗透到普通老百姓的生活,成为不可或缺的组成部分。例如车辆导航、物流跟踪、交通管理等。

▲ 车辆定位导航

那么,大家平时使用手机定位服务的时候,有没有想过这些问题:

1)手机到底如何实现定位的?工作原理是什么?
2)大家都知道卫星定位,那么,是不是只有卫星这一种定位方式?
3)为什么有时候我们没有打开手机的卫星定位开关,仍然能够进行定位?
4)如果我们在室内,没有卫星信号覆盖,是不是就彻底不能定位了?
5)…
好了,带着这些疑问,我们进入正文部分。

5、卫星定位技术

定位,我们通常按使用场景,分为室内定位和室外定位。

我们先来说说用得最多的室外定位。目前最主流的室外定位方式,刚才我们已经提到了,就是卫星定位。

卫星定位:是利用人造地球卫星进行点位测量的技术,也是目前使用最为广泛、最受用户欢迎的定位技术。它的特点非常突出,就是精度高、速度快、使用成本低。

但是,目前世界上只有少数国家,具备建设和维护卫星定位系统的能力。

大家所熟知的,包括:美国的GPS,中国的北斗(BDS)、欧洲的伽利略(Galileo)、俄罗斯的格洛纳斯(GLONASS)。此外,还有日本的准天顶系统(QZSS)和印度的IRNSS。

我们就拿使用最为广泛的美国GPS系统来说吧。GPS,英文全名是Global Positioning System,全球定位系统。

它起始于1958年美国军方的一个项目,1964年投入使用,1994年彻底布设完成。

GPS系统的主要建设目的,是为陆海空三大领域提供实时、全天候和全球性的导航服务,并用于情报搜集、核爆监测和应急通讯等一些军事目的。

该系统由24颗卫星构成,其中21颗为工作卫星,还有3颗是在轨备用卫星。它们共同组成了GPS卫星星座。

24颗卫星距地高度为20200km,运行周期为11小时58分(恒星时12小时),均匀分布在6个轨道平面内。

正常情况下,在地球表面上任何地点任何时刻,平均可同时观测到6颗GPS卫星,最多可达10颗卫星。

除了天上的卫星之外,当然还需要地面的相关设备进行配合和监测,也就是地面监控系统。

GPS工作卫星的地面监控系统包括一个主控站、三个注入站和五个监控站。

GPS导航系统的基本原理,是测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置。

我们的手机,内置了GPS模块和天线,相当于接收机,负责GPS数据的接收和处理。

这些数据被手机操作系统或APP应用软件(例如百度地图)调用,起到精确定位的目的。

小提示:大家如果有兴趣的话,可以安装类似“GPS雷达”这样的APP,随时查看自己的手机现在能搜到哪几颗定位卫星,就像下图这样。

▲ 我随便扫了一下,头上的卫星还真不少啊

卫星定位这个东西,涉及到国家安全,当然不能完全依赖于国外。所以,尽管GPS系统非常成熟,我们国家还是开发了北斗系统。

▲ 弹道导弹,总不能用人家老美的卫星来定位吧?

截至目前,我们的北斗系统已经具备商用能力,配合基准站,能给客户提供精确到10米的定位服务,和GPS不相上下。

同时,北斗也弥补了GPS的不足,具备短报文能力(GPS卫星是单向广播的,不具备双向通信能力,功能略显单一)。限于篇幅,今天对北斗不多做介绍,下次专门开专题来讲。

对于GPS这样的卫星定位系统来说,影响定位精度的因素主要来自两个方面:

1)一个是大气层中的电离层(电离层在太阳光的照射下充满了离子和电子,对GPS信号这种电磁波的影响严重);
2)还有一个是多径效应(以前介绍通信基础的时候讲过,因为建筑等影响,直射信号和反射信号抵达的时间不同,造成信号干扰)。

不过总的来说,如果天气OK,GPS的定位精度都不会太差。

6、基站定位技术

好了,说完了卫星定位,再来看看地面定位。说到地面定位,大家首先想到了什么?哈哈,是不是雷达?

确实,雷达作为一项搜索定位技术,广泛应用于军事和民用领域。但是,毕竟普通手机数量非常庞大,加之生活场所障碍物非常复杂,不管从技术角度,还是成本角度,都不适合采用雷达进行定位。

那我们采用什么方式呢?其实可以用的方法很多,最常用的,是基站定位,也就是常说的LBS,Location Based Service(基于位置服务)。

基站定位的原理和雷达有相似之处。雷达定位大家都知道,就是发射雷达波,根据目标的反射,进行空间位置测算。

基站定位的话,基站就相当于是一个“雷达”。

通常,在城市中,一部手机会在多个基站的信号覆盖之下。手机会对不同基站的下行导频信号进行“测量”,得到各个基站的信号TOA(到达时刻)或TDOA(到达时间差)。根据这个测量结果,结合基站的坐标,就能够计算出手机的坐标值。

画个图,一看就明白了:

清楚了吧,三点一位。

基站定位的精度并不高,误差大概从100米到上千米。主要误差原因,是来自基站的位置和密度。简而言之,基站数量越多,密度越高,定位精度也就越高。基站和手机之间的障碍物越少,定位精度也会有所提升。

通常农村地区的基站定位精度低,是因为农村基站少,盲区多,有时候只有一个站的信号,当然无法精确定位了。

▲ 一个站可以定位一个圈,无法定位一个点

除了上面所说的基站定位之外,如果你对定位精度要求不高的话,也可以直接查看手机当前所在的小区信息,来确认目标位置。

我们所有的手机,只要连接到运营商的网络,就相当于“登记”在网络里。当前连接的基站信息,在手机中都可以查到。

▲ 在拨打电话界面输入 ##4636## 查看对应的基站信息苹果的话,输入3001#12345#

在运营商那边,也非常容易查到这个信息。即使你关机了,运营商HSS(负责管理用户数据的设备)都能查到之前你所在的基站小区。

这种方式查看位置比较快,但是精度就很低,一个基站覆盖的范围,从几百米到几公里不等。

7、Wi-Fi定位技术

除了基站定位之外,还有一个大家可能比较陌生的地面定位方式,就是Wi-Fi定位。

没错,Wi-Fi也可以定位哟!

也许你会认为,我所说的Wi-Fi定位,就是IP地位定位。其实并不是哦!

大家都知道,每个人上网,都会有一个公网IP地址。这些IP地位,在网络系统中都是有注册的,例如属于南京电信或上海联通,之类的。

IP地址确实可以大致追踪到你的位置(运营商可以查得更准确),但是,这种定位也有局限性。一方面,现在很多运营商都采用NAT技术,不一定会给每个用户分配公网地址,另一方面, IP地址很容易欺骗,我如果搞一个代理地址,你看到的IP,可能是美国的。

我所说的Wi-Fi定位,和上面的IP地址定位完全不同,是根据Wi-Fi路由器MAC地址进行定位。

每一个无线AP(Wi-Fi路由器)都有一个全球唯一的MAC地址,并且一般来说,无线AP在一段时间内不会移动。

在开启Wi-Fi的情况下,采集设备(例如手机)可以搜到这个无线AP的信号,并且获取它的MAC地址和信号强度信息。

采集装置将这些信息上传到服务器,经过服务器的计算,保存为“MAC-经纬度”的映射。当采集的信息足够多,就在服务器上建立了一张巨大的Wi-Fi信息数据库

当一个设备处在这样的网络中时,可以将收集到的这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备,其计算方式和基站定位位置计算方式相似,也是利用三点定位或多点定位技术。

位置服务商要不断更新、补充自己的数据库,以保证数据的准确性。

那么,问题来了,这些AP位置映射数据怎么采集的呢?

大致可以分为两种——主动采集和用户提交。

【主动采集】:

谷歌的街景拍摄车,没想到吧?它就是一个采集设备。它采集沿途的无线信号并打上通过GPS定位出的坐标回传至服务器。

▲ Google街景拍摄车

【用户提交】:

Android手机用户在开启“使用无线网络定位”时,会提示是否允许使用Google的定位服务,如果允许,用户的位置信息就被谷歌收集到。iPhone则会自动收集Wi-Fi的MAC地址、GPS位置信息、运营商基站编码等,并发送给苹果公司的服务器。

和基站定位一样,Wi-Fi定位在AP密集的地方有很好的效果。如果AP很少,那也很难定位准确。

总的来说,Wi-Fi这种定位方式的执行难度比较大,可用性和准确性也不高。所以,主要还是一种辅助性质的定位手段。

【A-GPS】:

定位说到辅助,我们就要说到A-GPS了。

A-GPS,Assisted GPS,辅助全球卫星定位系统。从名字就可以看出来,这是GPS的一个增强功能。

▲ A-GPS网络架构

这个技术,就是将GPS定位和基站定位两种技术相结合。

手机通过基站大致定位自己的位置,然后把位置告诉AGPS服务器,服务器根据这个位置信息,将此时经过你头顶的卫星参数(哪几颗、频率、位置、仰角等信息)反馈给你的手机,你手机的GPS就可以快速搜索卫星。

采用A-GPS的话,手机搜星速度大大提高,几秒钟就可以定位。

其实,说实话,最靠谱的方式,还是卫星定位。

大家经常会发现自己被定位到河里去,多半都是因为卫星没信号,然后被基站定位和Wi-Fi定位给坑了。。。

以上这些(GPS定位、WiFi定位、基站定位),就是常用的室外定位技术。下面,我们将继续说说室内定位技术。

8、室内定位技术

8.1概述

事实上,像GPS这样的定位技术,虽然精度高,但是有一个明显的缺点,就是无法穿透建筑物,不能实现室内定位。

但是,人们对室内定位是有强烈需求的。例如地下车库,人们经常会忘记自己的车停在哪里。此外,在大型商场人流较多,找人会存在困难,小孩走失的话,也会需要定位。

▲ 地下车库,非常考验一个人的方向感

在工业方面,也有定位需求,例如厂房内的生产线跟踪,资产管理等。

现在我们都在说“万物互联”,那么,物在哪里,你总要知道的吧?

▲ IoT,物联网

对于这种室内定位需求,我们应该采用什么样的定位手段呢?

其实,任何一种通信技术,本身都会带有定位功能。就像我们刚才说的基站定位和Wi-Fi定位,本身都是通信技术,但是通过测量时间差,都能够进行位置测量。

所以,短距离通信技术有哪些,室内定位技术,就有哪些。

例如,蓝牙定位、红外定位、RFID射频定位、超声波定位、Zigbee定位、UMB定位,全部都属于室内定位技术。Wi-Fi定位,其实也一样适用于室内。

▲ Wi-Fi室内定位

我们简单介绍几个比较典型的吧。

8.2室内定位技术之蓝牙定位

首先,说说蓝牙定位。

蓝牙,大家都很熟悉,是一种短距离低功耗的无线传输技术。蓝牙定位,就是通过在指定区域安装信标(可以发出蓝牙信号),实现精确定位。这些比手机要小的信标,每隔几米放置一个,能够与所有装有蓝牙模块的移动设备进行通信。

▲ 蓝牙定位组网

蓝牙定位的优点,是设备体积小、短距离、低功耗,容易集成在手机等移动设备中。只要设备的蓝牙功能开启,就能够对其进行定位。

说到蓝牙定位,就要提一下iBeacon,这是苹果公司2013年推出的一种低功耗精准微定位服务。它比以往普通蓝牙技术传输距离更远,精度更高。

8.3室内定位技术之UWB超宽带

另外一个比较受欢迎的室内定位技术,是UWB超宽带。

超宽带(UWB)定位技术利用事先布置好的已知位置的锚节点和桥节点,与新加入的盲节点进行通讯,并利用三角定位或者“指纹”定位方式来确定位置。

▲ UMB室内定位技术

超宽带通信不需要使用传统通信体制中的载波,而是通过发送和接收具有纳秒或纳秒级以下的极窄脉冲来传输数据,因此具有GHz量级的带宽。

由于UWB技术具有穿透力强、抗多径效果好、安全性高、系统复杂度低、能提供精确定位精度等优点,前景也是相当广阔。

8.4小结

限于篇幅,其它几种室内定位技术,在这里就不一一介绍啦。

需要提一句的是,像GPS定位、基站定位这样的方式,搭建系统有很高的门槛,不管是技术,还是资金,都不是一般企业能够承受的。但是,室内定位技术完全不同,它并不需要很大的投资,而且技术难度也小得多,所以,现在很多公司都在研究,也做出了不少成熟产品。这一块的市场前景,还是非常广阔的。

9、最后

好啦,以上,就是对常用定位技术的介绍。

最后,我要提醒一下大家:定位数据属于重要的个人隐私信息,不得非法获取,也不能用于违法目的。

大家一定要保护自己的位置数据,千万不要随意授权不靠谱的APP获得你的位置信息,以免带来生命危险。

附录:更多网络编程干货文章

《计算机网络通讯协议关系图(中文珍藏版)[附件下载]》

《TCP/IP详解 - 第11章·UDP:用户数据报协议》

《TCP/IP详解 - 第17章·TCP:传输控制协议》

《TCP/IP详解 - 第18章·TCP连接的建立与终止》

《TCP/IP详解 - 第21章·TCP的超时与重传》

《技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)》

《通俗易懂-深入理解TCP协议(上):理论基础》

《通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理》

《理论经典:TCP协议的3次握手与4次挥手过程详解》

《理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程》

《计算机网络通讯协议关系图(中文珍藏版)》

《UDP中一个包的大小最大能多大?》

《P2P技术详解(一):NAT详解——详细原理、P2P简介》

《P2P技术详解(二):P2P中的NAT穿越(打洞)方案详解》

《P2P技术详解(三):P2P技术之STUN、TURN、ICE详解》

《通俗易懂:快速理解P2P技术中的NAT穿透原理》

《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》

《高性能网络编程(二):上一个10年,著名的C10K并发连接问题》

《高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了》

《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》

《高性能网络编程(五):一文读懂高性能网络编程中的I/O模型》

《高性能网络编程(六):一文读懂高性能网络编程中的线程模型》

《不为人知的网络编程(一):浅析TCP协议中的疑难杂症(上篇)》

《不为人知的网络编程(二):浅析TCP协议中的疑难杂症(下篇)》

《不为人知的网络编程(三):关闭TCP连接时为什么会TIME_WAIT、CLOSE_WAIT》

《不为人知的网络编程(四):深入研究分析TCP的异常关闭》

《不为人知的网络编程(五):UDP的连接性和负载均衡

《不为人知的网络编程(六):深入地理解UDP协议并用好它》

《不为人知的网络编程(七):如何让不可靠的UDP变的可靠?》

《网络编程懒人入门(一):快速理解网络通信协议(上篇)》

《网络编程懒人入门(二):快速理解网络通信协议(下篇)》

《网络编程懒人入门(三):快速理解TCP协议一篇就够》

《网络编程懒人入门(四):快速理解TCP和UDP的差异》

《网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势》

《网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门》

《网络编程懒人入门(七):深入浅出,全面理解HTTP协议》

《网络编程懒人入门(八):手把手教你写基于TCP的Socket长连接》

《网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?》

《技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解》

《让互联网更快:新一代QUIC协议在腾讯的技术实践分享》

《现代移动端网络短连接的优化手段总结:请求速度、弱网适应、安全保障》

《聊聊iOS中网络编程长连接的那些事》

《移动端IM开发者必读(一):通俗易懂,理解移动网络的“弱”和“慢”》

《移动端IM开发者必读(二):史上最全移动弱网络优化方法总结》

《IPv6技术详解:基本概念、应用现状、技术实践(上篇)》

《IPv6技术详解:基本概念、应用现状、技术实践(下篇)》

《从HTTP/0.9到HTTP/2:一文读懂HTTP协议的历史演变和设计思路》

《脑残式网络编程入门(一):跟着动画来学TCP三次握手和四次挥手》

《脑残式网络编程入门(二):我们在读写Socket时,究竟在读写什么?》

《脑残式网络编程入门(三):HTTP协议必知必会的一些知识》

《脑残式网络编程入门(四):快速理解HTTP/2的服务器推送(Server Push)》

《脑残式网络编程入门(五):每天都在用的Ping命令,它到底是什么?》

《脑残式网络编程入门(六):什么是公网IP和内网IP?NAT转换又是什么鬼?》

《以网游服务端的网络接入层设计为例,理解实时通信的技术挑战》

《迈向高阶:优秀Android程序员必知必会的网络基础》

《全面了解移动端DNS域名劫持等杂症:技术原理、问题根源、解决方案等》

《美图App的移动端DNS优化实践:HTTPS请求耗时减小近半》

《Android程序员必知必会的网络通信传输层协议——UDP和TCP》

更多同类文章 ……

(本文已同步发布于:http://www.52im.net/thread-2428-1-1.html)