一直想清楚的理解IMEI是什么,但是怎么也找不到合适的下笔思路,最终还是把imei.org上的这篇介绍翻译过来,做个记录。
原文地址:http://imei.org/2013/05/imei-number-decode/ 原文标题:What Is IMEI Number and How To Decode It
译文:
“
你可能听说过IMEI,也知道它是移动设备的标识ID,但是你知道它的具体功用吗?IMEI自手机出产后就伴随其一生,究竟什么是IMEI,如何理解它的数字含义?
智能手机是全世界范围内偷窃事件的“主角”,不要低估IMEI的重要性,把IMEI备份一下是一个明智的决定。本文会解释为什么我们的手机需要IMEI,同时会列出如何找到并记录IMEI的技术方法。
IMEI是什么?
IMEI的全称是International Mobile Equipment Identity,每台设备都必备的一个唯一标识,用来区分设备与设备。当你购买一台新的手机设备时,你会在收据上看到IMEI;当你需要修理手机时,手机服务商可能会要求你提供IMEI。标准的IMEI是一个14位数字,同时也有IMEI/SV这样的16位数字形式(仅新设备有),SV是由软件设计的。当然苹果的iPhone GSM有 15位数字,而CDMA是14位数字。不管如何,IMEI的设计动机不仅仅是一个ID标识,它也可以用来阻止网络访问,还可以用IMEI来进行运营商解锁。
如果你的手机失窃,你可以将情况上报到你的手机服务商,他们会阻止这台手机进行一切的网络访问,同时警察也可以通过IMEI来识别丢失的设备。
IMEI怎么查看?
多数手机在你输入拨号*#06#后就能看到IMEI了,当然也有其他的一些方法:
- iOS:Settings->General->About(设置->通用->关于手机),这样也可以看到有IMEI(需要自己下滑寻找)。iPhone手机同样可以在sim卡托盘上找到IMEI,当然如果你不是使用原生的托盘就看不到了。
- Android:Settings->About(设置->关于),这里可以看到IMEI,序列号和其他的信息。
- 老的Sony或者索爱:输入 * Right * Left Left * Left *
- 新的索爱或者Blackberry:Options->Status(选项->状态)
你可以使用http://imei.org/check-iphone-carrier/ 服务通过输入IMEI来获得手机的运营商信息
如何解释IMEI:
2004年以来,统一的IMEI格式为:AA-BBBBBB-CCCCCC-D,这是一个15位数字号,其中:
- AA:两位数字号,表示Reporting Body Identifier,用来表示由TAC(Type Allocation Code)分配的GSMA。
- BBBBBB:TAC(FAC)的剩余部分。
- CCCCCC:机器序列号(SNR)
- D:Luhn 检测位
举例来说,现在iPhone 5的TAC为01-332700,而三星的Galaxy S2为35-853704,而C部分的SNR是由手机制造商自定义的生产序列号,最后一位校验位是通过算法来生成的。
IMEI是手机相关的,与sim卡无关,当你的手机被偷后,无论手机重置还是更换sim卡,IMEI都是不变的,这时你是可以通过联系你的手机服务商来锁住手机的服务的。如果这行不通,可以联系你所在地区的运营商来锁定IMEI对于运营商网络的访问。
有时候IMEI是变化的,尽管这不合法。有些窃贼有能力将合法的新的IMEI安装到你的手机里从而重新启用这个手机。另外鉴于犯罪动机,还有人会利用IMEI来监听设备。
综上,IMEI是手机的重要的唯一性ID,你需要去备份并记住它。
”
翻译结束。
最后附加一些说明。
关于TAC:http://en.wikipedia.org/wiki/Type_Allocation_Code
关于最后一位校验位的算法和python code:
以14位IMEI为例,校验位假设是C
- 从后向前,记录下每隔两位的数字,记为列表A
- 从后向前,记录下除A以外的数字,记为列表B
- 将A中的数字都乘以2,如果一个数字乘以2后大于10,那么把这个结果拆为两个数字(个位数一个,十位数一个),记为列表A'
- 把A'和B中的所有数字求和,记为S
- 计算S*9%10,记为F,如果F等于C,校验通过,否则IMEI有问题。
1: if len(arg0)==15:
2: check_bit = int(arg0[-1])
3: i = len(arg0)-2
4: l,r = [],[]
5: while i>=0:
6: m = int(arg0[i])*2
7: if m<10:
8: l.append(m)
9: else:
10: l.append(m%10)
11: l.append(m/10)
12:
13: r.append(int(arg0[i-1]))
14: i-=2
15: l.reverse()
16: r.reverse()
17: if sum((sum(l),sum(r)))*9%10==check_bit:
18: return True
19: return False