用module(...,package.seeall) 创建模块是什么意思?起什么作用?

用户用module(...,package.seeall) 创建模块 m(为方便表述,简称为 m ) 是为了定义m为全局可见,只要在main中require m 一次之后, 任何自定义模块,都能直接访问 m 中的变量和函数。




如何计算录音文件大小?

程序支持录音接口,录音文件的格式是amr,采用的是amr 12.2kbps, 每秒有1600字节数据,amr文件头有6字节。录音x秒,录音文件总大小为 录音秒数x*1600+6 。

例如录音5秒,总大小为5*1600+6=8006字节。 amr文件已经压缩过了,基本上不能再压缩了。




Luat是否能缓存DNS?

  1. Luat是具备DNS缓存这个功能的。
  2. DNS的有效时间是网络告诉模块的,不由模块来控制。

  3. 具体如下:

    模块在第一次查询DNS时,网络就会把这个DNS的有效时间告诉模块,模块会把DNS和有效时间都保存在本地。以后模块再收到DNS的请求时,会比较缓存的有效时间,如果是有效的,则用缓存的,如果失效,就再去网络查询。




为什么模块主频312M,还不如单片机的IO实时性强?

由于GPRS模块的首要任务是与网络进行通信,所以与网络相关的中断的优先级是最高的,模块每隔4.615ms就要与网络同步一次,并且还要处理网络下发的数据,这个中断,会处理1到2毫秒,在此期间会打断其他所有的中断(包括IO中断);所以GPRS模块的IO的实时性是无法与单片机比较的,哪怕是最便宜的单片机

Lua脚本中的定时器,支持的最小时长是1毫秒,但是1毫秒的肯定不准确,1秒以内的都不准确。

如果要利用定时器精确地采集外部的输入脉冲,脉冲频率高于1Hz都不精确;

如果对脉冲的采集精度没有要求,则可以根据自己的需求,实际采集一下试试能否满足需求




模块能实现微秒级延时么?

不支持,原因见上一条。如果想实现微秒级延时,需外挂单片机。




如何打印core的代码的trace?

core那一部分程序称为模块基础文件,用户有时候需要打印这一部分的trace, 以查找bug原因。

方法是发送AT命令打开core打印开关。

require"ril"  
ril.request("ATTRACE=\"SXS\",1,0")
ril.request("ATTRACE=\"DSS\",1,0")
ril.request("AT*TRACE=\"RDA\",1,0")

然后用下载调试工具打印trace




Luat 连接远程服务器是用IP地址还是用域名?

都支持




怎么在lua脚本中查询模块的IMEI?

在\lib\misc.lua库文件中,有一个获取模块IMEI号的函数:getimei()。 自开发客户在应用脚本中 将 misc.lua 直接require 进来,直接调用即可

require"misc"
local myimei
myimei = misc.getimei()



如何从trace中检查网络连接是否正常?

用户在烧写自己的脚本应用程序后,如果发现连接不上服务器,请按照如下几个步骤检查一下:

1.trace中搜索CPIN ,如果找到+CPIN: READY ,表示sim卡正常;如果找到+CPIN: NOT INSERTED ,表示检测不到sim卡,检查一下卡是否插好;如果搜到+CPIN : 其他字符串,也表示不正常

2.trace中搜索CSQ ,格式为+CSQ: 信号值,99 ,信号值的取值范围为0-31,或者固定的99,0和99都表示没信号,1-31表示有信号,31信号最强,如果信号不好或者没信号,检查一下天线

3. 在trace中搜索CREG ,如果找到+CREG: 1 ,"位置区ID","小区ID"或者+CREG: 5,"位置区ID","小区ID"或者+CREG: 2 ,1,"位置区ID","小区ID"或者+CREG: 2,5,"位置区ID","小区ID",表示注册上运营商的GSM网络,其余的值都不正常,可以确认一下卡是否欠费

4. 在trace中搜索CGATT ,如果找到+CGATT: 1 表示附着上GPRS数据网络;如果找到+CGATT: 0 ,表示没有附着上GPRS数据网络,可以确认一下卡是否欠费

5. 在trace中搜索CIICR ,看AT命令是否返回OK,如下图所示才表示正常:

Q22-1

6. 在trace中搜索CIFSR ,看AT命令是否返回ip地址,如下图所示才表示正常:

Q22-2

7. 在trace中搜索CIPSTART ,看连接自己的服务器是否成功,如下图所示才表示正常:

ok

