SIM(卡应用)
# 简介
sim卡是物联网中最常用的功能,本文介绍如何用开发板,和PC端搭建一个sim卡读取的功能演示。
# API说明
socket的API在LuatOS-Air lib有做封装,建议直接用lib的API接口。
|API接口| 描述|
| --- | --- |
| sim.getIccid()|获取sim卡的iccid|
| sim.getImsi()|获取sim卡的imsi|
|sim.getMcc()|获取sim卡的mcc|
| sim.getMnc()|获取sim卡的getmnc|
| sim.getStatus()|获取sim卡的状态|
> 详细的API介绍见[sim API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2292)
# 示例
本文以demo\simId这个DEMO为例做演示。
1.插入一张能识别的sim卡,到sim0卡座上,usb线接到左边的usb口子上,注意不要接到右边的串口usb上,开关拨到on位置,按开机键1s以上开机。
2.修改demo:
>(1)开启一个任务设置卡座id号(1.3基线固件可以在sim卡0和sim卡1自动识别,1.2基线不行)
```lua
--sim_id :sim卡的卡座id号
local sim_id=0
sys.taskInit(function()
--调用sim.lua中的设置sim卡id号函数
sim.setId(sim_id)
sys.wait(10000)
end)
```
>(2)开启一个循环定时器,调用sim.lua中函数,打印sim卡参数
```lua
sys.timerLoopStart(function ()
--获取sim卡iccid
ril.request("AT+ICCID")
log.info("sim_iccid:",sim.getIccid())
--获取sim卡imsi
log.info("sim_imsi:",sim.getImsi())
--获取sim卡status
log.info("sim_status:",sim.getStatus())
--获取sim卡id
log.info("sim_id:",sim.getId())
end,1000)
```
3.在了解并修改了DEMO后将demo和对应的底包下载到开发板,下载的方式这里不详细说明请参考[快速入门的烧录章节。](https://hmi.wiki.luatos.com/doc/65042949/e6zPC3k9/pzudReb2#nav_3 "环境搭建方法")
4.下载完成后重启,可以看到工具中打印的信息:

------
# 常见问题
- **为什么读不到sim卡?**
由于原因种类较多,按一下步骤排查:
```
1:看模块开机没?at指令能不能用?sim卡放到别的机器上是不是ok?
2:看模块与卡座之间连线有没有问题,去掉ESD器件和线路上的滤波电容,检查原理图和PCB与实物是否相符,尤其是卡座pcb,原理图是否与规格书上引脚编号是否一致。
3:开机瞬间用示波器测试下sim_vdd管脚波形,如果波形有1.8v-3.3v-0v 变化,一般是卡座和模块之间问题,要识别到卡,才会有电压输出。
4:如果以上都排除了,重新烧下固件看下。
```
- **为什么sim卡供电脚没电压?**
```
1:sim卡要识别到卡才会有电压输出
2:在模块开机后10到15s左右,SIM_VDD会拉高到1.8V左右,开始找卡,如果未能与SIM卡通信成功,则短时关闭再拉高到3V左右去找卡,如果还未找到,就关闭SIM_VDD,整个过程6s左右。
```
- 精确测量sim卡各[引脚波形](http://doc.openluat.com/article/634/0)
- **为什么接上sim卡,不能插拔检测**
如果用到gpio23做检测脚,at固件的1623,1624版本默认输出是低电平,用到这个脚检测要注意,其他版本默认是高电平1.8v。
- **专网卡访问白名单**
用定向Ip的物联网卡,需要把域名或IP加入白名单才能使用,下面列出模块会访问的域名或IP服务器。
DNS服务器,可以通过AT+CDNSCFG?查询默认的服务器,如果需要修改,可以通过AT+CDNSCFG=ip1,ip2进行修改。(V3035后续版本支持)
NTP时间同步,会在下面列出的服务器中随机选一下,可以根据需要修改。
| 功能| 地址| 端口 | 协议 |
| --- | --- | --- | --- |
| 远程升级| iot.openluat.com | 80 | http |
| 日志服务|dev_msg1.openluat.com| 12425| udp|
| 基站WIFI定位| bs.openluat.com | 12412和 12411| udp|
| AGPS星历下载| download.openluat.com | 80 | http |
| NTP时间同步| cn.pool.ntp.org | 123 | udp |
| NTP时间同步| edu.ntp.org.cn | 123 | udp |
| NTP时间同步| cn.ntp.org.cn| 123 | udp |
| NTP时间同步| s2c.time.edu.cn| 123 | udp |
| NTP时间同步| time1.aliyun.com | 123 | udp |
| NTP时间同步| tw.pool.ntp.org | 123 | udp |
| NTP时间同步| 0.cn.pool.ntp.org | 123 | udp |
| NTP时间同步| 0.tw.pool.ntp.org | 123 | udp |
| NTP时间同步| 1.cn.pool.ntp.org |123 | udp |
| NTP时间同步| 1.tw.pool.ntp.org | 123 | udp |
| NTP时间同步| 3.cn.pool.ntp.org | 123 | udp |
| NTP时间同步| 3.tw.pool.ntp.org| 123 | udp |
- **卡用到没流量了,会有什么提示回调吗?**
没有,可以通过网络业务逻辑看门狗task控制软重启。参考方法如下:
```lua
--网络业务逻辑看门狗task
socketAppDogCo = sys.taskInit(function()
while true do
--连续5分钟没有喂狗,根据项目需求自行修改时长
if sys.wait(300000) == nil then
sys.restart("socketApp exception software dog timeout")
end
end
end)
--喂狗代码(根据产品业务逻辑,在适当的位置去调用):
--如何去确认这个“适当的位置”呢?下面列举几种常见的场景:
--1、如果模块和服务器之间有应用心跳的应答机制,则可以在模块每次收到服务器的心跳应答时去喂狗
--2、如果没有心跳应答机制,可以在连接服务器成功后,起个定时器,每隔一段时间去喂一次狗;连接断开时,关闭这个喂狗定时器
--3、如果模块定时会向服务器发送数据,可以在每次发送数据成功后,去喂狗
--sim卡识别异常、网络注册异常、PDP激活异常、socket连接异常、socket发送数据异常、socket接收数据异常时,都可以通过网络业务逻辑看门狗控制软重启
coroutine.resume(softwareDogCo,"feed")