RIL(虚拟AT)

# 简介 虚拟AT 也叫 VAT , 'V' 的英文就是 virtual 虚拟的意思; ,传统的AT 是上位机何下位机之间的通信指令,通常是通过物理串口进行交互;VAT 则不依赖具体的硬件串口,而是通过软件接口来实现等效功能,所以称它为虚拟AT. # 实现方法 ## 命令一 ril.setrilcb(cb) 参数cb 是一个回调函数, 用于将底层AT 指令返回的内容通过cb 输出到指定通道(如示例中的:usb_write ),或者应用自己的处理函数 ## 命令二 ril.request(strcmd) 参数 strcmd 就是用户要发给底层的 AT指令字符串。 # 示例 ``` --- 模块功能:MYVAT -- @author JWL -- @license MIT -- @copyright HEZHOU -- @release 2020.04.02 require"ril" require "utils" require "sys" require "pm" require "net" require "record" require "audio" require "rtos" require "misc" require "common" module(..., package.seeall) --开机就关掉RNDIS 否则物联网卡流量会被网卡给消耗掉。 ril.request("AT+RNDISCALL=0,1") --VAT是否打开 "1" 开 ,"0" 关 local flag_enatc = "1" -- 串口ID,串口读缓冲区 local recvQueue = {} -- 串口超时,串口准备好后发布的消息 local uartimeout, recvReady,RECV_MAXCNT = 100, "UART_RECV_ID",1024 --向PC 写入数据,目的是将AT指令的返回数据呈现给电脑一方 local function usb_write(data) uart.write(uart.USB, data) end --配置USB 的虚拟串口 uart.setup(uart.USB, 0, 0, uart.PAR_NONE, uart.STOP_1) uart.on(uart.USB, "receive", function() table.insert(recvQueue, uart.read(uart.USB, RECV_MAXCNT)) sys.timerStart(sys.publish, uartimeout, recvReady) end) --处理PC 发过来的AT 指令 function app_procmd(str_recv) log.info("str_recv------------",str_recv) local flag_handled=true --用来判断AT指令是否已经被应用层处理,如果已经被处理的就不需要发到底层去了。 local str_rsp ="" --临时存放应用层已经处理的AT指令返回字符串 local prefix = string.match(str_recv, "[aA][tT](%+%u+)") if prefix ~=nil then if prefix == "+RIL?" then --读取VAT标志开关标志 str_rsp = "+RIL:"..flag_enatc elseif prefix == "+RIL" then --设置VAT 开或者关 local temp_enatc = string.match( str_recv, "+RIL=(%d+)") if temp_enatc ~= nil then flag_enatc = temp_enatc end if flag_enatc == "0" then ril.setrilcb(nil) end str_rsp = "+RIL:"..flag_enatc else flag_handled=false end else if string.upper(str_recv) =="AT\r\n" then str_rsp ="OK\r\n" else flag_handled=false end end if str_rsp ~="" then usb_write(str_rsp) end if (not flag_handled) and (flag_enatc == "1") then log.info("send at cmd ==>" ,str_recv) ril.setrilcb(usb_write) ril.request(str_recv) end end --将从VAT 串口收到的内容进行拼接 sys.subscribe(recvReady, function() local str_recv = table.concat(recvQueue) recvQueue = {} app_procmd(str_recv) end) ``` # 常见问题 1,VAT 的指令和标准AT 指令,大部分都相同,由于标准AT 指令里面的CIP 开头的网络通信指令在LuatOS-Air 中通过 socket 接口实现,所以LuatOS-Air 不支持CIP 的AT 指令。 2,PC 端输入的AT 指令需要大写,比如 AT+CSQ 不要写成 At+CsQ 3,LuatOS-Air怎么仍用UART1发AT命令,LuatOS-Air和AT 混用 LuatOS-Air不支持通过串口1发AT命令,可以参考上面虚拟AT发送方法 # 测试源码 [ myvat.lua](https://cdn.openluat-luatcommunity.openluat.com/attachment/20210418122644714_myvat.lua)