8. 如果第7步连接不正常,在电脑上用TCP&UDP测试工具(连接一下自己的服务器是否正常。




开发者如何在自己的Lua脚本中直接发AT命令来控制模块?

在开源代码中,常用的AT命令都已经被封装在各个lib文件中。

以这个cc.lua 这个打电话的库文件为例:

Q23

dial是拨出电话,hangup是挂断电话,accept是接听电话。都是用AT命令实现的。

如果用户想直接发AT,处理AT命令,也可以,就仿照我们的框架中直接扩展就好了。

比如用户可以在自己的脚本中,req来发AT命令,例如:

local ril = require "ril"
local req = ril.request
req("AT")

用户还要编写自己对AT命令或URC的处理程序,并用regrsp函数来注册 AT命令的返回处理程序,regurc来注册URC的处理程序。

不过,用户连用regrsp和regurc来注册这一步甚至都可以省略。比如,用户自己发CALL相关的AT,可以在cc.lua之ccrsp()和ccurc()中直接扩展代码。

用户自己发phonebook相关的AT,可以在pb.lua之pbrsp()中直接扩展代码。

用户自己发网络状态相关的AT,可以在net.lua之rsp()和neturc()中直接扩展代码。

用户自己发SMS相关的AT,可以在sms.lua之rsp()和urc()中直接扩展代码。




怎么才能进入飞行模式?

  • 语法
require"misc"
misc.setflymode(true)    --进入飞行模式
misc.setflymode(false)  --离开飞行模式



Lua脚本中如何得知电池电量?

  • 通过电量查询函数查询获取,在misc.lua中:
函数名: getvbatvolt
功能 : 获取VBAT的电池电压
参数 :
返回值: 电压,number类型,单位毫伏
function getvbatvolt()
 local v1,v2,v3,v4,v5 = pmd.param_get()
        return v2
end



trace打开对模块功耗有影响么?Lua脚本中怎么关闭所有的trace打印?

根据实际测试,trace打开对模块功耗没有影响。 如果用户想关闭trace,请使用sys库文件中的opntrace 函数, 具体请看代码注释




lib 库文件里有个dbg.lua,是干什么用的?

记录lua脚本程序的异常,例如运行时语法错误导致的重启, 主动控制的重启,会在开机时通过dbg模块上报给一个服务器




用play()函数来播放的音频文件怎么下载到模块?

audio.lua这个库文件中有一个音频播放接口play(filename)

那么这播放的资源文件(.amr .midi .mp3文件)该如何下载到模块里呢?

用LuaTools,跟选择lua脚本一样的方法.




Luat 是否支持ssl连接?

支持,在基础软件(底层lod,不同功能不同lod,详见core文件中)选取文件名带 SSL 的lod,然后,配合demo中 文件夹名中带ssl的脚本使用




为什么trace中有些打印有"test"前缀,而有些打印没有前缀?

Q32

看这个文件里面的local function print函数重新封装了一个print函数, 加上了模块名的打印。

至于第二个问题,没打印“test”的时候,是因为找不到这个再封装的 print的定义,就按照原始的print打印。




为什么用scite无法调试demo项目脚本?

Scite工具,只支持Lua的标准库,例如string,io等。

在Scite中,只能编辑、运行基于Lua标准库写的脚本,但是不能运行我们的 demo脚本,因为我们的demo脚本会用到我们自己的扩展库,例如rtos、sys等,

这些扩展库是针对模块,新增的功能,Scite中根本不支持,所以无法用Scite调试。

demo项目,只能烧写到开发板中直接运行。




IMEI、IMSI、ICCID的获取方式

脚本程序运行起来后,脚本会发送AT命令到底层软件去查询IMEI、IMSI、ICCID,所以从脚本运行起来,到真正获取到IMEI、IMSI、ICCID,是需要一段时间的,例如几秒钟,这个时间无法估计。




SN、IMEI、IMSI、CCID的区别?

sn是模块私有的序列号,imei是设备号码,要发到网络的,iccid是sim卡的序列号。imsi是sim卡序列号,但是imsi会发到网络作为交互用,iccid不会。

注意:模块内部默认没有sn号,用户调用misc.setsn()写入之后才有




Luat 休眠和唤醒(Lua开发模式下)

  • 模块休眠有两种概念:
1 进入飞行模式的休眠,下文称之为“深休眠”
2 没有进入飞行模式的休眠,下文称之为“浅休眠”
  • 深休眠

代码中调用misc.setflymode(true)进入深休眠, 调用misc.setflymode(false)退出深休眠。 深休眠状态下,会关闭语音和数据业务的协议栈,所以不能收发短信, 不能通话,不能上网进行数据传输,可以正常操作GPIO, 可以正常操作定时器。深休眠状态下的单模块功耗为1mAh, 如果还有GPS,UART等外设在运行,功耗另算。

  • 浅休眠

一般情况下,用户是不需要写代码去控制进入或者退出浅休眠状态, 系统自动控制进入和退出浅休眠 浅休眠状态下,不会关闭语音和数据业务的协议栈, 所以可以收发短信,可以通话,可以上网进行数据传输,可以正常操作GPIO,可以正常操作定时器 进入浅休眠状态后,收发短信时,会自动退出浅休眠,收发短信结束后,会立即自动进入浅休眠。 进入浅休眠状态后,通话时,会自动退出浅休眠,通话结束后,会立即自动进入浅休眠。 进入浅休眠状态后,数据传输时,会自动退出浅休眠,数据传输结束后,会立即自动进入浅休眠。 浅休眠状态下的单模块功耗为3.3mAh,如果还有GPS,UART等外设在运行,功耗另算。

  • 进入浅休眠状态后,UART无法正常工作,必须先退出浅休眠,UART才能正常收发数据

  • 脚本中有pm.wakepm.sleep接口,这两个接口是控制浅休眠的,在什么情况下使用这两个接口呢,举例说明:

  • 第一种场景:

UART接了外设,如果项目对功耗没有要求,可以直接写一行代码pm.wake("myuartwake"),这样软件永远不会进入浅休眠,UART可以一直正常收发数据如果项目要求低功耗,除了uart接外设之外,还要有一个gpio中断,接在外设上:

1. 在外设需要通过uart发送数据给模块前,先产生一个gpio中断到模块
2. 模块检测到gpio中断后,调用代码pm.wake("myuartwake"),如果此时模块处于浅休眠状态,则会退出浅休眠;然后再uart.setup
3. uart就可以调用uart.read和uart.write正常收发数据
4. 在uart不需要工作时,模块软件调用代码uart.close,然后再调用pm.sleep("myuartwake"),就可以进入浅休眠
  • 第二种场景:

只有单模块功能,没有UART、SPI、I2C等外设,例如:只用到了通话, 短信,gprs数据传输,模块内部集成的gps功能,这种情况下pm.wake 和pm.sleep接口是没有任何意义的,因为软件中的所有功能都是自动去控制 进入和退出浅休眠,并不会因为代码中执行pm.sleep而降低系统功耗,但 是可能会因为代码中执行pm.wake而增加功耗,这种情况下如果想降低功耗, 只能在软件逻辑上进行处理,例如降低gprs数据传输频率,减少gps 开启时间等。




如何设置APN?

  • Luat版本,使用setapn函数来设置:在link.lua这个库文件中,有function setapn(a,b,c) 函数可以设置APN,其中:
a: apn
b: 用户名
c: 密码 都是字符串型
  • 用户在应用程序中调用link.setapn即可实现APN的设置例如,设置APN (Access Point Name,接入点)为CMIOT,用户名和密码皆为空
require"link" 
link.setapn("CMIOT")  



OPENAT_NetworkStatusChangeInd后面跟的状态字是什么意思?

[network] OPENAT_NetworkStatusChangeInd state 0:网络断开,表示GPRS网络不可用,无法进行数据连接,有可能可以打电话

[network] OPENAT_NetworkStatusChangeInd state 1:网络已连接表示GPRS网络可用,可以进行链路激活

[network] OPENAT_NetworkStatusChangeInd state 2:链路正在激活

[network] OPENAT_NetworkStatusChangeInd state 3:链路已经激活PDP已经激活,可以通过socket接口建立数据连接




如何区别模块是AT还是Luat?

1、使用usb转ttl线,连接到开发板的UART1,使用串口调试助手尝试发送AT,如果出现回显ok,则证明是AT版;如果没有任何回显,则可能是Luat版。注意:此时应该连接模块的UART引脚

2、使用下载调试工具,模块开机后,在工具上方会提示软件版本。注意:此时应该连接模块的HOST引脚




如果查看剩余RAM和FLASH?

Luat_VXXXX_8955.lod: Lua脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件)可用768KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用860KB

