SIM卡API说明
查询SIM卡信息
查询IMSI
用户可通过如下接口获取SIM卡的IMSI号码,以方便用户对IMSI的应用。
接口如下:
sim.getImsi()
示例
# -*- coding: UTF-8 -*-
#示例
import sim
imsi = sim.getImsi()
print("Get IMSI : {}".format(imsi))
查询ICCID
用户可通过如下接口查询SIM卡的ICCID,以方便用户对SIM卡的ICCID的应用。
接口如下:
sim.getIccid()
示例
# -*- coding: UTF-8 -*-
#示例
import sim
iccid = sim.getIccid()
print("Get IMSI : {}".format(iccid))
查询电话号码
用户可通过如下接口查询SIM卡电话号码,SIM电话号码需要先设置后查询。
接口如下:
sim.getPhoneNumber()
示例
# -*- coding: UTF-8 -*-
#示例
import sim
phone_num = sim.getPhoneNumber()
print("Get Phone Number is : {}".format(phone_num))
查询信息应用场景
应用程序启动后,等待注网成功,然后查询SIM卡信息,为后续处理业务做准备。
# -*- coding: UTF-8 -*-
#示例
import sim
import checkNet
import sys
sim_status_dict={
0:"SIM卡不存在/被移除",
1:"SIM已经准备好",
2:"SIM卡已锁定,等待CHV1密码",
3:"SIM卡已被阻拦,需要CHV1密码解锁密码",
4:"由于SIM/USIM个性化检查失败,SIM卡被锁定",
5:"由于PCK错误导致SIM卡被阻拦,需要MEP密码解除阻拦",
6:"需要隐藏电话簿条目的密钥",
7:"需要解锁隐藏密钥的编码",
8:"SIM卡已锁定,等待CHV2密码",
9:"SIM卡被阻拦,需要CHV2解锁密码",
10:"由于网络个性化检查失败,SIM卡被锁定",
11:"由于NCK不正确,SIM卡被阻拦,需要MEP解锁密码",
12:"由于子网络锁个性化检查失败,SIM卡被锁定",
13:"由于错误的NSCK,SIM卡被阻拦,需要MEP解锁密码",
14:"由于服务提供商个性化检查失败,SIM卡被锁定",
15:"由于SPCK错误,SIM卡被阻拦,需要MEP解锁密码",
16:"由于企业个性化检查失败,SIM卡被锁定",
17:"由于CCK不正确,SIM卡被阻止,需要MEP解锁密码",
18:"SIM正在初始化,等待完成",
19:"CHV1/CHV2/PIN错误",
20:"SIM卡无效",
21:"未知状态"
}
if __name__ == '__main__':
# 1、查询SIM卡状态
sim_status = sim.getStatus()
if sim_status not in sim_status_dict:
print("接口返回失败")
sys.exit()
print("Get SIM status : {}".format(sim_status_dict[sim_status]))
if sim_status != 1:
sys.exit()
# 2、等待注网成功
stage, state = checkNet.waitNetworkReady(30)
if stage == 3 and state == 1:
print('Network connection successful.')
else:
print('Network connection failed, stage={}, state={}'.format(stage, state))
sys.exit()
# 3、查询开机注网后的SIM卡信息
imsi = sim.getImsi()
if type(imsi).__name__ == 'int':
print("Get IMSI failed !")
sys.exit()
print("Get IMSI is : {}".format(imsi))
iccid = sim.getIccid()
if type(iccid).__name__ == 'int':
print("Get ICCID failed !")
sys.exit()
print("Get ICCID is : {}".format(iccid))
phone_number= sim.getPhoneNumber()
if type(phone_number).__name__ == 'int':
print("Get phone_number failed !")
sys.exit()
print("Get phone number is : {}".format(phone_number))
查询SIM卡状态
用户可通过如下接口获取当前SIM卡的状态,通过SIM卡状态判断SIM卡是否可以正常使用。
接口如下:
sim.getStatus()
示例
# -*- coding: UTF-8 -*-
#示例
import sim
import sys
sim_status_dict={
0:"SIM卡不存在/被移除",
1:"SIM已经准备好",
2:"SIM卡已锁定,等待CHV1密码",
3:"SIM卡已被阻拦,需要CHV1密码解锁密码",
4:"由于SIM/USIM个性化检查失败,SIM卡被锁定",
5:"由于PCK错误导致SIM卡被阻拦,需要MEP密码解除阻拦",
6:"需要隐藏电话簿条目的密钥",
7:"需要解锁隐藏密钥的编码",
8:"SIM卡已锁定,等待CHV2密码",
9:"SIM卡被阻拦,需要CHV2解锁密码",
10:"由于网络个性化检查失败,SIM卡被锁定",
11:"由于NCK不正确,SIM卡被阻拦,需要MEP解锁密码",
12:"由于子网络锁个性化检查失败,SIM卡被锁定",
13:"由于错误的NSCK,SIM卡被阻拦,需要MEP解锁密码",
14:"由于服务提供商个性化检查失败,SIM卡被锁定",
15:"由于SPCK错误,SIM卡被阻拦,需要MEP解锁密码",
16:"由于企业个性化检查失败,SIM卡被锁定",
17:"由于CCK不正确,SIM卡被阻止,需要MEP解锁密码",
18:"SIM正在初始化,等待完成",
19:"CHV1/CHV2/PIN错误",
20:"SIM卡无效",
21:"未知状态"
}
if __name__ == '__main__':
sim_status = sim.getStatus()
if sim_status not in sim_status_dict:
print("接口返回失败")
sys.exit()
if sim_status != 1:
print("Get SIM status status : {}".format(sim_status_dict[sim_status]))
sys.exit()
print("Get sim_status is : {}".format(sim_status_dict[sim_status]))
PIN码验证功能
用户可通过开启PIN码验证功能来保证SIM卡的使用安全。PIN码是SIM卡的安全识别码,用于验证用户的身份和保护个人信息安全。开启PIN码验后,每次重启设备后(或CFUN0/1切换后)均需进行PIN码验证,在验证通过后SIM卡才能正常使用。PIN码验证连续3次输入错误后SIM卡将被锁定,需要用PUK码进行解码。
开启PIN验证
用户可通过如下接口开启SIM卡PIN码验证功能,用以保证SIM卡的使用安全。
接口如下:
sim.enablePin(pin)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
result = sim.enablePin("1234")
print("Enable PIN : {}".format(result))
关闭PIN验证
用户可通过如下接口关闭PIN码验证功能,在保证SIM卡是在安全的环境下使用时,可以关闭PIN码验证功能来简化应用程序。
接口如下:
sim.disablePin(pin)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
#根据实际PIN码输入,此处"1234"为示例PIN码
result = sim.disablePin("1234")
print("Disable PIN : {}".format(result))
PIN验证
用户可通过如下接口来完成SIM卡的PIN码验证,开启PIN码验证后,SIM卡需完成PIN码验证后才能将状态将切换到正常状态,之后应用程序才能进行业务处理。
接口如下:
sim.verifyPin(pin)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
#根据实际PIN码输入
result = sim.verifyPin("1234")
print("Verify PIN result is : {}".format(result))
修改PIN
用户可定期通过如下接口修改SIM卡的PIN码,提高SIM卡使用的安全性。
接口如下:
sim.changePin(oldPin, newPin)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
sim.changePin("1234", "4321")
PIN码应用场景
用户为了安全应用SIM卡,需要在开启PIN码验证功能的情况下进行业务处理。
# -*- coding: UTF-8 -*-
#示例
import sim
import checkNet
import sys
sim_status_dict={
0:"SIM卡不存在/被移除",
1:"SIM已经准备好",
2:"SIM卡已锁定,等待CHV1密码",
3:"SIM卡已被阻拦,需要CHV1密码解锁密码",
4:"由于SIM/USIM个性化检查失败,SIM卡被锁定",
5:"由于PCK错误导致SIM卡被阻拦,需要MEP密码解除阻拦",
6:"需要隐藏电话簿条目的密钥",
7:"需要解锁隐藏密钥的编码",
8:"SIM卡已锁定,等待CHV2密码",
9:"SIM卡被阻拦,需要CHV2解锁密码",
10:"由于网络个性化检查失败,SIM卡被锁定",
11:"由于NCK不正确,SIM卡被阻拦,需要MEP解锁密码",
12:"由于子网络锁个性化检查失败,SIM卡被锁定",
13:"由于错误的NSCK,SIM卡被阻拦,需要MEP解锁密码",
14:"由于服务提供商个性化检查失败,SIM卡被锁定",
15:"由于SPCK错误,SIM卡被阻拦,需要MEP解锁密码",
16:"由于企业个性化检查失败,SIM卡被锁定",
17:"由于CCK不正确,SIM卡被阻止,需要MEP解锁密码",
18:"SIM正在初始化,等待完成",
19:"CHV1/CHV2/PIN错误",
20:"SIM卡无效",
21:"未知状态"
}
if __name__ == '__main__':
sim_status = sim.getStatus()
if sim_status not in sim_status_dict:
print("接口返回失败")
sys.exit()
if sim_status == 2:
# 开启了PIN码验证,需要验证PIN码
PIN="1234" #PIN码-请根据SIM卡真实的PIN码填写
pin_result = sim.verifyPin(PIN)
if pin_result != 0:
print("Error PIN ! Please input right PIN!")
sys.exit()
# 验证成功后关闭PIN码验证,下次不再需要进行PIN码验证
# result = sim.disablePin(PIN)
#if result != 0:
# print("Error PIN ! Please input right PIN!")
# sys.exit()
# 查询SIM状态
sim_status = sim.getStatus()
if sim_status not in sim_status_dict:
print("接口返回失败")
sys.exit()
if sim_status != 1:
print("Get SIM status : {}".format(sim_status_dict[sim_status]))
sys.exit()
print("Get sim_status is : {}".format(sim_status_dict[sim_status]))
#等待注网成功,进行业务处理
stage,state = checkNet.waitNetworkReady(30)
if stage == 3 and state == 1:
print('Network connection successful.')
else:
print('Network connection failed, stage={}, state={}'.format(stage, state))
SIM卡解锁
用户可通过如下接口处理连续3次输入PIN码错误导致锁PIN的情况。这个接口在用PUK码解锁的同时重新设置了PIN码。需要注意PUK码错误10次后SIM卡将被永久锁定,自动报废。
接口如下:
sim.unblockPin(puk, newPin)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
sim.unblockPin("12345678", "0000")
电话薄功能
用户在实际项目应用过程中,如需保存对端电话号码,需要用到电话薄功能。此接口可以提供保存电话号码信息的功能。此功能接口支持情况请参考QuecPython官网wiki电话薄功能
读取电话薄
用户可通过如下接口读取电话薄。其中电话号码存储位置参考QuecPython官网wiki中sim.readPhonebook()
接口参数描述。需注意start-end差值需要小于等于20。
接口如下:
sim.readPhonebook(storage, start, end, username)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
# 读取本SIM卡电话薄中索引值1到4的电话信息
sim_phone_boo = sim.readPhonebook(9, 1, 4, "")
print("SIM卡中电话薄 : {}".format(miss_call))
# 读取未接来电中索引值1到4的电话信息
miss_call = sim.readPhonebook(4, 1, 4, "")
print("未接来电 : {}".format(miss_call))
设置电话薄
用户可通过如下接口来保存电话号码信息到电话簿中:
sim.writePhonebook(storage, index, username, number)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
# 保存Tom电话号码保存到SIM卡电话薄索引位置1的位置上
sim.writePhonebook(9, 1, 'Tom', '18144786859')
电话薄应用场景
在项目运行中,获取到电话号码,并保存电话号码到SIM卡电话薄中。
# -*- coding: UTF-8 -*-
#示例
import sim
def save_phone_number_to_simbook(index,name,phonenumber,input_type = 0 ):
# type = 0,如果设置保存电话号码位置已经存在电话号码,直接返回,不覆盖保存
if input_type == 0:
# 查询当前位置是否已有电话号码信息
phone_info = sim.readPhonebook(9, index, index, name)
if type(phone_info).__name__ == 'int':
print("不存在")
elif phone_info[1][0][1] == name and phone_info[1][0][2] == phonenumber:
# 电话号码已存在
print("已存在")
return
else:
print("不存在")
else:
pass
# 保存姓名,电话号码到SIM卡电话薄中index地址处
result = sim.writePhonebook(9, index, name, phonenumber)
def get_name_phone():
return 'Tom','18144786858'
if __name__ == '__main__':
name,phonenumber = get_name_phone()
# 姓名电话号码已存在则不保存
save_phone_number_to_simbook(1,name,phonenumber,0)
#姓名电话号码已存在覆盖保存
save_phone_number_to_simbook(1,name,phonenumber,1)
SIM卡热插拔
在项目中,用户如需监测SIM卡插拔情况,可以用如下接口注册回调函数。当SIM卡插入或者拔出时,系统将会调用如下接口注册的回调函数,回调函数会上送SIM卡插入或者拔出的事件给应用层。用户可以根据通知事件来判断SIM卡是插入还是拔出。QuecPython模组对此接口支持情况请参考QuecPython官网wiki热插拔功能
注册热插拔回调
用户可通过如下接口注册SIM卡热插拔回调函数。
接口如下:
sim.setCallback(usrFun)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
def sim_hot_call(event):
if event == 1:
# SIM 卡插入
print("Get SIM Inster event : {}".format(event))
elif event == 2:
# SIM 卡拔出
print("Get SIM Unplug event : {}".format(event))
else:
# 未知事件
print("Get SIM Unkown event : {}".format(event))
sim.setCallback(sim_hot_call)
获取SIM卡热插拔配置
用户可通过如下接口查询SIM卡热插拔功能的当前配置信息,根据配置信息可以判断当前是否开启了热插拔功能。
接口如下:
sim.getSimDet()
示例
# -*- coding: UTF-8 -*-
#示例
import sim
sim_hot_conf = sim.getSimDet()
print("Get Current SIM config info : {}".format(sim_hot_conf))
if sim_hot_conf[0] == 1:
# SIM卡热插拔功能启用
print("Current SIM Hotplug is enable")
配置SIM卡热插拔
用户可通过如下接口启用或者关闭SIM卡热插拔功能。
接口如下:
sim.setSimDet(switch, triggerLevel)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
# 先判断SIM卡插入时,电平是高电平还是低电平,在此以SIM插入时为高电平为例
# 1、注册热插拔回调函数
def sim_hot_call(event):
print("Get SIM event : {}".format(event))
sim.setCallback(sim_hot_call)
sim_hot_conf = sim.getSimDet()
# 2、开启SIM卡热插拔功能并标记模组SIM卡插入时,电平为高电平
if sim_hot_conf[0] == 0:
print("SIM hot-swapping is not currently enabled")
print("Will enable this function")
sim.setSimDet(1, 1)
else:
print("Already enbale this function")
SIM卡热插拔应用场景
用户在项目中,检测SIM卡插拔事件,并设置标识,标记发生了SIM卡插入或者拔出事件。(用户可以根据需要决定是否通知应用程序中其他模块发生了SIM卡插拔事件)。
# -*- coding: UTF-8 -*-
#示例
import sim
import net
insert_flag = False
def sim_hot_call(event):
global insert_flag
print("Get SIM event : {}".format(event))
if event == 1:
#检测到SIM卡插入,设置标记SIM卡被插入
insert_flag = True
else:
insert_flag = False
if __name__ == '__main__':
sim_hot_conf = sim.getSimDet()
if sim_hot_conf[0] == 0:
#为开启SIM卡热插拔功能,在位电平标记请根据实际SIM卡在位电平设置
#此处以SIM卡在为电平为1为例
print("enable this function")
sim.setSimDet(1, 1)
else:
print("Already enbale this function")
#设置回调函数检测SIM卡的插拔动作
sim.setCallback(sim_hot_call)
双卡切换
用户在项目应用过程中,为了网络稳定,满足多种网络场景,需要两张不同SIM卡可以随时切换的功能,以应对各种网络异常情况。QuecPython模组对于此功能支持情况请参考QuecPython官网wiki中SIM卡切卡功能。
注册切卡回调函数
用户可通过如下接口注册回调函数监测切卡事件。当发生了切卡事件,系统将通过注册的回调函数发出切卡事件通知应用层,应用层收到切卡事件通知后,将进行切卡导致的网络异常情况的处理。
接口如下:
sim.setSwitchcardCallback(usrFun)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
import net
sim_status_dict={
0:"SIM卡不存在/被移除",
1:"SIM已经准备好",
2:"SIM卡已锁定,等待CHV1密码",
3:"SIM卡已被阻拦,需要CHV1密码解锁密码",
4:"由于SIM/USIM个性化检查失败,SIM卡被锁定",
5:"由于PCK错误导致SIM卡被阻拦,需要MEP密码解除阻拦",
6:"需要隐藏电话簿条目的密钥",
7:"需要解锁隐藏密钥的编码",
8:"SIM卡已锁定,等待CHV2密码",
9:"SIM卡被阻拦,需要CHV2解锁密码",
10:"由于网络个性化检查失败,SIM卡被锁定",
11:"由于NCK不正确,SIM卡被阻拦,需要MEP解锁密码",
12:"由于子网络锁个性化检查失败,SIM卡被锁定",
13:"由于错误的NSCK,SIM卡被阻拦,需要MEP解锁密码",
14:"由于服务提供商个性化检查失败,SIM卡被锁定",
15:"由于SPCK错误,SIM卡被阻拦,需要MEP解锁密码",
16:"由于企业个性化检查失败,SIM卡被锁定",
17:"由于CCK不正确,SIM卡被阻止,需要MEP解锁密码",
18:"SIM正在初始化,等待完成",
19:"CHV1/CHV2/PIN错误",
20:"SIM卡无效",
21:"未知状态"
}
def switch_sim_call(result):
print("Get switch SIM card event : {}".format(reslut))
if result == 7:
# SIM卡切卡成功,通知应用层,SIM卡切卡成功
print("SIM switch success!")
elif result == 9:
print("SIM switch failed!")
if __name__ == '__main__':
sim.setSwitchcardCallback(switch_sim_call)
查询当前 SIM卡ID
用户可通过如下接口查询当前启用的SIM卡ID。
接口如下 :
sim.getCurSimid()
示例
# -*- coding: UTF-8 -*-
#示例
import sim
simid = sim.getCurSimid()
print("Current SIM is : {}".format(simid))
切换SIM卡
用户可通过如下接口切换到指定SIM卡。如当前SIM卡出现不可恢复的异常网络情况,可用此接口将正在使用的SIM卡切换到另一张SIM卡,使应用程序可以继续处理业务。
接口如下:
sim.switchCard(simId)
示例
# -*- coding: UTF-8 -*-
#示例
import sim
simid = sim.getCurSimid()
print("Current SIM is : {}".format(simid))
if simid == 0:
# 启用SIM2
print("Current is SIM 1 and Will switch to SIM2")
sim.switchCard(1)
双卡切换应用场景
以下场景根据客户需求和业务流程,可能需要切卡操作。
检测到当前卡信号弱满足不了业务需求就尝试切到另一张卡, 比如单车,对讲机。
一张卡接入公网,一张卡接入专网,公网卡主要做数据业务, 专网卡处理一些特殊任务, 比如电网客户。
用户应用程序在启动时检测到当前SIM卡状态无效,无法进行网络交互,切换到另一张SIM卡。
# -*- coding: UTF-8 -*-
#示例
import sim
import net
import sys
sim_status_dict={
0:"SIM卡不存在/被移除",
1:"SIM已经准备好",
2:"SIM卡已锁定,等待CHV1密码",
3:"SIM卡已被阻拦,需要CHV1密码解锁密码",
4:"由于SIM/USIM个性化检查失败,SIM卡被锁定",
5:"由于PCK错误导致SIM卡被阻拦,需要MEP密码解除阻拦",
6:"需要隐藏电话簿条目的密钥",
7:"需要解锁隐藏密钥的编码",
8:"SIM卡已锁定,等待CHV2密码",
9:"SIM卡被阻拦,需要CHV2解锁密码",
10:"由于网络个性化检查失败,SIM卡被锁定",
11:"由于NCK不正确,SIM卡被阻拦,需要MEP解锁密码",
12:"由于子网络锁个性化检查失败,SIM卡被锁定",
13:"由于错误的NSCK,SIM卡被阻拦,需要MEP解锁密码",
14:"由于服务提供商个性化检查失败,SIM卡被锁定",
15:"由于SPCK错误,SIM卡被阻拦,需要MEP解锁密码",
16:"由于企业个性化检查失败,SIM卡被锁定",
17:"由于CCK不正确,SIM卡被阻止,需要MEP解锁密码",
18:"SIM正在初始化,等待完成",
19:"CHV1/CHV2/PIN错误",
20:"SIM卡无效",
21:"未知状态"
}
def switch_sim_call(result):
print("Get switch SIM card event : {}".format(reslut))
if result == 7:
print("SIM switch success!")
net.setModemFun(0)
net.setModemFun(1)
elif result == 9:
print("SIM switch failed!")
if __name__ == '__main__':
sim.setSwitchcardCallback(switch_sim_call)
sim_status = sim.getStatus()
if sim_status not in sim_status_dict:
print("接口返回失败")
sys.exit()
if sim_status != 20:
# sim卡状态无效
print("Get SIM status status : {}".format(sim_status_dict[sim_status]))
#查询当前使用SIM卡
sim_id = sim.getCurSimid()
#切换到另一张卡上运行
if sim_id == 0:
sim.switchCard(1)
else:
sim.switchCard(0)