感谢热心网友Delectate整理的部分Q&A。如果还有常见问题但没有在wiki上列出来,请在http://erp.openluat.com上留言。

用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 Air模块是否能缓存DNS?

  1. 我们Luat Air模块是具备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打印工具:RDA平台trace工具。




Luat Air模块连接远程服务器是用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测试工具(保存在 QQ群文件->调试工具 下)连接一下自己的服务器是否正常,如果不正常,检查一下自己的服务器,如果正常,在QQ群中提问题。




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

合宙的openluat开源代码中,常用的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()中直接扩展代码。




怎么才能让Luat Air模块进入飞行模式?

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



合宙开源Luat Air模块如何实现定位功能?

如果GPRS模块串口跟gps芯片连接,gps芯片会通过串口获取上报gps信息, GPRS模块通过数据连接上报给后台

如果GPRS模块没跟GPS连接,模块本身会上报基站位置信息(位置区+小区) 给我们后台,后台通过解析成经纬度位置信息

手机可以通过合宙的时间线app在地图上看到后台的位置信息。




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文件)该如何下载到模块里呢?

用Luat下载工具,跟选择lua脚本一样的方法:

在luadb脚本文件表格 那里点 ,添加

21

  • 可以用shift或ctrl多选。 至于先选脚本还是先选资源文件,这个没关系。只要选上就行。



Luat Air模块是否支持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 Air模块休眠和唤醒(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 开启时间等。




GPRS模块AT命令版本和Luat版本如何设置APN?

  • AT命令版本,使用AT+CSTT命令来设置:

AT+CSTT=<apn>,<user name>,<password> <apn>,<user name>,<password> 皆为字符串型。

  • 例1:

设置APN (Access Point Name,接入点)为CMNET,用户名和密码皆为空AT+CSTT="CMNET","",""

  • 例2:

设置APN (Access Point Name,接入点)为CMIOT,用户名和密码皆为空AT+CSTT="CMIOT","",""

  • 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")  



Luat Air模块如何实现空中远程升级模块lua脚本?

  • 合宙开源Luat Air模块支持远程升级,但是只能升级Lua脚本以及图片、铃声等资源,不能升级lod软件。远程升级功能需要终端Lua脚本和服务器算法的配合才能完成。

一、Lua脚本这边需要做的工作

  • 在我们开源模块lua代码中,有样例程序short_connection_flymode已经支持远程升级。就以这个demo为例做讲解。
  • 打开:script\socket\short_connection_flymode\main.lua文件,
  • 语法

PROJECT = "SOCKET_SHORT_CONNECTION_FLYMODE"

  • 参数:
VERSION = "1.0.0"` 
require"sys"
require"update"
update.setup("udp","www.test.com",2233)

项目标识在Lua脚本中用来表示当前脚本的项目名,和服务器端的项目标识必须保持一致,才能支持升级。 项目标识命名随意。脚本版本号在Lua脚本中用来表示当前脚本的版本号,必须低于服务器端上同一项目的脚本版本号,才能升级。脚本版本号可随意命名,但是格式必须和服务器上的格式保持一致。

  • require"update" --这个必须有

update.setup("udp","www.test.com",2233)
--请将协议类型(UDP/TCP),升级用的后台以及端口写成开发自己需要的

项目标识和脚本版本号写好,并require "update" 后, update.setup会将模块的项目标识、脚本版本号以及模块IMEI号上报给升级后台。

二、服务器端需要做的工作

这里以Air200为例:

2.1 合成.bin文件

  • 需要将lua脚本以及所有的资源文件(图片、铃声等)合成.bin文件,这个.bin文件是新版本,用于升级之用。

8

2.2 后台需要做一个界面,上传合成的.bin文件到后台

  • 这个界面需要能够编辑项目标识和脚本版本号,能够上传.bin文件,并提供一个升级开关。如图:

air200-2

注:该界面还需要能够编辑允许升级的模块的IMEI号/号段。

2.3服务器这边的程序配合

上传界面做好后,上传.bin文件(新版本),并设置项目标识跟模块保持一致, lua版本号要大于模块上报的。IMEI号段也要设置好。

服务器那边得到模块的上报后,判断项目标识和服务器这边的保持一致,服务器这边的新版本号大于模块上报的版本号,而且服务器这边升级开关是开的,模块IMEI号也在设置的允许号段之内,则启动升级过程。

升级过程我们提供了一个协议,见附件。




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接口建立数据连接




Air800的GPLDO如何使用?

用pmd.ldoset打开/关闭,pmd.ldoset(7,pmd.LDO_VIB)打开输出3.3V,pmd.ldoset(0,pmd.LDO_VIB)关闭输出




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

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

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

开发工具使用教程

1




AT版本的波特率是多少?

波特率无需特别设定,开发板会在发送第一个AT后自适应;所以请尝试多次发送AT;

发送AT后无需回车(\r)。




为什么发送AT指令没有任何响应?

首先请确认开发板是AT版,如果不是请下载AT版底层。

然后请确认串口线连接正确。

Q33

AT命令的格式为AT\r\n,\r\n为换行,有的串口助手可以发送新行。勾上即可

Q33

如果不行,请尝试更换其他串口调试助手。




如何把Luat版转换为AT版?

如果开发者想使用AT模式进行开发,必须得将模块的固件改为AT固件

3

3

3

可以看到,固件已经从Luat改为AT。

AT版本转换Luat版本同理:

选择对应的lod文件

2

3

完成后,可以通过软件版本查看是否下载成功

开发工具使用教程