Luat_VXXXX_8955_SSL.lod: LuaDB脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件)可用768KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用796KB

Luat_VXXXX_8955_SSL_TTS.lod: LuaDB脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件)可用324KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用344KB

Luat_VXXXX_8955_SSL_UI.lod: LuaDB 脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件,图片文件)可用704KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用540KB

Luat_VXXXX_8955_TTS_UI.lod: LuaDB 脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件,图片文件)可用152KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用132KB

Luat_VXXXX_8955_TTS1.lod: LuaDB脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件)可用216KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用260KB

Luat_VXXXX_8955_UI.lod: LuaDB 脚本和资源(通过烧写工具烧写的文件,例如lua脚本文件,mp3音频文件,图片文件)可用512KB 文件系统(例如脚本运行过程中创建的参数文件,录音文件,远程升级文件等)可用796KB

Luat_VXXXX_8955F.lod:64M flash版本(Air202F),支持SSL、TTS、SPI接口的LCD功能。除去系统所占空间,还剩余5M ROM 和1M RAM可供开发者使用。

文件系统的实际空间可通过rtos.get_fs_free_size()打印

无论是哪一种底层软件,关于文件系统空间的使用,注意以下几点: 如果用烧写工具烧写脚本和资源时,自动勾选了压缩功能(默认不勾选,只有脚本和资源大小超过Lua脚本和资源可用空间时,才会自动勾选),则开机后,会自动解压缩所有的脚本和资源文件到文件系统中 如果用到远程升级功能,一定要为远程升级文件预留足够用的空间,至少保留升级bin文件大小+“所有脚本和资源的原始大小之和”的文件系统空间

RDA8955的RAM总空间都为4MB 其中Lua运行内存1024KB,Luat框架引用的一些lua模块需要占用一定的运行内存,可通过下面代码实时打印RAM和FLASH

print("mem:",_G.collectgarbage("count"))  -- 打印占用的RAM
print("flash",rtos.get_fs_free_size()) -- 打印剩余FALSH,单位Byte