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.下载完成后重启,可以看到工具中打印的信息: ![image.png](https://cos.easydoc.net/22753220/files/l0c0zu82.png) ------ # 常见问题 - **为什么读不到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")