diff --git "a/docs/Application_guide/zh/media/network-comm/sim/\351\207\215\345\220\257\345\220\216SIM\345\215\241\347\212\266\346\200\201\346\201\242\345\244\215\346\255\243\345\270\270.png" "b/docs/Application_guide/zh/media/network-comm/sim/\351\207\215\345\220\257\345\220\216SIM\345\215\241\347\212\266\346\200\201\346\201\242\345\244\215\346\255\243\345\270\270.png" new file mode 100644 index 0000000000000000000000000000000000000000..ad96db1ca00e7c8e572042f4fb6d9f37db869f9b Binary files /dev/null and "b/docs/Application_guide/zh/media/network-comm/sim/\351\207\215\345\220\257\345\220\216SIM\345\215\241\347\212\266\346\200\201\346\201\242\345\244\215\346\255\243\345\270\270.png" differ diff --git a/docs/Application_guide/zh/network-comm/esim/README.md b/docs/Application_guide/zh/network-comm/esim/README.md index 710d75dbd053b9bc06531123d3f2df54ab17d7a8..a6915b3131e53587d1b268a5dec4734d7ca64f5c 100644 --- a/docs/Application_guide/zh/network-comm/esim/README.md +++ b/docs/Application_guide/zh/network-comm/esim/README.md @@ -116,13 +116,13 @@ M2M的远程SIM配置使用服务器驱动(推送模式)来配置和远程 * 跨境设备 -设备移动跨境场景需要进行运营商网络切换普通 SIM 卡无法满足,全球漫游卡资费又比较昂贵,通过eSIM 可以自由切换到当地运营商,而无需改动硬件。 +设备移动跨境场景需要进行运营商网络切换,普通 SIM 卡无法满足,全球漫游卡资费又比较昂贵,通过eSIM 可以自由切换到当地运营商,而无需改动硬件。 ## eSIM支持型号 -Quecpython现支持eSIM功能具体型号如下表: +QuecPython现支持eSIM功能具体型号如下表: | 型号 | | :----------------- | @@ -137,21 +137,21 @@ Quecpython现支持eSIM功能具体型号如下表: -## QuecPython eSIM工具 +## eSIM工具 ### 工具介绍 -esimtools软件主要用于处理eSIM空卡情况,esimtools软件需要从运营商服务器下载数据,需要个人电脑可以正常访问因特网。 +QEsimTool软件主要用于处理eSIM空卡情况,QEsimTool软件需要从运营商服务器下载数据,需要个人电脑可以正常访问因特网。 -esimtools软件的运行机制:用户从运营商获取AccCode,将AccCode作为参数传给esimtools,esimtools通过AccCode解析出运营商服务器地址,并向运营商服务器发送下载profile数据请求。当esimtools下载profile数据完成后,将通过AT指令将数据发送到设备中,进而将profile写入eSIM卡中。 +QEsimTool软件的运行机制:用户从运营商获取AccCode,将AccCode作为参数传给QEsimTool,QEsimTool通过AccCode解析出运营商服务器地址,并向运营商服务器发送下载profile数据请求。当QEsimTool下载profile数据完成后,将通过AT指令将数据发送到设备中,进而将profile写入eSIM卡中。 -esimtools软件获取方式:请到[quectel](https://www.quectel.com/)官网,联系客服进行领取。 +QEsimTool软件获取方式:请到[quectel](https://www.quectel.com/)官网,联系客服进行领取。 ### 界面介绍 -esimtools软件附有应用指导文档,以下仅做简单介绍。 +QEsimTool软件附有应用指导文档,以下仅做简单介绍。 -esimtools软件启动界面如下: +QEsimTool软件启动界面如下:  @@ -163,7 +163,7 @@ Baud rate :串口波特率。 OPEN :以指定的波特率打开Port。 -AccCode :AccCode需要运营商提供,填入esimtools中,作为参数。 +AccCode :AccCode需要运营商提供,填入QEsimTool中,作为参数。 DownloadProfile :点击此按钮将解析AccCode,通过网络下载profile。 @@ -183,7 +183,7 @@ DeleteProfile :删除和ICCID对应的profile。 用户可以按照如下步骤进行操作: -* 正常启动模组设备后,在个人电脑中打开esimtools软件。 +* 正常启动模组设备后,在个人电脑中打开QEsimTool软件。 * 检查个人电脑是否可以正常访问因特网。 @@ -200,7 +200,7 @@ DeleteProfile :删除和ICCID对应的profile。 -## QuecPython eSIM API介绍 +## eSIM API介绍 以下接口均是以LPA方式实现,需要用户和卡商确认eSIM卡是否支持LPA功能。 @@ -248,7 +248,7 @@ from sim import esim def usrFun(result): ''' :param result :OTA下载profile结果。 - :type result :整形,0:成功 1:失败 + :type result :整型,0:成功 1:失败 ''' print("OTA result:{}".format(result)) @@ -287,7 +287,7 @@ print("Get all profile :{}".format(profile_list)) ### 下载安装运营商profile -用户可通过如下接口下载安装运营商的profile。如eSIM为空卡,请使用esimtools工具进行安装首个profile。为确保此接口可以正常下载profile信息,需eSIM卡当前启用的profile能够正常注网,并且可以正常和AccCode中的运营商服务器地址进行网络数据交互。在此接口调用后,必须等下载结果通知到达后才能调用eSIM接口进行别的操作,否则将影响下载安装结果。 +用户可通过如下接口下载安装运营商的profile。如eSIM为空卡,请使用QEsimTool工具进行安装首个profile。为确保此接口可以正常下载profile信息,需eSIM卡当前启用的profile能够正常注网,并且可以正常和AccCode中的运营商服务器地址进行网络数据交互。在此接口调用后,必须等下载结果通知到达后才能调用eSIM接口进行别的操作,否则将影响下载安装结果。 接口如下: @@ -304,7 +304,7 @@ from sim import esim def usrFun(result): ''' :param result :OTA下载profile结果。 - :type result :整形,0:成功 1:失败 + :type result :整型,0:成功 1:失败 ''' print("OTA result:{}".format(result)) @@ -438,9 +438,9 @@ class pyesim(): self.stage, self.state = checkNet.waitNetworkReady(60) if self.stage == 3 and self.state == 1: print("network is success!") - self.debug_enbale = True - self.ota_result = False - pass + self.debug_enbale = True + self.ota_result = False + pass def esim_log(self,args): if self.debug_enbale == True: print("esim {}".format(args)) @@ -530,14 +530,14 @@ if __name__ == '__main__': ### 无法下载安装profile * AccCode是否错误,可向运营商进行确认。 -* 当前的设备或PC机是否可以正常访问从AccCode中解析除的url地址。 +* 当前的设备或PC机是否可以正常访问从AccCode中解析出的url地址。 * 是否重复下载安装profile。 * 是否运营商进行限制,同一个AccCode只能使用一次,需和运营商进行确定。 * 网络信号是否太弱,网络不稳定。 ### 下载安装profile后无法上网 -如遇到下载安装profile成功后无法上网,请做一次CFUN=0,1的切换操作。如依然无法上网,请按如下方面进行检查。 +如遇到下载安装profile成功后无法上网,请做一次CFUN=0/1的切换操作。如依然无法上网,请按如下方面进行检查。 * SIM卡状态是否异常 * 下载安装的profile是否已正常激活。 @@ -546,4 +546,5 @@ if __name__ == '__main__': ### 提示eSIM卡未插卡 -请参考Quecptyhon官网wik蜂窝无线网卡[网络异常处理]()。 +请参考QuecPtyhon官网wik蜂窝无线网卡[网络异常处理](https://python.quectel.com/doc/Application_guide/zh/network-comm/nic/cellular/exception-handling.html#开机时网络异常处理)。 + diff --git a/docs/Application_guide/zh/network-comm/sim/Common-exception-handling.md b/docs/Application_guide/zh/network-comm/sim/Common-exception-handling.md index 866fd518ffd668977c0b0804499b0a0fc63bccea..e5f4a867e58638c8a8060fae12939dfa3a5692bd 100644 --- a/docs/Application_guide/zh/network-comm/sim/Common-exception-handling.md +++ b/docs/Application_guide/zh/network-comm/sim/Common-exception-handling.md @@ -1,5 +1,5 @@ # 常见异常处理 -SIM卡状态异常以及注网、拨号异常,请参考Quecpython官网wiki蜂窝无线网卡[网络异常处理]()部分 +SIM卡状态异常以及注网、拨号异常,请参考QuecPython官网wiki蜂窝无线网卡[网络异常处理](https://python.quectel.com/doc/Application_guide/zh/network-comm/nic/cellular/exception-handling.html)部分 ## 无法发短信 * 检查SIM卡状态是否异常。 @@ -19,8 +19,9 @@ SIM卡状态异常以及注网、拨号异常,请参考Quecpython官网wiki蜂 ## 注网拨号成功URL无法访问 * SIM卡是否欠费,运营商不转发对端回复数据或不转发请求报文到对端。如欠费请充费。 -* 其他异常情况参考Quecpython官网wiki蜂窝无线网卡[网络异常处理]()部分。 +* 其他异常情况参考QuecPython官网wiki蜂窝无线网卡[网络异常处理](https://python.quectel.com/doc/Application_guide/zh/network-comm/nic/cellular/exception-handling.html)部分。 ## 某些协议数据不能正常交互 * 对于此类SIM卡运营商是否对指定的某些协议做了限制,例如NTP协议,某些运营商对NTP协议限制只能发送到指定的NTP服务地址,否则无法交互。和运营商核实,开通此类业务。 -* 其他异常情况参考Quecpython官网wiki蜂窝无线网卡[网络异常处理]()部分。 +* 其他异常情况参考QuecPython官网wiki蜂窝无线网卡[网络异常处理](https://python.quectel.com/doc/Application_guide/zh/network-comm/nic/cellular/exception-handling.html)部分。 + diff --git a/docs/Application_guide/zh/network-comm/sim/Frequently-Asked-Questions.md b/docs/Application_guide/zh/network-comm/sim/Frequently-Asked-Questions.md index 64773bfd7bc037f124c7dc322aae32b001c54bfd..cecf445cb5b2b6a7bb7e3925cba8587ec82a2f63 100644 --- a/docs/Application_guide/zh/network-comm/sim/Frequently-Asked-Questions.md +++ b/docs/Application_guide/zh/network-comm/sim/Frequently-Asked-Questions.md @@ -2,13 +2,13 @@ ## 新办理SIM卡首次使用需要做什么 新办理SIM卡一般需要激活SIM卡,可以通过电话或者运营商提供的url地址进行操作。 ## SIM卡为什么无法发送短信 -* 未能正常设置短信验证码 +* 未能正常设置短信中心号码 * 未开通短信业务 * 运营商不支持 * 未正常联网 ## 为什么不能拨打电话 -* SIM卡是未流量卡不支持打电话 +* SIM卡是流量卡不支持打电话 * 设备不在服务区 * 信号太弱 * 设备未能正常注网 diff --git a/docs/Application_guide/zh/network-comm/sim/Quecpython-SIM-function-application-example.md b/docs/Application_guide/zh/network-comm/sim/Quecpython-SIM-function-application-example.md index 1ecb0fa228af2ad0d9982aba22f8b34370fa9c06..a078535aa999ec3125bbf4b4b2b6c196edf145ae 100644 --- a/docs/Application_guide/zh/network-comm/sim/Quecpython-SIM-function-application-example.md +++ b/docs/Application_guide/zh/network-comm/sim/Quecpython-SIM-function-application-example.md @@ -1,770 +1,827 @@ -# Quecpython SIM卡API说明 - -## 查询SIM卡信息 - -### 查询IMSI - -用户可通过如下接口获取SIM卡的IMSI号码,以方便用户对IMSI的应用。 - -接口如下: - -```python -sim.getImsi() -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -imsi = sim.getImsi() -print("Get IMSI : {}".format(imsi)) - -``` - -### 查询ICCID - -用户可通过如下接口查询SIM卡的ICCID,以方便用户对SIM卡的ICCID的应用。 - -接口如下: - -```python -sim.getIccid() -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -iccid = sim.getIccid() -print("Get IMSI : {}".format(iccid)) - -``` - - - -### 查询电话号码 - -用户可通过如下接口查询SIM卡电话号码,SIM电话号码需要先设置后查询。 - -接口如下: - -```python -sim.getPhoneNumber() -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -phone_num = sim.getPhoneNumber() -print("Get Phone Number is : {}".format(phone_num)) - -``` - -### 应用场景 - -应用程序启动后,等待注网成功,然后查询SIM卡信息,为后续处理业务做准备。 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim -import checkNet - -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("接口返回失败") - exit() - if sim_status != 1: - print("Get SIM status : {}".format(sim_status_dict[sim_status])) - 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)) - exit() - - # 3、查询开机注网后的SIM卡信息 - - imsi = sim.getImsi() - if type(imsi).__name__ == 'int': - print("Get IMSI failed !") - exit() - print("Get IMSI is : {}".format(imsi)) - - iccid = sim.getIccid() - if type(iccid).__name__ == 'int': - print("Get ICCID failed !") - exit() - print("Get ICCID is : {}".format(iccid)) - - phone_number= sim.getPhoneNumber() - if type(phone_number).__name__ == 'int': - print("Get phone_number failed !") - exit() - print("Get phone number is : {}".format(phone_number)) - -``` - - - -## 查询SIM卡状态 - -用户可通过如下接口获取当前SIM卡的状态,通过SIM卡状态判断SIM卡是否可以正常使用。 - -接口如下: - -``` -sim.getStatus() -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim -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:"未知状态" -} - -sim_status = sim.getStatus() -if sim_status not in sim_status_dict: - print("接口返回失败") - exit() - if sim_status != 1: - print("Get SIM status status : {}".format(sim_status_dict[sim_status])) - 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卡的使用安全。 - -接口如下: - -```python -sim.enablePin(pin) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -result = sim.enablePin("1234") -print("Enable PIN : {}".format(result)) - -``` - - - -### 关闭PIN验证 - -用户可通过如下接口关闭PIN码验证功能,在保证SIM卡是在安全的环境下使用时,可以关闭PIN码验证功能来简化应用程序。 - -接口如下: - -```python -sim.disablePin(pin) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -#根据实际PIN码输入,此处"1234"为示例PIN码 -result = sim.disablePin("1234") -print("Disable PIN : {}".format(result)) - -``` - - - -### PIN验证 - -用户可通过如下接口来完成SIM卡的PIN码验证,开启PIN码验证后,SIM卡需完成PIN码验证后才能将状态将切换到正常状态,之后应用程序才能进行业务处理。 - -接口如下: - -```python -sim.verifyPin(pin) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -#根据实际PIN码输入 -result = sim.verifyPin("1234") -print("Verify PIN result is : {}".format(result)) -``` - - - -### 修改PIN - -用户可定期通过如下接口修改SIM卡的PIN码,提高SIM卡使用的安全性。 - -接口如下: - -```python -sim.changePin(oldPin, newPin) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -sim.changePin("1234", "4321") -``` - -### 应用场景 - -用户为了安全应用SIM卡,需要在开启PIN码验证功能的情况下进行业务处理。 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim -import checkNet - -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("接口返回失败") - 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!") - exit() - - # 验证成功后关闭PIN码验证,下次不再需要进行PIN码验证 - # result = sim.disablePin(PIN) - #if result != 0: - # print("Error PIN ! Please input right PIN!") - # exit() - - # 查询SIM状态 - sim_status = sim.getStatus() - if sim_status not in sim_status_dict: - print("接口返回失败") - exit() - if sim_status != 1: - print("Get SIM status : {}".format(sim_status_dict[sim_status])) - 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) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -sim.unblockPin("12345678", "0000") - -``` - -## 电话薄功能 - -用户在实际项目应用过程中,如需保存对端电话号码,需要用到电话薄功能。此接口可以提供保存电话号码信息的功能。此功能接口支持情况请参考Quecpython官网wiki[电话薄功能](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#%E7%94%B5%E8%AF%9D%E7%B0%BF%E5%8A%9F%E8%83%BD) - -### 读取电话薄 - -用户可通过如下接口读取电话薄。其中电话号码存储位置参考Quecpython官网wiki中`sim.readPhonebook()`[接口参数描述](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#%3Ccode%3Esim.readPhonebook%3C/code%3E)。需注意start-end差值需要小于等于20。 - -接口如下: - -```python -sim.readPhonebook(storage, start, end, username) -``` - -示例 - -```python -# -*- 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) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -# 保存Tom电话号码保存到SIM卡电话薄索引位置1的位置上 -sim.writePhonebook(9, 1, 'Tom', '18144786859') - -``` - -### 应用场景 - -在项目运行中,获取到电话号码,并保存电话号码到SIM卡电话薄中。 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -def save_phone_number_to_simbook(index,name,phonenumber,type = 0 ): - # type = 0,如果设置保存电话号码位置已经存在电话号码,直接返回,不覆盖保存 - if type == 0: - # 查询当前位置是否已有电话号码信息 - phone_info = sim.readPhonebook(9, index, index, "") - 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[热插拔功能](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#%E7%83%AD%E6%8F%92%E6%8B%94%E5%8A%9F%E8%83%BD) - -### 注册热插拔回调 - -用户可通过如下接口注册SIM卡热插拔回调函数。 - -接口如下: - -```python -sim.setCallback(usrFun) -``` - -示例 - -```python -# -*- 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卡热插拔功能的当前配置信息,根据配置信息可以判断当前是否开启了热插拔功能。 - -接口如下: - -```python -sim.getSimDet() -``` - -示例 - -```python -# -*- 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卡热插拔功能。 - -接口如下: - -```python -sim.setSimDet(switch, triggerLevel) -``` - -示例 - -```python -# -*- 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卡插拔事件)。 - -```python -# -*- 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卡切卡功能](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#SIM%E5%8D%A1%E5%88%87%E5%8D%A1%E5%8A%9F%E8%83%BD)。 - -### 注册切卡回调函数 - -用户可通过如下接口注册回调函数监测切卡事件。当发生了切卡事件,系统将通过注册的回调函数发出切卡事件通知应用层,应用层收到切卡事件通知后,将进行切卡导致的网络异常情况的处理。 - -接口如下: - -```python -sim.setSwitchcardCallback(usrFun) -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim -import net - -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。 - -接口如下 : - -```python -sim.getCurSimid() -``` - -示例 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim - -simid = sim.getCurSimid() -print("Current SIM is : {}".format(simid)) -``` - - - -### 切换SIM卡 - -用户可通过如下接口切换到指定SIM卡。如当前SIM卡出现不可恢复的异常网络情况,可用此接口将正在使用的SIM卡切换到另一张SIM卡,使应用程序可以继续处理业务。 - -接口如下: - -```python -sim.switchCard(simId) -``` - -示例 - -```python -# -*- 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卡。 - -```python -# -*- coding: UTF-8 -*- -#示例 -import sim -import net - -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("接口返回失败") - 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) - -``` - - +# SIM卡API说明 + +## 查询SIM卡信息 + +### 查询IMSI + +用户可通过如下接口获取SIM卡的IMSI号码,以方便用户对IMSI的应用。 + +接口如下: + +```python +sim.getImsi() +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +imsi = sim.getImsi() +print("Get IMSI : {}".format(imsi)) + +``` + +### 查询ICCID + +用户可通过如下接口查询SIM卡的ICCID,以方便用户对SIM卡的ICCID的应用。 + +接口如下: + +```python +sim.getIccid() +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +iccid = sim.getIccid() +print("Get IMSI : {}".format(iccid)) + +``` + + + +### 查询电话号码 + +用户可通过如下接口查询SIM卡电话号码,SIM电话号码需要先设置后查询。 + +接口如下: + +```python +sim.getPhoneNumber() +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +phone_num = sim.getPhoneNumber() +print("Get Phone Number is : {}".format(phone_num)) + +``` + +### 查询信息应用场景 + +应用程序启动后,等待注网成功,然后查询SIM卡信息,为后续处理业务做准备。 + +```python +# -*- 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() +``` + +示例 + +```python +# -*- 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卡的使用安全。 + +接口如下: + +```python +sim.enablePin(pin) +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +result = sim.enablePin("1234") +print("Enable PIN : {}".format(result)) + +``` + + + +### 关闭PIN验证 + +用户可通过如下接口关闭PIN码验证功能,在保证SIM卡是在安全的环境下使用时,可以关闭PIN码验证功能来简化应用程序。 + +接口如下: + +```python +sim.disablePin(pin) +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +#根据实际PIN码输入,此处"1234"为示例PIN码 +result = sim.disablePin("1234") +print("Disable PIN : {}".format(result)) + +``` + + + +### PIN验证 + +用户可通过如下接口来完成SIM卡的PIN码验证,开启PIN码验证后,SIM卡需完成PIN码验证后才能将状态将切换到正常状态,之后应用程序才能进行业务处理。 + +接口如下: + +```python +sim.verifyPin(pin) +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +#根据实际PIN码输入 +result = sim.verifyPin("1234") +print("Verify PIN result is : {}".format(result)) +``` + + + +### 修改PIN + +用户可定期通过如下接口修改SIM卡的PIN码,提高SIM卡使用的安全性。 + +接口如下: + +```python +sim.changePin(oldPin, newPin) +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +sim.changePin("1234", "4321") +``` + +### PIN码应用场景 + +用户为了安全应用SIM卡,需要在开启PIN码验证功能的情况下进行业务处理。 + +```python +# -*- 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) +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +sim.unblockPin("12345678", "0000") + +``` + +## 电话薄功能 + +用户在实际项目应用过程中,如需保存对端电话号码,需要用到电话薄功能。此接口可以提供保存电话号码信息的功能。此功能接口支持情况请参考QuecPython官网wiki[电话薄功能](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#%E7%94%B5%E8%AF%9D%E7%B0%BF%E5%8A%9F%E8%83%BD) + +### 读取电话薄 + +用户可通过如下接口读取电话薄。其中电话号码存储位置参考QuecPython官网wiki中`sim.readPhonebook()`[接口参数描述](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#%3Ccode%3Esim.readPhonebook%3C/code%3E)。需注意start-end差值需要小于等于20。 + +接口如下: + +```python +sim.readPhonebook(storage, start, end, username) +``` + +示例 + +```python +# -*- 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) +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +# 保存Tom电话号码保存到SIM卡电话薄索引位置1的位置上 +sim.writePhonebook(9, 1, 'Tom', '18144786859') + +``` + +### 电话薄应用场景 + +在项目运行中,获取到电话号码,并保存电话号码到SIM卡电话薄中。 + +```python +# -*- 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[热插拔功能](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#%E7%83%AD%E6%8F%92%E6%8B%94%E5%8A%9F%E8%83%BD) + +### 注册热插拔回调 + +用户可通过如下接口注册SIM卡热插拔回调函数。 + +接口如下: + +```python +sim.setCallback(usrFun) +``` + +示例 + +```python +# -*- 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卡热插拔功能的当前配置信息,根据配置信息可以判断当前是否开启了热插拔功能。 + +接口如下: + +```python +sim.getSimDet() +``` + +示例 + +```python +# -*- 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卡热插拔功能。 + +接口如下: + +```python +sim.setSimDet(switch, triggerLevel) +``` + +示例 + +```python +# -*- 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卡插拔事件)。 + +```python +# -*- 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卡切卡功能](https://python.quectel.com/doc/API_reference/zh/iotlib/sim.html#SIM%E5%8D%A1%E5%88%87%E5%8D%A1%E5%8A%9F%E8%83%BD)。 + +### 注册切卡回调函数 + +用户可通过如下接口注册回调函数监测切卡事件。当发生了切卡事件,系统将通过注册的回调函数发出切卡事件通知应用层,应用层收到切卡事件通知后,将进行切卡导致的网络异常情况的处理。 + +接口如下: + +```python +sim.setSwitchcardCallback(usrFun) +``` + +示例 + +```python +# -*- 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。 + +接口如下 : + +```python +sim.getCurSimid() +``` + +示例 + +```python +# -*- coding: UTF-8 -*- +#示例 +import sim + +simid = sim.getCurSimid() +print("Current SIM is : {}".format(simid)) +``` + + + +### 切换SIM卡 + +用户可通过如下接口切换到指定SIM卡。如当前SIM卡出现不可恢复的异常网络情况,可用此接口将正在使用的SIM卡切换到另一张SIM卡,使应用程序可以继续处理业务。 + +接口如下: + +```python +sim.switchCard(simId) +``` + +示例 + +```python +# -*- 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卡。 + +```python +# -*- 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) + +``` + + diff --git a/docs/Application_guide/zh/network-comm/sim/README.md b/docs/Application_guide/zh/network-comm/sim/README.md index 8df489e1878390f47843c91d44a88a99dc9f5a3b..7b4a69c33098cda923353a6a8451ce2f972b6f10 100644 --- a/docs/Application_guide/zh/network-comm/sim/README.md +++ b/docs/Application_guide/zh/network-comm/sim/README.md @@ -56,7 +56,7 @@ vSIM,全称为Virtual SIM,即虚拟SIM卡。它的核心思想是把物理SI -## QuecPython支持的SIM卡类型 +## 支持的SIM卡类型 QuecPython所有模组都支持卡片式SIM卡,部分平台的模组支持eSIM,但是需要定制版本才能支持,QuecPython不支持vSIM。目前,支持定制eSIM的平台如下: diff --git a/docs/Application_guide/zh/network-comm/sim/Troubleshoot-SIM-card-abnormalities.md b/docs/Application_guide/zh/network-comm/sim/Troubleshoot-SIM-card-abnormalities.md index b143d1d305436400848adcb5c6fcdbda9f416d10..c5281fe722ee46f886174dbe756f2cc10983d235 100644 --- a/docs/Application_guide/zh/network-comm/sim/Troubleshoot-SIM-card-abnormalities.md +++ b/docs/Application_guide/zh/network-comm/sim/Troubleshoot-SIM-card-abnormalities.md @@ -56,7 +56,7 @@ SIM卡状态异常是指通过`sim.getStatus()`这个API查询的值既不是0 步骤3:重启设备,再次查询SIM卡状态,确认是否恢复正常。 - + - 当SIM卡状态值是3时 diff --git a/docs/Application_guide/zh/network-comm/sms.md b/docs/Application_guide/zh/network-comm/sms.md index aa2b19b07e1ec512d2c1dfd30e48c405df2f1bc0..b635eb531e2c0f2a4d31b08193b5376776ec1a17 100644 --- a/docs/Application_guide/zh/network-comm/sms.md +++ b/docs/Application_guide/zh/network-comm/sms.md @@ -255,7 +255,7 @@ PDU类型对于SMS-DELIVER,结构图如下: ### 短信接收流程 -短信先从网络接收到短信,之后移动设备终端回复CP-ACK报文到网络,当短信解析完成,移动设备终端再次发送RP-ACK,网络层回复CP-ACK。 +移动设备先从网络侧接收到短信,之后移动设备终端回复CP-ACK报文到网络,当短信解析完成,移动设备终端再次发送RP-ACK,网络层回复CP-ACK。 如下图: @@ -1240,7 +1240,7 @@ SM和ME短信存储空间均已满,导致短信接收不到,只有清除短 * 应用场景7 -短信存储空间为SM,SM存储空间已满的情况下,想保留短信同时也保证短信可以正常接收,可以更换短信接收存储空间为ME。如果ME存储空间也已满。只有删除短信,才能正常接收到短信。 +短信存储空间为SM,SM存储空间已满的情况下,想保留短信同时也保证短信可以正常接收,可以更换短信接收存储空间为ME。如果ME存储空间也已满,只有删除短信,才能正常接收到短信。 * 应用场景8 diff --git a/docs/Application_guide/zh/sidebar.yaml b/docs/Application_guide/zh/sidebar.yaml index 4801ff89007aa2ea3aeed64b0583c677a58736fa..03aecda5de2ceb634919c612cd14b7508344e033 100644 --- a/docs/Application_guide/zh/sidebar.yaml +++ b/docs/Application_guide/zh/sidebar.yaml @@ -170,7 +170,7 @@ items: file: network-comm/sim/SIM-APDU.md - label: SIM双卡功能 file: network-comm/sim/SIM-dual-SIM-capability.md - - label: QuecPython SIM功能应用示例 + - label: SIM功能应用示例 file: network-comm/sim/Quecpython-SIM-function-application-example.md - label: 常见异常处理 file: network-comm/sim/Common-exception-handling.md @@ -230,4 +230,4 @@ items: - label: Helios SDK开发指南__进阶 file: helios-sdk/junior.md - label: Helios SDK开发指南__高级 - file: helios-sdk/advanced.md \ No newline at end of file + file: helios-sdk/advanced.md diff --git a/docs/Application_guide/zh/system/Timer.md b/docs/Application_guide/zh/system/Timer.md index c947dac69c556c9a4e0271124f927bcdaac67b9d..63d8d4792c41dabdc9c89ebd072a6eece911316d 100644 --- a/docs/Application_guide/zh/system/Timer.md +++ b/docs/Application_guide/zh/system/Timer.md @@ -54,7 +54,7 @@