移动设备国际识别码(IMEI:International Mobile Equipment Identification Number)是区别移动设备的标志,具有唯一性,贴在手机背面的标志上,并且储存在移动设备中,可用于监控被窃或无效的移动设备,它也是该手机在厂家的"档案"和"身份证号".IMEI码由GSM(全球移动通信协会)统一分配,授权BABT(英国通信认证管理委员会)审受.其总长为15位,每位数字仅使用0~9的数字
IMEI由15位数字组成,其组成为:
1、前6位数(TAC,Type ApprovalCode)是"型号核准号码",一般代表机型.
2、接着的2位数(FAC,Final Assembly Code)是"最后装配号",一般代表产地.3、之后的6位数(SNR)是"串号",一般代表生产顺序号.4、最后1位数(SP)通常是"0",为检验码,备用.IMEI校验码算法:
(1).将偶数位数字分别乘以2,分别计算个位数和十位数之和
(2).将奇数位数字相加,再加上上一步算得的值(3).如果得出的数个位是0则校验位为0,否则为10减去个位数如:35 89 01 80 69 72 41 偶数位乘以2得到52=10 92=18 12=02 02=00 92=18 22=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => 校验位 10-3 = 7
代码如下:
/** * 格式化imei * 因为IMEI格式不统一,长度有14位和16位的,所以,为了统一,将14位和16位的MEID,统一设置为15位的 设置格式: * 如果IMEI长度为14位,那么直接得到第15位,如果MEID长度为16位,那么直接在根据前14位得到第15位 * 如果IMEI长度为其他长度,那么直接返回原值 * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和 * (2).将奇数位数字相加,再加上上一步算得的值 * (3).如果得出的数个位是0则校验位为0,否则为10减去个位数 * 如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02, * 计算奇数位数字之和和偶数位个位十位之和,得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 => * 校验位 10-3 = 7 * @param imei $ * @author Baip 125618036@qq.com */ public function formatImei( $imei ){ if ( empty( $imei ) ){ return false; } $imeiStrlen = strlen($imei); if ( $imeiStrlen != 14 && $imeiStrlen != 16 ){ return $imei; } $imeiRes = ''; if ( $imeiStrlen == 14 ){ $imeiRes = $imei . $this->getImei15($imei); } if ($imeiStrlen == 16) { $imeiRes = $imei . $this->getImei15(substr($imei, 0,14)); } return $imeiRes; } /** * 根据imei前14位,得到第15位的校验位 * IMEI校验码算法: * (1).将偶数位数字分别乘以2,分别计算个位数和十位数之和 * (2).将奇数位数字相加,再加上上一步算得的值 * (3).如果得出的数个位是0则校验位为0,否则为10减去个位数 * 如:35 89 01 80 69 72 41 偶数位乘以2得到5*2=10 9*2=18 1*2=02 0*2=00 9*2=18 2*2=04 1*2=02,计算奇数位数字之和和偶数位个位十位之和, * 得到 3+(1+0)+8+(1+8)+0+(0+2)+8+(0+0)+6+(1+8)+7+(0+4)+4+(0+2)=63 * 校验位 10-3 = 7 * @param $imei * @author Baip 125618036@qq.com */ private function getImei15($imei){ if ( strlen( $imei ) == 14 ){ $imeiArr = str_split($imei); $imeiNewArr = []; foreach ($imeiArr as $key => $value){ $imeiNewArr[$key+1] = $value; } $sum1 = 0; $sum2 = 0; if ( is_array($imeiNewArr) && count($imeiNewArr) == 14 ){ for ($i=1; $i<= count($imeiNewArr); $i++ ){ //如果为偶数 if ( $i % 2 == 0 ){ $temp = intval( ($imeiNewArr[$i] - 0) * 2 ); if ($temp < 10){ $sum2 = $sum2 + $temp; }else{ //目的:大于10的值12,最后要用个位+十位 (1+2) 转化为:sum + 1 + 12-10 $sum2 = $sum2 + 1 + $temp -10 ; } }else{ $sum1 = $sum1 + $imeiNewArr[$i] - '0'; } } $total = $sum1 + $sum2; if ( $total % 10 == 0 ){ return 0; }else{ return intval(10 - $total % 10); } }else{ return ''; } } }