一、Luatools使用问题
使用教程参考:http://ask.openluat.com/article/4
1.1、烧录下载
1.1.1、2G模块无法烧录下载
1. 检查下载线连接是否正确,下载线要连接模块的host_txd、host_rxd、gnd
2. 检查下host_txd、host_rxd是否与其他管脚短路,特别是host_txd和vddio相邻,可能会因为贴片或者焊接问题导致短路
3. 下载线不稳定,更换ft232/cp2102等芯片串口线对比试一下
4. 检查供电以及开机是否正常,测量vbat 3.6V到4.2V,并拉低pwrkey 2000ms开机
5. 检查下载口电平是否匹配,支持2.8V,兼容3.3V
6. 更换电脑usb口或者更换电脑对比测试
7. 模块可能损坏【静电击穿、炉温过高可能导致损坏】,更换模块对比测试确认
8. 如果出现下载过程中失败问题,参考如下顺序排查
1) 供电可能不稳定,使用稳定的电源供电,可以直接用稳压电源对vbat供电对比确认
2) 下载线可能不稳定,更换ft232/cp2102等芯片串口线对比试一下
更多详细说明参考:https://oldask.openluat.com/article/17
1.1.2、2G开发板无法烧录下载
1. 参考开发板使用手册,确认跳线帽使用是否正常
2. 开发板上已经有usb转串口芯片,所以要使用micro usb线,不要使用usb转串口线
3. 检查供电以及开机是否正常,测量vbat
3.6V到4.2V,并长按pwrkey开机
4. 检查下载口电平是否匹配,支持2.8V,兼容3.3V
5. 更换电脑usb口或者更换电脑对比测试
6. 模块可能损坏【静电击穿、炉温过高可能导致损坏】,更换模块对比测试确认
7. 如果出现下载过程中失败问题,参考如下顺序排查
1) 供电可能不稳定,使用稳定的电源供电,可以直接用稳压电源对vbat供电对比确认
2) 下载线可能不稳定,更换ft232/cp2102等芯片串口线对比试一下
1.1.3、4G模块(开发板)无法烧录下载
1. 检查下载线连接是否正确,如果是模块,要连接模块的usb_dp、usb_dm、vbus、gnd;如果是开发板,要连接usb口,luatools准备好下载后,拨动开关拨到on位置
2. 需要使用稳定的usb下载线,不要使用usb转串口下载线
3. 检查供电是否正常,测量vbat 3.6V到4.2V
4. 要安装驱动,参考:http://ask.openluat.com/article/92,注意:安装好驱动之后,在烧录固件过程中,设备管理器中会出现下图所示的下载驱动
烧录固件,正常开机后,设备管理器中会出现下图所示的3种驱动
如果没有出现这些端口,或者有感叹号,表示驱动没有安装成功,请重新安装驱动
注意:如果电脑安装了USBPcap,会造成下载驱动有感叹号,从而造成无法烧录固件,但是可以正常抓取日志。如果遇到此问题,请删除USBPcap后再试;此问题可以参考下图操作:
5. 更换电脑usb口或者更换电脑对比测试
6. 模块可能损坏【静电击穿、炉温过高可能导致损坏】,更换模块或者开发板对比测试确认
7. 如果出现下载过程中失败问题,参考如下顺序排查
1) 供电可能不稳定,使用稳定的电源供电,可以直接用稳压电源对vbat供电对比确认
2) 下载线可能不稳定,更换稳定的usb下载线
1.1.4、生成量产文件时的加密功能有什么用
如果项目有安全性方便的考虑,防止别人拿到设备后,读取自己写的脚本文件,可以在生成量产文件时,打开加密功能选项,输入密码,Luatools对所有脚本和其他资源文件进行加密,即使别人拿到了加密设备,也无法解密出原始的脚本和资源文件
1.1.5、4G开发模式下的“USB打印Trace、UART1打印Trace、UART2打印Trace”是什么功能
可以选择输出脚本日志的端口,默认是USB输出日志,如果烧录或者生成量产文件时,选择了指定端口输出日志,注意在Luatools主界面,选择对应的打印口,这样在Trace窗口才能输出日志
1.1.6、Luat开发方式下可以烧录哪种类型的文件
任何类型的文件都可以烧录,例如mp3、bmp、png、jpg、txt、自定义后缀的文件等等,烧录后,脚本如何访问这些文件,参考1.1.7章节
1.1.7、脚本代码中如何读取通过Luatools烧录进模块的文件
通过Luatools烧录进模块的文件,开机启动时,根据不同类型的文件,会自动创建不同的目录保存这些文件,完整的文件路径(filePath)定义如下:
2G模块:
Ø 如果是lua文件,例如xxx.lua:非加密下载时,文件路径为/lua/xxx.lua;加密下载时,文件路径为/lua/xxx.luae
Ø 如果是非lua文件,例如xxx.mp3:非加密下载时,文件路径为/ldata/xxx.mp3;加密下载时,文件路径为/ldata/xxx.mp3e
4G模块:
Ø 无论什么格式的文件,例如xxx.lua,文件路径都为:/lua/xxx.lua
考虑到对内存的消耗过大可能会造成内存不足的问题:如果文件较小(小于4KB),可以使用io.readFile(filePath)一次性全部读出;如果文件较大(大于4KB),可以使用io.readStream(filePath, offset,
len)分段读出
1.1.8、Luat开发方式下可以烧录某个项目的部分文件吗?
不可以。每次烧录,都会删除模块中之前的所有脚本和资源文件,所以每次烧录,必须烧录某个项目的所有脚本和资源文件(包括lib脚本文件)
1.1.9、打开串口失败
Luatools打开串口时,会对波特率做校验,如果串口芯片的波特率满足不了要求,会打开失败
2G模式下,波特率为921600;4G模式下,波特率为115200
目前遇到过如下几种打开串口失败的情况:
1. 使用了PCIE转串口卡,这种串口卡不支持921600波特率,所以在2G开发模式下会提示打开失败,在4G模式下可以正常打开
1.2、日志输出
1.2.1、2G模块(开发板)无法输出日志
1. 参考1.1.1和1.1.2章节,先检查一下数据线、供电、跳线问题
2. 联系代码开发者,确认一下代码中是否关闭了日志输出功能
3. 联系代码开发者,确认一下代码中是否配置了host口、uart1或者uart2输出日志功能,Luatools选择的打印口要和代码配置一致
1.2.2、4G模块(开发板)无法输出日志
1. 参考1.1.3章节,先检查一下数据线、供电问题
2. AT版本固件不支持通过Luatools trace窗口输出日志,通过sscom等串口工具,连接ASR Modem Device AT口,发送ATI命令检查一下版本号是否正确
3. 联系代码开发者,确认一下代码中是否关闭了日志输出功能
4. 联系代码开发者,确认一下代码中是否配置了usb口、uart1或者uart2输出日志功能,Luatools主界面选择的打印口要和代码配置一致
5. 参考1.1.5章节,确认下烧录或者打包时选择的打印Trace口是否和Luatools主界面选择的打印口一致
1.2.3、日志输出过程中,突然停止输出
1. 如果是4G模块usb口输出日志,点击“关闭端口”后再点击“打开端口”;如果是4G 模块串口或者2G模块输出日志,点击“重启端口”
2. 参考1.2.1和1.2.2排查
1.2.4、4G模块USB输出日志时,会丢失开机过程的部分日志
4G模块开机时,部分电脑识别usb口过慢,导致开机部分的日志可能丢失;遇到此类问题,可以参考1.1.5章节,使用uart1或者uart2输出日志
1.2.5、为什么系统状态、信号强度、版本类型、框架类型、软件版本的内容有时不显示或者显示不正确
这些内容都是从抓取的日志中分析关键字解析出来的,如果不是从开机开始抓取日志,会丢失一些日志,从而导致解析失败。例如软件版本是搜索poweron reason解析出来的,如果没有抓到这一行日志,软件版本就会解析失败,或者如果自己写的应用脚本中也会输出poweron reason关键字日志,也可能导致解析异常。所以,这些信息的解析仅仅是作为参考方便开发者分析问题,要进一步准确分析问题,一定要直接分析日志
1.2.6、Luatools可以抓取、输出哪几种日志
1. 可以抓取、实时显示、自动保存Luat版本的脚本日志,脚本日志文件自动保存在工具根目录的log/*.trc中
2. 可以抓取、自动保存4G模块AT版本或者Luat版本的底层日志,底层日志文件自动保存在工具根目录的log\4gdiag\*. sdl中,但是不可以实时显示;如果需要调试4G模块AT版本问题,可以用串口工具直接监控AT口的命令交互日志【参考:https://oldask.openluat.com/article/983】或者单片机打印出来AT交互日志来分析问题;或者吧sdl文件发给合宙技术支持人员分析
3. 不可以抓取2G模块AT版本日志。如果需要调试2G模块AT版本问题,可以用串口工具直接监控AT口的命令交互日志【参考:https://oldask.openluat.com/article/983】或者单片机打印出来AT交互日志来分析问题;或者按照合宙技术支持人员的要求,参考:http://ask.openluat.com/article/63来抓取日志
1.3、其他
1.3.1、Luatools无法启动、出现error 126
缺少vc_redist运行库,http://www.openluat.com/Product/file/asr1802/vc%E8%BF%90%E8%A1%8C%E5%BA%93%E5%90%88%E9%9B%86MSVBCRT_AIO_2018.07.30_X86+X64.exe下载安装后,重新运行Luatools
1.3.2、Luatools工作异常、闪退
1. 点击菜单“帮助->检查新版本”,更新最新版本
2. 检查电脑的任务管理中是否有多个luatools.exe,如果有,关闭所有后,再重启Luatools
3. 最新版本如果仍然有问题,提供Luatools根目录下的*failed.log给合宙技术支持人员分析
1.3.3、不小心删除了源码,有办法找回吗
1. Luatools根目录下ClearScr中会保存最后一次本地烧录或者生成量产文件时的所有源码文件
2. 如果第1步不是你想要的,找一个有源码的设备,联系合宙技术支持人员处理
1.3.4、如何抓取模块死机时的日志
1. 2G模块参考:http://ask.openluat.com/article/63
2. 4G模块参考:http://ask.openluat.com/article/910
1.3.5、是否有64位、Linux、Mac版本工具;是否支持xp系统
没有64位、Linux、Mac版本工具,Linux和Mac请使用虚拟机运行Luatools工具;支持部分XP系统,建议在WIN7以上 的系统上使用
1.3.6、为什么提示多个工具在运行
检查电脑的任务管理中是否有多个luatools.exe,如果有,关闭所有后,再重启Luatools
1.3.7、为什么设备一直在正常运行,但是coolwatcher抓日志过程中,会突然不输出日志
按照如下顺序尝试解决
1. 下载线可能不稳定,更换使用ft232芯片串口线;抓日志过程中最好不要频繁的碰到串口线,可能会受到干扰
2. 左下角的command编辑框中输入creconnect命令后回车【注意:host rx要和串口线连接,才能正常接收命令】
3. 重新插拔串口线,重启coolwatcher
如果左下角command编辑框中输入r 0命令后回车【注意:host rx要和串口线连接,才能正常接收命令】,有0xXXXXXXXX格式的数据返回,表示host口通信正常,没输出日志,可能是host寄存器受到干扰导致,此时参照下图将可能受到干扰的寄存器主动设置正常
二、量产烧录工具使用问题
2G模块量产烧录工具: http://www.openluat.com/Product/file/rda8955/RDA平台Lod客户升级工具2.5.7z
4G模块量产烧录工具: http://www.openluat.com/Product/file/asr1802/ASR平台core客户升级工具V1.3_Air720系列.7z
2.1、使用一拖多烧录时,出现后一个模块开始烧录,前一个模块烧录失败的问题
检查下夹具供电,使用稳定的电源给夹具供电;不要一个电源同时给多个夹具供电
2.2、4G模块烧录到最后,没有提示成功,提示“USB is Removed”
1. 更换一根好点儿usb线,或者更换一个电脑usb口,或者更换电脑试试
2. 工具目录下config/param.ini中,确认一下modleType配置是否正确
2.3、4G模块量产烧录工具打开失败
出现此问题,一般都是blf文件配置出错导致的,打开config/param.ini,检查下图中的core对应的blf文件配置是否正确
三、开关机(电源)问题
3.1、2G模块无法开机
1. 测量vddio引脚电压,如果是2.8V左右,表示已经正常开机,“无法开机”纯属误判;如果是低电平0V左右,表示没有开机
2. vbat引脚电压3.6V到4.2V,powerkey拉低至少2秒,才有可能开机;测量vbat引脚和powerkey状态,确认是否满足要求
3. 模块峰值需要2A电流,供电跌落不能太多
4. 注意:reset引脚拉低是关机功能,不是重启功能
5. 如果使用了硬件看门狗,可能因为硬件看门狗外围电路异常导致模块一直在重启,可参考20.10章节确认
6. 如果上电后,发现电流不跑,host口没有日志输出,可能是开机过程中发生了死机问题;在powerkey一直拉低自动开机模式下,如果vrtc外部供电,就会造成vbat放电过慢,在放电没有完全时进行上电,会导致死机
7. AT版本,上电后,如果发现电流不跑,日志跑到一半也停止了,网络指示灯正常闪烁,可能是开机过程中在某个task里死循环,曾经有一个客户的板子,开机时模块UART1_RX管脚被外部拉低导致模块一直有串口中断,导致死循环
8. AT版本,如果AT口输出NORMAL
POWER DOWN的URC提示,表示正常关机,有两种情况会导致这种关机
1) 开机状态下,检测到powerkey被拉低1.5秒以上时间
2) 收到了AT+CPOWD=1命令
3.2、2G模块无法关机
1. AT固件,开机状态下,powerkey引脚从高电平拉低1.5秒以上,或者发送AT+CPOWD命令,都会执行关机流程;如果采用了“powerkey一直拉低”的上电自动开机设计,则无法通过powerkey或者AT+CPOWD命令关机【固件后,检测到powerkey拉低,会再次自动开机】,只能vbat直接断电关机
2. Luat固件,开机状态下,require了lib中powerKey功能模块,配置了长按powerkey关机,长按powerkey按键,或者在脚本中直接调用rtos.poweroff()接口,都会执行关机流程;如果采用了“powerkey一直拉低”的上电自动开机设计,则无法通过powerkey或者rtos.poweroff()接口关机【固件后,检测到powerkey拉低,会再次自动开机】,只能vbat直接断电关机
3. 注意:模块烧录软件后,如果没有彻底断一次电,自动开机后,powerkey按键、AT+CPOWD命令、rtos.poweroff()接口都无法成功关机,实际的现象表现为:关机后,会一直不断重启。这个是芯片设计的一个缺陷,无法修改
3.3、4G模块无法开机
1. 测量V_GLOBAL_1V8引脚电压,如果是1.8V左右,表示已经正常开机,“无法开机”纯属误判;如果是低电平0V左右,表示没有开机
2. 如果引出了usb引脚,usb连接电脑,参考1.1.3章节第4步,持续观察20秒,看是否会稳定出现设备管理器中的3个端口,如果稳定出现,表示已经正常开机,“无法开机”纯属误判;如果没有出现,表示没有正常开机;如果出现后一闪而过,表示可能一直在异常重启,参考4.2章节处理
3. vbat引脚电压3.4V到4.3V,powerkey拉低至少2秒,才有可能开机;测量vbat引脚和powerkey状态,确认是否满足要求
4. 模块峰值需要2A电流,供电跌落不能太多
5. 将模块的第142脚:EXTON1N直接接地可以实现上电自动开机功能。需要注意,在上电自动开机模式下,将无法关机,只要VBAT管脚的电压大于开机电压,即使软件调用关机接口,模块仍然会再次开机。另外,在此模式下,要想成功自动开机,VBAT管脚电压仍然要大于软件设定的开机电压值(3.1V),如果不满足,模块会关闭,就会出现反复开关机的情况。
不建议把模块的第21脚:PWRKEY 直接接地来实现上电开机功能。假如把PWRKEY 直接接地了,此时再把RESET_IN_N 拉低超过15秒的话,模块内部的PMU会认为模块状态异常,强制断电,即使在RESET_IN_N释放以后模块也会一直处于关机状态,直到松开PWRKEY一段时间。
3.4、4G模块无法关机
1. AT固件,开机状态下,powerkey引脚从高电平拉低1.5秒以上,或者发送AT+CPOWD命令,都会执行关机流程;如果采用了“EXTON1N一直拉低”的上电自动开机设计,则无法通过powerkey或者AT+CPOWD命令关机【关机后,检测到EXTON1N拉低,会再次自动开机】,只能vbat直接断电关机
2. Luat固件,开机状态下,在脚本中直接调用rtos.poweroff()接口,都会执行关机流程;如果采用了“EXTON1N一直拉低”的上电自动开机设计,则无法通过rtos.poweroff()接口关机【关机后,检测到EXTON1N拉低,会再次自动开机】,只能vbat直接断电关机
3. 将模块的第142脚:EXTON1N直接接地可以实现上电自动开机功能。需要注意,在上电开机模式下,将无法关机,只要VBAT管脚的电压大于开机电压即使软件调用关机接口,模块仍然会再开机起来。另外,在此模式下,要想成功开机起来VBAT管脚电压仍然要大于软件设定的开机电压值(3.1V),如果不满足,模块会关闭,就会出现反复开关机的情况。
不建议把模块的第21脚:PWRKEY 直接接地来实现上电开机功能。假如把PWRKEY 直接接地了,此时再把RESET_IN_N 拉低超过15秒的话,模块内部的PMU会认为模块状态异常,强制断电,即使在RESET_IN_N释放以后模块也会一直处于关机状态,直到松开PWRKEY一段时间。
3.5、其他
3.5.1、有没有推荐的电池
建议选择18650或锂聚合物电池。供电必须满足3.7~4.2v,电压跌落不超过0.6v,最低不低于3.4v
3.5.2、为什么使用市电仍然无法正常工作
请检查电源动态响应能力。必要时vbat、gnd并电容
3.5.3、能否获取电量百分比
不能,只能获得电池电压。使用misc.getVbatt(),返回毫安。开发者自行根据电池的承认书去换算百分比(因为不同电池放电曲线各有差异)
3.5.4、为什么供电没问题却仍然无法开机、自动关机、或者异常重启
请用示波器检查供电有无跌落,万用表响应能力较差
3.5.5、客户示例:4G模块开机很慢,powerkey需要按16秒才能开机
RESET管脚与MCU直接相连,这样的话板子在上电时,MCU的IO反转可能会影响到模块的开机;RESET管脚需要用三极管驱动,或者加二极管隔离。
四、重启问题
关于重启问题的详细描述参考如下文章:
http://ask.openluat.com/article/27
http://ask.openluat.com/article/28
http://ask.openluat.com/article/29
http://ask.openluat.com/article/909
重要提醒:使用Luat固件开发时,一定要使用errDump功能,此功能对“量产投放市场的设备,远程调试初步定位问题”至关重要
4.1、2G模块重启
1. 如果是Luat二次开发模式,使用官方发布的AT固件或者Luat固件+随便一个demo,测试确认下,是不是自己写的软件有问题
2. vbat引脚电压3.6V到4.2V,使用示波器测量vbat电压是否有跌落;模块峰值需要2A电流,可使用直流稳压电源直接对vbat供电对比测试;如果有问题,参考:https://oldask.openluat.com/article/19分析处理
3. 如果使用了硬件看门狗,可能因为硬件看门狗外围电路异常导致模块一直在重启,可参考20.10章节确认
4. AT版本,如果无法抓到日志,直接联系合宙技术支持人员处理;如果可以抓到日志,按照如下步骤处理:
1) 如果出现“(0xffffffff)模块硬件上电中,正在启动”,表示硬件重启,直接按照第1步确认问题,同时确认下是否为外围单片机给模块断电复位引起的重启
2) 其他的重启,直接联系合宙技术支持人员按照如下方式处理
A. 合宙技术支持人员提供一个debug
assert版本的固件【注意:此固件仅供测试使用,不能用于量产】
B. 客户在MCU端开机发送AT*EXASSERT=1命令【注意:此命令会导致模块发生重启问题时,直接死机,仅测试使用,不能用于量产;测试设备使用完毕之后,再发送AT*EXASSERT=0恢复默认配置】
C. 如果有硬件看门狗机制,要从硬件上断开硬件看门狗;以防复现死机问题后,被硬件看门狗重启复位
D. 参考http://ask.openluat.com/article/63挂测复现问题死机问题后,保留死机现场,联系合宙技术支持人员远程分析
5. Luat版本,如果无法抓到日志,直接联系合宙技术支持人员处理;如果可以抓到日志,搜索poweron
reason:
1) reason为0,表示硬件重启,直接按照第1步确认问题,同时确认下是否为硬件看门狗或者外围单片机给模块断电复位引起的重启
2) reason为7,表示点击了Luatools的“重启模块”按钮控制的重启
3) reason为8,表示core中的软件看门狗重启,检查一下脚本中是否写了死循环的逻辑
4) reason为3,表示软件重启,在日志中搜索restart或者[E]或者traceback,分析原因自行解决;如果日志中搜索不到这些关键字,检查一下应用脚本中是否调用了rtos.restart()所致
5) 如果以上步骤都不能解决问题,直接联系合宙技术支持人员按照如下方式处理
A. 合宙技术支持人员提供一个debug
assert版本的固件【注意:此固件仅供测试使用,不能用于量产】
B. 客户在main.lua中sys.init前加一行代码ril.request("AT*EXASSERT=1")【注意:此行代码会导致模块发生重启问题时,直接死机,仅测试使用,不能用于量产;测试设备使用完毕之后,再修改为ril.request("AT*EXASSERT=0")恢复默认配置】
C. 如果有硬件看门狗机制,关闭此功能;以防复现死机问题后,被硬件看门狗重启复位
D. 参考http://ask.openluat.com/article/63挂测复现问题死机问题后,保留死机现场,联系合宙技术支持人员远程分析
4.2、4G模块重启
1. 如果是Luat二次开发模式,使用官方发布的AT固件或者Luat固件+随便一个demo,测试确认下,是不是自己写的软件有问题
2. vbat引脚电压3.4V到4.3V,使用示波器测量vbat电压是否有跌落;模块峰值需要2A电流,断开模块与外部的连接,使用直流稳压电源直接对vbat供电对比测试
3. AT版本,如果无法抓到日志,直接联系合宙技术支持人员处理;如果可以抓到日志,参考1.2.6章节,提供sdl日志文件给合宙技术支持人员分析;如果需要设置为死机模式,复现问题进一步分析,参考http://ask.openluat.com/article/910处理
4. Luat版本,如果无法抓到日志,直接联系合宙技术支持人员处理;如果可以抓到日志,搜索poweron
reason:
1) reason为0,表示硬件重启,直接按照第1步确认问题,同时确认下是否为硬件看门狗或者外围单片机给模块断电复位引起的重启
2) reason为3,表示软件重启,在日志中搜索restart或者[E]或者traceback或者EE
LOG,分析原因自行解决
如果以上步骤都不能解决问题,参考1.2.6章节,提供trc日志文件和sdl日志文件给合宙技术支持人员分析;如果需要设置为死机模式,复现问题进一步分析,参考http://ask.openluat.com/article/910处理
五、校准问题
模块如果没有校准,射频性能就无法达到最优,极端情况下,会造成网络通信非常不稳定;未校准的模块必须走售后流程维修或者换货
5.1、2G模块如何判断是否校准
1. AT版本,发送AT+ATWMFT=99命令查询,如果返回SUCC表示已校准,其余返回表示未校准
2. Luat版本,日志中搜索ATWMFT,看AT+ATWMFT=99命令的返回值,如果返回SUCC表示已校准,其余返回表示未校准
5.2、4G 模块如何判断是否校准
4G模块会对2G、3G、4G进行单独校准,所以要单独查询这三部分是否校准;同时也要根据模块支持的网络制式区别对待,例如720H支持2G、3G、4G,则这三部分都要校准才正常;720G支持3G、4G,则只要这两部分都校准就正常
1. AT版本,发送AT*MRD_CDF=Q,GsmCalData.nvm、AT*MRD_CDF=Q,aplp_rf_calibration.nvm、AT*MRD_CDF=Q,LteCalData.nvm命令分别查询2G、3G、4G是否校准,如果返回1表示已校准,其余返回表示未校准
2. Luat版本,日志中搜索MRD_CDF,看AT*MRD_CDF=Q,GsmCalData.nvm、AT*MRD_CDF=Q,aplp_rf_calibration.nvm、AT*MRD_CDF=Q,LteCalData.nvm命令的返回值,如果返回1表示已校准,其余返回表示未校准
六、IMEI、SN问题
6.1、Luat版本为什么开机读出的IMEI、SN为空
Lua版本的脚本运行起来之后,会发送AT命令查询imei、sn,从脚本开始运行到查询到结果,一般需要3秒钟【只是经验值,不要用做程序设计依据】,如果在查询到结果之前使用misc.getImei()、misc.getSn()接口读取,就为返回空;
用户开发项目时,可以根据项目的应用场景,分别做不同处理,比较典型的两种场景如下:
1. 如果开机后过一段时间(这个时间超过开机查询imei、sn的时间,例如连接后台服务器)才会用到imei和sn,则用到时直接调用读取接口即可,因为这个时间点肯定已经查询到结果
2. 如果在查询到imei、sn之后,立即执行某个动作,则需要在自己写的脚本中订阅查询结果的消息,参考如下代码
sys.subscribe("IMEI_READY_IND",
function() end)
sys.subscribe("SN_READY_IND",
function() end)s
6.2、为什么IMEI为默认值
2G模块的默认值:359759002514931
4G模块的默认值:
1. 如果是合宙研发人员在开发调试过程中,发给客户体验测试的模块,可能会漏写IMEI
2. 如果是通过官方渠道购买的2G模块,请注意观察下模块标签。因合宙工厂扫描头偏移原因,2019年2月份、3月份(3月20日之前)生产的部分2G模块,IMEI和标签上的不一致,IMEI为默认值359759002514931,遇到此类模块,需要走售后流程换货或者维修。模块标签上SN的第3到10位表示生产日期,例如SN:05201902270907815,20190227表示2019年2月27日生产
3. 曾经有一个客户,在生产时让合宙工厂代烧录客户固件,客户固件中有一个设计“烧录固件后,第一次运行时,会读取模块imei,存储到文件系统中,以后直接使用文件系统中存储的imei”,因为合宙工厂的生产流程是“先烧录固件,再写imei”,所以导致这批客户设备出厂后,发现文件系统中存储的imei都是默认值。所以让合宙代烧录的客户一定要注意imei使用的软件设计逻辑:直接实时查询使用即可,不要再另外存储一份使用
4. 其余情况,先根据第五章节确认下模块判断下有没有校准,同时提供日志给合宙技术支持人员分析
6.3、为什么4G模块写IMEI会失败
实际场景中,用户可能会写自定义的imei到模块中,AT版本使用AT+WIMEI命令、Luat版本使用misc.setImei接口来写入;imei一共15位,其中最后1位是校验位,根据前14位计算得来
2G模块的固件对最后1位的校验位没做检查,即使校验位错误,也允许写入
4G模块的固件对最后1位的校验位会做正确性检查,校验位出错,返回写入失败;所以如果4G模块出现写IMEI失败,可以通过https://www.oming.me/tools/imei检查下校验位【如果此链接失效,可以把校验位设置为0到9依次尝试】,如果检验位没问题,提供日志给合宙技术支持人员分析
6.4、SN是什么,如何读写
sn的标准含义是指序列号,合宙模块的标签上都有sn号,记录了生产日期等信息;模块的flash中也有一块区域为sn,我们现在讨论的是模块flash中的这一块区域。 sn区域最多可以存储64字节的数据,即使重新烧录固件,此区域的数据也不丢失,和imei的存储机制类似。合宙工厂生产模块时,对sn区域没有写入任何有效数据【2G模块虽然写入了数据,但是此数据没什么实际意义】,所以客户拿到模块之后,可以根据sn区域的特性,存储自定义的不超过64字节的任何数据,例如阿里云的设备密钥
sn读写接口如下:
1. AT版本:AT+WISN?读取sn;AT+WISN="..."写sn
2. Luat版本:misc.getSn()读取sn;misc.setSn(...)写sn
七、SIM卡问题
7.1、支持中国大陆哪些运营商
1. 2G模块:仅支持中国移动和中国联通(2G、3G、4G卡),由于中国联通关闭了2G网络,建议使用用中国移动卡
2. 4G模块:不同型号的模块支持的运营商不同,因不断推出新的模块型号,故此处不再一一罗列;请登录www.openluat.com,打开产品中心,根据使用的模块型号自行确认
7.2、是否支持中国港澳台、外国运营商
1. 2G模块:只要有2G网络的地区运营商,理论上都支持,建议在当地实际测试下;目前在中国港澳台、印度、中东、美国、非洲、德国都实地测试过可用
2. 4G模块:根据模块型号支持的频段,参考:http://ask.openluat.com/article/946各个国家和地区的网络频段,自行判断是否可以使用
例如,要判断Air720H是否在其他国家可以使用,首先打开http://www.openluat.com/Product/file/asr1802/Air720x(3229)%E7%B3%BB%E5%88%97%E6%A8%A1%E5%9D%97%E7%A1%AC%E4%BB%B6%E8%AE%BE%E8%AE%A1%E6%89%8B%E5%86%8CV1.27.pdf找到Air720H支持的频段,如下图所示
可以得知:Air720H支持B1、B3、B5、B8、B38、B39、B40、B41
那么Air720H可以在哪些国家使用呢?分如下几种情况讨论
注意:一旦确定可用,需要参考本文的APN设置章节,设置为正确的APN,才能正常上网
7.3、支持SIM卡热插拔吗
支持
1. 2G模块
1) 默认打开了软件检测SIM卡热插拔功能,但是软件检测有延时,详情参考AT手册中的AT+AMSDTC命令
2) 支持硬件检测SIM卡热插拔功能,硬件检测无延时,但是默认关闭了此功能,如果需要打开,参考AT手册中的AT+CSDT命令【AT版本发送AT+CSDT=1命令,Lua版本执行ril.request("AT+CSDT=1")】,同时硬件电路上要接SIMDET脚
2. 4G模块
1) 不支持软件检测SIM卡热插拔功能
2) 支持硬件检测SIM卡热插拔功能,硬件检测无延时,但是默认关闭了此功能,如果需要打开,参考AT手册中的AT+CSDT命令【AT版本发送AT+CSDT=1命令,Lua版本执行ril.request("AT+CSDT=1")】,同时硬件电路上要接USIM_CD脚
7.4、找不到SIM卡
2G模块:主动上报+CPIN: NOT INSERTED或者AT+CPIN?查询返回+CPIN: NOT INSERTED
4G模块:主动上报+CPIN: SIM REMOVED或者AT+CPIN?查询返回+CME ERROR: 10
都表示找不到SIM卡,按照如下步骤排查:
1. 进入飞行模式后,会导致找不到sim卡,确认下是否为进入飞行模式所致。AT固件发送AT+FCUN=0命令、Luat版本执行net.switchFly(true)接口都会导致进入飞行模式,从而不识卡。请检查是否自己的代码逻辑控制了主动进入飞行模式;请检查自己的代码应用逻辑
2. 确认卡是否插反、插错
3. 确认模块是否支持所使用的运营商的卡:2G模块仅支持移动和联通卡,4G模块型号不同支持的运行商也不同
4. 对比交叉测试,卡插到手机上,是否正常:
1) 如果不正常,检查下卡片是否变形、氧化,用卡背贴胶带、胶水灌注、擦拭卡片等方式再尝试,如果都不行,考虑换卡吧
2) 如果正常,把此卡放到其他板子上,如果其他板子正常,可能属于板子单体问题;如果其他板子也不正常,应该是板子硬件设计问题。参考第5步分析
5. 其余情况参考:http://ask.openluat.com/article/960进一步分析,如果不确定波形是否正确,请拍下测量的波形视频,发出来分析
6. 发出来SIM卡部分的原理图给合宙FAE分析
7.5、Luat版本为什么开机读出的ICCID、IMSI为空
Lua版本的脚本运行起来,检测到sim卡之后,会发送AT命令查询iccid、imsi,从脚本开始运行到查询到结果,一般需要5秒钟【只是经验值,不要用做程序设计依据】,如果在查询到结果之前使用sim.getIccid()、sim.getImsi()接口读取,就为返回空;
用户开发项目时,可以根据项目的应用场景,分别做不同处理,比较典型的两种场景如下:
1. 如果开机后过一段时间(这个时间超过开机查询iccid、imsi的时间,例如连接后台服务器)才会用到iccid和imsi,则用到时直接调用读取接口即可,因为这个时间点肯定已经查询到结果
2. 如果在查询到iccid、imsi之后,立即执行某个动作,则需要在自己写的脚本中订阅查询结果的消息,参考如下代码
sys.subscribe("IMSI_READY",
function() end) --iccid也是IMSI_READY的消息
sys.subscribe("IMSI_READY",
function() end)
7.6、可以读到SIM卡的手机号码(MSISDN)吗
目前有两种方式可以获取本机号码:
1. sim卡出厂时,可以写入自己的手机号码到sim卡中,但这不是强制要求的。在中国,运营商制卡时基本上都不会写入手机号码。如果可以确认自己用的sim卡中已经存储了手机号码,可以通过如下方式读取手机号码:
1) AT版本,发送AT+CNUM命令查询
2) Luat版本,开机后调用sim.setQueryNumber(true)打开查询本机号码功能,会自动查询本机号码;可通过sim.getNumber()获取查询结果
2. 模块开机后,sim卡向短信平台发送一条短信(短信内容中可以包含imei或者imsi),短信平台收到短信后,识别手机号码后,可通过如下方式通知模块手机号码:
1) 短信平台下发一条短信给模块,短信内容中包含手机号码,模块收到后解析出号码
2) 模块连接一个后台服务器,后台服务器与短信平台相连,根据imei或者imsi读取到对应的手机号码,然后把这个号码,下发给imei或者imsi对应的模块
7.7、虚拟卡(VSIM)
虚拟卡是一种“将sim卡数据写入模块flash,实现和实体卡同样网络功能”的纯软件技术,相比实体卡存在“省去卡槽的硬件设计、不会出现掉卡、不会因为卡被盗而产生的巨额流量”的优点
目前合宙已不生产新的虚拟卡模块,之前已经出货的虚拟卡模块会持续维护。部分2G和4G模块支持贴片卡(ESIM卡),有需要的话,可咨询购买
虚拟卡使用时常见问题如下:
1. 仅2G模块支持虚拟卡,虚拟卡有专门的模块型号,只能在合宙工厂写入虚拟卡数据
2. 不支持虚拟卡的2G模块,客户不能自行写入虚拟卡数据支持虚拟卡功能
3. 支持虚拟卡的模块,如果烧录了Luat版本的旧版本lod或者tts的lod,可能会擦除虚拟卡数据,导致虚拟卡功能失效。对于必须使用Luat版本tts lod的情况,建议使用Air202F或者Air268F支持虚拟卡的模块,可以烧录Luat版本的8955F lod,不会擦除虚拟卡数据
4. 实体卡和虚拟卡同时存在时,优先使用实体卡,不支持实时切换功能
5. 虚拟卡为纯流量卡,不支持语音和短信业务
6. 虚拟卡也是运营商提供的一种技术,资费和实体卡一致
7.8、贴片卡(ESIM)
目前,支持贴片卡的模块型号列表如下:
1. 2G模块:Air202支持
2. 4G模块:Air720SL支持
7.9、合宙物联网卡(虚拟卡、贴片卡、实体卡)商务问题
物联网卡管理平台地址:sim.openluat.com
商务问题列表如下,有需要请联系淘宝客服处理:
1. 存在试用期,计费规则如下:
1) 测试期:物联网卡在申请开通时,可自由选择是否开通测试期,测试期最长为三个月,即时生效,测试期以合同订单签订的失效日期为止,测试期结束后自动进入沉默期。在测试期内,有2M/月测试流量,不超过该流量不计费,超过2M则当月按照0.29元/MB(10M及以上套餐)、1元/MB(2M及5M套餐)进行计费,且测试期不享受流量池。(测试期流量一般用于设备前装质量检测)
2) 沉默期:测试期后,进入沉默期,最长六个月,沉默期用户产生流量后直接激活,并进入流量池。沉默期结束后仍未激活,强制激活
3) 计费期:物联网卡从激活之日期,根据购买流量时长(以月为计时单位)在系统内以套餐生效日期、套餐失效日期呈现,即物联网卡的有效使用期限,用户如需长期使用物联网卡应在套餐失效期前进行续费,以延长套餐的有效期,避免因套餐失效而停机
2. 欠费后不可使用,到期前提供iccid或者imei进行续费;过期超过2个月不能续费,自动销号
3. 支持流量池、支持转移卡的归属账号
4. 平台更新有24小时的延迟,可能会造成“已用流量为0、流量不符、已正常使用却提示沉默期等物联网卡状态不符”的问题,出现此类问题,请24小时之后,再登录平台查看
7.10、想使用语音短信业务怎么办
合宙出售的物联网卡为纯流量卡,不支持语音和短信业务。必须去运营商办理实名认证的卡才能使用
7.11、实体卡如何防盗
无法防盗,建议使用贴片卡
7.12、为什么SIM VCC没有供电
sim_vcc不是持续供电,是间歇性供电,只有卡在位才持续供电
7.13、为什么Luatools提示“可能是虚拟卡数据错误,请重启几次,如果一直出现此提示,请联系管理员”
Luatools有一个检测虚拟卡数据是否完整的功能,但是此功能无法做好,如果出现此提示,根据如下情况分析:
1.
如果模块不支持虚拟卡,直接忽略此提示,属于误报
2. 如果模块支持虚拟卡,并且当前没有外置实体卡,如果上网正常,属于误报;如果上网不正常,提供日志给合宙技术支持人员分析
7.14、如何判断sim卡所属运营商
参考:https://oldask.openluat.com/article/856
八、天线射频问题
常见的模块天线有如下几种:PCB天线、FPC天线、弹簧天线、棒状天线、外置吸盘天线
常见的GPS天线有:陶瓷天线
本章节描述的是常见的注意事项,具体到一款产品遇到的天线问题,还是要分析产品的内部结构,需要拍张清晰的产品内部以及外壳照片发给合宙技术支持人员分析
8.1、天线设计和调试
任何一款规范的产品,天线设计至关重要,一定要到正规的天线厂,针对整机,对天线做匹配性调试。如果天线没有经过调试,在使用过程中会出现信号不稳定、驻网失败、连接服务器断线等网络问题
客户如果没有条件做调试,建议选择抗干扰强的天线,下面分情况讨论:
1. 模块天线:PCB天线、FPC天线、弹簧天线,必须要到正规天线厂做匹配性调试
2. 模块天线:棒状天线、外置吸盘天线,如果没有条件调试,一定要选择抗干扰强,稳定性好的天线,这样射频受到的干扰会比较小
3. GPS陶瓷天线,如果大板和陶瓷天线面积都比较小,一定要去正规天线厂调试。如果面积都比较大,实在没条件调试,可以不去调试
建议天线选配按照如下顺序执行:
1. 有条件到天线厂调试天线的话,一定要去天线厂调试
2. 没条件在天线厂调试天线的话,可以选择合宙官方提供的天线或者其他渠道购买的天线。注意:直接购买现成的天线,产品的射频性能无法发挥到最优,购买天线时,价格越贵,性能越好,按照自己的预算去选择,不建议选择差的天线。差天线在网络环境较差的情况下,是很容易出现信号不稳定、驻网失败、连接服务器断线等网络问题。如果要选择合宙官方的天线,打开:m.openluat.com后,进入“周边工具”页面选购
8.2、天线使用环境
天线调试好之后,使用环境对天线性能也有影响,需要注意的问题如下:
1. 模块天线:不能放在全封闭或者半封闭的金属盒子里,对天线性能影响很大
2. GPS天线:天线上方不能有金属物质,不能有较厚的遮挡物(例如几厘米的塑料盒子肯定不行,1毫米的塑料盒子可以)
8.3、2G模块测试传导灵敏度时,到-107.5左右GPRS就会掉线
GSM灵敏度-108左右,正常应该不会掉线,可能是有干扰导致灵敏度下降,或者线损没有补上
8.4、2G模块天线为什么和GND短路了
设计如此,这是正常表现;天线和GND之间有电感,所以测试为0欧姆
8.5、2G模块和4G模块天线通用吗
4G天线可以用到2G上,但是2G天线不建议用到4G上
8.6、4G模块如果支付辅天线,如何使用辅天线
合宙大部分的4G模块不支持辅天线,个别模块支持辅天线,对于支持辅天线的模块来说,仅使用主天线可以满足日常基本需求,如果要求射频高性能发挥到极致,可以同时使用主天线和辅天线
8.7、天线厂调试天线时,如何提供来电自动接听的软件
1. AT版本:开机后发送ATS0=1命令到模块,接收到来电,振铃1声后会自动接听
2. Luat版本:在自己的脚本中添加如下代码
1) 2G模块
require
"cc"
sys.subscribe("CALL_INCOMING",
function(num) cc.accept(num) end)
2) 4G模块
ril.regUrc("RING",
function() ril.request("ATA") end)
九、信号问题
9.1、没有信号(信号弱)
1. 参考7.4章节检查下是否不识卡
2. 参考第八章确认天线是否匹配
3. 检查天线是否连接、天线连接座子的接口是否正确、天线是否损坏【换天线确认】
4. 没有注册上网络(参考第十章节),也可能会导致没有信号
5. 静电击穿等原因可能导致模块射频损坏【可以同一张卡,用其他模块对比测试,初步确认此问题】
9.2、信号强度和网络数据业务的稳定性关系
信号强度和dBm的对应关系为:信号强度*2-113 = dBm值
信号强度的查询方法:
1. AT版本:通过AT+CSQ查询,取值范围参考AT手册【手册中搜索AT+CSQ】
2. Luat版本:通过net.getRssi()返回信号强度值
信号强度仅仅表示当前驻留小区的网络覆盖程度,一般来说,信号强度和网络通信稳定率是正比关系。信号强度差,网络数据通信相对就不稳定;但不能绝对的认为信号强度好,网络数据通信就一定稳定,和网络是否拥堵等其他因素也有关系;经验值如下:
CSQ值小于10,可以认为网络较差
CSQ值在10和25之间,可以认为网络中等
CSQ值大于25,可以认为网络较好
十、网络注册和附着问题
10.1、无法注册网络、注册网络慢、无法附着网络、附着网络慢
1. 参考7.4章节检查下是否不识卡
2. 检查下sim卡是否欠费
3. 参考第八章确认天线是否匹配
4. 检查天线是否连接、天线连接座子的接口是否正确、天线是否损坏【换天线确认】
5. 换卡、换板子对比测试,确保使用正常的硬件和sim卡测试
6. 参考7.1和7.2章节,确保模块支持当地的网络制式
7. 偏远地区的网络覆盖可能不全,或者产品的天线射频指标不合格,想办法用手机对比测试;用手机对比测试时,注意手机要设置为和模块同样的网络制式,同时借助Cellular-Z工具确认,详情参考:https://oldask.openluat.com/article/1002
8. 环境因素(车库、地下室、电梯等)
9. 确认下是否所有设备在同一地点表现是否一致,有可能是伪基站造成的
10.2、为什么在一些车库里面手机接打电话正常,但是模块注册网络失败呢
首先确保手机和模块使用的网络制式相同,例如模块是移动2G网络,手机也要在移动2G网络下,这样才有对比意义
10.3、为什么有些SIM卡在2G模块上无法注册网络
0029版本开始的core固件,支持了中国移动的一种新标准的物联网卡,如果遇到此问题,确认一下版本是否为0029以及之后的版本,如果不是,烧录最新core固件测试确认下
10.4、同一地点,同一张卡,手机可以注册上4G网络,为什么4G模块不可以
之前有客户遇到过类似问题,均为“测试地点,4G信号太弱”引起的,手机上的天线增益比4G模块大板上的天线增益要高,所以手机正常,4G模块不正常。4G模块更换高增益天线后,也变得正常
10.5、4G模块使用2G卡,注册网络很慢
不同型号的4G模块,支持的网络频段也不相同。
以支持频段最多的4G模块Air720H为例,同时支持4G、3G、2G网络,开机搜索网络时,默认软件是按照4G、3G、2G网络的顺序依次搜索,等搜索到2G网络时,可能已经过去几分钟了(例如我在上海办公室,使用Air720H模块,3分钟左右才能搜索到2G网络),对于使用2G卡的用户或者要使用2G网络的应用场景来说,这种速度简直是不能忍受。那么如何加快搜索2G网络的速度呢,有如下两种方式:
|
优势 |
劣势 |
全网搜索,减少搜索4G、3G网络的时间,通过每次开机发送如下AT命令实现: AT+MEDCR=0,8,1 AT+MEDCR=0,17,240 AT+MEDCR=0,19,1 |
兼容各种网络环境,注册2G网络的速度可以稍微变快一点儿(例如,我这边Air720H模块,发送这三条指令前,测试了4次,分别为:174秒、118秒、147秒、136秒;发送这三条指令后,测试了4次,分别为240秒、110秒、112秒、112秒) |
2G的驻网速度还是没有质的提升 |
仅搜索2G网络,通过开机发送如下AT命令实现: AT*BAND=0,74 |
2G网络注册快,和2G模块的驻网速度基本一致(例如,我这边Air720H模块,基本上都是在20秒以内) |
设置AT命令后,模块就只能使用2G网络了;以后如果要使用默认网络配置,必须发送AT+RSTSET(发送后,会自动重启)命令来恢复出厂设置 |
10.6、4G模块如何设置网络频段
1. 仅搜索2G网络
1) AT版本:开机发送AT*BAND=0,74命令设置
2) Luat版本:main.lua中sys.init(0,0)前添加一行代码ril.request("AT*BAND=0,74")
2. 仅搜索4G网络
1) AT版本:开机发送AT*BAND=5,74,129,480,149命令设置
2) Luat版本:main.lua中sys.init(0,0)前添加一行代码ril.request("AT*BAND=5,74,129,480,149")
注意:这些设置生效后,会保存到flash中,不会丢失;如果仅仅是测试需要,在测试结束之后,AT版本通过发送AT+RSTSET命令,Luat版本通过执行一行代码ril.request("AT+RSTSET")来恢复出厂设置
更多使用方式参考:http://ask.openluat.com/article/130和AT手册
10.7、如何判断4G模块注册的是什么网络
1. AT版本,有如下两种方式可以查询
1) 当注册的网络类型发生变化时,会通过urc上报^MODE:<SysMainMode>,<SysMode>;其中<SysMainMode>表示当前注册的网络类型:
<SysMainMode>为3时表示2G网络
<SysMainMode>为5时表示3G WCDMA网络
<SysMainMode>为15时表示3G TD网络
<SysMainMode>为17时表示4G网络
<SysMainMode>为其余值时表示未注册网络
2) 发送AT*BANDIND?命令主动查询,返回的查询结果格式为:*BANDIND: <n>[,<band>,<AcT>];其中<AcT>表示当前注册的网络类型:
<AcT>为0、1、3时表示2G网络
<AcT>为2、4、5、6、8时表示3G网络
<AcT>为7时表示4G网络
<AcT>为其余值时表示未注册网络
2. Luat版本,有如下两种方式可以查询
1) 日志中搜索^MODE,搜索结果的格式为:^MODE:<SysMainMode>,<SysMode>;其中<SysMainMode>表示当前注册的网络类型:
<SysMainMode>为3时表示2G网络
<SysMainMode>为5时表示3G WCDMA网络
<SysMainMode>为15时表示3G TD网络
<SysMainMode>为17时表示4G网络
<SysMainMode>为其余值时表示未注册网络
2) 调用net.getNetMode()接口,返回值表示当前注册的网络类型:
返回值为0表示未注册网络
返回值为1、2时表示2G网络
返回值为3时表示3G TD网络
返回值为4时表示4G网络
返回值为5时表示3G WCDMA网络
详情可参考AT手册和http://ask.openluat.com/article/130帮助理解
10.8、各国网络频段汇总
参考:https://oldask.openluat.com/article/946
10.9、网络小区参数
在对接后台时,有些后台会要求终端上传一些小区参数,例如:
cell
id:小区ID
ecl、ce level:无线信号覆盖等级
pci:物理小区标识
sinr:信号与干扰加噪声比
rsrp:参考信号接收功率
tac:基站跟踪区域码
strength:信号强度,通过AT+CSQ或者AT+CESQ获取
一般来说,只有4G小区才具有这些参数信息,我们以4G小区为例,来说明如何获取这些参数,AT手册中有一个+EEMLTESVC的上报,上报的数据中包含了这些参数;有如下两种方式可以触发+EEMLTESVC上报:
1、通过AT+EEMOPT=1设置为主动查询模式,在需要查询时,发送AT+EEMGINFO?查询
2、通过AT+EEMOPT=2,value设置为主动上报模式,根据value设置的上报周期定时上报
+EEMLTESVC中的参数和我们需要的参数对应关系参考下图
ecl、ce level:无线信号覆盖等级,没有现成的AT命令可以直接查询,可参考下图自行计算
十一、APN设置和PDP激活问题
11.1、2G模块如何设置APN
1. AT版本,固件包含各国公网APN列表,但是列表无法保证完整性和正确性,除中国大陆外,其他国家和地区还是建议用户使用AT+CSTT或者AT+SAPBR命令主动设置正确的APN
1) 如果在中国大陆使用中国移动的公网卡,根据应用场景不同,可选是否设置APN
A. 如果socket单连接,在AT+CGATT?附着上数据网络之后,可以不设置APN,直接使用AT+CIPSTART命令去连接服务器
B. 如果是socket多连接、http应用、mqtt应用,因为流程要求必须执行设置APN的命令,所以使用AT+CSTT或者AT+SAPBR命令主动去设置正确的APN;公网的中国移动物联网卡的APN为CMIOT【实际上,中国移动的卡,即使设置错误,也能正常上网,可能中国移动网关没有检查这个APN】
2) 如果在中国港澳台或者国外使用,请咨询SIM卡供应商获取APN信息,使用AT+CSTT或者AT+SAPBR命令主动去设置正确的APN
3) 如果是专网卡,无论在什么国家和地区使用,请咨询SIM卡供应商获取APN信息,使用AT+CSTT或者AT+SAPBR命令主动去设置正确的APN
2. Luat版本,固件包含各国公网APN列表,但是列表无法保证完整性和正确性,除中国大陆外,其他国家和地区还是建议用户使用link.setApn(apn, userName, password)主动设置正确的APN
1) 如果在中国大陆使用中国移动的公网卡,可以不主动设置APN
2) 如果在中国港澳台或者国外使用,请咨询SIM卡供应商获取APN信息,使用link.setApn(apn, userName, password)主动去设置正确的APN
3) 如果是专网卡,无论在什么国家和地区使用,请咨询SIM卡供应商获取APN信息,使用link.setApn(apn, userName, password)主动去设置正确的APN
11.2、4G 模块如何设置APN
1. AT版本
1) 如果是公网SIM卡,不需要用户主动设置APN,软件自动去网络端查询APN进行设置
2) 如果是专网SIM卡,首先咨询SIM卡提供商APN参数,然后参考:http://ask.openluat.com/article/913进行设置,设置成功后,后续用到CSTT或者SAPBR设置APN时,必须再次传入正确的APN参数,才能正常使用
2. Luat版本
1) 如果是公网SIM卡,不需要用户主动设置APN,软件自动去网络端查询APN进行设置
2) 如果是专网SIM卡,首先咨询SIM卡提供商APN参数,然后在main.lua尽可能靠前的位置调用link.setAuthApn(prot,apn,user,pwd)进行设置【注意:第一次设置成功之后,软件会自动重启,因为重启后才能生效】
11.3、PDP激活失败
参考10.1章节
11.4、为什么4G模块专网卡连接服务器失败
1. 参考11.2章节,检查APN参数是否设置正确
2. 如果有其他厂家的模块,对比测试下是否连接正常
3. 如果无法百分百保证服务器配置没问题,最好在服务器端用wireshark抓包,或者在服务器上安装一个第三方工具,开启一个服务器端口来对比测试
十二、socket问题
12.1、连接服务器失败
1. 服务器必须是公网地址
2. 使用PC上的TCP UDP测试工具客户端、或者mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障
3. 如果连接ssl服务器,确认下core文件是否支持ssl功能(例如2G模块的某些core文件不支持ssl功能)
4. 2G模块不要使用中国联通卡
5. 检查下模块信号、网络注册、网络附着、PDP激活状态
6. 检查下SIM卡是否欠费
7. 提供日志给合宙技术支持人员
1) 2G模块:使用合宙技术支持人员提供的debug core文件,参考:http://ask.openluat.com/article/63抓日志
2) 4G模块:参考1.2.6章节中的1和2,提供Luatools下的trc文件和sdl文件
12.2、数据收发延迟大、速度慢、经常失败、掉线断开
1. 检查下是否存在代码逻辑错误,导致异常
2. 检查下是否不断重启,导致异常
3. 检查下服务器网络是否稳定,不要用内网穿透方式搭建服务器
4. 检查下使用环境是否网络覆盖不好,例如车库、地下、电梯、山区等
5. 2G模块不要使用中国联通卡
6. 检查下模块信号、网络注册、网络附着、PDP激活状态
7. 排查是否为设备天线问题:发出来设备的天线调试指标参数给合宙技术支持人员;曾经有一个客户天线指标明显有问题,导致10几个小时出现30次左右掉线;后来重新调试天线之后,40个小时出现几次掉线
8. 如果经常出现连接被动断开:
1) 如果直接使用的是tcp udp socket连接,检查下心跳包的频率,基站策略会关闭长时间没有数据传输的连接,建议心跳包的频率不要超过4分钟,一般都是建议使用2分钟
2) 如果使用的是mqtt连接,检查下mqtt keep alive的时间,基站策略会关闭长时间没有数据传输的连接,建议心跳包的频率不要超过4分钟,一般都是建议使用2分钟
3) 如果使用的是mqtt连接,检查下是否在1.5倍的mqtt keep alive的时间,没有成功发送数据到服务器,就会被被服务器主动断开,这种情况一般都是发送数据超时引起的
9. 排查是否为网络问题:如果同一地点的所有设备都有问题,可能和网络环境有关系;使用手机设置为同样的网络模式,对比测试确认下;或者把设备移动到其他距离此地点比较远的地方对比测试。【注意:目前2G网络环境在逐步恶化,在网络较好的情况下,24小时出现10次以内的掉线都可以认为正常,仅仅作为经验值参考】
10. 如果要降低掉线率,可通过如下方式设置【注意:在网络环境不变的情况下,降低掉线率意味着会增加响应延时】
1) 2G模块
A. AT版本:
a) 通过AT+TCPUSERPARAM命令设置较大的重传次数和重传间隔
b) 如果使用的是MQTT,除了执行第a)步操作之外,还可以通过AT+MCONNECT命令增大MQTT KEEP ALIVE的时间来降低掉线率
B. Luat版本:
a) 调用socket.setTcpResendPara接口设置较大的重传次数和重传间隔
b) 如果使用的是MQTT,除了执行第a)步操作之外,还可以通过调用mqtt.client接口增大MQTT KEEP ALIVE的时间来降低掉线率
2) 4G模块
A. AT版本:
a) 目前还不支持AT设置重传次数和重传间隔
b) 如果使用的是MQTT,除了执行第a)步操作之外,还可以通过AT+MCONNECT命令增大MQTT KEEP ALIVE的时间来降低掉线率
B. Luat版本:
a) 目前还没有接口支持设置重传次数和重传间隔
b) 如果使用的是MQTT,除了执行第a)步操作之外,还可以通过调用mqtt.client接口增大MQTT KEEP ALIVE的时间来降低掉线率
11. 排查是否设备单体问题:如果同一地点,某些设备正常,某些设备异常,按照如下几种情况分析
1) 分析正常设备和异常设备的使用环境是否相同:
A. 如果不同,例如异常设备固定在钢制墙壁上,正常设备放置在桌子上,钢制墙壁可能对天线射频有干扰,将异常设备和正常设备放置在同样的使用环境中,再对比测试
B. 如果相同,参考第2)步
2) 分析正常和异常的设备,驻留的小区是否相同:
A. 如果相同,重点排查异常设备的天线射频部分,分析不出结果的话,异常设备寄给合宙分析
B. 如同不同,多测试几次,确认下,是不是在异常小区内很容易出问题,如果异常小区很容易出问题,可能就是小区拥堵造成的
12. 提供日志给合宙技术支持人员
1) 2G模块:使用合宙技术支持人员提供的debug core文件,参考:http://ask.openluat.com/article/63抓日志
2) 4G模块:参考1.2.6章节中的1和2,提供Luatools下的trc文件和sdl文件
12.3、如何发送大量数据
1. AT版本:发送数据的AT命令,例如AT+CIPSEND、AT+MQTTPUB、AT+HTTPDATA都有支持的最大长度,参考AT手册,根据这些AT命令单次发送支持的最大长度,MCU端拆包发送
2. Luat版本:lib中socket、mqtt、http功能模块对数据发送进行了封装,支持一次传入大量数据【只要内存够用】,lib中自动分包进行发送
12.4、为什么频繁收发数据时,会导致整个模块系统响应变慢
模块的主频是有限的,如果一直频繁收发数据,CPU频繁的处理数据收发,肯定会导致对其他任务的处理有延时。
如果是Luat版本二次开发,这种表现会更加明显,因为所有Luat应用是一个单task应用,频繁的收发数据,会导致这个单task在频繁的处理数据收发消息,从而影响其他功能的及时响应。可参考:http://ask.openluat.com/article/930辅助理解
12.5、是否支持长连接
UDP协议的socket不支持长连接,TCP协议的socket支持长连接;长连接需要在代码中实现断开自动重连的控制逻辑,以及实现定时发送心跳的业务逻辑
12.6、快发和慢发有什么区别
UDP协议本身没有可靠性保证,所以不存在快发慢发之说,可以认为UDP协议的socket一直是快发模式
TCP协议发送数据时,数据发送出去之后,必须等到服务器返回TCP ACK包,才认为数据发送成功,在网络较差的情况下,这种ACK确认就会导致发送过程很慢。从而导致用户程序后续的AT处理逻辑一直处于等待状态。例如执行AT+CIPSEND动作发送一包数据后,接下来要执行AT+QTTS播放TTS,但是CIPSEND一直等了1分钟才返回SEND OK,这时AT+QTTS就会一直等待1分钟,可能不是程序中想看到的。此时就可以设置为快发模式,AT+CIPSEND可以立即返回一个结果,此结果表示“数据是否被缓冲区所保存”,从而不影响后续其他AT指令的及时执行
AT版本可以通过AT+CIPQSEND指令、Luat版本可以通过socket.setSendMode接口设置发送模式为快发或者慢发
快发模式下,在core中有一个1460*7=10220字节的缓冲区,要发送的数据首先存储到此缓冲区,然后在core中自动循环发送。如果此缓冲区已满,则AT+CIPSEND会直接返回ERROR,socket:send接口也会直接返回失败
同时满足如下几种条件,适合使用快发模式:
1. 发送的数据量小,并且发送频率低,数据发送速度远远不会超过core中的10220字节大小;没有精确地判断标准,可以简单的按照3分钟不超过10220字节来判断;曾经有一个不适合快发模式的例子如下:用户使用Luat版本的http上传一个几十K的文件,设置了快发模式,导致一直发送失败,因为循环的向core中的缓冲区插入数据,插入数据的速度远远超过发送数据到服务器的速度,所以很快就导致缓冲区慢,再插入数据时,就直接返回失败
2. 对每次发送的数据,不需要确认发送结果
3. 数据发送功能不能影响其他功能的及时响应
12.7、支持发送什么格式的数据
任何数据格式都支持
1. AT版本:建议使用AT+CIPSEND命令时,指定数据长度,此方式支持任何格式的数据发送,使用方法参考AT手册
2. Luat版本:socket的send接口,支持任何格式的数据发送,参数为string类型,其他table等数据类型,都要转换为string类型之后,才能发送
12.8、如何查询错误码
参考:http://ask.openluat.com/article/61
12.9、最多同时支持多少个连接
参考:http://ask.openluat.com/article/61
1. 2G模块:非SSL连接最多8个;在内存空间充足的情况下,SSL连接个数没有限制
2. 4G模块:AT版本最多8个连接;Luat版本最多10个连接
注意:Luat版本的lib中的一些功能模块会用到socket连接,例如update、agps、lbsLoc、errDump;同时支持的连接个数包含lib中的这些连接;例如在某个时间点,update和lbsLoc在工作,会占用2个socket连接,这个时间点用户的应用脚本中最多能够同时使用的连接个数就少2个了
12.10、是否支持websocket、是否可以做server使用
不支持websocket
不可以做server使用
12.11、为什么要发送心跳包(如何检测连接活性)
因为基站资源有限,如果不发心跳包保活,基站会主动断掉链路,回收资源,模块和服务器无感,并不知道链路已经断开。建议心跳包的频率不要超过4分钟,一般都是建议使用2分钟
12.12、为什么有时连接断开会收到提示;有时不可以收到提示,必须等到发送数据时才能检测到断开
能收到提示的情况,通常是服务器主动断开连接
不能收到提示的情况,可能是链路被基站断开,或者其他意外情况导致【例如服务器网线被拔掉】,模块和服务器无感知;此时只能通过发送数据超时来感知
12.13、如何统计流量
运营商按照ip包来统计流量,ip包包含:ip包头+tcp包头+用户数据,以IPv4为例:
ip包头包含固定的20字节+可选的4字节,至少20字节
tcp包头包含固定的20字节+可选的4字节,至少20字节
用户数据就是用户能够感知到的数据内容了,如果直接使用socket,就是用户感知的数据;如果使用http、mqtt、ssl,这部分数据就不是用户能够感知的原始数据了,http会加上http包头,mqtt会加入mqtt的包裹部分,ssl会加密数据
tcp数据收发时,有ack确认机制,例如设备发数据给服务器后,还会收到服务器返回的tcp ack包,这个tcp ack包(至少40字节)也是计算在流量之内的。接收到服务器下发的数据时,设备也会回复一个tcp ack包,同样这个ack包仍然计算在流量之内
另外,socket连接以及断开连接,都有多次数据收发,这部分也会消耗流量
例如有一个tcp socket连接,连接成功后,每分钟设备发送2字节的心跳数据到服务器,服务器收到数据后,再回复2字节的心跳应答数据。这个过程中,每分钟消耗的流量至少有42(设备发送)+40(服务器回复ack)+42(服务器发送)+40(设备回复ack)=164字节,实际处理中,服务器回复ack和服务器发送可能合并成一个IP包42字节,这样的话,至少也要42+42+40
= 124字节。这是最简单的算法,实际应用中,还要考虑到重传、包头中的可选字节,应该会比这里计算的流量多一些。如果要准确计算,建议在服务器端用wireshark抓包分析
另外一个常见的例子是,为什么通过http下载一个文件,实际消耗的流量比文件本身要多呢?跟上个例子类似,文件本身大小仅仅是用户数据,除了用户数据外,还有如下几部分的流量消耗:
1. 连接服务器消耗流量
2. http请求时有http头,服务器下发数据时也有http头
3. 每包数据都有tcp头和ip头
4. 重传也会消耗流量
5. 与服务器断开连接也需要消耗流量
12.14、是否支持IPv6
2G模块不支持IPv6
4G模块支持IPv6协议,rndis和ppp应用也支持了IPv6,但是Luat版本二次开发和AT版本tcp、http、mqtt指令没有使用IPv6
12.15、模块IP地址
模块激活pdp后,模块端显示的ip地址是运营商分配的内网ip
模块与服务器连接成功后,在服务器端显示的ip地址是运营商分配的公网ip地址
对于同一个模块来说,这两个ip地址都是会变化的,例如同一个模块:
1. 第一次激活pdp后,模块端显示的ip地址为:10.155.141.25,与服务器连接成功后,服务器端显示此模块的ip地址和端口为:117.132.197.166:48191,与服务器断开再重连服务器,此时服务器端显示此模块的ip地址和端口为:117.132.197.166:48492
2. pdp主动去激活,然后再重新激活,模块端显示的ip地址为:10.41.220.39,与服务器连接成功后,服务器端显示此模块的ip地址和端口为:221.178.127.225:40876,与服务器断开再重连服务器,此时服务器端显示此模块的ip地址和端口为:221.178.127.225:40787
所以这两种ip地址,对模块来说没有多大意义,不要用他们来标识模块,如果要标识模块,请使用模块imei
12.16、数据接收缓存问题
1. AT版本:使用CIPSTART建立的socket连接,接收数据没有缓存机制,收到数据后,立即通过AT口输出,每包最多1460字节;例如服务器下发一个70KB的文件,模块会连续收到多个包,通过AT口连续多次输出
2. Luat版本:有缓存机制,内存中有一个缓存表,缓存表有256个元素,每个元素存储收到的一包数据(最多1460字节),所以最多可以缓存256*1460字节,所有元素都被占用时,socket收到新数据时,会清空缓存表,重新开始缓存;需要读取数据时,通过socket:recv接口主动读取即可
注意:缓存表位于内存中,断电或者重启后,缓存表中的数据会被清空;虽然缓存表可以缓存很多数据,但是建议收到数据时,还是要及时读取出来;缓存表不断缓存数据,会占用大量内存,在项目内存紧张的情况下,很容易出现内存不足问题导致重启
12.17、客户示例:2G模块3秒上传一次GPS位置数据,轨迹丢失问题
现在的2G网络环境无法保证"任何时间任何地点,都能及时成功的传输数据",延时
和发送失败的问题,肯定是存在的,如果要比较完美的行驶轨迹,需要在应用层设计好数据
缓存和数据补传工作,注意事项如下:
1. 发送当前一包数据时,在返回发送结果之前,新的数据包需要缓存起来
2. 发送失败的数据包缓存起来
3. 缓存数据的条数可以设置一个最大值,超过这个最大值,根据业务需要,丢弃一些缓存数据,例如丢弃最早的数据
4. 如果协议允许,可以在一条报文中发送多条已缓存的数据
5. 连接断开或者数据传输失败时,做好重连动作
12.18、数据透传时,会丢失前面的一部分数据
确认下是否收发数据前是否唤醒了模块
十三、http问题
13.1、是否支持HTTPS
支持,TLSV1.2
1. 2G模块:必须使用带有ssl功能固件才能支持
支持如下四种加密套件:
TLS_RSA_WITH_AES_128_CBC_SHA (0x2F)
TLS_RSA_WITH_AES_256_CBC_SHA (0x35)
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x3C)
TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3D)
证书支持情况如下:
1) AT版本:不支持证书配置,不校验证书
2) Luat版本:支持证书配置,支持单向认证和双向认证
2. 4G模块
支持证书配置,支持单向认证和双向认证
支持如下六种加密套件:
0X0035
TLS_RSA_WITH_AES_256_CBC_SHA
0X002F
TLS_RSA_WITH_AES_128_CBC_SHA
0X0005
TLS_RSA_WITH_RC4_128_SHA
0X0004
TLS_RSA_WITH_RC4_128_MD5
0X000A
TLS_RSA_WITH_3DES_EDE_CBC_SHA
0X003D
TLS_RSA_WITH_AES_256_CBC_SHA256
13.2、为什么频繁请求会失败
支持的http连接总数有限,参考12.9章节
建议一个http连接返回请求结果之后,再去请求下一个连接;不要使用循环定时器方式不断的发起新的http请求
13.3、支持发送什么格式的数据
任何数据格式都支持
1. AT版本:使用AT+HTTPDATA命令时,指定数据长度,支持任何格式的数据发送,使用方法参考AT手册
2. Luat版本:参考http的api手册,按照参数要求传入数据即可
13.4、如何查询错误码
1. AT版本:参考AT手册
2. Luat版本:参考http://ask.openluat.com/article/61
如果是https连接失败,参考13.1章节,确认下服务器是否支持“模块支持的加密套件”
13.5、如何POST文件
1. AT版本:参考AT手册,主要是使用AT+HTTPDATA命令录入文件数据【最长支持100KB】后,发送AT+HTTPACTION=1利用post上传
2. Luat版本:参考http的demo,在模块文件系统支持的空间范围内,post的文件没有大小限制
13.6、为什么POST JSON格式的数据会出现失败
检查一下是否忘记设置了"Content-Type:
application/json"请求头
1. AT版本:参考AT手册,2G模块使用AT+HTTPPARA="USER_DEFINED","Content-Type:
application/json";4G模块使用AT+HTTPPARA="USERDATA","Content-Type:
application/json"
2. Luat版本:参考http的demo,在head参数中传入{["Content-Type"]="application/json"}
13.7、AT版本如何设计HTTP应用逻辑
参考:http://ask.openluat.com/article/939
13.8、数据接收缓存问题
1. AT版本:有缓存机制,内存中有一个的缓冲区(2G模块300KB,4G模块319499字节),收到数据后,插入此缓冲区,然后通过AT口输出urc,提示收到的数据长度;缓冲区满之后,再收到新数据,会丢弃新收到的数据,并通过AT口输出urc提示出错;需要读取数据时,发送AT+HTTPREAD命令读取,可分段读取,也可全部读取
注意:缓冲区位于内存中,断电或者重启后,缓存表中的数据会被清空;虽然缓冲区可以缓存很多数据,但是建议收到数据时,通过AT+HTTPREAD及时读取出来,以防缓冲区满出错
2. Luat版本:有如下两种缓存机制, http.request接口可以设置使用何种缓存机制,http的demo中有详细示例可供参考
1) 内存缓存:内存中有一个缓冲区,在项目剩余可用内存的范围内,此缓冲区没有大小限制,例如项目可用内存剩余200KB,则此缓冲区的理想最大值是200KB;收到的数据都会缓存到此缓冲区,如果收到的数据超过缓冲区大小,会导致内存不足重启;数据接收完整后,通过回调函数传出缓冲区数据,供用户应用脚本使用
注意:缓冲区位于内存中,断电或者重启后,缓冲区中的数据会被清空;如果接收的数据过多,不建议使用内存缓存的机制,可能会导致内存不足重启
2) 文件缓存:接收到的数据可以保存在文件中,在文件系统剩余空间的范围内,此文件没有大小限制,例如项目剩余文件系统空间200KB,则此文件的理想最大值是200KB;收到的数据都会保存到此文件中,如果收到的数据文件最大值,会导致保存失败,新数据被丢弃;数据接收完整后,通过回调函数传出文件完整路径,供用户应用脚本使用
注意:文件位于文件系统中,断电或者重启后,文件不会被自动清空删除;如果文件已经不再使用,一定要通过os.remove接口将文件删除。否则会一直占用文件系统空间,导致可用文件系统空间变小
13.9、为什么https访问失败
1. 确认下使用的core固件是否正确
1) 2G模块AT版本:AirM2M_VXXXX_AT_S_SSL.lod和AirM2M_VXXXX_AT_S_8955F.lod才支持ssl功能
2) 2G模块Luat版本:带SSL或者8955F的lod才支持ssl功能
3) 4G模块:所有版本都支持
2. 参考13.1章节,检查服务器是否支持模块支持的加密套件
3. 发日志文件给合宙技术支持人员分析
十四、mqtt问题
14.1、是否支持ssl
支持,TLSV1.2
1. 2G模块:必须使用带有ssl功能固件才能支持
支持如下四种加密套件:
TLS_RSA_WITH_AES_128_CBC_SHA (0x2F)
TLS_RSA_WITH_AES_256_CBC_SHA (0x35)
TLS_RSA_WITH_AES_128_CBC_SHA256 (0x3C)
TLS_RSA_WITH_AES_256_CBC_SHA256 (0x3D)
证书支持情况如下:
1) AT版本:不支持证书配置,不校验证书
2) Luat版本:支持证书配置,支持单向认证和双向认证
2. 4G模块
支持证书配置,支持单向认证和双向认证
支持如下六种加密套件:
0X0035
TLS_RSA_WITH_AES_256_CBC_SHA
0X002F
TLS_RSA_WITH_AES_128_CBC_SHA
0X0005
TLS_RSA_WITH_RC4_128_SHA
0X0004
TLS_RSA_WITH_RC4_128_MD5
0X000A
TLS_RSA_WITH_3DES_EDE_CBC_SHA
0X003D
TLS_RSA_WITH_AES_256_CBC_SHA256
14.2、AT版本如何设计MQTT应用逻辑
参考:http://ask.openluat.com/article/939
14.3、有没有免费的MQTT broker可用
合宙有一个lbsmqtt.airm2m.com:1884的broker,没有网页端控制页面,可以用模块和mqtt.fx客户端配合测试
14.4、如何实现掉线自动重连
1. AT版本:参考:http://ask.openluat.com/article/939中的异常处理流程
2. Luat版本:参考mqtt demo,实现自动重连即可
14.5、频繁掉线是什么原因
1. 检查下是否存在代码逻辑错误,导致异常
2. 检查下是否不断重启,导致异常
3. 检查下服务器网络是否稳定,不要用内网穿透方式搭建服务器
4. 检查下使用环境是否网络覆盖不好,例如车库、地下、电梯、山区等
5. 2G模块不要使用中国联通卡
6. 检查下模块信号、网络注册、网络附着、PDP激活状态
7. 排查是否为设备天线问题:发出来设备的天线调试指标参数给合宙技术支持人员;曾经有一个客户天线指标明显有问题,导致10几个小时出现30次左右掉线;后来重新调试天线之后,40个小时出现几次掉线
8. 如果经常出现连接被动断开:
1) 检查下mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接
2) 检查下是否在1.5倍的mqtt keep alive的时间,没有成功发送数据到服务器,就会被被服务器主动断开,这种情况一般都是发送数据超时引起的
9. 排查是否为网络问题:如果同一地点的所有设备都有问题,可能和网络环境有关系;使用手机设置为同样的网络模式,对比测试确认下;或者把设备移动到其他距离此地点比较远的地方对比测试。【注意:目前2G网络环境在逐步恶化,在网络较好的情况下,24小时出现10次以内的掉线都可以认为正常,仅仅作为经验值参考】
10. 如果要降低掉线率,可通过如下方式设置【注意:在网络环境不变的情况下,降低掉线率意味着会增加响应延时】
1) 2G模块
A. 加大TCP重传次数和重传间隔:AT版本通过AT+TCPUSERPARAM命令设置;Luat版本通过socket.setTcpResendPara接口设置
B. mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接
C. 减少Qos1和Qos2的publish使用,允许的话建议都使用Qos0
2) 4G模块
A. 加大TCP重传次数和重传间隔:目前还不支持
B. mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接
C. 减少Qos1和Qos2的publish使用,允许的话建议都使用Qos0
11. 排查是否设备单体问题:如果同一地点,某些设备正常,某些设备异常,按照如下几种情况分析
1) 分析正常设备和异常设备的使用环境是否相同:
A. 如果不同,例如异常设备固定在钢制墙壁上,正常设备放置在桌子上,钢制墙壁可能对天线射频有干扰,将异常设备和正常设备放置在同样的使用环境中,再对比测试
B. 如果相同,参考第2)步
2) 分析正常和异常的设备,驻留的小区是否相同:
A. 如果相同,重点排查异常设备的天线射频部分,分析不出结果的话,异常设备寄给合宙分析
B. 如同不同,多测试几次,确认下,是不是在异常小区内很容易出问题,如果异常小区很容易出问题,可能就是小区拥堵造成的
12. 提供日志给合宙技术支持人员
1) 2G模块:使用合宙技术支持人员提供的debug core文件,参考:http://ask.openluat.com/article/63抓日志
2) 4G模块:参考1.2.6章节中的1和2,提供Luatools下的trc文件和sdl文件
14.6、有没有认证机制
有,每个设备有clientid、username、password
14.7、client id是否允许重复
不允许重复,重复的话,服务器会踢掉上一个相同id的设备
14.8、是否支持通配符
订阅的主题支持通配符,所以建议订阅的主题复杂且不易被猜;建议使用自建服务器,或者项目之间隔离,公网broker不可靠
参考:https://oldask.openluat.com/article/68
14.9、Qos0、1、2如何选择
应用允许的情况下,建议使用Qos0,Qos1和Qos2会加重网络负担,4G网络还好,特别是2G网络,在网络拥堵和较差的情况下,数据传输的次数越多,掉线的概率就会越高
14.10、AT版本publish json格式的数据,如何处理"
需要转义处理,参考:http://ask.openluat.com/article/122
14.11、如何查询错误码
1. AT版本:参考AT手册
2. Luat版本:参考http://ask.openluat.com/article/61
如果是mqtt ssl连接失败,参考14.1章节,确认下服务器是否支持“模块支持的加密套件”
14.12、数据接收缓存问题
1. AT版本:可通过AT+MQTTMSGSET命令设置是否缓存,详情参考AT手册
1) 不缓存:通过AT+MQTTMSGSET=0设置;收到订阅的publish报文后,立即通过AT口输出主题、payload长度、payload内容,每个报文中支持的payload内容最长1360字节
2) 内存缓存:通过AT+MQTTMSGSET=1设置;内存中有一个缓存表,最多支持缓存4条publish报文;收到订阅的publish报文后,插入缓冲表中的空闲位置,然后通过AT口输出存储位置;缓存表满之后,新收到的publish报文会覆盖最旧的publish报文
注意:缓存表位于内存中,断电或者重启后,缓存表中的数据会被清空;建议收到数据时,通过AT+MQTTMSGGET及时读取出来,以防缓冲区满覆盖丢失数据
2. Luat版本:
内存中有一个缓存表,在项目剩余可用内存的范围内,此缓存表没有大小限制,例如项目可用内存剩余200KB,则此缓存表的理想最大值是200KB;收到的publish报文都会缓存到此缓存表,如果收到的数据超过缓存表大小,会导致内存不足重启;需要读取数据时,通过mqtt:receive接口主动读取即可
注意:缓存表位于内存中,断电或者重启后,缓存表中的数据会被清空;虽然缓存表可以缓存很多数据,但是建议收到数据时,还是要及时读取出来;缓存表不断缓存数据,会占用大量内存,在项目内存紧张的情况下,很容易出现内存不足问题导致重启
14.13、为什么mqtt ssl访问失败
1. 确认下使用的core固件是否正确
1) 2G模块AT版本:AirM2M_VXXXX_AT_S_SSL.lod和AirM2M_VXXXX_AT_S_8955F.lod才支持ssl功能
2) 2G模块Luat版本:带SSL或者8955F的lod才支持ssl功能
3) 4G模块:所有版本都支持
2. 参考14.1章节,检查服务器是否支持模块支持的加密套件
3. 发日志文件给合宙技术支持人员分析
十五、远程升级问题
参考:http://ask.openluat.com/article/916
十六、阿里云问题
16.1、如何连接阿里云
1. 2G模块AT版本:必须使用AT_S_SSL或者AT_S_8955F固件才能支持
2) 一型一密参考:http://www.openluat.com/Product/file/rda8955/%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91AT%E6%B5%81%E7%A8%8B%E8%AF%B4%E6%98%8E%EF%BC%88%E4%B8%80%E5%9E%8B%E4%B8%80%E5%AF%86%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88%EF%BC%8CAT_S_TTS%E5%92%8CAT_S%E7%89%88%E6%9C%AC%E4%B8%8D%E6%94%AF%E6%8C%81%EF%BC%8CAT_S_SSL%E5%92%8CAT_S_NOTTS%E7%89%88%E6%9C%AC%E6%94%AF%E6%8C%81%EF%BC%89.pdf
2. 2G模块Luat版本:必须使用带有SSL或者8955F的core固件,参考aLiYun的demo
3. 4G模块AT版本
1) 一机一密参考:http://www.openluat.com/Product/file/asr1802/%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91AT%E6%B5%81%E7%A8%8B%E8%AF%B4%E6%98%8E%EF%BC%88%E4%B8%80%E6%9C%BA%E4%B8%80%E5%AF%86%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88%EF%BC%89.pdf
2) 一型一密参考:http://www.openluat.com/Product/file/asr1802/%E8%BF%9E%E6%8E%A5%E9%98%BF%E9%87%8C%E4%BA%91AT%E6%B5%81%E7%A8%8B%E8%AF%B4%E6%98%8E%EF%BC%88%E4%B8%80%E5%9E%8B%E4%B8%80%E5%AF%86%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88%EF%BC%89.pdf
4. 4G模块Luat版本:参考aLiYun的demo
16.2、除了阿里云,支持华为云、百度云、腾讯云、OneNet等其他云平台吗
支持,但是需要用户自己开发,没有提供官方例程和lib文件
开发者伙伴发布了一些文章在ask网站,仅供参考,不保证正确和稳定性
华为云:http://ask.openluat.com/article/904、http://ask.openluat.com/article/902、http://ask.openluat.com/article/903
OneNET:http://ask.openluat.com/article/56、http://ask.openluat.com/article/893、http://ask.openluat.com/article/179
百度云、腾讯云:http://ask.openluat.com/article/177
16.3、一型一密方案,设备在线运行了很多天后,模块中的设备密钥和阿里云平台上的密钥不一致导致无法上线
有一个客户陆续反映此问题,目前还没有定位到根本原因,可按照如下方式协助确认此问题:
1. 首先从阿里云平台导出所有设备的密钥保存下来,然后设备复现此问题后,对比一下模块中的设备密钥和本地保存的密钥是否一致:如果不一致,就是模块端的问题;如果一致,就是阿里云平台端的问题。【注意:必须在设备正常在线状态下,从阿里云平台导出密钥保存下来,设备复现问题后,对比才有意义;如果设备已经复现问题,再从阿里云平台导出密钥对比,没有意义】
2. 在脚本中增加一个辅助保存设备密钥的功能:连接阿里云成功后,将设备密钥保存到nvm中,复现问题后,对比nvm中的密钥和sn中存储的密钥是否一致
在定位出根本原因之前,可通过如下方式规避处理:在阿里云上删除此设备,然后再重新录入
16.4、为什么阿里云连接失败
1. 确认下使用的core固件是否正确
1) 2G模块AT版本:AirM2M_VXXXX_AT_S_SSL.lod和AirM2M_VXXXX_AT_S_8955F.lod才支持ssl功能
2) 2G模块Luat版本:带SSL或者8955F的lod才支持ssl功能
3) 4G模块:所有版本都支持
2. 确认下product key中的大小写是否正确,连接阿里云服务器时,会用到这个product key,大小写敏感,大小写出错会导致域名解析失败
3. 默认使用模块imei作为client id连接阿里云,从日志中确认下实际imei和模块标签上的imie是否一致,如果不一致,可能模块没写imei,参考6.2章节分析处理
4. 发日志文件给合宙技术支持人员分析
16.5、如何降低阿里云的离线率
目前2G网络环境在逐步恶化,在网络较好的情况下,24小时出现10次以内的掉线【仅仅作为经验值参考】都可以认为正常,如果掉线率太高,需要日志分析,如果不方便抓日志,可以按照如下方式处理后,对比看下是否有改善:
1. 2G模块
1) 加大TCP重传次数和重传间隔:AT版本通过AT+TCPUSERPARAM命令设置;Luat版本通过socket.setTcpResendPara接口设置
2) mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接
3) 减少Qos1和Qos2的publish使用,允许的话建议都使用Qos0
2. 4G模块
1) 加大TCP重传次数和重传间隔:目前还不支持
2) mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接
3) 减少Qos1和Qos2的publish使用,允许的话建议都使用Qos0
16.6、阿里云网站上的异常信息和模块动作的对应关系
阿里云网站异常信息 | 模块动作 |
Device disconnect | 发送了disconnect报文,可能是逻辑问题,导致异常发送了disconnect报文,需要脚本日志文件分析【2G模块2.3.5版本之前的部分版本脚本lib,存在一个bug,可能会导致此问题,建议更新到2.3.5以及之后的版本】 |
Connectoin reset by peer | 模块发送超时失败,没有断开mqtt连接,直接断开了socket【可参考16.5章节优化】 |
keepalive timeout | 模块发送mqtt心跳超时,被服务器断开【可参考16.5章节优化】 |
kicked by the same device | 有两种可能性: 1、存在相同client id的设备,默认使用模块imei作为client id,可能是imei重复,可参考6.2章节确认下是否模块imei为默认值 2、设备在线状态下,发生了重启,重启后成功连接阿里云【如果使用了errDump功能模块,可参考22.3章节检查下是否有异常信息上报】 |
16.7、如何批量写入三元组
一机一密的三元组信息为:ProductKey、DeviceName、DeviceSecret
一型一密的三元组信息为:ProductKey、ProductSecret、DeviceName
ProductKey和ProductSecret可以直接固化在代码中
DeviceName建议直接使用模块的IMEI,也可以使用MCU端的一个唯一ID,只要这个ID在同一个ProductKey下是唯一的即可
DeviceSecret的批量写入,详细说明如下:
1. 一机一密,有如下两种方式:
1) 在工厂烧录固件时,上位机通过模块uart口将DeviceSecret写入到模块中【强烈建议存储在模块sn中,参考6.4章节;Luat版本也可存储在nvm中,参考30.3章节;AT版本,如果mcu端可以存储,也可以存储在mcu端】
2) 终端设备第一次开机运行时,连接自建的服务器,将ProductKey和DeviceName上传给自建服务器,自建服务器访问阿里云获取对应的DeviceSecret,然后将DeviceSecret下发给终端设备存储【强烈建议存储在模块sn中,参考6.4章节;Luat版本也可存储在nvm中,参考30.3章节;AT版本,如果mcu端可以存储,也可以存储在mcu端】
2. 一型一密:在连接阿里云过程中,终端设备会自动动态注册,注册成功后,阿里云服务器会返回对应的DeviceSecret给终端设备,终端设备存储起来即可【强烈建议存储在模块sn中,参考6.4章节;Luat版本也可存储在nvm中,参考30.3章节;AT版本,如果mcu端可以存储,也可以存储在mcu端】;之后再去连接阿里云,不需要再次动态注册,因为阿里云仅允许动态注册一次,重复注册会返回错误
更多说明参考:https://oldask.openluat.com/article/39
16.8、AT版本,MCU端如何实现HmacMD5算法
下载http://www.openluat.com/Product/file/rda8955/core_src.7z,参考:cust_src\elua\lib\crypto\src\aliyun_iot_common_hmac.c文件中的aliyun_iot_common_hmac_md5接口
十七、基站定位问题
17.1、如何使用基站定位
目前合宙的2G和4G模块都支持基站定位,此服务免费
1. 2G模块AT版本:参考AT手册,使用AT+AMGSMLOC命令查询
2. 4G模块AT版本:参考AT手册,使用AT+CIPGSMLOC命令查询
3. Luat版本:参考lbsLoc的demo
17.2、基站定位原理
模块正常联网后,搜索附近的小区信息,上报给后台;后台查询小区经纬度,并结合信号强度等因素进行计算(三角定位原理),最后返回计算出来的经纬度给模块
17.3、基站定位精度如何
搜索到的小区越多,定位的精度越高;一般来说,城市中心定位精度比郊区和农村定位精度高,城市中心的定位精度在几十米到几百米不等,郊区和农村的定位精度更低,可能会有几千米甚至更多的误差
1. AT版本:单小区定位,仅仅将驻留小区上报的后台参与定位
2. Luat版本:多小区定位,将实时搜索到的所有小区同时上报给后台参与定位
基站定位的误差都比较大,如果需要准确定位,请使用支持GPS的模块,例如Air800、Air530
17.4、为什么基站定位失败
搜索到的小区越多,定位的精度越高;一般来说,城市中心定位精度比郊区和农村定位精度高,城市中心的定位精度在几十米到几百米不等,郊区和农村的定位精度更低,可能会有几千米甚至更多的误差
1. AT版本:参考AT手册的错误码,如果返回后台查询位置失败的错误,则发送AT+CREG=2、AT+CEREG=2两个AT命令后,根据注册的网络制式,发送AT+CREG?或者AT+CEREG?查询当前驻留的小区id,然后在电脑浏览器中打开http://bs.openluat.com/,手动查找当前驻留小区的位置;如果手动可以查到位置,则服务器存在BUG,直接向技术支持人员反映问题;如果手动无法查到位置,则基站数据库还没有收录当前设备的小区位置信息,向技术支持人员反馈,我们会尽快收录
2. Luat版本:
1) main.lua中的PRODUCT_KEY和此设备在iot.openluat.com中所属项目的ProductKey必须一致,请去检查
2) 后台基站数据库查询不到所有小区的位置信息;在trace中向上搜索encellinfo,然后在电脑浏览器中打开http://bs.openluat.com/,手动查找encellinfo后的所有小区位置;如果手动可以查到位置,则服务器存在BUG,直接向技术支持人员反映问题;如果手动无法查到位置,则基站数据库还没有收录当前设备的小区位置信息,向技术支持人员反馈,我们会尽快收录
17.5、如何在iot.openluat.com中查询设备的基站定位请求记录
因基站定位请求数据太多,为了保证iot后台运行的稳定性,不再保存请求记录,如果实在有查询需求,联系合宙技术支持人员处理
17.6、合宙官方的基站定位能在国外使用吗
不能,没有国外的基站数据库
十八、GPS定位问题
18.1、哪些模块支持GPS定位
目前仅:Air800、Air801、Air530支持
其余模块例如Air720G如果要支持GPS,可以采用Air720G+Air530方案,使用Luat二次开发实现
18.2、GPS天线如何设计
参考:https://www.jianshu.com/p/f52e9a52cc11
18.3、Air800模块如何测试信噪比
参考:http://ask.openluat.com/article/963
18.4、Air800模块如何输出原始NMEA数据
1. AT版本:发送AT+CGNSTST=1命令,可以打开NMEA数据输出功能
2. Luat版本:参考gps v1的demo,添加如下代码
gps.setNmeaMode(2, function(nmeaItem) log.info("nmea", nmeaItem) end)
18.5、Air800模块GPS无信号、信号弱、定位失败
1. 使用Air800官方开发板+客户固件对比测试:如果Air800官方开发板也存在同样问题,重点检查以下步骤中的环境问题和软件问题;如果Air800没问题,重点检查一下步骤中的硬件问题
2. 不能在室内测试,必须到室外测试;如果只能在室内测试,可以淘宝搜索“gps信号转发器”,但是不可用于rtk定位测试。为什么不能在室内测试,参考:http://ask.openluat.com/article/66
3. 检查gps天线
1) 必须使用gps天线,普通的gsm、蓝牙、wifi、433等天线不支持gps定位
2) gps陶瓷天线,如果大板和陶瓷天线面积都比较小,一定要去正规天线厂调试。如果面积都比较大,实在没条件调试,可以不去调试
3) 天线朝上,面向天空,天线上方不能有金属物质,不能有较厚的遮挡物(例如几厘米的塑料盒子肯定不行,几毫米的塑料盒子可以)
4)