xuxinyi пре 6 месеци
комит
d3a07760a2
100 измењених фајлова са 6049 додато и 0 уклоњено
  1. 2 0
      .gitignore
  2. 7 0
      .vscode/settings.json
  3. BIN
      BackGround/BAT&Rssi/Rssi0.jpg
  4. BIN
      BackGround/BAT&Rssi/Rssi1.jpg
  5. BIN
      BackGround/BAT&Rssi/Rssi2.jpg
  6. BIN
      BackGround/BAT&Rssi/Rssi3.jpg
  7. BIN
      BackGround/BAT&Rssi/Rssi4.jpg
  8. BIN
      BackGround/BAT&Rssi/b0.jpg
  9. BIN
      BackGround/BAT&Rssi/b1.jpg
  10. BIN
      BackGround/BAT&Rssi/b2.jpg
  11. BIN
      BackGround/BAT&Rssi/b3.jpg
  12. BIN
      BackGround/BAT&Rssi/b4.jpg
  13. BIN
      BackGround/Black.jpg
  14. BIN
      BackGround/Calling.jpg
  15. BIN
      BackGround/PowerOn.jpg
  16. BIN
      BackGround/PutInSerNum.jpg
  17. BIN
      BackGround/Standby.jpg
  18. BIN
      BackGround/WaitDispatch.jpg
  19. BIN
      BackGround/WaitService.jpg
  20. BIN
      BackGround/top.jpg
  21. BIN
      audio/camera-13695.mp3
  22. BIN
      audio/camera-250776.mp3
  23. BIN
      audio/shutter.mp3
  24. 18 0
      demo/CPU温度/getTemperature.lua
  25. 73 0
      demo/CPU温度/main.lua
  26. 0 0
      demo/MODBUS_SLAVE/.keep
  27. 76 0
      demo/MODBUS_SLAVE/main.lua
  28. 229 0
      demo/MODBUS_SLAVE/modbus_slave.lua
  29. 65 0
      demo/aLiYun/MQTT-TCP直连/企业版实例/一型一密预注册/main.lua
  30. 182 0
      demo/aLiYun/MQTT-TCP直连/企业版实例/一型一密预注册/testALiYun.lua
  31. 65 0
      demo/aLiYun/MQTT-TCP直连/企业版实例/一机一密/main.lua
  32. 171 0
      demo/aLiYun/MQTT-TCP直连/企业版实例/一机一密/testALiYun.lua
  33. 65 0
      demo/aLiYun/MQTT-TCP直连/公共实例/一型一密/main.lua
  34. 185 0
      demo/aLiYun/MQTT-TCP直连/公共实例/一型一密/testALiYun.lua
  35. 65 0
      demo/aLiYun/MQTT-TCP直连/公共实例/一机一密/main.lua
  36. 173 0
      demo/aLiYun/MQTT-TCP直连/公共实例/一机一密/testALiYun.lua
  37. 65 0
      demo/aLiYun/比较老的连接方式,仅用于华东2节点,其他地域不能使用;已经不推荐使用,建议使用MQTT-TCP直连/main.lua
  38. 209 0
      demo/aLiYun/比较老的连接方式,仅用于华东2节点,其他地域不能使用;已经不推荐使用,建议使用MQTT-TCP直连/testALiYun.lua
  39. 29 0
      demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/MessagemqttInMsg.lua
  40. 70 0
      demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/MessagemqttOutMsg.lua
  41. 104 0
      demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/MessagemqttTask.lua
  42. 64 0
      demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/main.lua
  43. BIN
      demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/微消息队列MQTT.docx
  44. 72 0
      demo/adc/main.lua
  45. 51 0
      demo/adc/testAdc.lua
  46. 65 0
      demo/alarm/main.lua
  47. 45 0
      demo/alarm/testAlarm.lua
  48. BIN
      demo/audio/0.mp3
  49. BIN
      demo/audio/1.mp3
  50. BIN
      demo/audio/10.amr
  51. BIN
      demo/audio/10.pcm
  52. BIN
      demo/audio/2.amr
  53. BIN
      demo/audio/2.mp3
  54. BIN
      demo/audio/3.mp3
  55. BIN
      demo/audio/4.mp3
  56. BIN
      demo/audio/8.pcm
  57. BIN
      demo/audio/alarm_door.pcm
  58. BIN
      demo/audio/alipay.amr
  59. BIN
      demo/audio/alipay.pcm
  60. BIN
      demo/audio/audio.rar
  61. BIN
      demo/audio/call.mp3
  62. BIN
      demo/audio/lowPower.mp3
  63. 74 0
      demo/audio/main.lua
  64. BIN
      demo/audio/pwron.mp3
  65. BIN
      demo/audio/record.spx
  66. BIN
      demo/audio/sms.mp3
  67. 192 0
      demo/audio/testAudio.lua
  68. 148 0
      demo/audio/testAudioStream.lua
  69. 97 0
      demo/audio/testHttpPlayMp3.lua
  70. BIN
      demo/audio/tip.amr
  71. BIN
      demo/audio/welcome.amr
  72. BIN
      demo/audio/yuan.amr
  73. BIN
      demo/audio/yuan.pcm
  74. BIN
      demo/audioParam/audio_calib.bin
  75. 72 0
      demo/audioParam/main.lua
  76. 37 0
      demo/audioParam/testAudioParam.lua
  77. BIN
      demo/audioParam/使用说明/AudioCalibrator_V2.3.5.7z
  78. BIN
      demo/audioParam/使用说明/NVEditor.rar
  79. BIN
      demo/audioParam/使用说明/V1.2_W20.25.1_NV.rar
  80. BIN
      demo/audioParam/使用说明/audio_calib bin生成工具.rar
  81. 12 0
      demo/audioParam/使用说明/使用说明.txt
  82. 44 0
      demo/bluetooth/beacon.lua
  83. 123 0
      demo/bluetooth/bt.lua
  84. 75 0
      demo/bluetooth/main.lua
  85. 180 0
      demo/bluetooth/master.lua
  86. 152 0
      demo/bluetooth/slave.lua
  87. BIN
      demo/call/call.mp3
  88. 5 0
      demo/call/key.lua
  89. 73 0
      demo/call/main.lua
  90. 169 0
      demo/call/testCall.lua
  91. BIN
      demo/call/tip.amr
  92. 115 0
      demo/camera/color_lcd_spi_gc9106l.lua
  93. 145 0
      demo/camera/color_lcd_spi_st7735.lua
  94. 73 0
      demo/camera/main.lua
  95. 1919 0
      demo/camera/testCamera.lua
  96. 39 0
      demo/camera/testUartSentFile.lua
  97. BIN
      demo/console/console功能使用说明.docx
  98. 63 0
      demo/console/main.lua
  99. 65 0
      demo/crypto/main.lua
  100. 27 0
      demo/crypto/private.key

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+
+调试日志/57 4C 66 00 7E 00 32 00 00 FF 85 17 51 5.vb

+ 7 - 0
.vscode/settings.json

@@ -0,0 +1,7 @@
+{
+    "idf.adapterTargetName": "esp32s3",
+    "idf.openOcdConfigs": [
+        "interface/ftdi/esp32_devkitj_v1.cfg",
+        "target/esp32s3.cfg"
+    ]
+}

BIN
BackGround/BAT&Rssi/Rssi0.jpg


BIN
BackGround/BAT&Rssi/Rssi1.jpg


BIN
BackGround/BAT&Rssi/Rssi2.jpg


BIN
BackGround/BAT&Rssi/Rssi3.jpg


BIN
BackGround/BAT&Rssi/Rssi4.jpg


BIN
BackGround/BAT&Rssi/b0.jpg


BIN
BackGround/BAT&Rssi/b1.jpg


BIN
BackGround/BAT&Rssi/b2.jpg


BIN
BackGround/BAT&Rssi/b3.jpg


BIN
BackGround/BAT&Rssi/b4.jpg


BIN
BackGround/Black.jpg


BIN
BackGround/Calling.jpg


BIN
BackGround/PowerOn.jpg


BIN
BackGround/PutInSerNum.jpg


BIN
BackGround/Standby.jpg


BIN
BackGround/WaitDispatch.jpg


BIN
BackGround/WaitService.jpg


BIN
BackGround/top.jpg


BIN
audio/camera-13695.mp3


BIN
audio/camera-250776.mp3


BIN
audio/shutter.mp3


+ 18 - 0
demo/CPU温度/getTemperature.lua

@@ -0,0 +1,18 @@
+--- 模块功能:CPU温度
+-- @author openLuat
+-- @module getTemperature
+-- @license MIT
+-- @copyright openLuat
+-- @release 2021.6.2
+module(...,package.seeall)
+require "misc"
+
+--模块温度返回回调函数
+--@temp温度,srting类型,如果要对该值进行运算,可以使用带float的固件将该值转为number
+local function getTemperatureCb(temp)
+    log.info("Temperature",temp)
+end
+
+--2秒循环查询模块温度
+sys.timerLoopStart(misc.getTemperature,2000,getTemperatureCb)
+

+ 73 - 0
demo/CPU温度/main.lua

@@ -0,0 +1,73 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "GET_TEMPERATURE"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载获取CPU温度模块
+require "getTemperature"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()
+

+ 0 - 0
demo/MODBUS_SLAVE/.keep


+ 76 - 0
demo/MODBUS_SLAVE/main.lua

@@ -0,0 +1,76 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "JGCAMER_TMP"
+VERSION = "1.0.22d"
+
+
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_INFO
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+--net.startQueryAll(60000, 160000)
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air800和Air801开发板上的指示灯引脚为pio.P0_28,其他开发板上的指示灯引脚为pio.P1_1
+--require "netLed"
+--netLed.setup(true,pio.P1_1)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+--require "errDump"
+--errDump.request("udp://ota.airm2m.com:9072")
+
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "i0HYcPLQOKXJ4ZJgqsfTlCeyiN5Ta9Rs"  --XRL202S_DEMO
+--PRODUCT_KEY = "pJLSua8vi39WLWDJRN1fp6YyMrUz7oye"  --Air720X标准模块
+
+-- PRODUCT_KEY = "BjAcFHv702Jpdoj1DiEyEqui3Y7nnYiQ"  --Air724HG标准模块
+-- require "update"
+-- update.request();
+
+ 
+
+--加载串口功能测试模块(串口1,TASK方式实现,串口帧超时分帧)
+
+ require "modbus_slave"
+
+
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 229 - 0
demo/MODBUS_SLAVE/modbus_slave.lua

@@ -0,0 +1,229 @@
+--- modbus模块功能
+-- @module modbus
+-- @author JWL
+-- @license MIT
+-- @copyright openLuat
+-- @release 2021.11.17
+
+module(...,package.seeall)
+
+require"utils"
+require"common"
+
+
+
+local THISDEV =0x01
+
+--保持系统处于唤醒状态,此处只是为了测试需要,所以此模块没有地方调用pm.sleep("testUart")休眠,不会进入低功耗休眠状态
+--在开发“要求功耗低”的项目时,一定要想办法保证pm.wake("modbusrtu")后,在不需要串口时调用pm.sleep("testUart")
+pm.wake("modbusrtuslav")
+
+local uart_id = 1
+local uart_baud = 9600
+--[[
+--   起始        地址    功能代码    数据       CRC校验    结束
+-- 3.5 字符     8 位      8 位      N x 8 位   16 位      3.5 字符
+--- 发送modbus数据函数
+@function   modbus_resp
+@param      slaveaddr : 从站地址
+            Instructions:功能码
+            hexdat 回复的数据 HEX STRING
+@return     无
+@usage modbus_resp("0x01","0x01","0x0101","0x04")
+]]
+local function modbus_resp(slaveaddr,Instructions,hexdat)
+    local data = (string.format("%02x",slaveaddr)..string.format("%02x",Instructions)..hexdat):fromHex()
+    local modbus_crc_data= pack.pack('<h', crypto.crc16("MODBUS",data))
+    local data_tx = data..modbus_crc_data
+    uart.write(uart_id,data_tx)
+end
+
+---仿真回复阵列,实际数字位则用业务状态/数据替换
+local rsptb={}
+rsptb[0x01]={0xFF,0XFF} 
+rsptb[0x02]={0x55,0X55} 
+rsptb[0x03]={0X00,0X01,0X02,0X03,0X04,0X05,0X06,0X07,0X08,0X09,0X0A,0X0B,0X0C,0X0D,0X0E,0X0F} 
+rsptb[0x04]={0X10,0X11,0X12,0X13,0X14,0X15,0X16,0X17,0X18,0X19,0X1A,0X1B,0X1C,0X1D,0X1E,0X1F} 
+
+local function MSK_DIGI(pos)
+    local msk =0
+    for i=1,pos do
+        msk=bit.lshift(msk,1)
+        msk=msk+1
+    end
+    return msk
+end
+
+local function modbus_read()
+    local cacheData = ""
+    while true do
+        local s = uart.read(uart_id,1)
+        if s == "" then
+        
+            if not sys.waitUntil("UART_RECEIVE",35000/uart_baud) then
+                -- 3.5个字符的时间间隔,只是用在RTU模式下面,因为RTU模式没有开始符和结束符,
+                -- 两个数据包之间只能靠时间间隔来区分,Modbus定义在不同的波特率下,间隔时间是不一样的,
+                -- 所以就是3.5个字符的时间,波特率高,这个时间间隔就小,波特率低,这个时间间隔相应就大
+                -- 4800  = 7.297ms
+                -- 9600  = 3.646ms
+                -- 19200  = 1.771ms
+                -- 38400  = 0.885ms
+                --uart接收数据,如果 35000/uart_baud 毫秒没有收到数据,则打印出来所有已收到的数据,清空数据缓冲区,等待下次数据接收
+                --注意:
+                --因为在整个GSM模块软件系统中,软件定时器的精确性无法保证,例如本demo配置的是100毫秒,在系统繁忙时,实际延时可能远远超过100毫秒,达到200毫秒、300毫秒、400毫秒等
+                --设置的延时时间越短,误差越大
+                if cacheData:len()>0 then
+                    local a = string.toHex(cacheData)
+                    log.info("modbus接收数据:",a)
+
+                    -- 0x01: 读线圈寄存器               位操作     单个或多个
+                    -- 0x02: 读离散输入寄存器           位操作     单个或多个
+                    -- 0x03: 读保持寄存器               字节操作   单个或多个
+                    -- 0x04: 读输入寄存器               字节操作   单个或多个
+                    -- 0x05: 写单个线圈寄存器           位操作     单个
+                    -- 0x06: 写单个保持寄存器           字节操作   单个
+                    -- 0x0f: 写多个线圈寄存器           位操作     多个
+                    -- 0x10: 写多个保持寄存器           字节操作   多个
+
+                    -- ----------------------错误码定义---------------------------------
+                    -- 01	非法功能。对于服务器(或从站)来说,询问中接收到的功能码是不可允许的操作,可能是因为功能码仅适用于新设备而被选单元中不可实现同时,还指出服务器(或从站)在错误状态中处理这种请求,例如:它是未配置的,且要求返回寄存器值。
+                    -- 02	非法数据地址。对于服务器(或从站)来说,询问中接收的数据地址是不可允许的地址,特别是参考号和传输长度的组合是无效的。对于带有100个寄存器的控制器来说,偏移量96和长度4的请求会成功,而偏移量96和长度5的请求将产生异常码02。
+                    -- 03	非法数据值。对于服务器(或从站)来说,询问中包括的值是不可允许的值。该值指示了组合请求剩余结构中的故障。例如:隐含长度是不正确的。modbus协议不知道任何特殊寄存器的任何特殊值的重要意义,寄存器中被提交存储的数据项有一个应用程序期望之外的值。
+                    -- 04	从站设备故障。当服务器(或从站)正在设法执行请求的操作时,产生不可重新获得的差错。
+                    -- 05	确认。与编程命令一起使用,服务器(或从站)已经接受请求,并且正在处理这个请求,但是需要长持续时间进行这些操作,返回这个响应防止在客户机(或主站)中发生超时错误,客户机(或主机)可以继续发送轮询程序完成报文来确认是否完成处理。
+                    -- 06	从属设备忙。与编程命令一起使用。服务器(或从站)正在处理长持续时间的程序命令。张服务器(或从站)空闲时,用户(或主站)应该稍后重新传输报文。
+                    -- 08	存储奇偶差错。与功能码20和21以及参考类型6一起使用,指示扩展文件区不能通过一致性校验。服务器(或从站)设法读取记录文件,但是在存储器中发现一个奇偶校验错误。客户机(或主方)可以重新发送请求,但可以在服务器(或从站)设备上要求服务。
+                    -- 10	不可用网关路径。与网关一起使用,指示网关不能为处理请求分配输入端口至输出端口的内部通信路径。通常意味着网关是错误配置的或过载的。
+                    -- 11	网关目标设备响应失败。与网关一起使用,指示没有从目标设备中获得响应。通常意味着设备未在网络中。
+
+                    local nextpos ,dev, func = pack.unpack(cacheData,"bb",1)
+                    log.info("nextpos ,dev, func ",nextpos , string.format("%02X,%02X", dev or 0, func or 0)  )
+                    --01 06 0001 0002 59CB
+                    if dev ==THISDEV then
+                         if func == 0x01 or func == 0x02  or func == 0x03  or func == 0x04 or func == 0x05 or func == 0x06 then
+                            if #cacheData >= 8 then
+                                local strcrc= pack.pack('<h', crypto.crc16("MODBUS",cacheData:sub(1,6)))
+                                if strcrc == cacheData:sub(7,8) then
+                                    local _, reg,val = pack.unpack(cacheData,">H>H",nextpos)
+                                    log.info("a-func,crc is correct!",func,  string.format("reg=0x%04X, val=0x%04X",reg,val))
+                                    --校验正确后,根据不同的功能码做回复(DEMO 忽略起始地址)
+                                    if func ==0x01 or func ==0x02 then 
+                                        ---01 01 00 00 00 0A BC 0D
+                                        local _,bitcnt =  pack.unpack(cacheData,">H",5)
+                                        if bitcnt >0 then 
+                                             local bytlen ,hflg=0,false
+                                             if bitcnt%8 == 0 then  
+                                                bytlen= bitcnt/8 
+                                             else  
+                                                bytlen=  ( bitcnt- bitcnt%8)/8 + 1  
+                                                hflg =true
+                                             end
+                                             if bytlen <= #rsptb[func] then
+                                                local strhex =""
+                                                for i=1,bytlen do
+                                                    if hflg and i ==bytlen then 
+                                                        --不足一个字节的位数,主机和从机之间定好协议,这里就简化成低位掩码,用户自己对照
+                                                        local msk = MSK_DIGI(bitcnt%8)
+                                                        strhex = strhex.. string.format("%02x", bit.band( rsptb[func][i] ,msk) )  
+                                                    else
+                                                        strhex = strhex.. string.format("%02x",rsptb[func][i])  
+                                                    end
+                                                end
+                                                log.info(" bytlen , #rsptb[func], msk,strhex", bytlen , #rsptb[func],msk,strhex)
+                                                modbus_resp(THISDEV,func, string.format("%02x%s",#strhex/2,strhex))
+                                             else
+                                                modbus_resp(THISDEV,func+0x80, string.format("%02x",0x02))
+                                             end
+                                        end
+                                    elseif  func ==0x03 or func ==0x04 then 
+                                        local _,bytlen =  pack.unpack(cacheData,">H",5)
+                                        if bytlen <=#rsptb[func] then
+                                            local strhex =""
+                                            for i=1,bytlen do
+                                               strhex = strhex.. string.format("%04x",rsptb[func][i])  
+                                            end
+                                            log.info(" bytlen , #rsptb[func], msk,strhex", bytlen , #rsptb[func],msk,strhex)
+                                            modbus_resp(THISDEV,func, string.format("%02x%s",#strhex/2,strhex))
+                                        else
+                                            modbus_resp(THISDEV,func+0x80, string.format("%02x",0x02))
+                                        end
+                                    elseif  func ==0x05 or func ==0x06 then 
+                                        --假设写入都是成功的,实际上写入也要判断值域:回复则是原包返回
+                                        log.info("save set data ",func,  string.format("reg=0x%04X, val=0x%04X",reg,val))
+                                        local strhex = string.format("%04X%04X",reg,val)
+                                        modbus_resp(THISDEV,func, strhex)
+
+                                    else
+                                        log.info("unkonw func",func)
+                                        modbus_resp(THISDEV,func+0x80, string.format("%02x",0x01))
+                                    end
+                                else
+                                    log.info("a-func #cacheData  crc, calcrc", func, #cacheData, cacheData:sub(7,8) :toHex(),  strcrc:toHex())
+                                end
+                            end
+                        elseif func == 0x0F   then 
+                            local dlen = cacheData:byte(nextpos+4)
+                            if #cacheData >= 7+dlen+2 then
+                                local strcrc= pack.pack('<h', crypto.crc16("MODBUS",cacheData:sub(1,7+dlen)))
+                                if strcrc == cacheData:sub(7+dlen+1,7+dlen+2) then
+                                    local _, reg,val = pack.unpack(cacheData,">H>H",nextpos)
+                                    local tmpdat = cacheData:sub(8,dlen+8-1)
+                                     --假设写入都是成功的,实际上写入也要判断值域:回复为起始地址和线圈个数
+                                    log.info("b-func crc is correct!",func,dlen,"will save:", tmpdat:toHex())
+                                    local strhex = string.format("%04X%04X",reg,val)
+                                    modbus_resp(THISDEV,func,strhex)
+                                else
+                                    log.info("b-func,#cacheData  crc, calcrc",func, #cacheData, cacheData:sub(7+dlen+1,7+dlen+2) :toHex(),  strcrc:toHex())
+                                end
+                            end
+
+                        elseif func == 0x10 then 
+                            local dlen = cacheData:byte(nextpos+4)
+                            log.info("#cacheData,func,dlen=",#cacheData,func,dlen)
+                            --01 10 0000 000A 14 0000000000000000000000000000000000000000 70FE
+
+                            if #cacheData >= 7+dlen+2 then
+                                local strcrc= pack.pack('<h', crypto.crc16("MODBUS",cacheData:sub(1,7+dlen)))
+                                if strcrc == cacheData:sub(7+dlen+1,7+dlen+2) then
+                                    local _, reg,val = pack.unpack(cacheData,">H>H",nextpos)
+                                    local tmpdat = cacheData:sub(8,dlen +8-1)
+                                    --假设写入都是成功的,实际上写入也要判断值域:回复为起始地址和字节个数
+                                    log.info("c-func crc is correct!",func,dlen,"will save:", tmpdat:toHex(),  #tmpdat/2,"words")
+                                    local strhex = string.format("%04X%04X",reg,val)
+                                    modbus_resp(THISDEV,func,strhex)
+
+                                else
+                                    log.info("c-func,#cacheData  crc, calcrc",func, #cacheData, cacheData:sub(7+dlen+1,7+dlen+2) :toHex(),  strcrc:toHex())
+                                end
+                            end
+                        end
+                    end
+                    --MODBUS 暂时不考虑粘包的情况
+                    cacheData = ""
+                end
+            end
+        else
+            cacheData = cacheData..s
+        end
+    end
+end
+
+
+
+
+--配置并且打开串口
+uart.setup(uart_id,uart_baud,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+--配置485的GPIO DIR
+uart.set_rs485_oe(uart_id,18)
+
+--注册串口的数据发送通知函数
+uart.on(uart_id,"receive",function() sys.publish("UART_RECEIVE") end)
+
+
+--启动串口数据接收任务
+sys.taskInit(modbus_read)
+
+
+
+
+

+ 65 - 0
demo/aLiYun/MQTT-TCP直连/企业版实例/一型一密预注册/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ALIYUN"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载阿里云功能测试模块
+require "testALiYun"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 182 - 0
demo/aLiYun/MQTT-TCP直连/企业版实例/一型一密预注册/testALiYun.lua

@@ -0,0 +1,182 @@
+--- 模块功能:阿里云功能测试.
+-- 支持数据传输和OTA功能
+-- @author openLuat
+-- @module aLiYun.testALiYun
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.04.14
+
+module(...,package.seeall)
+
+require"aLiYun"
+require"misc"
+require"pm"
+
+--三元组信息,根据实际值自行修改
+--注意:这里默认的三元组无法连接上阿里云
+local PRODUCT_KEY = "yourProductKey"
+local PRODUCE_SECRET = "PrIhAcqfNdCdvccf"
+local DEVICE_NAME = "862991234567890"
+
+--企业版实例ID,根据实际值自行修改
+--注意:这里实例ID无法连接上阿里云
+local INSTANCE_ID = "yourInstanceId"
+
+--[[
+函数名:getDeviceName
+功能  :获取设备名称
+参数  :无
+返回值:设备名称
+]]
+local function getDeviceName()
+    return DEVICE_NAME
+end
+
+
+--[[
+函数名:getDeviceSecret
+功能  :获取设备密钥
+参数  :无
+返回值:设备密钥
+]]
+local function getDeviceSecret()
+    --默认使用设备的SN作为设备密钥,用户可以根据项目需求自行修改
+    return misc.getSn()
+end
+
+--[[
+函数名:setDeviceSecret
+功能  :修改设备密钥
+参数  :设备密钥
+返回值:无
+]]
+local function setDeviceSecret(s)
+    --默认使用设备的SN作为设备密钥,用户可以根据项目需求自行修改
+    misc.setSn(s)
+end
+
+--阿里云客户端是否处于连接状态
+local sConnected
+
+local publishCnt = 1
+
+--[[
+函数名:pubqos1testackcb
+功能  :发布1条qos为1的消息后收到PUBACK的回调函数
+参数  :
+		usertag:调用mqttclient:publish时传入的usertag
+		result:true表示发布成功,false或者nil表示失败
+返回值:无
+]]
+local function publishTestCb(result,para)
+    log.info("testALiYun.publishTestCb",result,para)
+    sys.timerStart(publishTest,20000)
+    publishCnt = publishCnt+1
+end
+
+--发布一条QOS为1的消息
+function publishTest()
+    if sConnected then
+        --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
+        aLiYun.publish("/"..PRODUCT_KEY.."/"..getDeviceName().."/update","qos1data",1,publishTestCb,"publishTest_"..publishCnt)
+    end
+end
+
+---数据接收的处理函数
+-- @string topic,UTF8编码的消息主题
+-- @number qos,消息质量等级
+-- @string payload,原始编码的消息负载
+local function rcvCbFnc(topic,qos,payload)
+    log.info("testALiYun.rcvCbFnc",topic,qos,payload)
+end
+
+--- 连接结果的处理函数
+-- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
+local function connectCbFnc(result)
+    log.info("testALiYun.connectCbFnc",result)
+    sConnected = result
+    if result then
+        --订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
+        --根据自己的项目需要订阅主题,下面注释掉的一行代码中的主题是非法的,所以不能打开,一旦打开,会导致订阅失败
+        --aLiYun.subscribe({["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
+        --注册数据接收的处理函数
+        aLiYun.on("receive",rcvCbFnc)
+        --PUBLISH消息测试
+        publishTest()
+    end
+end
+
+aLiYun.on("connect",connectCbFnc)
+--setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
+--aLiYun.setMqtt(0)
+aLiYun.setConnectMode("direct",INSTANCE_ID..".mqtt.iothub.aliyuncs.com",1883)
+aLiYun.setup(PRODUCT_KEY,PRODUCE_SECRET,getDeviceName,getDeviceSecret,setDeviceSecret)
+
+--要使用阿里云OTA功能,必须参考本文件124或者126行aLiYun.setup去配置参数
+--然后加载阿里云OTA功能模块(打开下面的代码注释)
+require"aLiYunOta"
+--如果利用阿里云OTA功能去下载升级合宙模块的新固件,默认的固件版本号格式为:_G.PROJECT.."_".._G.VERSION.."_"..sys.getcorever(),下载结束后,直接重启,则到此为止,不需要再看下文说明
+
+
+--如果下载升级合宙模块的新固件,下载结束后,自己控制是否重启
+--如果利用阿里云OTA功能去下载其他升级包,例如模块外接的MCU升级包,则根据实际情况,打开下面的代码注释,调用设置接口进行配置和处理
+--设置MCU当前运行的固件版本号
+--aLiYunOta.setVer("MCU_VERSION_1.0.0")
+--设置新固件下载后保存的文件名
+--aLiYunOta.setName("MCU_FIRMWARE.bin")
+
+--[[
+函数名:otaCb
+功能  :新固件文件下载结束后的回调函数
+        通过uart1(115200,8,uart.PAR_NONE,uart.STOP_1)把下载成功的文件,发送到MCU,发送成功后,删除此文件
+参数  :
+		result:下载结果,true为成功,false为失败
+		filePath:新固件文件保存的完整路径,只有result为true时,此参数才有意义
+返回值:无
+]]
+local function otaCb(result,filePath)
+    log.info("testALiYun.otaCb",result,filePath)
+    if result then
+        local uartID = 1
+        sys.taskInit(
+            function()                
+                local fileHandle = io.open(filePath,"rb")
+                if not fileHandle then
+                    log.error("testALiYun.otaCb open file error")
+                    if filePath then os.remove(filePath) end
+                    return
+                end
+                
+                pm.wake("UART_SENT2MCU")
+                uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
+                uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+                while true do
+                    local data = fileHandle:read(1460)
+                    if not data then break end
+                    uart.write(uartID,data)
+                    sys.waitUntil("UART_SENT2MCU_OK")
+                end
+                --此处上报新固件版本号(仅供测试使用)
+                --用户开发自己的程序时,根据下载下来的新固件,执行升级动作
+                --升级成功后,调用aLiYunOta.setVer上报新固件版本号
+                --如果升级失败,调用aLiYunOta.setVer上报旧固件版本号
+                aLiYunOta.setVer("MCU_VERSION_1.0.1")
+                
+                uart.close(uartID)
+                pm.sleep("UART_SENT2MCU")
+                fileHandle:close()
+                if filePath then os.remove(filePath) end
+            end
+        )
+
+        
+    else
+        --文件使用完之后,如果以后不再需求,需要自行删除
+        if filePath then os.remove(filePath) end
+    end    
+end
+
+
+--设置新固件下载结果的回调函数
+--aLiYunOta.setCb(otaCb)
+

+ 65 - 0
demo/aLiYun/MQTT-TCP直连/企业版实例/一机一密/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ALIYUN"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载阿里云功能测试模块
+require "testALiYun"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 171 - 0
demo/aLiYun/MQTT-TCP直连/企业版实例/一机一密/testALiYun.lua

@@ -0,0 +1,171 @@
+--- 模块功能:阿里云功能测试.
+-- 支持数据传输和OTA功能
+-- @author openLuat
+-- @module aLiYun.testALiYun
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.04.14
+
+module(...,package.seeall)
+
+require"aLiYun"
+require"misc"
+require"pm"
+
+--三元组信息,根据实际值自行修改
+--注意:这里默认的三元组无法连接上阿里云
+local PRODUCT_KEY = "yourProductKey"
+local DEVICE_NAME = "862991234567890"
+local DEVICE_SECRET = "7b0012b7997c62cd985d4913785d02e7"
+
+--企业版实例ID,根据实际值自行修改
+--注意:这里实例ID无法连接上阿里云
+local INSTANCE_ID = "yourInstanceId"
+
+
+--[[
+函数名:getDeviceName
+功能  :获取设备名称
+参数  :无
+返回值:设备名称
+]]
+local function getDeviceName()
+    return DEVICE_NAME
+end
+
+
+--[[
+函数名:getDeviceSecret
+功能  :获取设备密钥
+参数  :无
+返回值:设备密钥
+]]
+local function getDeviceSecret()
+    return DEVICE_SECRET
+end
+
+--阿里云客户端是否处于连接状态
+local sConnected
+
+local publishCnt = 1
+
+--[[
+函数名:pubqos1testackcb
+功能  :发布1条qos为1的消息后收到PUBACK的回调函数
+参数  :
+		usertag:调用mqttclient:publish时传入的usertag
+		result:true表示发布成功,false或者nil表示失败
+返回值:无
+]]
+local function publishTestCb(result,para)
+    log.info("testALiYun.publishTestCb",result,para)
+    sys.timerStart(publishTest,20000)
+    publishCnt = publishCnt+1
+end
+
+--发布一条QOS为1的消息
+function publishTest()
+    if sConnected then
+        --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
+        aLiYun.publish("/"..PRODUCT_KEY.."/"..getDeviceName().."/update","qos1data",1,publishTestCb,"publishTest_"..publishCnt)
+    end
+end
+
+---数据接收的处理函数
+-- @string topic,UTF8编码的消息主题
+-- @number qos,消息质量等级
+-- @string payload,原始编码的消息负载
+local function rcvCbFnc(topic,qos,payload)
+    log.info("testALiYun.rcvCbFnc",topic,qos,payload)
+end
+
+--- 连接结果的处理函数
+-- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
+local function connectCbFnc(result)
+    log.info("testALiYun.connectCbFnc",result)
+    sConnected = result
+    if result then
+        --订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
+        --根据自己的项目需要订阅主题,下面注释掉的一行代码中的主题是非法的,所以不能打开,一旦打开,会导致订阅失败
+        --aLiYun.subscribe({["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
+        --注册数据接收的处理函数
+        aLiYun.on("receive",rcvCbFnc)
+        --PUBLISH消息测试
+        publishTest()
+    end
+end
+
+aLiYun.on("connect",connectCbFnc)
+--setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
+--aLiYun.setMqtt(0)
+aLiYun.setConnectMode("direct",INSTANCE_ID..".mqtt.iothub.aliyuncs.com",1883)
+aLiYun.setup(PRODUCT_KEY,nil,getDeviceName,getDeviceSecret)
+
+--要使用阿里云OTA功能,必须参考本文件124或者126行aLiYun.setup去配置参数
+--然后加载阿里云OTA功能模块(打开下面的代码注释)
+require"aLiYunOta"
+--如果利用阿里云OTA功能去下载升级合宙模块的新固件,默认的固件版本号格式为:_G.PROJECT.."_".._G.VERSION.."_"..sys.getcorever(),下载结束后,直接重启,则到此为止,不需要再看下文说明
+
+
+--如果下载升级合宙模块的新固件,下载结束后,自己控制是否重启
+--如果利用阿里云OTA功能去下载其他升级包,例如模块外接的MCU升级包,则根据实际情况,打开下面的代码注释,调用设置接口进行配置和处理
+--设置MCU当前运行的固件版本号
+--aLiYunOta.setVer("MCU_VERSION_1.0.0")
+--设置新固件下载后保存的文件名
+--aLiYunOta.setName("MCU_FIRMWARE.bin")
+
+--[[
+函数名:otaCb
+功能  :新固件文件下载结束后的回调函数
+        通过uart1(115200,8,uart.PAR_NONE,uart.STOP_1)把下载成功的文件,发送到MCU,发送成功后,删除此文件
+参数  :
+		result:下载结果,true为成功,false为失败
+		filePath:新固件文件保存的完整路径,只有result为true时,此参数才有意义
+返回值:无
+]]
+local function otaCb(result,filePath)
+    log.info("testALiYun.otaCb",result,filePath)
+    if result then
+        local uartID = 1
+        sys.taskInit(
+            function()                
+                local fileHandle = io.open(filePath,"rb")
+                if not fileHandle then
+                    log.error("testALiYun.otaCb open file error")
+                    if filePath then os.remove(filePath) end
+                    return
+                end
+                
+                pm.wake("UART_SENT2MCU")
+                uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
+                uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+                while true do
+                    local data = fileHandle:read(1460)
+                    if not data then break end
+                    uart.write(uartID,data)
+                    sys.waitUntil("UART_SENT2MCU_OK")
+                end
+                --此处上报新固件版本号(仅供测试使用)
+                --用户开发自己的程序时,根据下载下来的新固件,执行升级动作
+                --升级成功后,调用aLiYunOta.setVer上报新固件版本号
+                --如果升级失败,调用aLiYunOta.setVer上报旧固件版本号
+                aLiYunOta.setVer("MCU_VERSION_1.0.1")
+                
+                uart.close(uartID)
+                pm.sleep("UART_SENT2MCU")
+                fileHandle:close()
+                if filePath then os.remove(filePath) end
+            end
+        )
+
+        
+    else
+        --文件使用完之后,如果以后不再需求,需要自行删除
+        if filePath then os.remove(filePath) end
+    end    
+end
+
+
+--设置新固件下载结果的回调函数
+--aLiYunOta.setCb(otaCb)
+

+ 65 - 0
demo/aLiYun/MQTT-TCP直连/公共实例/一型一密/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ALIYUN"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载阿里云功能测试模块
+require "testALiYun"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 185 - 0
demo/aLiYun/MQTT-TCP直连/公共实例/一型一密/testALiYun.lua

@@ -0,0 +1,185 @@
+--- 模块功能:阿里云功能测试.
+-- 支持数据传输和OTA功能
+-- @author openLuat
+-- @module aLiYun.testALiYun
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.04.14
+
+module(...,package.seeall)
+
+require"aLiYun"
+require"misc"
+require"pm"
+
+--地域和可用区,详情参考:https://help.aliyun.com/document_detail/40654.html?spm=a2c4g.11186623.2.22.797d7c80uIGAZ7
+--根据自己的产品所在地域修改
+local REGION_ID = "cn-shanghai"
+
+--三元组信息,根据实际值自行修改
+--注意:这里默认的三元组无法连接上阿里云
+local PRODUCT_KEY = "yourProductKey"
+local PRODUCE_SECRET = "8vOb5miTNRLrFecG"
+local DEVICE_NAME = "862991234567890"
+
+--[[
+函数名:getDeviceName
+功能  :获取设备名称
+参数  :无
+返回值:设备名称
+]]
+local function getDeviceName()
+    return DEVICE_NAME
+end
+
+
+--[[
+函数名:getDeviceSecret
+功能  :获取设备密钥
+参数  :无
+返回值:设备密钥
+]]
+local function getDeviceSecret()
+    --默认使用设备的SN作为设备密钥,用户可以根据项目需求自行修改
+    return misc.getSn()
+end
+
+--[[
+函数名:setDeviceSecret
+功能  :修改设备密钥
+参数  :设备密钥
+返回值:无
+]]
+local function setDeviceSecret(s)
+    --默认使用设备的SN作为设备密钥,用户可以根据项目需求自行修改
+    misc.setSn(s)
+end
+
+--阿里云客户端是否处于连接状态
+local sConnected
+
+local publishCnt = 1
+
+--[[
+函数名:pubqos1testackcb
+功能  :发布1条qos为1的消息后收到PUBACK的回调函数
+参数  :
+		usertag:调用mqttclient:publish时传入的usertag
+		result:true表示发布成功,false或者nil表示失败
+返回值:无
+]]
+local function publishTestCb(result,para)
+    log.info("testALiYun.publishTestCb",result,para)
+    sys.timerStart(publishTest,20000)
+    publishCnt = publishCnt+1
+end
+
+--发布一条QOS为1的消息
+function publishTest()
+    if sConnected then
+        --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
+        aLiYun.publish("/"..PRODUCT_KEY.."/"..getDeviceName().."/update","qos1data",1,publishTestCb,"publishTest_"..publishCnt)
+    end
+end
+
+---数据接收的处理函数
+-- @string topic,UTF8编码的消息主题
+-- @number qos,消息质量等级
+-- @string payload,原始编码的消息负载
+local function rcvCbFnc(topic,qos,payload)
+    log.info("testALiYun.rcvCbFnc",topic,qos,payload)
+end
+
+--- 连接结果的处理函数
+-- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
+local function connectCbFnc(result)
+    log.info("testALiYun.connectCbFnc",result)
+    sConnected = result
+    if result then
+        --订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
+        --根据自己的项目需要订阅主题,下面注释掉的一行代码中的主题是非法的,所以不能打开,一旦打开,会导致订阅失败
+        --aLiYun.subscribe({["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
+        --注册数据接收的处理函数
+        aLiYun.on("receive",rcvCbFnc)
+        --PUBLISH消息测试
+        publishTest()
+    end
+end
+
+--rrpcUseCustomTopic接口不是必须的,在设置rrpc自定义topic时调用
+--aLiyun.rrpcUseCustomTopic(true)
+aLiYun.on("connect",connectCbFnc)
+--setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
+--aLiYun.setMqtt(0)
+aLiYun.setRegion(REGION_ID)
+aLiYun.setConnectMode("direct",PRODUCT_KEY..".iot-as-mqtt."..REGION_ID..".aliyuncs.com",1883)
+aLiYun.setup(PRODUCT_KEY,PRODUCE_SECRET,getDeviceName,getDeviceSecret,setDeviceSecret)
+
+--要使用阿里云OTA功能,必须参考本文件124或者126行aLiYun.setup去配置参数
+--然后加载阿里云OTA功能模块(打开下面的代码注释)
+require"aLiYunOta"
+--如果利用阿里云OTA功能去下载升级合宙模块的新固件,默认的固件版本号格式为:_G.PROJECT.."_".._G.VERSION.."_"..sys.getcorever(),下载结束后,直接重启,则到此为止,不需要再看下文说明
+
+
+--如果下载升级合宙模块的新固件,下载结束后,自己控制是否重启
+--如果利用阿里云OTA功能去下载其他升级包,例如模块外接的MCU升级包,则根据实际情况,打开下面的代码注释,调用设置接口进行配置和处理
+--设置MCU当前运行的固件版本号
+--aLiYunOta.setVer("MCU_VERSION_1.0.0")
+--设置新固件下载后保存的文件名
+--aLiYunOta.setName("MCU_FIRMWARE.bin")
+
+--[[
+函数名:otaCb
+功能  :新固件文件下载结束后的回调函数
+        通过uart1(115200,8,uart.PAR_NONE,uart.STOP_1)把下载成功的文件,发送到MCU,发送成功后,删除此文件
+参数  :
+		result:下载结果,true为成功,false为失败
+		filePath:新固件文件保存的完整路径,只有result为true时,此参数才有意义
+返回值:无
+]]
+local function otaCb(result,filePath)
+    log.info("testALiYun.otaCb",result,filePath)
+    if result then
+        local uartID = 1
+        sys.taskInit(
+            function()
+                local fileHandle = io.open(filePath,"rb")
+                if not fileHandle then
+                    log.error("testALiYun.otaCb open file error")
+                    if filePath then os.remove(filePath) end
+                    return
+                end
+
+                pm.wake("UART_SENT2MCU")
+                uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
+                uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+                while true do
+                    local data = fileHandle:read(1460)
+                    if not data then break end
+                    uart.write(uartID,data)
+                    sys.waitUntil("UART_SENT2MCU_OK")
+                end
+                --此处上报新固件版本号(仅供测试使用)
+                --用户开发自己的程序时,根据下载下来的新固件,执行升级动作
+                --升级成功后,调用aLiYunOta.setVer上报新固件版本号
+                --如果升级失败,调用aLiYunOta.setVer上报旧固件版本号
+                aLiYunOta.setVer("MCU_VERSION_1.0.1")
+
+                uart.close(uartID)
+                pm.sleep("UART_SENT2MCU")
+                fileHandle:close()
+                if filePath then os.remove(filePath) end
+            end
+        )
+
+
+    else
+        --文件使用完之后,如果以后不再需求,需要自行删除
+        if filePath then os.remove(filePath) end
+    end
+end
+
+
+--设置新固件下载结果的回调函数
+--aLiYunOta.setCb(otaCb)
+

+ 65 - 0
demo/aLiYun/MQTT-TCP直连/公共实例/一机一密/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ALIYUN"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载阿里云功能测试模块
+require "testALiYun"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 173 - 0
demo/aLiYun/MQTT-TCP直连/公共实例/一机一密/testALiYun.lua

@@ -0,0 +1,173 @@
+--- 模块功能:阿里云功能测试.
+-- 支持数据传输和OTA功能
+-- @author openLuat
+-- @module aLiYun.testALiYun
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.04.14
+
+module(...,package.seeall)
+
+require"aLiYun"
+require"misc"
+require"pm"
+
+--地域和可用区,详情参考:https://help.aliyun.com/document_detail/40654.html?spm=a2c4g.11186623.2.22.797d7c80uIGAZ7
+--根据自己的产品所在地域修改
+local REGION_ID = "cn-shanghai"
+
+--三元组信息,根据实际值自行修改
+--注意:这里默认的三元组无法连接上阿里云
+local PRODUCT_KEY = "yourProductKey"
+local DEVICE_NAME = "862991234567890"
+local DEVICE_SECRET = "c85d8dd8d28fbf527b2a4a36a67b7541"
+
+--[[
+函数名:getDeviceName
+功能  :获取设备名称
+参数  :无
+返回值:设备名称
+]]
+local function getDeviceName()
+    return DEVICE_NAME
+end
+
+
+--[[
+函数名:getDeviceSecret
+功能  :获取设备密钥
+参数  :无
+返回值:设备密钥
+]]
+local function getDeviceSecret()
+    return DEVICE_SECRET
+end
+
+--阿里云客户端是否处于连接状态
+local sConnected
+
+local publishCnt = 1
+
+--[[
+函数名:pubqos1testackcb
+功能  :发布1条qos为1的消息后收到PUBACK的回调函数
+参数  :
+		usertag:调用mqttclient:publish时传入的usertag
+		result:true表示发布成功,false或者nil表示失败
+返回值:无
+]]
+local function publishTestCb(result,para)
+    log.info("testALiYun.publishTestCb",result,para)
+    sys.timerStart(publishTest,20000)
+    publishCnt = publishCnt+1
+end
+
+--发布一条QOS为1的消息
+function publishTest()
+    if sConnected then
+        --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
+        aLiYun.publish("/"..PRODUCT_KEY.."/"..getDeviceName().."/update","qos1data",1,publishTestCb,"publishTest_"..publishCnt)
+    end
+end
+
+---数据接收的处理函数
+-- @string topic,UTF8编码的消息主题
+-- @number qos,消息质量等级
+-- @string payload,原始编码的消息负载
+local function rcvCbFnc(topic,qos,payload)
+    log.info("testALiYun.rcvCbFnc",topic,qos,payload)
+end
+
+--- 连接结果的处理函数
+-- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
+local function connectCbFnc(result)
+    log.info("testALiYun.connectCbFnc",result)
+    sConnected = result
+    if result then
+        --订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
+        --根据自己的项目需要订阅主题,下面注释掉的一行代码中的主题是非法的,所以不能打开,一旦打开,会导致订阅失败
+        --aLiYun.subscribe({["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
+        --注册数据接收的处理函数
+        aLiYun.on("receive",rcvCbFnc)
+        --PUBLISH消息测试
+        publishTest()
+    end
+end
+
+--rrpcUseCustomTopic接口不是必须的,在设置rrpc自定义topic时调用
+--aLiyun.rrpcUseCustomTopic(true)
+aLiYun.on("connect",connectCbFnc)
+--setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
+--aLiYun.setMqtt(0)
+aLiYun.setRegion(REGION_ID)
+aLiYun.setConnectMode("direct",PRODUCT_KEY..".iot-as-mqtt."..REGION_ID..".aliyuncs.com",1883)
+aLiYun.setup(PRODUCT_KEY,nil,getDeviceName,getDeviceSecret)
+
+--要使用阿里云OTA功能,必须参考本文件124或者126行aLiYun.setup去配置参数
+--然后加载阿里云OTA功能模块(打开下面的代码注释)
+require"aLiYunOta"
+--如果利用阿里云OTA功能去下载升级合宙模块的新固件,默认的固件版本号格式为:_G.PROJECT.."_".._G.VERSION.."_"..sys.getcorever(),下载结束后,直接重启,则到此为止,不需要再看下文说明
+
+
+--如果下载升级合宙模块的新固件,下载结束后,自己控制是否重启
+--如果利用阿里云OTA功能去下载其他升级包,例如模块外接的MCU升级包,则根据实际情况,打开下面的代码注释,调用设置接口进行配置和处理
+--设置MCU当前运行的固件版本号
+--aLiYunOta.setVer("MCU_VERSION_1.0.0")
+--设置新固件下载后保存的文件名
+--aLiYunOta.setName("MCU_FIRMWARE.bin")
+
+--[[
+函数名:otaCb
+功能  :新固件文件下载结束后的回调函数
+        通过uart1(115200,8,uart.PAR_NONE,uart.STOP_1)把下载成功的文件,发送到MCU,发送成功后,删除此文件
+参数  :
+		result:下载结果,true为成功,false为失败
+		filePath:新固件文件保存的完整路径,只有result为true时,此参数才有意义
+返回值:无
+]]
+local function otaCb(result,filePath)
+    log.info("testALiYun.otaCb",result,filePath)
+    if result then
+        local uartID = 1
+        sys.taskInit(
+            function()
+                local fileHandle = io.open(filePath,"rb")
+                if not fileHandle then
+                    log.error("testALiYun.otaCb open file error")
+                    if filePath then os.remove(filePath) end
+                    return
+                end
+
+                pm.wake("UART_SENT2MCU")
+                uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
+                uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+                while true do
+                    local data = fileHandle:read(1460)
+                    if not data then break end
+                    uart.write(uartID,data)
+                    sys.waitUntil("UART_SENT2MCU_OK")
+                end
+                --此处上报新固件版本号(仅供测试使用)
+                --用户开发自己的程序时,根据下载下来的新固件,执行升级动作
+                --升级成功后,调用aLiYunOta.setVer上报新固件版本号
+                --如果升级失败,调用aLiYunOta.setVer上报旧固件版本号
+                aLiYunOta.setVer("MCU_VERSION_1.0.1")
+
+                uart.close(uartID)
+                pm.sleep("UART_SENT2MCU")
+                fileHandle:close()
+                if filePath then os.remove(filePath) end
+            end
+        )
+
+
+    else
+        --文件使用完之后,如果以后不再需求,需要自行删除
+        if filePath then os.remove(filePath) end
+    end
+end
+
+
+--设置新固件下载结果的回调函数
+--aLiYunOta.setCb(otaCb)
+

+ 65 - 0
demo/aLiYun/比较老的连接方式,仅用于华东2节点,其他地域不能使用;已经不推荐使用,建议使用MQTT-TCP直连/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ALIYUN"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载阿里云功能测试模块
+require "testALiYun"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 209 - 0
demo/aLiYun/比较老的连接方式,仅用于华东2节点,其他地域不能使用;已经不推荐使用,建议使用MQTT-TCP直连/testALiYun.lua

@@ -0,0 +1,209 @@
+--- 模块功能:阿里云功能测试.
+-- 支持数据传输和OTA功能
+-- @author openLuat
+-- @module aLiYun.testALiYun
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.04.14
+
+module(...,package.seeall)
+
+require"aLiYun"
+require"misc"
+require"pm"
+
+--采用一机一密认证方案时:
+--PRODUCT_KEY为阿里云华东2站点上创建的产品的ProductKey,用户根据实际值自行修改
+local PRODUCT_KEY = "b0FMK1Ga5cp"
+--除了上面的PRODUCT_KEY外,还需要提供获取DeviceName的函数、获取DeviceSecret的函数
+--设备名称使用函数getDeviceName的返回值,默认为设备的IMEI
+--设备密钥使用函数getDeviceSecret的返回值,默认为设备的SN
+--单体测试时,可以直接修改getDeviceName和getDeviceSecret的返回值
+--批量量产时,使用设备的IMEI和SN;合宙生产的模块,都有唯一的IMEI,用户可以在自己的产线批量写入跟IMEI(设备名称)对应的SN(设备密钥)
+--或者用户自建一个服务器,设备上报IMEI给服务器,服务器返回对应的设备密钥,然后调用misc.setSn接口写到设备的SN中
+
+--采用一型一密认证方案时:
+--PRODUCT_KEY和PRODUCE_SECRET为阿里云华东2站点上创建的产品的ProductKey和ProductSecret,用户根据实际值自行修改
+--local PRODUCT_KEY = "b1KCi45LcCP"
+--local PRODUCE_SECRET = "VWll9fiYWKiwraBk"
+--除了上面的PRODUCT_KEY和PRODUCE_SECRET外,还需要提供获取DeviceName的函数、获取DeviceSecret的函数、设置DeviceSecret的函数
+--设备第一次在某个product下使用时,会先去云端动态注册,获取到DeviceSecret后,调用设置DeviceSecret的函数保存DeviceSecret
+
+--[[
+函数名:getDeviceName
+功能  :获取设备名称
+参数  :无
+返回值:设备名称
+]]
+local function getDeviceName()
+    --默认使用设备的IMEI作为设备名称,用户可以根据项目需求自行修改    
+    return misc.getImei()
+    
+    --用户单体测试时,可以在此处直接返回阿里云的iot控制台上注册的设备名称,例如return "862991419835241"
+    --return "862991419835241"
+end
+
+--[[
+函数名:setDeviceSecret
+功能  :修改设备密钥
+参数  :设备密钥
+返回值:无
+]]
+local function setDeviceSecret(s)
+    --默认使用设备的SN作为设备密钥,用户可以根据项目需求自行修改
+    misc.setSn(s)
+end
+
+
+--[[
+函数名:getDeviceSecret
+功能  :获取设备密钥
+参数  :无
+返回值:设备密钥
+]]
+local function getDeviceSecret()
+    --默认使用设备的SN作为设备密钥,用户可以根据项目需求自行修改
+    return misc.getSn()
+    
+    --用户单体测试时,可以在此处直接返回阿里云的iot控制台上生成的设备密钥,例如return "y7MTCG6Gk33Ux26bbWSpANl4OaI0bg5Q"
+    --return "y7MTCG6Gk33Ux26bbWSpANl4OaI0bg5Q"
+end
+
+--阿里云客户端是否处于连接状态
+local sConnected
+
+local publishCnt = 1
+
+--[[
+函数名:pubqos1testackcb
+功能  :发布1条qos为1的消息后收到PUBACK的回调函数
+参数  :
+		usertag:调用mqttclient:publish时传入的usertag
+		result:true表示发布成功,false或者nil表示失败
+返回值:无
+]]
+local function publishTestCb(result,para)
+    log.info("testALiYun.publishTestCb",result,para)
+    sys.timerStart(publishTest,20000)
+    publishCnt = publishCnt+1
+end
+
+--发布一条QOS为1的消息
+function publishTest()
+    if sConnected then
+        --注意:在此处自己去控制payload的内容编码,aLiYun库中不会对payload的内容做任何编码转换
+        aLiYun.publish("/"..PRODUCT_KEY.."/"..getDeviceName().."/update","qos1data",1,publishTestCb,"publishTest_"..publishCnt)
+    end
+end
+
+---数据接收的处理函数
+-- @string topic,UTF8编码的消息主题
+-- @number qos,消息质量等级
+-- @string payload,原始编码的消息负载
+local function rcvCbFnc(topic,qos,payload)
+    log.info("testALiYun.rcvCbFnc",topic,qos,payload)
+end
+
+--- 连接结果的处理函数
+-- @bool result,连接结果,true表示连接成功,false或者nil表示连接失败
+local function connectCbFnc(result)
+    log.info("testALiYun.connectCbFnc",result)
+    sConnected = result
+    if result then
+        --订阅主题,不需要考虑订阅结果,如果订阅失败,aLiYun库中会自动重连
+        aLiYun.subscribe({["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=0, ["/"..PRODUCT_KEY.."/"..getDeviceName().."/get"]=1})
+        --注册数据接收的处理函数
+        aLiYun.on("receive",rcvCbFnc)
+        --PUBLISH消息测试
+        publishTest()
+    end
+end
+
+-- 认证结果的处理函数
+-- @bool result,认证结果,true表示认证成功,false或者nil表示认证失败
+local function authCbFnc(result)
+    log.info("testALiYun.authCbFnc",result)
+end
+
+--采用一机一密认证方案时:
+--配置:ProductKey、获取DeviceName的函数、获取DeviceSecret的函数;其中aLiYun.setup中的第二个参数必须传入nil
+aLiYun.setup(PRODUCT_KEY,nil,getDeviceName,getDeviceSecret)
+
+--采用一型一密认证方案时:
+--配置:ProductKey、ProductSecret、获取DeviceName的函数、获取DeviceSecret的函数、设置DeviceSecret的函数
+--aLiYun.setup(PRODUCT_KEY,PRODUCE_SECRET,getDeviceName,getDeviceSecret,setDeviceSecret)
+
+--setMqtt接口不是必须的,aLiYun.lua中有这个接口设置的参数默认值,如果默认值满足不了需求,参考下面注释掉的代码,去设置参数
+--aLiYun.setMqtt(0)
+aLiYun.on("auth",authCbFnc)
+aLiYun.on("connect",connectCbFnc)
+
+
+--要使用阿里云OTA功能,必须参考本文件124或者126行aLiYun.setup去配置参数
+--然后加载阿里云OTA功能模块(打开下面的代码注释)
+require"aLiYunOta"
+--如果利用阿里云OTA功能去下载升级合宙模块的新固件,默认的固件版本号格式为:_G.PROJECT.."_".._G.VERSION.."_"..sys.getcorever(),下载结束后,直接重启,则到此为止,不需要再看下文说明
+
+
+--如果下载升级合宙模块的新固件,下载结束后,自己控制是否重启
+--如果利用阿里云OTA功能去下载其他升级包,例如模块外接的MCU升级包,则根据实际情况,打开下面的代码注释,调用设置接口进行配置和处理
+--设置MCU当前运行的固件版本号
+--aLiYunOta.setVer("MCU_VERSION_1.0.0")
+--设置新固件下载后保存的文件名
+--aLiYunOta.setName("MCU_FIRMWARE.bin")
+
+--[[
+函数名:otaCb
+功能  :新固件文件下载结束后的回调函数
+        通过uart1(115200,8,uart.PAR_NONE,uart.STOP_1)把下载成功的文件,发送到MCU,发送成功后,删除此文件
+参数  :
+		result:下载结果,true为成功,false为失败
+		filePath:新固件文件保存的完整路径,只有result为true时,此参数才有意义
+返回值:无
+]]
+local function otaCb(result,filePath)
+    log.info("testALiYun.otaCb",result,filePath)
+    if result then
+        local uartID = 1
+        sys.taskInit(
+            function()                
+                local fileHandle = io.open(filePath,"rb")
+                if not fileHandle then
+                    log.error("testALiYun.otaCb open file error")
+                    if filePath then os.remove(filePath) end
+                    return
+                end
+                
+                pm.wake("UART_SENT2MCU")
+                uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
+                uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+                while true do
+                    local data = fileHandle:read(1460)
+                    if not data then break end
+                    uart.write(uartID,data)
+                    sys.waitUntil("UART_SENT2MCU_OK")
+                end
+                --此处上报新固件版本号(仅供测试使用)
+                --用户开发自己的程序时,根据下载下来的新固件,执行升级动作
+                --升级成功后,调用aLiYunOta.setVer上报新固件版本号
+                --如果升级失败,调用aLiYunOta.setVer上报旧固件版本号
+                aLiYunOta.setVer("MCU_VERSION_1.0.1")
+                
+                uart.close(uartID)
+                pm.sleep("UART_SENT2MCU")
+                fileHandle:close()
+                if filePath then os.remove(filePath) end
+            end
+        )
+
+        
+    else
+        --文件使用完之后,如果以后不再需求,需要自行删除
+        if filePath then os.remove(filePath) end
+    end    
+end
+
+
+--设置新固件下载结果的回调函数
+--aLiYunOta.setCb(otaCb)
+

+ 29 - 0
demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/MessagemqttInMsg.lua

@@ -0,0 +1,29 @@
+--- 模块功能:微消息队列_MQTT客户端数据接收处理
+-- @author openLuat
+-- @module mqtt.mqttInMsg
+-- @license MIT
+-- @copyright openLuat
+-- @release 2022.08.31
+
+module(...,package.seeall)
+
+--- MQTT客户端数据接收处理
+-- @param mqttClient,MQTT客户端对象
+-- @return 处理成功返回true,处理出错返回false
+-- @usage mqttInMsg.proc(mqttClient)
+function proc(mqttClient)
+    local result,data
+    while true do
+        result,data = mqttClient:receive(60000,"APP_SOCKET_SEND_DATA")
+        --接收到数据
+        if result then
+            log.info("mqttInMsg.proc",data.topic,data.payload)
+                
+            --TODO:根据需求自行处理data.payload
+        else
+            break
+        end
+    end
+	
+    return result or data=="timeout" or data=="APP_SOCKET_SEND_DATA"
+end

+ 70 - 0
demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/MessagemqttOutMsg.lua

@@ -0,0 +1,70 @@
+--- 模块功能:微消息队列_MQTT客户端数据发送处理
+-- @author openLuat
+-- @module mqtt.mqttOutMsg
+-- @license MIT
+-- @copyright openLuat
+-- @release 2022.08.31
+
+
+module(...,package.seeall)
+
+--数据发送的消息队列
+local msgQueue = {}
+
+local function insertMsg(topic,payload,qos,user)
+    if MessagemqttTask.isReady() then
+        table.insert(msgQueue,{t=topic,p=payload,q=qos,user=user})
+        sys.publish("APP_SOCKET_SEND_DATA")
+    end
+end
+-------发布测试------
+
+local function pubQos0TestCb(result)
+    log.info("mqttOutMsg.pubQos0TestCb",result)
+    if result then sys.timerStart(pubQos0Test,10000) end
+end
+
+function pubQos0Test()
+    insertMsg("luatceshi/ceshiwanglong","12345",0,{cb=pubQos0TestCb}) -----换成自己的主题,或者注释掉,不然报错
+end
+
+
+
+-------发布测试------
+
+--- 初始化“MQTT客户端数据发送”
+-- @return 无
+-- @usage mqttOutMsg.init()
+function init()
+    pubQos0Test()
+end
+
+
+
+--- 去初始化“MQTT客户端数据发送”
+-- @return 无
+-- @usage mqttOutMsg.unInit()
+function unInit()
+    while #msgQueue>0 do
+        local outMsg = table.remove(msgQueue,1)
+        if outMsg.user and outMsg.user.cb then outMsg.user.cb(false,outMsg.user.para) end
+    end
+end
+
+
+--- MQTT客户端数据发送处理
+-- @param mqttClient,MQTT客户端对象
+-- @return 处理成功返回true,处理出错返回false
+-- @usage mqttOutMsg.proc(mqttClient)
+function proc(mqttClient)
+    --log.info("mqttOutMsg.proc1",#msgQueue)
+    while #msgQueue>0 do
+        local outMsg = table.remove(msgQueue,1)
+        log.info("mqttOutMsg.proc before publish",outMsg.p)
+        local result = mqttClient:publish(outMsg.t,outMsg.p,outMsg.q)
+        --log.info("mqttOutMsg.proc after publish",result)
+        if outMsg.user and outMsg.user.cb then outMsg.user.cb(result,outMsg.user.para) end
+        if not result then return end
+    end
+    return true
+end

+ 104 - 0
demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/MessagemqttTask.lua

@@ -0,0 +1,104 @@
+--- 模块功能:微消息队列_MQTT客户端处理框架
+-- @author openLuat
+-- @module mqtt.mqttTask
+-- @license MIT
+-- @copyright openLuat
+-- @release 2022.08.31
+
+module(...,package.seeall)
+
+require"misc"
+require"mqtt"
+require"MessagemqttOutMsg"
+require"MessagemqttInMsg"
+local ready = false
+---------------注意ParentTopic Group_ID 的长度不易过长 ,阿里云限制最多64个字符---------------
+
+ParentTopic="XXX" --父级Topic 必须在微消息队列MQTT版控制台创建
+Group_ID="XXXXX" --共用组名 必须在微消息队列MQTT版控制台创建
+HOST="XXXXX"--微消息队列接入点
+INSTANCE_ID="XXXXXX" --实例ID 微消息队列MQTT版控制台可以看到
+AccessKey_ID="XXXXXXXX" ---阿里云访问凭证
+AccessKey_Secret="XXXXXXXXXXX"
+---------------微消息队列参数设置---------------
+--- MQTT连接是否处于激活状态
+-- @return 激活状态返回true,非激活状态返回false
+-- @usage mqttTask.isReady()
+function isReady()
+    return ready
+end
+
+function getSubscribeTopic()
+    -- return PARENT_TOPIC.."/y506/"..nvm.get("deviceSn")
+    return ParentTopic.."/ceshiwanglong" ----改为自己的topic
+	--------p2p模式----------------------
+	
+	---return ParentTopic.."/p2p/".."/Group_ID .. "@@@" ..misc.getSn()/" ----改为自己的topic
+	----发送P2P消息时,需将二级Topic设为“p2p”,将三级Topic设为目标接收者的Client ID。
+	----接收消息的客户端无需任何订阅处理,只需要完成客户端的初始化即可收到P2P消息。
+	--------p2p模式----------------------
+end
+
+
+
+--启动MQTT客户端任务
+sys.taskInit(function()
+    local retryConnectCnt = 0
+    while true do
+        if not socket.isReady() then
+            retryConnectCnt = 0
+            -- 等待网络环境准备就绪,超时时间是5分钟
+            sys.waitUntil("IP_READY_IND", 300000)
+        end
+
+        if socket.isReady() then
+            -- 创建一个MQTT客户端
+
+            local clientID = Group_ID .. "@@@" ..misc.getSn()
+            local userName = "Signature|" .. AccessKey_ID .. "|" .. INSTANCE_ID
+            local password = string.fromHex(crypto.hmac_sha1(clientID, clientID:len(),AccessKey_Secret,AccessKey_Secret:len()))
+            password = crypto.base64_encode(password, password:len())
+            local mqttClient = mqtt.client(clientID,600,userName,password,nil)
+            -- 阻塞执行MQTT CONNECT动作,直至成功
+            -- 如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
+            -- mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
+            if mqttClient:connect(HOST, 1883, "tcp") then
+                retryConnectCnt = 0
+                ready = true
+                -- 订阅主题
+                if mqttClient:subscribe(getSubscribeTopic(),1) then
+                    MessagemqttOutMsg.init()
+                    -- 循环处理接收和发送的数据
+                    while true do
+                        if not MessagemqttInMsg.proc(mqttClient) then
+                            log.error("mqttTask.MessagemqttInMsg.proc error")
+                            break
+                        end
+                        if not MessagemqttOutMsg.proc(mqttClient) then
+                            log.error("mqttTask.MessagemqttOutMsg.proc error")
+                            break
+                        end
+                    end
+                    MessagemqttOutMsg.unInit()
+                end
+                ready = false
+            else
+                retryConnectCnt = retryConnectCnt + 1
+            end
+            -- 断开MQTT连接
+            mqttClient:disconnect()
+            if retryConnectCnt >= 5 then
+                link.shut()
+                retryConnectCnt = 0
+            end
+            sys.wait(5000)
+        else
+            -- 进入飞行模式,20秒之后,退出飞行模式
+            net.switchFly(true)
+            sys.wait(20000)
+            net.switchFly(false)
+        end
+    end
+end)
+
+

+ 64 - 0
demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/main.lua

@@ -0,0 +1,64 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "MICRO_MESSAGE_MQTT"
+VERSION = "1.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载MQTT功能测试模块
+require "MessagemqttTask"
+--启动系统框架
+sys.init(0, 0)
+sys.run()

BIN
demo/aLiYun/阿里云微消息队列MQTT/MICRO_MESSAGE_MQTT/微消息队列MQTT.docx


+ 72 - 0
demo/adc/main.lua

@@ -0,0 +1,72 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ADC"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载ADC功能测试模块
+require "testAdc"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 51 - 0
demo/adc/testAdc.lua

@@ -0,0 +1,51 @@
+--- 模块功能:ADC功能测试.
+-- ADC测量精度(12bit)
+-- 每隔1s读取一次ADC值
+-- @author openLuat
+-- @module adc.testAdc
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.12.19
+
+module(...,package.seeall)
+
+--- ADC读取测试
+-- @return 无
+-- @usage read2()
+local function read2()
+    --ADC2接口用来读取电压
+    local ADC_ID = 2
+    -- 读取adc
+    -- adcval为number类型,表示adc的原始值,无效值为0xFFFF
+    -- voltval为number类型,表示转换后的电压值,单位为毫伏,无效值为0xFFFF
+
+    local adcval,voltval = adc.read(ADC_ID)
+    log.info("testAdc2.read",adcval,voltval)
+end
+
+--- ADC读取测试
+-- @return 无
+-- @usage read3()
+local function read3()
+    --ADC3接口用来读取电压
+    local ADC_ID = 3
+    -- 读取adc
+    -- adcval为number类型,表示adc的原始值,无效值为0xFFFF
+    -- voltval为number类型,表示转换后的电压值,单位为毫伏,无效值为0xFFFF
+
+    local adcval,voltval = adc.read(ADC_ID)
+    log.info("testAdc3.read",adcval,voltval)
+end
+
+-- 开启对应的adc通道
+adc.open(2)
+adc.open(3)
+
+-- 定时每秒读取adc值
+sys.timerLoopStart(read2,1000)
+sys.timerLoopStart(read3,1000)
+
+require"misc"
+sys.timerLoopStart(function ()
+    log.info("vbatt.read",misc.getVbatt())
+end,1000)

+ 65 - 0
demo/alarm/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "ALARM"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载闹钟功能测试模块
+require "testAlarm"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 45 - 0
demo/alarm/testAlarm.lua

@@ -0,0 +1,45 @@
+--- 模块功能:闹钟功能测试(支持开机闹钟和关机闹钟,同时只能存在一个闹钟,如果想实现多个闹钟,等当前闹钟触发后,再次调用闹钟设置接口去配置下一个闹钟).
+-- @author openLuat
+-- @module alarm.testAlarm
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.14
+
+require"ntp"
+require "sys"
+require"misc"
+module(...,package.seeall)
+
+
+sys.taskInit(function()
+    sys.wait(10000)
+    log.info("alarm test start")
+    misc.setClock({year=2020,month=5,day=1,hour=12,min=12,sec=12})
+    sys.wait(2000)
+    local onTimet = os.date("*t",os.time() + 60)  --下次要开机的时间为60秒后
+    log.info("alarm restart time", 60)
+    rtos.set_alarm(1,onTimet.year,onTimet.month,onTimet.day,onTimet.hour,onTimet.min,onTimet.sec)   --设定闹铃
+    --如果要测试关机闹钟,打开下面这2行代码
+    --sys.wait(2000)
+    --rtos.poweroff()
+end)
+
+--[[
+函数名:alarMsg
+功能  :开机闹钟事件的处理函数
+参数  :无
+返回值:无
+]]
+local function alarMsg()
+	print("alarMsg")
+end
+
+--如果是关机闹钟开机,则需要软件主动重启一次,才能启动GSM协议栈
+if rtos.poweron_reason()==rtos.POWERON_ALARM then
+	sys.restart("ALARM")
+end
+
+--注册闹钟模块
+rtos.init_module(rtos.MOD_ALARM)
+--注册闹钟消息的处理函数(如果是开机闹钟,闹钟事件到来时会调用alarmsg)
+rtos.on(rtos.MSG_ALARM,alarMsg)



BIN
demo/audio/10.amr


BIN
demo/audio/10.pcm







BIN
demo/audio/alarm_door.pcm


BIN
demo/audio/alipay.amr


BIN
demo/audio/alipay.pcm


BIN
demo/audio/audio.rar


BIN
demo/audio/call.mp3


BIN
demo/audio/lowPower.mp3


+ 74 - 0
demo/audio/main.lua

@@ -0,0 +1,74 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "AUDIO"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载AUDIO功能测试模块
+require "testAudio"
+--require "testAudioStream"
+--require "testHttpPlayMp3"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

BIN
demo/audio/pwron.mp3


BIN
demo/audio/record.spx


BIN
demo/audio/sms.mp3


+ 192 - 0
demo/audio/testAudio.lua

@@ -0,0 +1,192 @@
+--- 模块功能:音频功能测试.
+-- @author openLuat
+-- @module audio.testAudio
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.19
+
+module(...,package.seeall)
+--require"record"
+require"audio"
+require"common"
+
+--音频播放优先级,对应audio.play接口中的priority参数;数值越大,优先级越高,用户根据自己的需求设置优先级
+--PWRON:开机铃声
+--CALL:来电铃声
+--SMS:新短信铃声
+--TTS:TTS播放
+--REC:录音音频
+PWRON,CALL,SMS,TTS,REC = 4,3,2,1,0
+
+local function testCb(r)
+    log.info("testAudio.testCb",r)
+end
+
+--播放音频文件测试接口,每次打开一行代码进行测试
+local function testPlayFile()
+    --单次播放来电铃声,默认音量等级
+    --audio.play(CALL,"FILE","/lua/call.mp3")
+    --单次播放来电铃声,音量等级7
+    --audio.play(CALL,"FILE","/lua/call.mp3",audiocore.VOL7)
+    --单次播放来电铃声,音量等级7,播放结束或者出错调用testcb回调函数
+    --audio.play(CALL,"FILE","/lua/call.mp3",audiocore.VOL7,testCb)
+    --循环播放来电铃声,音量等级7,没有循环间隔(一次播放结束后,立即播放下一次)
+    audio.play(CALL,"FILE","/lua/call.mp3",audiocore.VOL7,nil,true)
+    --循环播放来电铃声,音量等级7,循环间隔为2000毫秒
+    --audio.play(CALL,"FILE","/lua/call.mp3",audiocore.VOL7,nil,true,2000)
+end
+
+
+--播放tts测试接口,每次打开一行代码进行测试
+--audio.play接口要求TTS数据为UTF8编码,因为本文件编辑时采用的是UTF8编码,所以可以直接使用ttsStr,不用做编码转换
+--如果用户自己编辑脚本时,采用的不是UTF8编码,需要调用common.XXX2utf8接口进行转换
+local ttsStr = "上海合宙通信科技有限公司欢迎您"
+local function testPlayTts()
+    --单次播放,默认音量等级
+    --audio.play(TTS,"TTS",ttsStr)
+    --单次播放,音量等级7
+    --audio.play(TTS,"TTS",ttsStr,7)
+    --单次播放,音量等级7,播放结束或者出错调用testcb回调函数
+    --audio.play(TTS,"TTS",ttsStr,7,testCb)
+    --循环播放,音量等级7,没有循环间隔(一次播放结束后,立即播放下一次)
+    --audio.play(TTS,"TTS",ttsStr,7,nil,true)
+    --循环播放,音量等级7,循环间隔为2000毫秒
+    audio.play(TTS,"TTS",ttsStr,7,nil,true,2000)
+end
+
+
+--播放冲突测试接口,每次打开一个if语句进行测试
+local function testPlayConflict()
+    if true then
+        --循环播放来电铃声
+        audio.play(CALL,"FILE","/lua/call.mp3",7,nil,true)
+        --5秒钟后,循环播放开机铃声
+        sys.timerStart(audio.play,5000,PWRON,"FILE","/lua/pwron.mp3",7,nil,true)        
+    end    
+
+    if false then
+        --循环播放来电铃声
+        audio.play(CALL,"FILE","/lua/call.mp3",audiocore.VOL7,nil,true)
+        --5秒钟后,尝试循环播放新短信铃声,但是优先级不够,不会播放
+        sys.timerStart(audio.play,5000,SMS,"FILE","/lua/sms.mp3",7,nil,true)        
+    end    
+
+    if false then
+        --循环播放TTS
+        audio.play(TTS,"TTS",ttsStr,7,nil,true)
+        --10秒钟后,循环播放开机铃声
+        sys.timerStart(audio.play,10000,PWRON,"FILE","/lua/pwron.mp3",7,nil,true)        
+    end
+
+
+    if false then
+        --循环播放录音
+        audio.play(REC,"RECORD",1,7,nil,true)
+        --5秒钟后,循环播放开机铃声
+        sys.timerStart(audio.play,5000,PWRON,"FILE","/lua/pwron.mp3",7,nil,true)        
+    end   
+end
+
+
+local function tesTtsNew()
+    --设置优先级相同时的播放策略,1表示停止当前播放,播放新的播放请求
+    audio.setStrategy(1)
+    audio.play(TTS,"TTS",ttsStr,7)
+end
+
+--audio.setChannel(1)
+
+--每次打开下面的一种分支进行测试
+
+if true then
+    if string.match(rtos.get_version(),"TTS") then
+        sys.timerStart(testPlayTts,5000)
+        --如果要测试tts播放时,请求播放新的tts,打开下面这段代码
+        --sys.timerLoopStart(tesTtsNew,5000)
+    else
+        sys.timerStart(testPlayFile,5000)
+    end
+else
+    sys.timerStart(testPlayConflict,5000)
+    
+    --5秒后,开始录音6秒,之后进行播放冲突测试接口
+    --sys.timerStart(record.start,5000,6,testPlayConflict)
+end
+
+--[[
+sys.taskInit(function()
+    local vol = 1
+    while true do
+        log.info("vol",vol)
+        --audio.play(CALL,"FILE","/lua/call.mp3",vol,function() sys.publish("PLAY_END") end)
+        audio.play(TTS,"TTS",ttsStr,vol,function() sys.publish("PLAY_END") end)
+        sys.waitUntil("PLAY_END")
+        vol = (vol==7) and 1 or (vol+1)
+    end
+end)
+]]
+
+--[[
+sys.taskInit(function()
+    
+    while true do        
+        sys.wait(2000)  
+        
+        --播放多arm文件方式
+        local multiFile = {"/lua/alipay.amr","/lua/10.amr","/lua/2.amr","/lua/yuan.amr"}
+        audio.play(1,"FILE",multiFile,7,function() sys.publish("armMultiTest") end)
+        sys.waitUntil("armMultiTest")
+        
+        sys.wait(2000)
+        
+        --播放多pcm文件方式
+        multiFile = {"/lua/alipay.pcm","/lua/10.pcm","/lua/8.pcm","/lua/yuan.pcm"}
+        audio.play(1,"FILE",multiFile,7,function() sys.publish("armMultiTest") end)
+        sys.waitUntil("armMultiTest")        
+        
+    end
+end)
+]]
+
+--支持audiocore.CLASS_AB和audiocore.CLASS_D两种
+--注意:烧录软件后,第一次开机后需要重启一次,设置才会生效
+--audiocore.setpa(audiocore.CLASS_AB)
+--[[
+sys.taskInit(function()    
+    while true do                
+        audio.play(TTS,"TTS","支付宝收款242425元",3,function() sys.publish("PLAY_END") end)
+        sys.waitUntil("PLAY_END")
+        
+        audio.play(TTS,"TTS","支付宝收款303000元",3,function() sys.publish("PLAY_END") end)
+        sys.waitUntil("PLAY_END")
+        
+        audio.play(TTS,"TTS","支付宝收款6003000元",3,function() sys.publish("PLAY_END") end)
+        sys.waitUntil("PLAY_END")
+    end
+end)
+]]
+
+--audio.setTTSSpeed(5)
+--pcall(audiocore.pa,13,2)
+--audiocore.setpa(audiocore.CLASS_D)
+--audio.setChannel(1)
+
+--[[
+sys.taskInit(function()
+    
+    while true do        
+        sys.wait(2000)  
+        
+        --播放多mp3文件方式
+        local multiFile = {"/lua/0.mp3","/lua/1.mp3","/lua/2.mp3","/lua/3.mp3","/lua/4.mp3"}
+        audio.play(1,"FILE",multiFile,2,function() sys.publish("mp3MultiTest") end)
+        sys.waitUntil("mp3MultiTest") 
+        
+    end
+end)
+]]
+
+
+
+
+

+ 148 - 0
demo/audio/testAudioStream.lua

@@ -0,0 +1,148 @@
+--- 模块功能:音频功能测试.
+-- @author openLuat
+-- @module audio.testAudio
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.19
+
+module(...,package.seeall)
+--require"record"
+require"audio"
+require"common"
+
+
+local tBuffer = {}
+local tStreamType
+--[[
+local function consumer()
+    sys.taskInit(function()
+        audio.setVolume(7)
+        while true do
+            while #tBuffer==0 do
+                sys.waitUntil("DATA_STREAM_IND")
+            end
+
+            local data = table.remove(tBuffer,1)
+            --log.info("testAudioStream.consumer remove",data:len())
+            local procLen = audiocore.streamplay(tStreamType,data)
+            if procLen<data:len() then
+                --log.warn("produce fast")
+                table.insert(tBuffer,1,data:sub(procLen+1,-1))
+                sys.wait(5)
+            end
+        end
+    end)
+end
+
+
+local function producer(streamType)
+    sys.taskInit(function()
+        while true do
+            tStreamType = streamType
+            local tAudioFile =
+            {
+                [audiocore.AMR] = "tip.amr",
+                [audiocore.SPX] = "record.spx",
+                [audiocore.PCM] = "alarm_door.pcm",
+                [audiocore.MP3] = "call.mp3",
+            }
+            
+            local fileHandle = io.open("/lua/"..tAudioFile[streamType],"rb")
+            if not fileHandle then
+                log.error("testAudioStream.producer open file error")
+                return
+            end
+            
+            while true do
+                local data = fileHandle:read(streamType==audiocore.SPX and 1200 or 1024)
+                if not data then fileHandle:close() return end
+                table.insert(tBuffer,data)
+                if #tBuffer==1 then sys.publish("DATA_STREAM_IND") end
+                --log.info("testAudioStream.producer",data:len())
+                sys.wait(10)
+            end  
+        end
+    end)
+end
+
+sys.timerStart(function()
+    --producer(audiocore.AMR)
+    --producer(audiocore.SPX)
+    producer(audiocore.PCM)
+    --producer(audiocore.MP3)
+    consumer()
+end,3000)
+]]--
+
+local function testAudioStream(streamType)
+    sys.taskInit(
+        function()
+            while true do
+                tStreamType = streamType
+		    	log.info("AudioTest.AudioStreamTest", "AudioStreamPlay Start", streamType)
+                local tAudioFile =
+                {
+                    [audiocore.AMR] = "tip.amr",
+                    [audiocore.SPX] = "record.spx",
+                    [audiocore.PCM] = "alarm_door.pcm",
+                    [audiocore.MP3] = "sms.mp3"
+                }
+                local fileHandle = io.open("/lua/" .. tAudioFile[streamType], "rb")
+                if not fileHandle then
+                    log.error("AudioTest.AudioStreamTest", "Open file error")
+                    return
+                end
+
+                while true do
+                    local data = fileHandle:read(streamType == audiocore.SPX and 1200 or 1024)
+                    if not data then 
+		    			fileHandle:close() 
+                        while audiocore.streamremain() ~= 0 do
+                            sys.wait(20)	
+                        end
+                        sys.wait(1000)
+                        audiocore.stop() --添加audiocore.stop()接口,否则再次播放会播放不出来
+                        log.warn("AudioTest.AudioStreamTest", "AudioStreamPlay Over")
+                        return 
+		    		end
+
+                    local data_len = string.len(data)
+                    local curr_len = 1
+                    while true do
+                        curr_len = curr_len + audiocore.streamplay(tStreamType,string.sub(data,curr_len,-1))
+                        if curr_len>=data_len then
+                            break
+                        elseif curr_len == 0 then
+                            log.error("AudioTest.AudioStreamTest", "AudioStreamPlay Error", streamType)
+                            return
+                        end
+                        sys.wait(10)
+                    end
+                    sys.wait(10)
+                end  
+            end
+        end
+    )
+end
+
+sys.taskInit(
+    function()
+        sys.wait(3000)
+        while true do
+            audio.setVolume(2)
+            log.info("AudioTest.AudioStreamTest.AMRFilePlayTest", "Start")
+            testAudioStream(audiocore.AMR)
+            sys.wait(30000)
+            log.info("AudioTest.AudioStreamTest.SPXFilePlayTest", "Start")
+            testAudioStream(audiocore.SPX)
+            sys.wait(30000)
+            log.info("AudioTest.AudioStreamTest.PCMFilePlayTest", "Start")
+            testAudioStream(audiocore.PCM)
+            sys.wait(30000)
+            log.info("AudioTest.AudioStreamTest.MP3FilePlayTest", "Start")
+            testAudioStream(audiocore.MP3)
+            sys.wait(30000)
+        end
+    end
+)
+

+ 97 - 0
demo/audio/testHttpPlayMp3.lua

@@ -0,0 +1,97 @@
+--- 模块功能:音频功能测试.
+-- @author openLuat
+-- @module audio.testAudio
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.19
+
+module(...,package.seeall)
+--require"record"
+require"audio"
+require"common"
+require"http"
+
+
+local tBuffer = {}
+local tStreamType = audiocore.MP3
+
+--每次通过http下载的数据长度
+local PRODUCE_STEP_LEN = 200*1024
+--触发http再次下载的本地播放剩余数据长度
+local CONSUME_THRESHOLD_LEN = 100*1024
+--本地播放剩余的数据总长度
+local remainDataLen = 0
+
+local function consumer()
+    sys.taskInit(function()
+        audio.setVolume(4)
+        while true do
+            while #tBuffer==0 do
+                sys.waitUntil("DATA_STREAM_IND")
+            end
+
+            local data = table.remove(tBuffer,1)
+            remainDataLen = remainDataLen-data:len()
+            if remainDataLen<=CONSUME_THRESHOLD_LEN then sys.publish("HTTP_DOWNLOAD_REQUEST") end
+            --log.info("testAudioStream.consumer remove",data:len())
+            local procLen = audiocore.streamplay(tStreamType,data)
+            if procLen<data:len() then
+                --log.warn("produce fast")
+                table.insert(tBuffer,1,data:sub(procLen+1,-1))
+                remainDataLen = remainDataLen+data:len()-procLen
+                --sys.wait(20)
+            end
+        end
+    end)
+end
+
+local function httpDownloadCbFnc(result,statusCode,head)
+    log.info("update.httpDownloadCbFnc",result,statusCode,head,sCbFnc,sPeriod)
+    sys.publish("UPDATE_DOWNLOAD",result,statusCode,head)
+end
+
+local function processData(stepData,totalLen,statusCode)
+    if stepData:len()>0 then
+        sProcessedLen = sProcessedLen+stepData:len()
+        remainDataLen = remainDataLen+stepData:len()
+        table.insert(tBuffer,stepData)
+        if #tBuffer==1 then sys.publish("DATA_STREAM_IND") end
+        
+        if sProcessedLen>=totalLen then
+            sProcessedLen = -1
+        end
+    end    
+end
+
+sys.taskInit(function()
+    while not socket.isReady() do sys.waitUntil("IP_READY_IND") end
+    
+    sProcessedLen = 0
+    while true do
+        
+        http.request("GET",
+            "http://openluat-luatcommunity.oss-cn-hangzhou.aliyuncs.com/attachment/20201215162756457_1601182321002.mp3",
+            nil,
+            {["Range"]="bytes="..sProcessedLen.."-"..(sProcessedLen+PRODUCE_STEP_LEN-1)},
+            nil,
+            60000,
+            httpDownloadCbFnc,
+            processData)
+        sys.waitUntil("UPDATE_DOWNLOAD")
+        
+        if sProcessedLen==-1 then
+            return
+        end
+        
+        if remainDataLen<=CONSUME_THRESHOLD_LEN then
+            sys.wait(200)
+        else
+            sys.waitUntil("HTTP_DOWNLOAD_REQUEST")
+        end        
+    end
+end)
+
+consumer()
+
+--sys.timerLoopStart(print,1000,"test")
+

BIN
demo/audio/tip.amr


BIN
demo/audio/welcome.amr


BIN
demo/audio/yuan.amr


BIN
demo/audio/yuan.pcm


BIN
demo/audioParam/audio_calib.bin


+ 72 - 0
demo/audioParam/main.lua

@@ -0,0 +1,72 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "AUDIO_PARAM"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+--加载音频参数写入功能测试模块
+require "testAudioParam"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 37 - 0
demo/audioParam/testAudioParam.lua

@@ -0,0 +1,37 @@
+--- 模块功能:音频参数写入功能测试.
+-- @author openLuat
+-- @module audio.testAudio
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.19
+
+module(...,package.seeall)
+
+require"utils"
+
+sys.taskInit(function()
+    local USERNVM_DIR = "/usernvm"
+    local USERNVM_AUDIOCALIB_FILE_PATH = USERNVM_DIR.."/user_audio_calib.bin"
+    local USERNVM_AUDIOCALIB_SET_FILE_PATH = USERNVM_DIR.."/user_audio_calib_flag.bin"
+
+    if rtos.make_dir(USERNVM_DIR) then
+        if io.exists(USERNVM_AUDIOCALIB_SET_FILE_PATH) then
+            if io.exists(USERNVM_AUDIOCALIB_FILE_PATH) then
+                log.error("audioParam USERNVM_AUDIOCALIB_FILE_PATH error",USERNVM_AUDIOCALIB_FILE_PATH)
+            else
+                log.info("audioParam success")
+            end
+        else
+            os.remove(USERNVM_AUDIOCALIB_FILE_PATH)
+            local userAudioParam = io.readFile("/lua/audio_calib.bin")
+            io.writeFile(USERNVM_AUDIOCALIB_FILE_PATH,pack.pack("<i",userAudioParam:len()))
+            io.writeFile(USERNVM_AUDIOCALIB_FILE_PATH,userAudioParam,"ab")
+            io.writeFile(USERNVM_AUDIOCALIB_SET_FILE_PATH,"1")
+            
+            log.info("audioParam write, restart later...")
+            sys.restart("audioParam")
+        end
+    else
+        log.error("audioParam make_dir error",USERNVM_DIR)
+    end
+end)

BIN
demo/audioParam/使用说明/AudioCalibrator_V2.3.5.7z


BIN
demo/audioParam/使用说明/NVEditor.rar


BIN
demo/audioParam/使用说明/V1.2_W20.25.1_NV.rar


BIN
demo/audioParam/使用说明/audio_calib bin生成工具.rar


+ 12 - 0
demo/audioParam/使用说明/使用说明.txt

@@ -0,0 +1,12 @@
+一、调试音频参数,生成lua代码中可以编码使用的音频文件audio_calib.bin
+
+    1、使用AudioCalibrator调试音频参数,调试OK后,write到模块中。如果要做备份,可以导出生成一个cfp文件
+    2、usb at口发送AT*USB="DIAG",1后,电脑设备管理器中会出现 Luat USB Device x NPI Diag口
+    3、打开NVEditor
+       (1)File->Port Settings,选择NPI端口,其余选项默认
+       (2)File->Open Project,打开V1.2_W20.25.1_NV\nvitem\nvitem_modem.prj
+       (3)File->Load From Phone(Normal mode),导出完成后,再点击保存按钮,所有的nv参数都自动覆盖保存到V1.2_W20.25.1_NV\nvitem中,其中audio_calib_VQE.nvm就是我们需要的音频参数nvm文件
+    4、复制上一步生成的audio_calib_VQE.nvm文件到\audio_calib生成工具\audionvm中,覆盖同名文件
+    5、运行 audio_calib生成工具\build.bat,在audio_calib生成工具目录下会生成一个audio_calib.bin文件
+
+二、参考audioParam的demo编码

+ 44 - 0
demo/bluetooth/beacon.lua

@@ -0,0 +1,44 @@
+--- 模块功能:蓝牙功能测试
+-- @author openLuat
+-- @module bluetooth.beacon
+-- @license MIT
+-- @copyright openLuat
+-- @release 2020.09.27
+-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本
+module(..., package.seeall)
+
+local function init()
+    log.info("bt", "init")
+    rtos.on(rtos.MSG_BLUETOOTH, function(msg)
+        if msg.event == btcore.MSG_OPEN_CNF then
+            sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
+        end
+    end)
+end
+
+local function poweron()
+    log.info("bt", "poweron")
+    btcore.open(0) --打开蓝牙从模式
+    _, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
+end
+
+local function advertising()
+
+    log.info("bt", "advertising")
+    --btcore.setadvparam(0x80,0xa0,0,0,0x07,0,0,"11:22:33:44:55:66") --广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)
+    btcore.setbeacondata("AB8190D5D11E4941ACC442F30510B408",10107,50179) --beacon设置  (uuid,major,minor)
+    --btcore.setadvdata(string.fromHex("0201061AFF06000215AB8190D5D11E4941ACC442F30510B408277BC403C5")) --通过设置广播包接口设置beacon
+    btcore.advertising(1)-- 打开广播
+end
+
+local ble_test = {init, poweron,advertising}
+
+sys.taskInit(function()
+    for _, f in ipairs(ble_test) do
+        sys.wait(5000)
+        f()
+    end
+end)
+
+
+

+ 123 - 0
demo/bluetooth/bt.lua

@@ -0,0 +1,123 @@
+--- 模块功能:蓝牙功能测试
+-- @author openLuat
+-- @module bluetooth.bt
+-- @license MIT
+-- @copyright openLuat
+-- @release 2020.09.27
+-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本
+module(..., package.seeall)
+
+
+local function init()
+    log.info("bt", "init")
+    call_state = 0
+    rtos.on(rtos.MSG_BLUETOOTH, function(msg)
+        if msg.event == btcore.MSG_OPEN_CNF then
+            sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
+        elseif msg.event == btcore.MSG_CLOSE_CNF then
+            log.info("bt", "ble close") --蓝牙关闭成功
+        elseif msg.event == btcore.MSG_BT_HFP_CONNECT_IND then
+            sys.publish("BT_HFP_CONNECT_IND", msg.result) --hfp连接成功
+		elseif msg.event == btcore.MSG_BT_HFP_DISCONNECT_IND then
+            log.info("bt", "bt hfp disconnect") --hfp断开连接
+        elseif msg.event == btcore.MSG_BT_HFP_CALLSETUP_OUTGOING then
+            log.info("bt", "bt call outgoing") --建立呼出电话
+        elseif msg.event == btcore.MSG_BT_HFP_CALLSETUP_INCOMING then
+            log.info("bt", "bt call incoming") --呼叫传入    
+            sys.publish("BT_CALLSETUP_INCOMING", msg.result)
+        elseif msg.event == btcore.MSG_BT_HFP_RING_INDICATION then
+            log.info("bt", "bt ring indication") --呼叫传入铃声
+        elseif msg.event == btcore.MSG_BT_AVRCP_CONNECT_IND then
+            sys.publish("BT_AVRCP_CONNECT_IND", msg.result) --avrcp连接成功
+		elseif msg.event == btcore.MSG_BT_AVRCP_DISCONNECT_IND then
+            log.info("bt", "bt avrcp disconnect") --avrcp断开连接
+        end
+    end)
+end
+
+local function unInit()
+    btcore.close()
+end
+
+local function poweron()
+    log.info("bt", "poweron")
+    btcore.open(2) --打开蓝牙
+    _, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
+end
+
+local function advertising()
+
+    log.info("bt", "advertising")
+    btcore.setname("Luat_Air724UG")-- 设置广播名称
+    btcore.setvisibility(0x11)-- 设置蓝牙可见性
+    log.info("bt", "bt visibility",btcore.getvisibility())
+
+end
+local function data_trans()
+    
+    advertising()
+    _, result = sys.waitUntil("BT_AVRCP_CONNECT_IND") --等待连接成功
+    if result ~= 0 then
+        return false    
+    end
+    --链接成功
+    sys.wait(1000)
+    log.info("bt.send", "Hello I'm Luat BT")
+    while true do
+        btcore.setavrcpvol(100)
+        sys.wait(1000)
+        log.info("bt", "bt avrcp vol",btcore.getavrcpvol())
+        sys.wait(1000)
+        btcore.setavrcpsongs(1)--播放
+        sys.wait(10000)
+        btcore.setavrcpsongs(0)--暂停   
+        sys.wait(10000)
+        btcore.setavrcpsongs(2)--上一曲
+        sys.wait(10000)
+        btcore.setavrcpsongs(3)--下一曲
+        sys.wait(10000)
+    end
+--[[
+    _, result = sys.waitUntil("BT_HFP_CONNECT_IND") --等待连接成功
+    if result ~= 0 then
+        return false    
+    end
+    --链接成功
+    sys.wait(1000)
+    log.info("bt.send", "Hello I'm Luat BT")
+    while true do
+        _, result = sys.waitUntil("BT_CALLSETUP_INCOMING")--蓝牙呼叫传入
+        if result ~= 0 then
+            return false    
+        end
+        btcore.hfpcallanswer()--接听
+        --btcore.hfpcallreject()--拒接
+        sys.wait(1000)   
+        btcore.sethfpvol(10)--设置音量
+        sys.wait(15000)   
+        btcore.hfpcallhangup()--挂断
+        sys.wait(10000)
+        btcore.hfpcalldial("176******02")--拨号
+        sys.wait(10000)
+        btcore.hfpcallhangup()--挂断
+        sys.wait(10000)
+        btcore.hfpcallredial()--重拨
+        sys.wait(10000)
+        btcore.hfpcallhangup()--挂断
+        sys.wait(10000)
+
+    end
+]]
+end
+
+local bt_test = {init, poweron,data_trans}
+
+sys.taskInit(function()
+    for _, f in ipairs(bt_test) do
+        f()
+    end
+end)
+
+
+
+

+ 75 - 0
demo/bluetooth/main.lua

@@ -0,0 +1,75 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "BLE"
+VERSION = "1.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载BLE功能测试模块
+--require "master" --主设备
+require "slave"  --从设备
+--require "beacon"  --beacon
+--require "bt"  --bt classic
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 180 - 0
demo/bluetooth/master.lua

@@ -0,0 +1,180 @@
+--- 模块功能:蓝牙功能测试
+-- @author openLuat
+-- @module bluetooth.master
+-- @license MIT
+-- @copyright openLuat
+-- @release 2020.09.27
+-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本
+module(..., package.seeall)
+
+local function init()
+    log.info("bt", "init")
+    rtos.on(rtos.MSG_BLUETOOTH, function(msg)
+        if msg.event == btcore.MSG_OPEN_CNF then
+	    log.info("bt", "ble open") --蓝牙打开成功
+            sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
+        elseif msg.event == btcore.MSG_CLOSE_CNF then
+            log.info("bt", "ble close") --蓝牙关闭成功
+        elseif msg.event == btcore.MSG_BLE_CONNECT_CNF then
+            sys.publish("BT_CONNECT_IND", {["handle"] = msg.handle, ["result"] = msg.result, ["addr"] = msg.addr}) --蓝牙连接成功
+        elseif msg.event == btcore.MSG_BLE_DISCONNECT_CNF then
+            log.info("bt", "ble disconnect") --蓝牙断开连接
+        elseif msg.event == btcore.MSG_BLE_DATA_IND then
+            sys.publish("BT_DATA_IND", {["data"] = msg.data, ["uuid"] = msg.uuid, ["len"] = msg.len})  --接收到的数据内容
+        elseif msg.event == btcore.MSG_BLE_SCAN_CNF then
+            if(msg.enable == 1) then
+                sys.publish("BT_SCAN_OPEN_CNF", msg.result) --打开扫描成功
+            else
+                sys.publish("BT_SCAN_CLOSE_CNF", msg.result) --关闭扫描成功
+            end
+        elseif msg.event == btcore.MSG_BLE_SCAN_IND then
+            sys.publish("BT_SCAN_IND", {["name"] = msg.name, ["addr_type"] = msg.addr_type, ["addr"] = msg.addr, ["manu_data"] = msg.manu_data, 
+            ["raw_data"] = msg.raw_data, ["raw_len"] = msg.raw_len, ["rssi"] = msg.rssi})  --接收到扫描广播包数据
+        elseif msg.event == btcore.MSG_BLE_FIND_CHARACTERISTIC_IND then
+            sys.publish("BT_FIND_CHARACTERISTIC_IND", msg.result)  --发现服务包含的特征
+        elseif msg.event == btcore.MSG_BLE_FIND_SERVICE_IND then
+            log.info("bt", "find service uuid",msg.uuid)  --发现蓝牙包含的16bit uuid
+            if msg.uuid == 0x1800 then          --根据想要的uuid修改
+                sys.publish("BT_FIND_SERVICE_IND", msg.result)
+            end
+        elseif msg.event == btcore.MSG_BLE_FIND_CHARACTERISTIC_UUID_IND then
+            uuid_c = msg.uuid
+            log.info("bt", "find characteristic uuid",msg.uuid) --发现到服务内包含的特征uuid
+        elseif msg.event == btcore.MSG_BLE_READ_VALUE_IND then
+            log.info("bt", "read characteristic value",msg.data) --读特征value值
+        end
+    end)
+end
+local function poweron()
+    log.info("bt", "poweron")
+    btcore.open(1) --打开蓝牙主模式
+    _, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
+end
+local function scan()
+    log.info("bt", "scan")
+    --btcore.setscanparam(1,48,6,0,0)--扫描参数设置(扫描类型,扫描间隔,扫描窗口,扫描过滤测量,本地地址类型)
+    btcore.scan(1) --开启扫描
+    _, result = sys.waitUntil("BT_SCAN_OPEN_CNF", 50000) --等待扫描打开成功
+    if result ~= 0 then
+        return false
+    end
+    sys.timerStart(
+        function()
+            sys.publish("BT_SCAN_IND", nil)
+        end,
+        10000)  
+    while true do
+        _, bt_device = sys.waitUntil("BT_SCAN_IND") --等待扫描回复数据
+        if not bt_device then
+            -- 超时结束
+            btcore.scan(0) --停止扫描
+            return false
+        else
+            log.info("bt", "scan result")
+            log.info("bt.scan_name", bt_device.name)  --蓝牙名称
+			log.info("bt.rssi", bt_device.rssi)  --蓝牙信号强度
+            log.info("bt.addr_type", bt_device.addr_type) --地址种类
+            log.info("bt.scan_addr", bt_device.addr) --蓝牙地址
+            if bt_device.manu_data ~= nil then
+                log.info("bt.manu_data", string.toHex(bt_device.manu_data)) --厂商数据
+            end
+            log.info("bt.raw_len", bt_device.raw_len)
+            if bt_device.raw_data ~= nil then
+                log.info("bt.raw_data", string.toHex(bt_device.raw_data)) --广播包原始数据
+            end
+
+            --蓝牙连接   根据设备蓝牙广播数据协议解析广播原始数据(bt_device.raw_data)
+            if (bt_device.name == "Luat_Air724UG") then   --连接的蓝牙名称根据要连接的蓝牙设备修改
+                name = bt_device.name
+                addr_type = bt_device.addr_type
+                addr = bt_device.addr
+                manu_data = bt_device.manu_data
+                adv_data = bt_device.raw_data -- 广播包数据 根据蓝牙广播包协议解析
+            end
+            if addr == bt_device.addr and bt_device.raw_data ~= adv_data then --接收到两包广播数据
+                scanrsp_data = bt_device.raw_data --响应包数据 根据蓝牙广播包协议解析
+                btcore.scan(0)  --停止扫描
+                btcore.connect(bt_device.addr,bt_device.addr_type)
+                log.info("bt.connect_name", name)
+                log.info("bt.connect_addr_type", addr_type)
+                log.info("bt.connect_addr", addr)
+                if manu_data ~= nil then
+                    log.info("bt.connect_manu_data", manu_data)
+                end
+                if adv_data ~= nil then
+                    log.info("bt.connect_adv_data", adv_data)
+                end
+                if scanrsp_data ~= nil then
+                    log.info("bt.connect_scanrsp_data", scanrsp_data)
+                end
+                return true
+            end
+
+        end
+    end
+    return true
+end
+
+local function data_trans()
+
+    _, bt_connect = sys.waitUntil("BT_CONNECT_IND") --等待连接成功
+    if bt_connect.result ~= 0 then
+        return false
+    end
+    --链接成功
+    log.info("bt.connect_handle", bt_connect.handle)--蓝牙连接句柄
+    log.info("bt", "find all service uuid")
+    btcore.findservice()--发现所有16bit服务uuid
+    _, result = sys.waitUntil("BT_FIND_SERVICE_IND") --等待发现uuid
+    if not result then
+        return false
+    end
+
+    btcore.findcharacteristic(0xfee0)--服务uuid
+    _, result = sys.waitUntil("BT_FIND_CHARACTERISTIC_IND") --等待发现服务包含的特征成功
+    if not result then
+        return false
+    end
+    btcore.opennotification(0xfee2); --打开通知 对应特征uuid  
+
+    --btcore.findcharacteristic("9ecadc240ee5a9e093f3a3b50100406e")--服务uuid
+    --_, result = sys.waitUntil("BT_FIND_CHARACTERISTIC_IND") --等待发现服务包含的特征成功
+    --if not result then
+    --    return false
+    --end
+    --btcore.opennotification("9ecadc240ee5a9e093f3a3b50200406e"); --打开通知 对应特征uuid  
+    
+    log.info("bt.send", "Hello I'm Luat BLE")
+    sys.wait(1000)
+    while true do
+        local data = "123456"
+        btcore.send(data,0xfee1, bt_connect.handle) --发送数据(数据 对应特征uuid 连接句柄)
+        --btcore.send(bt_recv.data,"9ecadc240ee5a9e093f3a3b50300406e",bt_connect.handle)
+		_, bt_recv = sys.waitUntil("BT_DATA_IND") --等待接收到数据
+        local data = ""
+        local len = 0
+        local uuid = ""
+        while true do
+            local recvuuid, recvdata, recvlen = btcore.recv(3)
+            if recvlen == 0 then
+                break
+            end
+            uuid = recvuuid
+            len = len + recvlen
+            data = data .. recvdata
+        end
+        if len ~= 0 then
+        log.info("bt.recv_data", data)
+        log.info("bt.recv_data len", len)
+        log.info("bt.recv_uuid", uuid)
+        end
+    end
+end
+
+local ble_test = {init, poweron, scan, data_trans}
+
+sys.taskInit(function()
+    for _, f in ipairs(ble_test) do
+        f()
+    end
+end)

+ 152 - 0
demo/bluetooth/slave.lua

@@ -0,0 +1,152 @@
+--- 模块功能:蓝牙功能测试
+-- @author openLuat
+-- @module bluetooth.slave
+-- @license MIT
+-- @copyright openLuat
+-- @release 2020.09.27
+-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本
+module(..., package.seeall)
+
+--蓝牙/WIFI分时复用功能测试
+local btWifiTdmTest = false
+
+require "wifiScan"
+
+local function init()
+    log.info("bt", "init")
+    rtos.on(rtos.MSG_BLUETOOTH, function(msg)
+        if msg.event == btcore.MSG_OPEN_CNF then
+            log.info("bt", "ble open") --蓝牙打开成功
+            sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
+        elseif msg.event == btcore.MSG_CLOSE_CNF then
+            log.info("bt", "ble close") --蓝牙关闭成功
+        elseif msg.event == btcore.MSG_BLE_CONNECT_IND then
+            sys.publish("BT_CONNECT_IND", {["handle"] = msg.handle, ["result"] = msg.result, ["addr"] = msg.addr}) --蓝牙连接成功
+		elseif msg.event == btcore.MSG_BLE_DISCONNECT_IND then
+            log.info("bt", "ble disconnect") --蓝牙断开连接
+        elseif msg.event == btcore.MSG_BLE_DATA_IND then
+            sys.publish("BT_DATA_IND", {["result"] = msg.result})--接收到的数据内容
+        end
+    end)
+end
+
+local function unInit()
+    btcore.close()
+end
+
+local function poweron()
+    log.info("bt", "poweron")
+    btcore.open(0) --打开蓝牙从模式
+    _, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
+end
+--[[
+--自定义服务
+local function service(uuid,struct)
+    btcore.addservice(uuid) --添加服务
+    for i = 1, #struct do
+		btcore.addcharacteristic(struct[i][1],struct[i][2],struct[i][3]) --添加特征
+		if(type(struct[i][4]) == "table") then
+			for j = 1,#struct[i][4] do
+                btcore.adddescriptor(struct[i][4][j][1],struct[i][4][j][2])  --添加描述
+			end
+		end
+	end
+end
+]]--
+local function advertising()
+    --local struct1 = {{0xfee1, 0x08, 0x0002},
+    --    {0xfee2, 0x10,0x0001, {{0x2902,0x0001},{0x2901,"123456"}}}}--{特征uuid,特征属性,特征权限,{特征描述uuid,描述属性}}
+    --local struct2 = {{"9ecadc240ee5a9e093f3a3b50200406e",0x10,0x0001,{{0x2902,0x0001}}},
+    --              {"9ecadc240ee5a9e093f3a3b50300406e",0x0c, 0x0002}}
+
+    log.info("bt", "advertising")
+    btcore.setname("Luat_Air724UG")-- 设置广播名称
+    btcore.setadvdata(string.fromHex("02010604ff000203"))-- 设置广播数据 根据蓝牙广播包协议
+    --btcore.setscanrspdata(string.fromHex("04ff000203"))-- 设置广播数据 根据蓝牙广播包协议
+    --service(0xfee0, struct1)--添加服务16bit uuid   自定义服务
+    --service("9ecadc240ee5a9e093f3a3b50100406e",struct2)--添加服务128bit uuid   自定义服务
+    --btcore.addwhitelist("11:22:33:44:55:66",0)
+	--btcore.setadvparam(0x80,0xa0,0,0,0x07,2,0,"11:22:33:44:55:66") --广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)
+    btcore.advertising(1)-- 打开广播
+end
+
+local function data_trans()
+    
+    advertising()
+    _, bt_connect = sys.waitUntil("BT_CONNECT_IND") --等待连接成功
+    if bt_connect.result ~= 0 then
+        return false    
+    end
+    --链接成功
+    log.info("bt.connect_handle",bt_connect.handle) --连接句柄
+    log.info("bt.send", "Hello I'm Luat BLE")
+    while true do
+        _, bt_recv = sys.waitUntil("BT_DATA_IND") --等待接收到数据
+        local data = ""
+        local len = 0
+        local uuid = ""
+        while true do
+            local recvuuid, recvdata, recvlen = btcore.recv(3)
+            if recvlen == 0 then
+                break
+            end
+            uuid = recvuuid
+            len = len + recvlen
+            data = data .. recvdata
+        end
+        if len ~= 0 then
+            log.info("bt.recv_data", data)
+            log.info("bt.recv_data len", len)
+            log.info("bt.recv_uuid", string.toHex(uuid))
+            if data == "close" then
+                btcore.disconnect()--主动断开连接
+                if btWifiTdmTest then return end
+            end
+            btcore.send(data, 0xfee2, bt_connect.handle)--发送数据(数据 对应特征uuid 连接句柄)
+            --btcore.send(data, "9ecadc240ee5a9e093f3a3b50200406e", bt_connect.handle)--发送数据(数据 对应特征uuid 连接句柄)
+        end
+    end
+end
+
+local ble_test = {init, poweron,data_trans}
+
+if btWifiTdmTest then
+    --蓝牙wifi分时复用测试方法:
+    --1、测试wifi搜索热点功能
+    --2、打开蓝牙,配置为从模式;手机上可以安装一个app,连接模块蓝牙,向模块发送数据测试;当手机app向模块发送5个字节的数据close时,模块会主动断开并且关闭蓝牙
+    --3、延时5秒钟,继续从第1步开始测试
+    sys.taskInit(function()
+        while true do
+            sys.wait(5000)
+            
+            log.info("wifiScan.request begin")
+            wifiScan.request(function(result,cnt,tInfo)
+                log.info("testWifi.scanCb",result,cnt)
+                log.info("testLbsLoc.wifiScan.request result",result,cnt)
+                sys.publish("WIFI_SCAN_IND",result,cnt,tInfo)
+            end)        
+            sys.waitUntil("WIFI_SCAN_IND")
+            log.info("wifiScan.request end")
+            
+            
+            
+            init()
+            poweron()
+            data_trans()
+            --关闭蓝牙
+            unInit()
+        end
+    end)
+else
+    sys.taskInit(function()
+        sys.wait(5000)
+        for _, f in ipairs(ble_test) do
+            f()
+        end
+    end)
+end
+
+
+
+
+

BIN
demo/call/call.mp3


+ 5 - 0
demo/call/key.lua

@@ -0,0 +1,5 @@
+
+module(...,package.seeall)
+require"powerKey"
+
+powerKey.setup(3000,function() end, function() sys.publish("POWER_KEY_IND") end)

+ 73 - 0
demo/call/main.lua

@@ -0,0 +1,73 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "CALL"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载Call功能测试模块
+require "testCall"
+require "key"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 169 - 0
demo/call/testCall.lua

@@ -0,0 +1,169 @@
+--- 模块功能:通话功能测试.
+-- @author openLuat
+-- @module call.testCall
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.20
+
+module(...,package.seeall)
+require"cc"
+require"audio"
+require"common"
+
+--来电铃声播放协程ID
+local coIncoming
+
+local function callVolTest()
+    local curVol = audio.getCallVolume()
+    curVol = (curVol>=7) and 1 or (curVol+1)
+    log.info("testCall.setCallVolume",curVol)
+    audio.setCallVolume(curVol)
+end
+-- audiocore.streamplay
+
+local function testAudioStream(streamType)
+    sys.taskInit(
+        function()
+            while true do
+                tStreamType = streamType
+		    	log.info("AudioTest.AudioStreamTest", "AudioStreamPlay Start", streamType)
+                local tAudioFile =
+                {
+                    [audiocore.AMR] = "tip.amr",
+                    [audiocore.SPX] = "record.spx",
+                    [audiocore.PCM] = "alarm_door.pcm",
+                    [audiocore.MP3] = "sms.mp3"
+                }
+                local fileHandle = io.open("/lua/" .. tAudioFile[streamType], "rb")
+                if not fileHandle then
+                    log.error("AudioTest.AudioStreamTest", "Open file error")
+                    return
+                end
+
+                while true do
+                    local data = fileHandle:read(streamType == audiocore.SPX and 1200 or 1024)
+                    if not data then 
+		    			fileHandle:close() 
+                        while audiocore.streamremain() ~= 0 do
+                            sys.wait(20)	
+                        end
+                        sys.wait(1000)
+                        audiocore.stop() --添加audiocore.stop()接口,否则再次播放会播放不出来
+                        log.warn("AudioTest.AudioStreamTest", "AudioStreamPlay Over")
+                        return 
+		    		end
+
+                    local data_len = string.len(data)
+                    local curr_len = 1
+                    while true do
+                        curr_len = curr_len + audiocore.streamplay(tStreamType,string.sub(data,curr_len,-1),audiocore.PLAY_VOLTE)
+                        if curr_len>=data_len then
+                            break
+                        elseif curr_len == 0 then
+                            log.error("AudioTest.AudioStreamTest", "AudioStreamPlay Error", streamType)
+                            return
+                        end
+                        sys.wait(10)
+                    end
+                    sys.wait(10)
+                end  
+            end
+        end
+    )
+end
+
+--- “通话已建立”消息处理函数
+-- @string num,建立通话的对方号码
+-- @return 无
+local function connected(num)
+    log.info("testCall.connected")
+    coIncoming = nil
+    --通话中设置mic增益,必须在通话建立以后设置
+    --audio.setMicGain("call",7)
+    --通话中音量测试
+    sys.timerLoopStart(callVolTest,5000)
+    --通话中向对方播放TTS测试
+    audio.play(7,"TTS","通话中TTS测试",7,nil,true,2000)
+    --通话中向对方播放音频
+    --[[
+    audio.setVolume(2)
+    log.info("AudioTest.AudioStreamTest.AMRFilePlayTest", "Start")
+    testAudioStream(audiocore.AMR)   
+    ]] 
+    --110秒之后主动结束通话
+    sys.timerStart(cc.hangUp,110000,num)
+end
+
+--- “通话已结束”消息处理函数
+-- @string discReason,通话结束原因值,取值范围如下:
+--                                     "CHUP"表示本端调用cc.hungUp()接口主动挂断
+--                                     "NO ANSWER"表示呼出后,到达对方,对方无应答,通话超时断开
+--                                     "BUSY"表示呼出后,到达对方,对方主动挂断
+--                                     "NO CARRIER"表示通话未建立或者其他未知原因的断开
+--                                     nil表示没有检测到原因值
+-- @return 无
+local function disconnected(discReason)
+    coIncoming = nil
+    log.info("testCall.disconnected",discReason)
+    sys.timerStopAll(cc.hangUp)
+    sys.timerStop(callVolTest)
+    audio.stop()
+end
+
+--- “来电”消息处理函数
+-- @string num,来电号码
+-- @return 无
+local function incoming(num)
+    log.info("testCall.incoming:"..num)
+    
+    if not coIncoming then
+        coIncoming = sys.taskInit(function()
+            --audio.play(1,"TTS","来电话啦",4,function() sys.publish("PLAY_INCOMING_RING_IND") end,true)
+            audio.play(1,"FILE","/lua/call.mp3",4,function() sys.publish("PLAY_INCOMING_RING_IND") end,true)
+            sys.waitUntil("PLAY_INCOMING_RING_IND")
+        end)
+        sys.subscribe("POWER_KEY_IND",function() audio.stop(function() cc.accept(num) end) end)
+    end
+    
+    --[[
+    if not coIncoming then
+        coIncoming = sys.taskInit(function()
+            for i=1,7 do
+                --audio.play(1,"TTS","来电话啦",i,function() sys.publish("PLAY_INCOMING_RING_IND") end)
+                audio.play(1,"FILE","/lua/call.mp3",i,function() sys.publish("PLAY_INCOMING_RING_IND") end)
+                sys.waitUntil("PLAY_INCOMING_RING_IND")
+            end
+            --接听来电
+            --cc.accept(num)
+        end)
+        
+    end]]
+    --接听来电
+    --cc.accept(num)
+    
+    
+end
+
+--- “通话功能模块准备就绪””消息处理函数
+-- @return 无
+local function ready()
+    log.info("tesCall.ready")
+    --呼叫10086
+    --sys.timerStart(cc.dial,10000,"10086")
+end
+
+--- “通话中收到对方的DTMF”消息处理函数
+-- @string dtmf,收到的DTMF字符
+-- @return 无
+local function dtmfDetected(dtmf)
+    log.info("testCall.dtmfDetected",dtmf)
+end
+
+--订阅消息的用户回调函数
+--sys.subscribe("CALL_READY",ready)
+sys.subscribe("NET_STATE_REGISTERED",ready)
+sys.subscribe("CALL_INCOMING",incoming)
+sys.subscribe("CALL_CONNECTED",connected)
+sys.subscribe("CALL_DISCONNECTED",disconnected)
+cc.dtmfDetect(true)
+sys.subscribe("CALL_DTMF_DETECT",dtmfDetected)

BIN
demo/call/tip.amr


+ 115 - 0
demo/camera/color_lcd_spi_gc9106l.lua

@@ -0,0 +1,115 @@
+--- 模块功能:GC 9106驱动芯片LCD命令配置
+-- @author openLuat
+-- @module ui.color_lcd_spi_gc9106
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.27
+
+--[[
+注意:disp库目前支持I2C接口和SPI接口的屏,此文件的配置,硬件上使用的是LCD专用的SPI引脚,不是标准的SPI引脚
+硬件连线图如下:
+Air模块			LCD
+GND-------------地
+LCD_CS----------片选
+LCD_CLK---------时钟
+LCD_DATA--------数据
+LCD_DC----------数据/命令选择
+VDDIO-----------电源
+LCD_RST---------复位
+]]
+
+module(...,package.seeall)
+
+--[[
+函数名:init
+功能  :初始化LCD参数
+参数  :无
+返回值:无
+]]
+local function init()
+    local para =
+    {
+        width = 128, --分辨率宽度,128像素;用户根据屏的参数自行修改
+        height = 160, --分辨率高度,160像素;用户根据屏的参数自行修改
+        bpp = 16, --位深度,彩屏仅支持16位
+        bus = disp.BUS_SPI4LINE, --LCD专用SPI引脚接口,不可修改
+        xoffset = 0, --X轴偏移
+        yoffset = 0, --Y轴偏移
+        freq = 13000000, --spi时钟频率,支持110K到13M(即110000到13000000)之间的整数(包含110000和13000000)
+        pinrst = pio.P0_6, --reset,复位引脚
+        pinrs = pio.P0_1, --rs,命令/数据选择引脚
+        --初始化命令
+        --前两个字节表示类型:0001表示延时,0000或者0002表示命令,0003表示数据
+        --延时类型:后两个字节表示延时时间(单位毫秒)
+        --命令类型:后两个字节命令的值
+        --数据类型:后两个字节数据的值
+        initcmd =
+        {
+            0xfe,
+            0xef,
+            0xb3,
+            0x0030003,
+            0x21,
+            0x36,
+            --0x00300c8,
+            0x0030008,--上下颠倒
+            0x3a,
+            0x0030005,
+            0xb4,
+            0x0030021,
+            0xF0,
+            0x003002d,
+            0x0030054,
+            0x0030024,
+            0x0030061,
+            0x00300ab,
+            0x003002e,
+            0x003002f,
+            0x0030000,
+            0x0030020,
+            0x0030010,
+            0x0030010,
+            0x0030017,
+            0x0030013,
+            0x003000f,
+            0xF1,
+            0x0030002,
+            0x0030022,
+            0x0030025,
+            0x0030035,
+            0x00300a8,
+            0x0030008,
+            0x0030008,
+            0x0030000,
+            0x0030000,
+            0x0030009,
+            0x0030009,
+            0x0030017,
+            0x0030018,
+            0x003000f,
+            0xfe,
+            0xff,
+            0x11,
+            0x010078,
+            0x29,
+        },
+        --休眠命令
+        sleepcmd = {
+            0x00020010,
+        },
+        --唤醒命令
+        wakecmd = {
+            0x00020011,
+        }
+    }
+    disp.init(para)
+    disp.clear()
+    disp.update()
+end
+
+--控制SPI引脚的电压域
+pmd.ldoset(15,pmd.LDO_VLCD)
+init()
+
+--打开背光
+--实际使用时,用户根据自己的lcd背光控制方式,添加背光控制代码

+ 145 - 0
demo/camera/color_lcd_spi_st7735.lua

@@ -0,0 +1,145 @@
+--- 模块功能:ST 7735驱动芯片LCD命令配置
+-- @author openLuat
+-- @module ui.color_lcd_spi_st7735
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.27
+
+--[[
+注意:disp库目前支持I2C接口和SPI接口的屏,此文件的配置,硬件上使用的是LCD专用的SPI引脚,不是标准的SPI引脚
+硬件连线图如下:
+Air模块			LCD
+GND-------------地
+LCD_CS----------片选
+LCD_CLK---------时钟
+LCD_DATA--------数据
+LCD_DC----------数据/命令选择
+VDDIO-----------电源
+LCD_RST---------复位
+]]
+
+module(...,package.seeall)
+
+--[[
+函数名:init
+功能  :初始化LCD参数
+参数  :无
+返回值:无
+]]
+local function init()
+    local para =
+    {
+        width = 128, --分辨率宽度,128像素;用户根据屏的参数自行修改
+        height = 160, --分辨率高度,160像素;用户根据屏的参数自行修改
+        bpp = 16, --位深度,彩屏仅支持16位
+        bus = disp.BUS_SPI4LINE, --LCD专用SPI引脚接口,不可修改
+        xoffset = 2, --X轴偏移
+        yoffset = 1, --Y轴偏移
+        freq = 13000000, --spi时钟频率,支持110K到13M(即110000到13000000)之间的整数(包含110000和13000000)
+        pinrst = pio.P0_6, --reset,复位引脚
+        pinrs = pio.P0_1, --rs,命令/数据选择引脚
+        --camera_preview_no_update_screen = 1, --0表示摄像头预览刷屏;1表示摄像头预览不刷屏
+        --初始化命令
+        --前两个字节表示类型:0001表示延时,0000或者0002表示命令,0003表示数据
+        --延时类型:后两个字节表示延时时间(单位毫秒)
+        --命令类型:后两个字节命令的值
+        --数据类型:后两个字节数据的值
+        initcmd =
+        {
+            0x00020011,
+            0x00010078,
+            --0x00020021, -- 反显
+            0x000200B1,
+            0x00030002,
+            0x00030035,
+            0x00030036,
+            0x000200B2,
+            0x00030002,
+            0x00030035,
+            0x00030036,
+            0x000200B3,
+            0x00030002,
+            0x00030035,
+            0x00030036,
+            0x00030002,
+            0x00030035,
+            0x00030036,
+            0x000200B4,
+            0x00030007,
+            0x000200C0,
+            0x000300A2,
+            0x00030002,
+            0x00030084,
+            0x000200C1,
+            0x000300C5,
+            0x000200C2,
+            0x0003000A,
+            0x00030000,
+            0x000200C3,
+            0x0003008A,
+            0x0003002A,
+            0x000200C4,
+            0x0003008A,
+            0x000300EE,
+            0x000200C5,
+            0x0003000E,
+            0x00020036,
+            0x00030000,  --0x000300C0 --mirror
+            0x000200E0,
+            0x00030012,
+            0x0003001C,
+            0x00030010,
+            0x00030018,
+            0x00030033,
+            0x0003002C,
+            0x00030025,
+            0x00030028,
+            0x00030028,
+            0x00030027,
+            0x0003002F,
+            0x0003003C,
+            0x00030000,
+            0x00030003,
+            0x00030003,
+            0x00030010,
+            0x000200E1,
+            0x00030012,
+            0x0003001C,
+            0x00030010,
+            0x00030018,
+            0x0003002D,
+            0x00030028,
+            0x00030023,
+            0x00030028,
+            0x00030028,
+            0x00030026,
+            0x0003002F,
+            0x0003003B,
+            0x00030000,
+            0x00030003,
+            0x00030003,
+            0x00030010,
+            0x0002003A,
+            0x00030005,
+            0x00020029,
+        },
+        --休眠命令
+        sleepcmd = {
+            0x00020010,
+        },
+        --唤醒命令
+        wakecmd = {
+            0x00020011,
+        }
+    }
+    disp.init(para)
+    disp.clear()
+    disp.update()
+end
+
+--控制SPI引脚的电压域
+pmd.ldoset(15,pmd.LDO_VLCD)
+init()
+
+--打开背光
+--实际使用时,用户根据自己的lcd背光控制方式,添加背光控制代码

+ 73 - 0
demo/camera/main.lua

@@ -0,0 +1,73 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "CAMERA"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart1,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(1, 115200)
+
+--加载硬件看门狗功能模块
+--根据自己的硬件配置决定:1、是否加载此功能模块;2、配置Luat模块复位单片机引脚和互相喂狗引脚
+--合宙官方出售的Air201开发板上有硬件看门狗,所以使用官方Air201开发板时,必须加载此功能模块
+--[[
+require "wdt"
+wdt.setup(pio.P0_30, pio.P0_31)
+]]
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+require"color_lcd_spi_st7735"
+--require"color_lcd_spi_gc9106l"
+require"testCamera"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 1919 - 0
demo/camera/testCamera.lua

@@ -0,0 +1,1919 @@
+--- 模块功能:camera功能测试.
+-- @author openLuat
+-- @module fs.testFs
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.27
+
+module(...,package.seeall)
+
+require"pm"
+require"scanCode"
+require"utils"
+require"common"
+require"testUartSentFile"
+
+local WIDTH,HEIGHT = disp.getlcdinfo()
+local DEFAULT_WIDTH,DEFAULT_HEIGHT = 320,240
+
+-- 扫码结果回调函数
+-- @bool result,true或者false,true表示扫码成功,false表示超时失败
+-- @string[opt=nil] codeType,result为true时,表示扫码类型;result为false时,为nil;支持QR-Code和CODE-128两种类型
+-- @string[opt=nil] codeStr,result为true时,表示扫码结果的字符串;result为false时,为nil
+local function scanCodeCb(result,codeType,codeStr)
+    --关闭摄像头预览
+    disp.camerapreviewclose()
+    --关闭摄像头
+    disp.cameraclose()
+    --允许系统休眠
+    pm.sleep("testScanCode")
+    --500毫秒后处理扫描结果
+    sys.timerStart(function()
+        --如果有LCD,显示扫描结果
+        if WIDTH~=0 and HEIGHT~=0 then
+            disp.clear()
+            if result then
+                disp.puttext(common.utf8ToGb2312("扫描成功"),0,5)
+                disp.puttext(common.utf8ToGb2312("类型: ")..codeType,0,35)
+                log.info("scanCodeCb",codeStr:toHex())
+                disp.puttext(common.utf8ToGb2312("结果: ")..codeStr,0,65)
+            else
+                disp.puttext(common.utf8ToGb2312("扫描失败"),0,5)
+            end
+            disp.update()
+        end
+    end,500)
+
+    sys.timerStart(scan,1000)
+end
+
+local bf302A_sdr =
+{
+	zbar_scan = 1,
+	i2c_addr = 0x6e,
+	sensor_width = 240,
+	sensor_height = 320,
+	id_reg = 0xfd,
+	id_value = 0x02,
+	spi_mode = disp.CAMERA_SPI_MODE_LINE1,
+	spi_speed = disp.CAMERA_SPEED_SDR,
+	spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,
+
+	init_cmd =
+	{
+		0xcf,0xb0,--//POWER UP
+		0x12,0x40,--//MTK:20 ZX:10 RDA:40
+		0x15,0x00,
+		0x6b,0x71,
+		0x00,0x40,
+		0x04,0x00,
+		0x06,0x26,
+		0x08,0x07,
+		0x1c,0x12,
+		0x20,0x20,
+		0x21,0x20,
+		0x34,0x02,
+		0x35,0x02,
+		0x36,0x21,
+		0x37,0x13,
+		0xca,0xf3,
+		0xcb,0x22,
+		0xcc,0x89,
+		0xcd,0x4c,
+		0xce,0x6b,
+		0xa0,0x8e,
+		0x01,0x1b,
+		0x02,0x1d,
+		0x13,0x08,
+		0x87,0x13,
+		0x8b,0x08,
+		0x70,0x1f,
+		0x71,0x43,
+		0x72,0x0a,
+		0x73,0x62,
+		0x74,0xa2,
+		0x75,0xbf,
+		0x76,0x02,
+		0x77,0xcc,
+		0x40,0x32,
+		0x41,0x28,
+		0x42,0x26,
+		0x43,0x1d,
+		0x44,0x1a,
+		0x45,0x14,
+		0x46,0x11,
+		0x47,0x0f,
+		0x48,0x0e,
+		0x49,0x0d,
+		0x4B,0x0c,
+		0x4C,0x0b,
+		0x4E,0x0a,
+		0x4F,0x09,
+		0x50,0x09,
+		0x24,0x50,
+		0x25,0x36,
+		0x80,0x00,
+		0x81,0x20,
+		0x82,0x40,
+		0x83,0x30,
+		0x84,0x50,
+		0x85,0x30,
+		0x86,0xd8,
+		0x89,0x45,
+		0x8a,0x33,
+		0x8f,0x81,
+		0x91,0xff,
+		0x92,0x08,
+		0x94,0x82,
+		0x95,0xfd,
+		0x9a,0x20,
+		0x9e,0xbc,
+		0xf0,0x8f,
+		0x51,0x06,
+		0x52,0x25,
+		0x53,0x2b,
+		0x54,0x0f,
+		0x57,0x2a,
+		0x58,0x22,
+		0x59,0x2c,
+		0x23,0x33,
+		0xa1,0x93,
+		0xa2,0x0f,
+		0xa3,0x2a,
+		0xa4,0x08,
+		0xa5,0x26,
+		0xa7,0x80,
+		0xa8,0x80,
+		0xa9,0x1e,
+		0xaa,0x19,
+		0xab,0x18,
+		0xae,0x50,
+		0xaf,0x04,
+		0xc8,0x10,
+		0xc9,0x15,
+		0xd3,0x0c,
+		0xd4,0x16,
+		0xee,0x06,
+		0xef,0x04,
+		0x55,0x34,
+		0x56,0x9c,
+		0xb1,0x98,
+		0xb2,0x98,
+		0xb3,0xc4,
+		0xb4,0x0c,
+		0xa0,0x8f,
+		0x13,0x07,
+
+	}
+}
+
+local gc6153 =
+{
+	zbar_scan = 1,  --是否支持扫码
+	i2c_addr = 0x40,  --/* 摄像头i2c访问地址 */
+	sensor_width = 240,  --/* 摄像头的宽 */
+	sensor_height = 320, --/* 摄像头的高 */
+	id_reg = 0xf1,      -- /* 摄像头ID寄存器 */
+	id_value = 0x53,    -- /* 摄像头ID值 */
+	-- /* 摄像头SPI是几线输出 */
+    --disp.CAMERA_SPI_MODE_LINE1 1线
+    --disp.CAMERA_SPI_MODE_LINE2 2线
+    --disp.CAMERA_SPI_MODE_LINE4 4线
+	spi_mode = disp.CAMERA_SPI_MODE_LINE1, -- /* 摄像头SPI是几线输出 */
+
+	-- /* 摄像头采集速率 */
+    --disp.CAMERA_SPEED_SDR  单片采集
+    --disp.CAMERA_SPEED_DDR  双边采集
+	spi_speed = disp.CAMERA_SPEED_SDR,  -- /* 摄像头采集速率 */
+
+   --disp.CAMERA_SPI_OUT_Y0_U0_Y1_V0
+   --disp.CAMERA_SPI_OUT_Y0_V0_Y1_U0
+   --disp.CAMERA_SPI_OUT_U0_Y0_V0_Y1
+   --disp.CAMERA_SPI_OUT_U0_Y1_V0_Y0
+   --disp.CAMERA_SPI_OUT_V0_Y0_U0_Y1
+   --disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0
+   --disp.CAMERA_SPI_OUT_Y1_U0_Y0_V0
+	spi_yuv_out = disp.CAMERA_SPI_OUT_U0_Y1_V0_Y0, -- /* 摄像头输出YUV的格式 */
+
+	init_cmd = --/*摄像头初始化寄存器*/
+	{
+		--addr  value
+		 0xfe, 0xa0  ,
+		 0xfe, 0xa0  ,
+		 0xfe, 0xa0  ,
+		 0xf6, 0x00  ,
+		 0xfa, 0x11  ,
+		 0xfc, 0x12  ,
+		 0xfe, 0x00  ,
+		 0xfe, 0x00  ,
+		 0x01, 0x41  ,
+		 0x02, 0x12  ,
+		 0x0d, 0x40  ,
+		 0x14, 0x7E  ,
+		 0x16, 0x05 ,
+		 0x17, 0x18  ,
+		 0x1c, 0x31  ,
+		 0x1d, 0xbb  ,
+		 0x1f, 0x3f  ,
+		 0x73, 0x20  ,
+		 0x74, 0x71  ,
+		 0x77, 0x22  ,
+		 0x7a, 0x08  ,
+		 0x11, 0x18  ,
+		 0x13, 0x48  ,
+		 0x12, 0xc8  ,
+		 0x70, 0xc8  ,
+		 0x7b, 0x18  ,
+		 0x7d, 0x30  ,
+		 0x7e, 0x02  ,
+		 0xfe, 0x10  ,
+		 0xfe, 0x00  ,
+		 0xfe, 0x00  ,
+		 0xfe, 0x00  ,
+		 0xfe, 0x00  ,
+		 0xfe, 0x00  ,
+		 0xfe, 0x10  ,
+		 0xfe, 0x00  ,
+		 0x49, 0x61  ,
+		 0x4a, 0x40  ,
+		 0x4b, 0x58  ,
+		 0xfe, 0x00  ,
+		 0x39, 0x02  ,
+		 0x3a, 0x80  ,
+		 0x20, 0x7e  ,
+		 0x26, 0x87  ,
+		 0x33, 0x10  ,
+		 0x37, 0x06  ,
+		 0x2a, 0x21  ,
+		 0x3f, 0x16  ,
+		 0x52, 0xa6  ,
+		 0x53, 0x81  ,
+		 0x54, 0x43  ,
+		 0x56, 0x78  ,
+		 0x57, 0xaa  ,
+		 0x58, 0xff  ,
+		 0x5b, 0x60  ,
+		 0x5c, 0x50  ,
+		 0xab, 0x2a  ,
+		 0xac, 0xb5  ,
+		 0x5e, 0x06  ,
+		 0x5f, 0x06  ,
+		 0x60, 0x44  ,
+		 0x61, 0xff  ,
+		 0x62, 0x69  ,
+		 0x63, 0x13  ,
+		 0x65, 0x13  ,
+		 0x66, 0x26  ,
+		 0x67, 0x07  ,
+		 0x68, 0xf5  ,
+		 0x69, 0xea  ,
+		 0x6a, 0x21  ,
+		 0x6b, 0x21  ,
+		 0x6c, 0xe4  ,
+		 0x6d, 0xfb  ,
+		 0x81, 0x3b  ,
+		 0x82, 0x3b  ,
+		 0x83, 0x4b  ,
+		 0x84, 0x90  ,
+		 0x86, 0xf0  ,
+		 0x87, 0x1d  ,
+		 0x88, 0x16  ,
+		 0x8d, 0x74  ,
+		 0x8e, 0x25  ,
+		 0x90, 0x36  ,
+		 0x92, 0x43  ,
+		 0x9d, 0x32  ,
+		 0x9e, 0x81  ,
+		 0x9f, 0xf4  ,
+		 0xa0, 0xa0  ,
+		 0xa1, 0x04  ,
+		 0xa3, 0x2d  ,
+		 0xa4, 0x01  ,
+		 0xb0, 0xc2  ,
+		 0xb1, 0x1e  ,
+		 0xb2, 0x10  ,
+		 0xb3, 0x20  ,
+		 0xb4, 0x2d  ,
+		 0xb5, 0x1b  ,
+		 0xb6, 0x2e  ,
+		 0xb8, 0x13  ,
+		 0xba, 0x60  ,
+		 0xbb, 0x62  ,
+		 0xbd, 0x78  ,
+		 0xbe, 0x55  ,
+		 0xbf, 0xa0  ,
+		 0xc4, 0xe7  ,
+		 0xc5, 0x15  ,
+		 0xc6, 0x16  ,
+		 0xc7, 0xeb  ,
+		 0xc8, 0xe4  ,
+		 0xc9, 0x16  ,
+		 0xca, 0x16  ,
+		 0xcb, 0xe9  ,
+		 0x22, 0xf8  ,
+		 0xfe, 0x02  ,
+		 0x01, 0x01  ,
+		 0x02, 0x80  ,
+		 0x03, 0x20  ,
+		 0x04, 0x20  ,
+		 0x0a, 0x00  ,
+		 0x13, 0x10  ,
+		 0x28, 0x03  ,
+		 0xfe, 0x00  ,
+		 0x22, 0xf8  ,
+		 0xf2, 0x03  ,
+	},
+}
+
+local gc0310_ddr =
+{
+	zbar_scan = 1,
+	i2c_addr = 0x21,
+	sensor_width = 320,
+	sensor_height = 240,
+	id_reg = 0xf1,
+	id_value = 0x10,
+	spi_mode = disp.CAMERA_SPI_MODE_LINE2,
+	spi_speed = disp.CAMERA_SPEED_DDR,
+	spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,
+
+	init_cmd =
+	{
+
+		0xfe,0xf0 ,
+		0xfe,0xf0 ,
+		0xfe,0x00 ,
+
+		0xfc,0x16 ,
+		0xfc,0x16 ,
+		0xf2,0x07 ,
+		0xf3,0x83 ,
+		0xf5,0x07 ,
+
+		0xf7,0x89 ,
+		0xf8,0x01 ,
+		0xf9,0x4f ,
+		0xfa,0x11 ,
+		0xfc,0xce ,
+		0xfd,0x00 ,
+		0x00,0x2f ,
+		0x01,0x0f ,
+		0x02,0x04 ,
+		0x03,0x02 ,
+		0x04,0x12 ,
+
+		0x09,0x00 ,
+		0x0a,0x00 ,
+		0x0b,0x00 ,
+		0x0c,0x04 ,
+		0x0d,0x01 ,
+		0x0e,0xe8 ,
+		0x0f,0x02 ,
+		0x10,0x88 ,
+		0x16,0x00 ,
+		0x17,0x14 ,
+		0x18,0x1a ,
+		0x19,0x14 ,
+		0x1b,0x48 ,
+		0x1c, 0x6c ,
+		0x1e,0x6b ,
+		0x1f,0x28 ,
+
+		0x20,0x8b ,
+
+		0x21,0x49 ,
+		0x22, 0xd0 ,
+		0x23,0x04 ,
+		0x24,0xff ,
+		0x34,0x20 ,
+		0x26,0x23 ,
+		0x28,0xff ,
+		0x29,0x00 ,
+		0x32, 0x04 ,
+		0x33,0x10 ,
+		0x37,0x20 ,
+		0x38,0x10 ,
+		0x47,0x80 ,
+		0x4e,0x66 ,
+		0xa8,0x02 ,
+		0xa9,0x80 ,
+		0x40,0xff ,
+		0x41,0x21 ,
+		0x42,0xcf ,
+		0x44,0x02 ,
+		0x45,0xa8 ,
+		0x46,0x02 ,
+		0x4a,0x11 ,
+		0x4b,0x01 ,
+		0x4c,0x20 ,
+		0x4d,0x05 ,
+		0x4f,0x01 ,
+		0x50,0x01 ,
+		0x55,0x01 ,
+		0x56,0xe0 ,
+		0x57,0x02 ,
+		0x58,0x80 ,
+		0x70,0x70 ,
+		0x5a,0x84 ,
+		0x5b,0xc9 ,
+		0x5c,0xed ,
+		0x77,0x74 ,
+		0x78,0x40 ,
+		0x79,0x5f ,
+		0x82,0x08 ,
+		0x83,0x0b ,
+		0x89,0xf0 ,
+
+		0x8f,0xaa ,
+		0x90,0x8c ,
+		0x91,0x90 ,
+		0x92,0x03 ,
+		0x93,0x03 ,
+		0x94,0x05 ,
+		0x95,0x43 ,
+		0x96,0xf0 ,
+
+		0xfe,0x00 ,
+		0x9a, 0x20 ,
+		0x9b, 0x80 ,
+		0x9c, 0x40 ,
+		0x9d, 0x80 ,
+		0xa1, 0x30 ,
+		0xa2, 0x32 ,
+		0xa4, 0x80 ,
+		0xa5, 0x28 ,
+		0xaa, 0x30 ,
+		0xac, 0x22 ,
+		0xfe, 0x00 ,
+		0xbf,0x08 ,
+		0xc0,0x16 ,
+		0xc1,0x28 ,
+		0xc2,0x41 ,
+		0xc3,0x5a ,
+		0xc4,0x6c ,
+		0xc5,0x7a ,
+		0xc6,0x96 ,
+		0xc7,0xac ,
+		0xc8,0xbc ,
+		0xc9,0xc9 ,
+		0xca,0xd3 ,
+		0xcb,0xdd ,
+		0xcc,0xe5 ,
+		0xcd,0xf1 ,
+		0xce,0xfa ,
+		0xcf,0xff ,
+		0xd0,0x40 ,
+		0xd1,0x38 ,
+		0xd2,0x38 ,
+		0xd3,0x50 ,
+		0xd6,0xf2 ,
+		0xd7,0x1b ,
+		0xd8,0x18 ,
+		0xdd,0x03 ,
+		0xfe,0x01 ,
+		0x05,0x30 ,
+		0x06,0x75 ,
+		0x07,0x40 ,
+		0x08,0xb0 ,
+		0x0a,0xc5 ,
+		0x0b,0x11 ,
+		0x0c,0x00 ,
+		0x12,0x52 ,
+		0x13,0x38 ,
+		0x18,0x95 ,
+		0x19,0x96 ,
+		0x1f, 0x20 ,
+		0x20, 0xc0 ,
+		0x3e,0x40 ,
+		0x3f,0x57 ,
+		0x40,0x7d ,
+		0x03,0x60 ,
+		0x44, 0x02 ,
+		0xfe,0x01 ,
+		0x1c,0x91 ,
+		0x21,0x15 ,
+		0x50,0x80 ,
+		0x56,0x04 ,
+		0x59,0x08 ,
+		0x5b,0x02 ,
+		0x61,0x8d ,
+		0x62,0xa7 ,
+		0x63,0xd0 ,
+		0x65,0x06 ,
+		0x66,0x06 ,
+		0x67,0x84 ,
+		0x69,0x08 ,
+		0x6a,0x25 ,
+		0x6b,0x01 ,
+		0x6c,0x00 ,
+		0x6d,0x02 ,
+		0x6e,0xf0 ,
+		0x6f,0x80 ,
+		0x76,0x80 ,
+		0x78,0xaf ,
+
+
+		0x79,0x75 ,
+		0x7a,0x40 ,
+		0x7b,0x50 ,
+		0x7c,0x0c ,
+
+		0x90,0xc9 ,
+		0x91,0xbe ,
+		0x92,0xe2 ,
+		0x93,0xc9 ,
+		0x95,0x1b ,
+		0x96,0xe2 ,
+		0x97,0x49 ,
+		0x98,0x1b ,
+		0x9a,0x49 ,
+		0x9b,0x1b ,
+		0x9c,0xc3 ,
+		0x9d,0x49 ,
+		0x9f,0xc7 ,
+		0xa0,0xc8 ,
+		0xa1,0x00 ,
+		0xa2,0x00 ,
+		0x86,0x00 ,
+		0x87,0x00 ,
+		0x88,0x00 ,
+		0x89,0x00 ,
+		0xa4,0xb9 ,
+		0xa5,0xa0 ,
+		0xa6,0xba ,
+		0xa7,0x92 ,
+		0xa9,0xba ,
+		0xaa,0x80 ,
+		0xab,0x9d ,
+		0xac,0x7f ,
+		0xae,0xbb ,
+		0xaf,0x9d ,
+		0xb0,0xc8 ,
+		0xb1,0x97 ,
+		0xb3,0xb7 ,
+		0xb4,0x7f ,
+		0xb5,0x00 ,
+		0xb6,0x00 ,
+		0x8b,0x00 ,
+		0x8c,0x00 ,
+		0x8d,0x00 ,
+		0x8e,0x00 ,
+		0x94,0x55 ,
+		0x99,0xa6 ,
+		0x9e,0xaa ,
+		0xa3,0x0a ,
+		0x8a,0x00 ,
+		0xa8,0x55 ,
+		0xad,0x55 ,
+		0xb2,0x55 ,
+		0xb7,0x05 ,
+		0x8f,0x00 ,
+		0xb8,0xcb ,
+		0xb9,0x9b ,
+		0xfe,0x01 ,
+		0xd0, 0x38 ,
+		0xd1, 0x00 ,
+		0xd2, 0x02 ,
+		0xd3, 0x04 ,
+		0xd4, 0x38 ,
+		0xd5, 0x12 ,
+		0xd6,0x30 ,
+		0xd7,0x00 ,
+		0xd8,0x0a ,
+		0xd9,0x16 ,
+		0xda,0x39 ,
+		0xdb,0xf8 ,
+		0xfe,0x01 ,
+		0xc1,0x3c ,
+		0xc2,0x50 ,
+		0xc3,0x00 ,
+		0xc4,0x40 ,
+		0xc5,0x30 ,
+		0xc6,0x30 ,
+		0xc7,0x10 ,
+		0xc8,0x00 ,
+		0xc9,0x00 ,
+		0xdc,0x20 ,
+		0xdd,0x10 ,
+		0xdf,0x00 ,
+		0xde,0x00 ,
+		0x01,0x10 ,
+		0x0b, 0x31 ,
+		0x0e,0x50 ,
+		0x0f,0x0f ,
+		0x10,0x6e ,
+		0x12,0xa0 ,
+		0x15,0x60 ,
+		0x16,0x60 ,
+		0x17,0xe0 ,
+		0xcc,0x0c ,
+		0xcd,0x10 ,
+		0xce,0xa0 ,
+		0xcf,0xe6 ,
+		0x45,0xf7 ,
+		0x46,0xff ,
+		0x47,0x15 ,
+		0x48,0x03 ,
+		0x4f,0x60 ,
+
+		0xfe,0x00 ,
+		0x05, 0x01 ,
+		0x06, 0x89 ,
+		0x07, 0x00 ,
+		0x08, 0x2a ,
+		0xfe, 0x01 ,
+		0x25, 0x00 ,
+		0x26, 0x6d ,
+		0x27, 0x01 ,
+		0x28, 0xb4 ,
+		0x29, 0x02 ,
+		0x2a, 0x8e ,
+		0x2b, 0x02 ,
+		0x2c, 0xfb ,
+		0x2d, 0x07 ,
+		0x2e, 0x3d ,
+
+		0x3c,0x20 ,
+
+		0x50,0x01 ,
+		0x51,0x00 ,
+		0x52,0x78 ,
+		0x53,0x00 ,
+		0x54,0xa0 ,
+		0x55,0x00 ,
+		0x56,0xf0 ,
+		0x57,0x01 ,
+		0x58,0x40 ,
+
+		0xfe,0x03 ,
+		0x01,0x00 ,
+		0x02,0x00 ,
+		0x10,0x00 ,
+		0x15,0x00 ,
+		0x17,0x00 ,
+		0x04,0x10 ,
+		0x05,0x00 ,
+		0x40,0x00 ,
+
+
+		0x52,0xa0 ,
+
+		0x53,0x24 ,
+		0x54,0x20 ,
+		0x55,0x20 ,
+		0x5a,0x00 ,
+		0x51,0x03 ,
+		0x64,0x06 ,
+		0xfe,0x00 ,
+	},
+}
+local gc0310_ddr_big =
+{
+	zbar_scan = 0,
+	i2c_addr = 0x21,
+	sensor_width = 640,
+	sensor_height = 480,
+	id_reg = 0xf1,
+	id_value = 0x10,
+	spi_mode = disp.CAMERA_SPI_MODE_LINE2,
+	spi_speed = disp.CAMERA_SPEED_DDR,
+	spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,
+
+	init_cmd =
+	{
+
+	 0xfe,0xf0 ,
+	 0xfe,0xf0 ,
+	 0xfe,0x00 ,
+
+	 0xfc,0x16 ,
+	 0xfc,0x16 ,
+	 0xf2,0x07 ,
+	 0xf3,0x83 ,
+	 0xf5,0x07 ,
+
+	 0xf7,0x89 ,
+	 0xf8,0x01 ,
+	 0xf9,0x4f ,
+	 0xfa,0x11 ,
+
+	 0xfc,0xce ,
+	 0xfd,0x00 ,
+
+	 0x00,0x2f ,
+	 0x01,0x0f ,
+	 0x02,0x04 ,
+
+
+	 0x03,0x02 ,
+	 0x04,0x12 ,
+
+	 0x09,0x00 ,
+	 0x0a,0x00 ,
+	 0x0b,0x00 ,
+	 0x0c,0x04 ,
+	 0x0d,0x01 ,
+	 0x0e,0xe8 ,
+	 0x0f,0x02 ,
+	 0x10,0x88 ,
+	 0x16,0x00 ,
+	 0x17,0x14 ,
+	 0x18,0x1a ,
+	 0x19,0x14 ,
+	 0x1b,0x48 ,
+	 0x1c, 0x6c ,
+	 0x1e,0x6b ,
+	 0x1f,0x28 ,
+
+	 0x20,0x8b ,
+
+	 0x21,0x49 ,
+	 0x22,0xd0 ,
+	 0x23,0x04 ,
+	 0x24,0xff ,
+	 0x34,0x20 ,
+
+	 0x26,0x23 ,
+	 0x28,0xff ,
+	 0x29,0x00 ,
+	 0x32,0x04 ,
+	 0x33,0x10 ,
+	 0x37,0x20 ,
+	 0x38,0x10 ,
+	 0x47,0x80 ,
+	 0x4e,0x66 ,
+	 0xa8,0x02 ,
+	 0xa9,0x80 ,
+
+	 0x40,0xff ,
+	 0x41,0x21 ,
+	 0x42,0xcf ,
+	 0x44,0x02 ,
+	 0x45,0xa8 ,
+	 0x46,0x02 ,
+	 0x4a,0x11 ,
+	 0x4b,0x01 ,
+	 0x4c,0x20 ,
+	 0x4d,0x05 ,
+	 0x4f,0x01 ,
+	 0x50,0x01 ,
+	 0x55,0x01 ,
+	 0x56,0xe0 ,
+	 0x57,0x02 ,
+	 0x58,0x80 ,
+
+	 0x70,0x70 ,
+	 0x5a,0x84 ,
+	 0x5b,0xc9 ,
+	 0x5c,0xed ,
+	 0x77,0x74 ,
+	 0x78,0x40 ,
+	 0x79,0x5f ,
+
+	 0x82,0x08 ,
+	 0x83,0x0b ,
+	 0x89,0xf0 ,
+
+	 0x8f,0xaa ,
+	 0x90,0x8c ,
+	 0x91,0x90 ,
+	 0x92,0x03 ,
+	 0x93,0x03 ,
+	 0x94,0x05 ,
+	 0x95,0x43 ,
+	 0x96,0xf0 ,
+
+	 0xfe,0x00 ,
+
+	 0x9a, 0x20 ,
+	 0x9b, 0x80 ,
+	 0x9c, 0x40 ,
+	 0x9d, 0x80 ,
+	 0xa1, 0x30 ,
+	 0xa2, 0x32 ,
+	 0xa4, 0x80 ,
+	 0xa5, 0x28 ,
+	 0xaa, 0x30 ,
+	 0xac, 0x22 ,
+
+	 0xfe, 0x00 ,
+	 0xbf,0x08 ,
+	 0xc0,0x16 ,
+	 0xc1,0x28 ,
+	 0xc2,0x41 ,
+	 0xc3,0x5a ,
+	 0xc4,0x6c ,
+	 0xc5,0x7a ,
+	 0xc6,0x96 ,
+	 0xc7,0xac ,
+	 0xc8,0xbc ,
+	 0xc9,0xc9 ,
+	 0xca,0xd3 ,
+	 0xcb,0xdd ,
+	 0xcc,0xe5 ,
+	 0xcd,0xf1 ,
+	 0xce,0xfa ,
+	 0xcf,0xff ,
+
+
+
+	 0xd0,0x40 ,
+	 0xd1,0x38 ,
+	 0xd2,0x38 ,
+	 0xd3,0x50 ,
+	 0xd6,0xf2 ,
+	 0xd7,0x1b ,
+	 0xd8,0x18 ,
+	 0xdd,0x03 ,
+
+	 0xfe,0x01 ,
+	 0x05,0x30 ,
+	 0x06,0x75 ,
+	 0x07,0x40 ,
+	 0x08,0xb0 ,
+	 0x0a,0xc5 ,
+	 0x0b,0x11 ,
+	 0x0c,0x00 ,
+	 0x12,0x52 ,
+	 0x13,0x38 ,
+	 0x18,0x95 ,
+	 0x19,0x96 ,
+	 0x1f, 0x20 ,
+	 0x20, 0xc0 ,
+	 0x3e,0x40 ,
+	 0x3f,0x57 ,
+	 0x40,0x7d ,
+
+	 0x03,0x60 ,
+
+	 0x44, 0x02 ,
+
+	 0xfe,0x01 ,
+	 0x1c,0x91 ,
+	 0x21,0x15 ,
+	 0x50,0x80 ,
+	 0x56,0x04 ,
+	 0x59,0x08 ,
+	 0x5b,0x02 ,
+	 0x61,0x8d ,
+	 0x62,0xa7 ,
+	 0x63,0xd0 ,
+	 0x65,0x06 ,
+	 0x66,0x06 ,
+	 0x67,0x84 ,
+	 0x69,0x08 ,
+	 0x6a,0x25 ,
+	 0x6b,0x01 ,
+	 0x6c,0x00 ,
+	 0x6d,0x02 ,
+	 0x6e,0xf0 ,
+	 0x6f,0x80 ,
+	 0x76,0x80 ,
+	 0x78,0xaf ,
+
+
+	 0x79,0x75 ,
+	 0x7a,0x40 ,
+	 0x7b,0x50 ,
+	 0x7c,0x0c ,
+
+	 0x90,0xc9 ,
+	 0x91,0xbe ,
+	 0x92,0xe2 ,
+	 0x93,0xc9 ,
+	 0x95,0x1b ,
+	 0x96,0xe2 ,
+	 0x97,0x49 ,
+	 0x98,0x1b ,
+	 0x9a,0x49 ,
+	 0x9b,0x1b ,
+	 0x9c,0xc3 ,
+	 0x9d,0x49 ,
+	 0x9f,0xc7 ,
+	 0xa0,0xc8 ,
+	 0xa1,0x00 ,
+	 0xa2,0x00 ,
+	 0x86,0x00 ,
+	 0x87,0x00 ,
+	 0x88,0x00 ,
+	 0x89,0x00 ,
+	 0xa4,0xb9 ,
+	 0xa5,0xa0 ,
+	 0xa6,0xba ,
+	 0xa7,0x92 ,
+	 0xa9,0xba ,
+	 0xaa,0x80 ,
+	 0xab,0x9d ,
+	 0xac,0x7f ,
+	 0xae,0xbb ,
+	 0xaf,0x9d ,
+	 0xb0,0xc8 ,
+	 0xb1,0x97 ,
+	 0xb3,0xb7 ,
+	 0xb4,0x7f ,
+	 0xb5,0x00 ,
+	 0xb6,0x00 ,
+	 0x8b,0x00 ,
+	 0x8c,0x00 ,
+	 0x8d,0x00 ,
+	 0x8e,0x00 ,
+	 0x94,0x55 ,
+	 0x99,0xa6 ,
+	 0x9e,0xaa ,
+	 0xa3,0x0a ,
+	 0x8a,0x00 ,
+	 0xa8,0x55 ,
+	 0xad,0x55 ,
+	 0xb2,0x55 ,
+	 0xb7,0x05 ,
+	 0x8f,0x00 ,
+	 0xb8,0xcb ,
+	 0xb9,0x9b ,
+
+
+
+
+	 0xfe,0x01 ,
+
+
+	 0xd0, 0x38 ,
+	 0xd1, 0x00 ,
+	 0xd2, 0x02 ,
+	 0xd3, 0x04 ,
+	 0xd4, 0x38 ,
+	 0xd5, 0x12 ,
+
+	 0xd6,0x30 ,
+	 0xd7,0x00 ,
+	 0xd8,0x0a ,
+	 0xd9,0x16 ,
+	 0xda,0x39 ,
+	 0xdb,0xf8 ,
+
+	 0xfe,0x01 ,
+	 0xc1,0x3c ,
+	 0xc2,0x50 ,
+	 0xc3,0x00 ,
+	 0xc4,0x40 ,
+	 0xc5,0x30 ,
+	 0xc6,0x30 ,
+	 0xc7,0x10 ,
+	 0xc8,0x00 ,
+	 0xc9,0x00 ,
+	 0xdc,0x20 ,
+	 0xdd,0x10 ,
+	 0xdf,0x00 ,
+	 0xde,0x00 ,
+
+
+	 0x01,0x10 ,
+	 0x0b,0x31 ,
+	 0x0e,0x50 ,
+	 0x0f,0x0f ,
+	 0x10,0x6e ,
+	 0x12,0xa0 ,
+	 0x15,0x60 ,
+	 0x16,0x60 ,
+	 0x17,0xe0 ,
+
+
+	 0xcc,0x0c ,
+	 0xcd,0x10 ,
+	 0xce,0xa0 ,
+	 0xcf,0xe6 ,
+
+
+	 0x45,0xf7 ,
+	 0x46,0xff ,
+	 0x47,0x15 ,
+	 0x48,0x03 ,
+	 0x4f,0x60 ,
+
+	 0xfe,0x00 ,
+	 0x05, 0x01 ,
+	 0x06, 0x89 ,
+	 0x07, 0x00 ,
+	 0x08, 0x2a ,
+	 0xfe, 0x01 ,
+	 0x25, 0x00 ,
+	 0x26, 0x6d ,
+	 0x27, 0x01 ,
+	 0x28, 0xb4 ,
+	 0x29, 0x02 ,
+	 0x2a, 0x8e ,
+	 0x2b, 0x02 ,
+	 0x2c, 0xfb ,
+	 0x2d, 0x07 ,
+	 0x2e, 0x3d ,
+
+	 0x3c,0x20 ,
+
+	 0x50,0x01 ,
+	 0x51,0x00 ,
+	 0x52,0x00 ,
+	 0x53,0x00 ,
+	 0x54,0x00 ,
+	 0x55,0x01 ,
+	 0x56,0xe0 ,
+	 0x57,0x02 ,
+	 0x58,0x80 ,
+
+	 0xfe,0x03 ,
+	 0x01,0x00 ,
+	 0x02,0x00 ,
+	 0x10,0x00 ,
+	 0x15,0x00 ,
+	 0x17,0x00 ,
+	 0x04,0x10 ,
+	 0x05,0x00 ,
+	 0x40,0x00 ,
+
+
+	 0x52,0xa0 ,
+
+	 0x53,0x24 ,
+	 0x54,0x20 ,
+	 0x55,0x20 ,
+	 0x5a,0x00 ,
+	 0x5b,0x80 ,
+	 0x5c,0x02 ,
+	 0x5d,0xe0 ,
+	 0x5e,0x01 ,
+	 0x51,0x03 ,
+	 0x64,0x06 ,
+	 0xfe,0x00 ,
+
+	},
+}
+local gc0310_sdr =
+{
+	zbar_scan = 1,
+	i2c_addr = 0x21,
+	sensor_width = 320,
+	sensor_height = 240,
+	id_reg = 0xf1,
+	id_value = 0x10,
+	spi_mode = disp.CAMERA_SPI_MODE_LINE2,
+	spi_speed = disp.CAMERA_SPEED_SDR,
+	spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,
+
+	init_cmd =
+	{
+
+		 0xfe,0xf0 ,
+		 0xfe,0xf0 ,
+		 0xfe,0x00 ,
+
+		 0xfc,0x16 , --4e
+		 0xfc,0x16 , --4e -- [0]apwd [6]regf_clk_gate
+		 0xf2,0x07 , --sync output
+		 0xf3,0x83 , --ff--1f--01 data output
+		 0xf5,0x07 , --sck_dely
+
+		 0xf7,0x88 , --f8/   88
+		 0xf8,0x00 ,           -- 00
+		 0xf9,0x4f , --0f--01   4d
+		 0xfa,0x32 , --32
+
+		 0xfc,0xce ,
+		 0xfd,0x00 ,
+		------------------------------------------------/
+		----------------/   CISCTL reg  ----------------/
+		------------------------------------------------/
+		 0x00,0x2f ,
+		 0x01,0x0f ,
+		 0x02,0x04 ,
+
+		 0x03,0x02 ,
+		 0x04,0x12 ,
+
+		 0x09,0x00 ,
+		 0x0a,0x00 ,
+		 0x0b,0x00 ,
+		 0x0c,0x02 ,--04
+		 0x0d,0x01 ,
+		 0x0e,0xec ,--e8
+		 0x0f,0x02 ,
+		 0x10,0x88 ,
+		 0x16,0x00 ,
+		 0x17,0x14 , --mirror
+		 0x18,0x6a ,--1a
+		 0x19,0x14 ,
+		 0x1b,0x48 ,
+		 0x1c,0x1c ,
+		 0x1e,0x6b ,
+		 0x1f,0x28 ,
+		 0x20,0x8b ,--0x89 travis20140801
+		 0x21,0x49 ,
+		 0x22,0xb0 ,
+		 0x23,0x04 ,
+		 0x24,0xff ,
+		 0x34,0x20 ,
+
+
+		------------------------------------------------/
+		--------------------   BLK   --------------------
+		------------------------------------------------/
+		 0x26,0x23 ,
+		 0x28,0xff ,
+		 0x29,0x00 ,
+		 0x32,0x00 ,
+		 0x33,0x10 ,
+		 0x37,0x20 ,
+		 0x38,0x10 ,
+		 0x47,0x80 ,
+		 0x4e,0x0f ,--66
+		 0xa8,0x02 ,
+		 0xa9,0x80 ,
+
+
+		------------------------------------------------/
+		------------------   ISP reg  ------------------/
+		------------------------------------------------/
+		 0x40,0xff ,
+		 0x41,0x21 ,
+		 0x42,0xcf ,
+		 0x44,0x02 ,
+		 0x45,0xa8 ,
+		 0x46,0x02 , --sync
+		 0x4a,0x11 ,
+		 0x4b,0x01 ,
+		 0x4c,0x20 ,
+		 0x4d,0x05 ,
+		 0x4f,0x01 ,
+		 0x50,0x01 ,
+		 0x55,0x00 ,
+		 0x56,0xf0 ,
+		 0x57,0x01 ,
+		 0x58,0x40 ,
+		------------------------------------------------/
+		------------------/   GAIN   --------------------
+		------------------------------------------------/
+		 0x70,0x70 ,
+		 0x5a,0x84 ,
+		 0x5b,0xc9 ,
+		 0x5c,0xed ,
+		 0x77,0x74 ,
+		 0x78,0x40 ,
+		 0x79,0x5f ,
+
+
+		------------------------------------------------/
+		------------------/   DNDD  --------------------/
+		------------------------------------------------/
+		 0x82,0x08 ,--0x14
+		 0x83,0x0b ,
+		 0x89,0xf0 ,
+		------------------------------------------------/
+		------------------   EEINTP  --------------------
+		------------------------------------------------/
+		 0x8f,0xaa ,
+		 0x90,0x8c ,
+		 0x91,0x90 ,
+		 0x92,0x03 ,
+		 0x93,0x03 ,
+		 0x94,0x05 ,
+		 0x95,0x43 , --0x65
+		 0x96,0xf0 ,
+		------------------------------------------------/
+		--------------------/  ASDE  --------------------
+		------------------------------------------------/
+		 0xfe,0x00 ,
+
+		 0x9a,0x20 ,
+		 0x9b,0x80 ,
+		 0x9c,0x40 ,
+		 0x9d,0x80 ,
+
+		 0xa1,0x30 ,
+			 0xa2,0x32 ,
+		 0xa4,0x30 ,
+		 0xa5,0x30 ,
+		 0xaa,0x10 ,
+		 0xac,0x22 ,
+
+
+		------------------------------------------------/
+		------------------/   GAMMA   ------------------/
+		------------------------------------------------/
+		 0xfe,0x00 ,--default
+		 0xbf,0x08 ,
+		 0xc0,0x16 ,
+		 0xc1,0x28 ,
+		 0xc2,0x41 ,
+		 0xc3,0x5a ,
+		 0xc4,0x6c ,
+		 0xc5,0x7a ,
+		 0xc6,0x96 ,
+		 0xc7,0xac ,
+		 0xc8,0xbc ,
+		 0xc9,0xc9 ,
+		 0xca,0xd3 ,
+		 0xcb,0xdd ,
+		 0xcc,0xe5 ,
+		 0xcd,0xf1 ,
+		 0xce,0xfa ,
+		 0xcf,0xff ,
+
+		------------------------------------------------/
+		------------------/   YCP  ----------------------
+		------------------------------------------------/
+		 0xd0,0x40 ,
+		 0xd1,0x38 , --0x34
+		 0xd2,0x38 , --0x34
+		 0xd3,0x50 ,--0x40
+		 0xd6,0xf2 ,
+		 0xd7,0x1b ,
+		 0xd8,0x18 ,
+		 0xdd,0x03 ,
+
+		------------------------------------------------/
+		--------------------   AEC   --------------------
+		------------------------------------------------/
+		 0xfe,0x01 ,
+		 0x05,0x30 ,
+		 0x06,0x75 ,
+		 0x07,0x40 ,
+		 0x08,0xb0 ,
+		 0x0a,0xc5 ,
+		 0x0b,0x11 ,
+		 0x0c,0x00 ,
+		 0x12,0x52 ,
+		 0x13,0x38 ,
+		 0x18,0x95 ,
+		 0x19,0x96 ,
+		 0x1f,0x20 ,
+		 0x20,0xc0 ,
+		 0x3e,0x40 ,
+		 0x3f,0x57 ,
+		 0x40,0x7d ,
+
+		 0x03,0x60 ,
+
+		 0x44,0x02 ,
+		------------------------------------------------/
+		--------------------   AWB   --------------------
+		------------------------------------------------/
+		 0xfe,0x01 ,
+		 0x1c,0x91 ,
+		 0x21,0x15 ,
+		 0x50,0x80 ,
+		 0x56,0x04 ,
+		 0x59,0x08 ,
+		 0x5b,0x02 ,
+		 0x61,0x8d ,
+		 0x62,0xa7 ,
+		 0x63,0xd0 ,
+		 0x65,0x06 ,
+		 0x66,0x06 ,
+		 0x67,0x84 ,
+		 0x69,0x08 ,
+		 0x6a,0x25 ,
+		 0x6b,0x01 ,
+		 0x6c,0x00 ,
+		 0x6d,0x02 ,
+		 0x6e,0xf0 ,
+		 0x6f,0x80 ,
+		 0x76,0x80 ,
+		 0x78,0xaf ,
+		 0x79,0x75 ,
+		 0x7a,0x40 ,
+		 0x7b,0x50 ,
+		 0x7c,0x0c ,
+
+		 0x90,0xc9 ,--stable AWB
+		 0x91,0xbe ,
+		 0x92,0xe2 ,
+		 0x93,0xc9 ,
+		 0x95,0x1b ,
+		 0x96,0xe2 ,
+		 0x97,0x49 ,
+		 0x98,0x1b ,
+		 0x9a,0x49 ,
+		 0x9b,0x1b ,
+		 0x9c,0xc3 ,
+		 0x9d,0x49 ,
+		 0x9f,0xc7 ,
+		 0xa0,0xc8 ,
+		 0xa1,0x00 ,
+		 0xa2,0x00 ,
+		 0x86,0x00 ,
+		 0x87,0x00 ,
+		 0x88,0x00 ,
+		 0x89,0x00 ,
+		 0xa4,0xb9 ,
+		 0xa5,0xa0 ,
+		 0xa6,0xba ,
+		 0xa7,0x92 ,
+		 0xa9,0xba ,
+		 0xaa,0x80 ,
+		 0xab,0x9d ,
+		 0xac,0x7f ,
+		 0xae,0xbb ,
+		 0xaf,0x9d ,
+		 0xb0,0xc8 ,
+		 0xb1,0x97 ,
+		 0xb3,0xb7 ,
+		 0xb4,0x7f ,
+		 0xb5,0x00 ,
+		 0xb6,0x00 ,
+		 0x8b,0x00 ,
+		 0x8c,0x00 ,
+		 0x8d,0x00 ,
+		 0x8e,0x00 ,
+		 0x94,0x55 ,
+		 0x99,0xa6 ,
+		 0x9e,0xaa ,
+		 0xa3,0x0a ,
+		 0x8a,0x00 ,
+		 0xa8,0x55 ,
+		 0xad,0x55 ,
+		 0xb2,0x55 ,
+		 0xb7,0x05 ,
+		 0x8f,0x00 ,
+		 0xb8,0xcb ,
+		 0xb9,0x9b ,
+
+
+		------------------------------------------------/
+		--------------------  CC ------------------------
+		------------------------------------------------/
+		 0xfe,0x01 ,
+
+		 0xd0,0x38 ,--skin red
+		 0xd1,0x00 ,
+		 0xd2,0x02 ,
+		 0xd3,0x04 ,
+		 0xd4,0x38 ,
+		 0xd5,0x12 ,
+
+		 0xd6,0x30 ,
+		 0xd7,0x00 ,
+		 0xd8,0x0a ,
+		 0xd9,0x16 ,
+		 0xda,0x39 ,
+		 0xdb,0xf8 ,
+		------------------------------------------------/
+		--------------------   LSC   --------------------
+		------------------------------------------------/
+		 0xfe,0x01 ,
+		 0xc1,0x3c ,
+		 0xc2,0x50 ,
+		 0xc3,0x00 ,
+		 0xc4,0x40 ,
+		 0xc5,0x30 ,
+		 0xc6,0x30 ,
+		 0xc7,0x10 ,
+		 0xc8,0x00 ,
+		 0xc9,0x00 ,
+		 0xdc,0x20 ,
+		 0xdd,0x10 ,
+		 0xdf,0x00 ,
+		 0xde,0x00 ,
+
+
+		------------------------------------------------/
+		------------------/  Histogram  ----------------/
+		------------------------------------------------/
+		 0x01,0x10 ,
+		 0x0b,0x31 ,
+		 0x0e,0x50 ,
+		 0x0f,0x0f ,
+		 0x10,0x6e ,
+		 0x12,0xa0 ,
+		 0x15,0x60 ,
+		 0x16,0x60 ,
+		 0x17,0xe0 ,
+
+
+		------------------------------------------------/
+		--------------   Measure Window   --------------/
+		------------------------------------------------/
+		 0xcc,0x0c ,
+		 0xcd,0x10 ,
+		 0xce,0xa0 ,
+		 0xcf,0xe6 ,
+
+
+		------------------------------------------------/
+		----------------/   dark sun   ------------------
+		------------------------------------------------/
+		 0x45,0xf7 ,
+		 0x46,0xff ,
+		 0x47,0x15 ,
+		 0x48,0x03 ,
+		 0x4f,0x60 ,
+
+		------------------------------------------------/
+		------------------/  banding  ------------------/
+		------------------------------------------------/
+		 0xfe,0x00 ,
+		 0x05,0x01 ,
+		 0x06,0x12 , --HB
+		 0x07,0x00 ,
+		 0x08,0x1c , --VB
+		 0xfe,0x01 ,
+		 0x25,0x00 , --step
+		 0x26,0x1f ,
+		 0x27,0x01 , --6fps
+		 0x28,0xf0 ,
+		 0x29,0x01 , --6fps
+		 0x2a,0xf0 ,
+		 0x2b,0x01 , --6fps
+		 0x2c,0xf0 ,
+		 0x2d,0x03 , --3.3fps
+		 0x2e,0xe0 ,
+		 0x3c,0x20 ,
+		--------------------/  SPI   --------------------
+		------------------------------------------------/
+		 0xfe,0x03 ,
+		 0x01,0x00 ,
+		 0x02,0x00 ,
+		 0x10,0x00 ,
+		 0x15,0x00 ,
+		 0x17,0x00 , --01--03
+		 0x04,0x10 ,--fifo full level
+		 0x40,0x00 ,
+		 0x52,0x82 , --zwb 02改成da
+		 0x53,0x24 , --24
+		 0x54,0x20 ,
+		 0x55,0x20 , --QQ--01
+		 0x5a,0x00 , --00 --yuv
+		 0x5b,0x40 ,
+		 0x5c,0x01 ,
+		 0x5d,0xf0 ,
+		 0x5e,0x00 ,
+		 0x51,0x03 ,
+		 0xfe,0x00 ,
+
+	}
+}
+
+local gc032a_ddr_big = {
+    zbar_scan = 1,
+    i2c_addr = 0x21,
+    sensor_width = 640,
+    sensor_height = 480,
+    id_reg = 0xf1,
+    id_value = 0x2a,
+    spi_mode = disp.CAMERA_SPI_MODE_LINE2,
+    spi_speed = disp.CAMERA_SPEED_DDR,
+    spi_yuv_out = disp.CAMERA_SPI_OUT_Y1_V0_Y0_U0,
+	mClk = 9,
+    init_cmd = 
+	{
+		 --System
+		 0xf3, 0x83, --ff--1f--01 data output
+		 0xf5, 0x08,
+		 0xf7, 0x01,
+		 0xf8, 0x04, ----pll-div----frank
+		 0xf9, 0x4e,
+		 0xfa, 0x00,
+		 0xfc, 0x02,
+		 0xfe, 0x02,
+		 0x81, 0x03,
+		 
+		 0xfe, 0x00,
+		 0x77, 0x64,
+		 0x78, 0x40,
+		 0x79, 0x60,
+		 --Analog&Cisctl
+		 0xfe, 0x00,
+		 0x03, 0x01,
+		 0x04, 0xcb,
+		 0x05, 0x01,
+		 0x06, 0xb2,
+		 0x07, 0x00,
+		 0x08, 0x10,
+		 
+		 0x0a, 0x00,
+		 0x0c, 0x00,
+		 0x0d, 0x01,
+		 0x0e, 0xe8,
+		 0x0f, 0x02,
+		 0x10, 0x88,
+		 
+		 0x17, 0x54,
+		 0x19, 0x08,
+		 0x1a, 0x0a,
+		 0x1f, 0x40,
+		 0x20, 0x30,
+		 0x2e, 0x80,
+		 0x2f, 0x2b,
+		 0x30, 0x1a,
+		 0xfe, 0x02,
+		 0x03, 0x02,
+		 0x05, 0xd7,
+		 0x06, 0x60,
+		 0x08, 0x80,
+		 0x12, 0x89,
+		 
+		 --SPI
+		 0xfe, 0x03,
+		 0x52, 0xba,
+		 0x53, 0x24,
+		 0x54, 0x20,
+		 0x55, 0x00,
+		 0x59, 0x1f, -- {0x59,0x10}, 20190627 scaler output error
+		 0x5a, 0x40, --00 --yuv
+		 0x5b, 0x80,
+		 0x5c, 0x02,
+		 0x5d, 0xe0,
+		 0x5e, 0x01,
+		 0x51, 0x03,
+		 0x64, 0x04,
+		 0xfe, 0x00,
+		 
+		 --blk
+		 0xfe, 0x00,
+		 0x18, 0x02,
+		 0xfe, 0x02,
+		 0x40, 0x22,
+		 0x45, 0x00,
+		 0x46, 0x00,
+		 0x49, 0x20,
+		 0x4b, 0x3c,
+		 0x50, 0x20,
+		 0x42, 0x10,
+		 
+		 --isp
+		 0xfe, 0x01,
+		 0x0a, 0xc5,
+		 0x45, 0x00,
+		 0xfe, 0x00,
+		 0x40, 0xff,
+		 0x41, 0x25,
+		 0x42, 0xef,
+		 0x43, 0x10,
+		 0x44, 0x82,
+		 0x46, 0x22,
+		 0x49, 0x03,
+		 0x52, 0x02,
+		 0x54, 0x00,
+		 0xfe, 0x02,
+		 0x22, 0xf6,
+		 
+		 --Shading
+		 0xfe, 0x01,
+		 0xc1, 0x38,
+		 0xc2, 0x4c,
+		 0xc3, 0x00,
+		 0xc4, 0x2c,
+		 0xc5, 0x24,
+		 0xc6, 0x18,
+		 0xc7, 0x28,
+		 0xc8, 0x11,
+		 0xc9, 0x15,
+		 0xca, 0x20,
+		 0xdc, 0x7a,
+		 0xdd, 0xa0,
+		 0xde, 0x80,
+		 0xdf, 0x88,
+		 
+		 --AWB --20170110
+		 0xfe, 0x01,
+		 0x50, 0xc1,
+		 0x56, 0x34,
+		 0x58, 0x04,
+		 0x65, 0x06,
+		 0x66, 0x0f,
+		 0x67, 0x04,
+		 0x69, 0x20,
+		 0x6a, 0x40,
+		 0x6b, 0x81,
+		 0x6d, 0x12,
+		 0x6e, 0xc0,
+		 0x7b, 0x2a,
+		 0x7c, 0x0c,
+		 0xfe, 0x01,
+		 0x90, 0xe3,
+		 0x91, 0xc2,
+		 0x92, 0xff,
+		 0x93, 0xe3,
+		 0x95, 0x1c,
+		 0x96, 0xff,
+		 0x97, 0x44,
+		 0x98, 0x1c,
+		 0x9a, 0x44,
+		 0x9b, 0x1c,
+		 0x9c, 0x64,
+		 0x9d, 0x44,
+		 0x9f, 0x71,
+		 0xa0, 0x64,
+		 0xa1, 0x00,
+		 0xa2, 0x00,
+		 0x86, 0x00,
+		 0x87, 0x00,
+		 0x88, 0x00,
+		 0x89, 0x00,
+		 0xa4, 0xc2,
+		 0xa5, 0x9b,
+		 0xa6, 0xc8,
+		 0xa7, 0x92,
+		 0xa9, 0xc9,
+		 0xaa, 0x96,
+		 0xab, 0xa9,
+		 0xac, 0x99,
+		 0xae, 0xce,
+		 0xaf, 0xa9,
+		 0xb0, 0xcf,
+		 0xb1, 0x9d,
+		 0xb3, 0xcf,
+		 0xb4, 0xac,
+		 0xb5, 0x00,
+		 0xb6, 0x00,
+		 0x8b, 0x00,
+		 0x8c, 0x00,
+		 0x8d, 0x00,
+		 0x8e, 0x00,
+		 0x94, 0x55,
+		 0x99, 0xa6,
+		 0x9e, 0xaa,
+		 0xa3, 0x0a,
+		 0x8a, 0x00,
+		 0xa8, 0x55,
+		 0xad, 0x55,
+		 0xb2, 0x55,
+		 0xb7, 0x05,
+		 0x8f, 0x00,
+		 0xb8, 0xc7,
+		 0xb9, 0xa0,
+		 
+		 0xfe, 0x01,
+		 0xd0, 0x40,
+		 0xd1, 0x00,
+		 0xd2, 0x00,
+		 0xd3, 0xfa,
+		 0xd4, 0x4a,
+		 0xd5, 0x02,
+		 
+		 0xd6, 0x44,
+		 0xd7, 0xfa,
+		 0xd8, 0x04,
+		 0xd9, 0x08,
+		 0xda, 0x5c,
+		 0xdb, 0x02,
+		 0xfe, 0x00,
+		 
+		 --Gamma
+		 0xfe, 0x00,
+		 0xba, 0x00,
+		 0xbb, 0x06,
+		 0xbc, 0x0b,
+		 0xbd, 0x10,
+		 0xbe, 0x19,
+		 0xbf, 0x26,
+		 0xc0, 0x33,
+		 0xc1, 0x3f,
+		 0xc2, 0x54,
+		 0xc3, 0x68,
+		 0xc4, 0x7c,
+		 0xc5, 0x8c,
+		 0xc6, 0x9c,
+		 0xc7, 0xb4,
+		 0xc8, 0xc9,
+		 0xc9, 0xd8,
+		 0xca, 0xe4,
+		 0xcb, 0xee,
+		 0xcc, 0xf4,
+		 0xcd, 0xf9,
+		 0xce, 0xfa,
+		 0xcf, 0xff,
+		 
+		 --Auto Gamma
+		 0xfe, 0x00,
+		 0x5a, 0x08,
+		 0x5b, 0x0f,
+		 0x5c, 0x15,
+		 0x5d, 0x1c,
+		 0x5e, 0x28,
+		 0x5f, 0x36,
+		 0x60, 0x45,
+		 0x61, 0x51,
+		 0x62, 0x6a,
+		 0x63, 0x7d,
+		 0x64, 0x8d,
+		 0x65, 0x98,
+		 0x66, 0xa2,
+		 0x67, 0xb5,
+		 0x68, 0xc3,
+		 0x69, 0xcd,
+		 0x6a, 0xd4,
+		 0x6b, 0xdc,
+		 0x6c, 0xe3,
+		 0x6d, 0xf0,
+		 0x6e, 0xf9,
+		 0x6f, 0xff,
+		 
+		 --Gain
+		 0xfe, 0x00,
+		 0x70, 0x50,
+		 
+		 --AEC
+		 0xfe, 0x00,
+		 0x4f, 0x01,
+		 0xfe, 0x01,
+		 0x0c, 0x01,
+		 0x0d, 0x00, --08 add 20170110
+		 0x12, 0xa0,
+		 0x13, 0x4a,
+		 0x44, 0x04,
+		 0x1f, 0x40,
+		 0x20, 0x40,
+		 0x23, 0x0a,
+		 0x26, 0x9a,
+		 0x3e, 0x20,
+		 0x3f, 0x2d,
+		 0x40, 0x40,
+		 0x41, 0x5b,
+		 0x42, 0x82,
+		 0x43, 0xb7,
+		 0x04, 0x0a,
+		 0x02, 0x79,
+		 0x03, 0xc0,
+		 
+		 --measure window
+		 0xfe, 0x01,
+		 0xcc, 0x08,
+		 0xcd, 0x08,
+		 0xce, 0xa4,
+		 0xcf, 0xec,
+		 
+		 --DNDD
+		 0xfe, 0x00,
+		 0x81, 0xb8,
+		 0x82, 0x04,
+		 0x83, 0x10,
+		 0x84, 0x01,
+		 0x86, 0x50,
+		 0x87, 0x18,
+		 0x88, 0x10,
+		 0x89, 0x70,
+		 0x8a, 0x20,
+		 0x8b, 0x10,
+		 0x8c, 0x08,
+		 0x8d, 0x0a,
+		 
+		 --Intpee
+		 0xfe, 0x00,
+		 0x8f, 0xaa,
+		 0x90, 0x1c,
+		 0x91, 0x52,
+		 0x92, 0x03,
+		 0x93, 0x03,
+		 0x94, 0x08,
+		 0x95, 0x6a,
+		 0x97, 0x00,
+		 0x98, 0x00,
+		 
+		 --ASDE
+		 0xfe, 0x00,
+		 0x9a, 0x30,
+		 0x9b, 0x50,
+		 0xa1, 0x30,
+		 0xa2, 0x66,
+		 0xa4, 0x28,
+		 0xa5, 0x30,
+		 0xaa, 0x28,
+		 0xac, 0x32,
+		 
+		 --YCP
+		 0xfe, 0x00,
+		 0xd1, 0x3f,
+		 0xd2, 0x3f,
+		 0xd3, 0x38,
+		 0xd6, 0xf4,
+		 0xd7, 0x1d,
+		 0xdd, 0x72,
+		 0xde, 0x84,
+		 
+		 0xfe, 0x00,
+		 0x05, 0x01,
+		 0x06, 0xad,
+		 0x07, 0x00,
+		 0x08, 0x10,
+		 
+		 0xfe, 0x01,
+		 0x25, 0x00,
+		 0x26, 0x4d,
+		 
+		 0x27, 0x01,
+		 0x28, 0xce, --16.6fps
+		 0x29, 0x01,
+		 0x2a, 0xce, --12.5fps
+		 0x2b, 0x01,
+		 0x2c, 0xce, --10fps
+		 0x2d, 0x01,
+		 0x2e, 0xce, --8.33fps
+		 0x2f, 0x01,
+		 0x30, 0xce, --5.88fps
+		 0x31, 0x01,
+		 0x32, 0xce, --4.34fps
+		 0x33, 0x01,
+		 0x34, 0xce, --3.99fps
+		 0x3c, 0x10, --{0x3c,0x00}
+		 0xfe, 0x00,
+	}
+}
+
+function scan()
+    --唤醒系统
+    pm.wake("testScanCode")
+    local ret = 0
+
+    --设置扫码回调函数,默认10秒超时
+    scanCode.request(scanCodeCb)
+
+    --打开摄像头
+    --ret = disp.cameraopen(1,1) -- 内部配置的gc0310 camera
+    --ret = disp.cameraopen_ext(gc6153) -- 外部配置gc6153 camera SDR
+    ret = disp.cameraopen_ext(gc0310_sdr) -- 外部配置gc0310 camera SDR
+	--ret = disp.cameraopen_ext(gc0310_ddr_big) -- 外部配置gc0310 camera DDR 640*480
+    --ret = disp.cameraopen_ext(gc0310_ddr) -- 外部配置gc0310 camera DDR
+    --ret = disp.cameraopen_ext(bf302A_sdr) -- 外部配置bf302A camera SDR
+    --ret = disp.cameraopen_ext(gc032a_ddr_big) -- 外部配置gc032a camera DDR 640*480
+
+    log.info("testScanCode cameraopen_ext ret ", ret)
+    --打开摄像头预览
+    --zoom: 放缩设置, 目前仅支持0xff尺寸自适应,0不放缩
+    --disp.camerapreviewxzoom(zoom)
+    --缩小2倍
+    disp.camerapreviewzoom(0xff)
+    ret = disp.camerapreview(0,0,0,0,128,160)
+	print("预览打开成功?",ret)
+    --rotation:反转角度设置 暂时只支持0和90度
+    --disp.camerapreviewrotation(90)
+end
+
+
+-- 拍照并显示
+function takePhotoAndDisplay()
+    --唤醒系统
+    pm.wake("testTakePhoto")
+    --打开摄像头
+    disp.cameraopen(1,0,0,1)
+    --disp.cameraopen(1,0,0,0)  --因目前core中还有问题没解决,所以不能关闭隔行隔列
+    --打开摄像头预览
+    --如果有LCD,使用LCD的宽和高
+    --如果无LCD,宽度设置为240像素,高度设置为320像素,240*320是Air268F支持的最大分辨率
+    disp.camerapreview(0,0,0,0,WIDTH or DEFAULT_WIDTH,HEIGHT or DEFAULT_HEIGHT)
+    --设置照片的宽和高像素并且开始拍照
+    --此处设置的宽和高和预览时的保持一致
+    --此处的第三个参数表示拍摄质量,默认50,100最好
+    disp.cameracapture(WIDTH or DEFAULT_WIDTH,HEIGHT or DEFAULT_HEIGHT)
+    --设置照片保存路径
+    disp.camerasavephoto("/testCamera.jpg")
+    log.info("testCamera.takePhotoAndDisplay fileSize",io.fileSize("/testCamera.jpg"))
+    --关闭摄像头预览
+    disp.camerapreviewclose()
+    --关闭摄像头
+    disp.cameraclose()
+    --允许系统休眠
+    pm.sleep("testTakePhoto")
+
+    --testUartSentFile.sendFile()
+    --显示拍照图片
+    if WIDTH~=0 and HEIGHT~=0 then
+        disp.clear()
+        disp.putimage("/testCamera.jpg",0,0)
+        disp.puttext(common.utf8ToGb2312("照片尺寸: "..io.fileSize("/testCamera.jpg")),0,5)
+        disp.update()
+    end
+
+    sys.timerStart(takePhotoAndDisplay,5000)
+end
+
+
+-- 拍照并通过uart1发送出去
+function takePhotoAndSendToUart()
+    --唤醒系统
+    pm.wake("testTakePhoto")
+    --打开摄像头
+    disp.cameraopen(1,0,0,1)
+    --disp.cameraopen(1,0,0,0)  --因目前core中还有问题没解决,所以不能关闭隔行隔列
+    --打开摄像头预览
+    --如果有LCD,使用LCD的宽和高
+    --如果无LCD,宽度设置为240像素,高度设置为320像素,240*320是Air268F支持的最大分辨率
+    disp.camerapreview(0,0,0,0,DEFAULT_WIDTH,DEFAULT_HEIGHT)
+    --设置照片的宽和高像素并且开始拍照
+    --此处设置的宽和高和预览时的保持一致
+    disp.cameracapture(DEFAULT_WIDTH,DEFAULT_HEIGHT)
+    --设置照片保存路径
+    disp.camerasavephoto("/testCamera.jpg")
+    log.info("testCamera.takePhotoAndSendToUart fileSize",io.fileSize("/testCamera.jpg"))
+    --关闭摄像头预览
+    disp.camerapreviewclose()
+    --关闭摄像头
+    disp.cameraclose()
+    --允许系统休眠
+    pm.sleep("testTakePhoto")
+
+    testUartSentFile.sendFile()
+
+    sys.timerStart(takePhotoAndSendToUart,30000)
+end
+
+
+--sys.timerStart(takePhotoAndDisplay,1000)
+--sys.timerStart(takePhotoAndSendToUart,1000)
+sys.timerStart(scan,1000)

+ 39 - 0
demo/camera/testUartSentFile.lua

@@ -0,0 +1,39 @@
+--- 模块功能:串口功能测试(非TASK版,串口帧有自定义的结构)
+-- @author openLuat
+-- @module uart.testUartTask
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.05.24
+
+module(...,package.seeall)
+
+require"utils"
+require"pm"
+
+local uartID = 1
+
+function sendFile()
+sys.taskInit(
+    function()                
+        local fileHandle = io.open("/testCamera.jpg","rb")
+        if not fileHandle then
+            log.error("testALiYun.otaCb1 open file error")
+            return
+        end
+        
+        pm.wake("UART_SENT2MCU")
+        uart.on(uartID,"sent",function() sys.publish("UART_SENT2MCU_OK") end)
+        uart.setup(uartID,115200,8,uart.PAR_NONE,uart.STOP_1,nil,1)
+        while true do
+            local data = fileHandle:read(1460)
+            if not data then break end
+            uart.write(uartID,data)
+            sys.waitUntil("UART_SENT2MCU_OK")
+        end
+        
+        uart.close(uartID)
+        pm.sleep("UART_SENT2MCU")
+        fileHandle:close()
+    end
+)
+end

BIN
demo/console/console功能使用说明.docx


+ 63 - 0
demo/console/main.lua

@@ -0,0 +1,63 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "CONSOLE"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+require "sys"
+require "net"
+require "pins"
+require "common"
+require "powerKey"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+require "misc"
+require "console"
+console.setup(1, 115200)
+
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 65 - 0
demo/crypto/main.lua

@@ -0,0 +1,65 @@
+--必须在这个位置定义PROJECT和VERSION变量
+--PROJECT:ascii string类型,可以随便定义,只要不使用,就行
+--VERSION:ascii string类型,如果使用Luat物联云平台固件升级的功能,必须按照"X.X.X"定义,X表示1位数字;否则可随便定义
+PROJECT = "CRYPTO"
+VERSION = "2.0.0"
+
+--加载日志功能模块,并且设置日志输出等级
+--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
+require "log"
+LOG_LEVEL = log.LOGLEVEL_TRACE
+--[[
+如果使用UART输出日志,打开这行注释的代码"--log.openTrace(true,1,115200)"即可,根据自己的需求修改此接口的参数
+如果要彻底关闭脚本中的输出日志(包括调用log模块接口和Lua标准print接口输出的日志),执行log.openTrace(false,第二个参数跟调用openTrace接口打开日志的第二个参数相同),例如:
+1、没有调用过sys.opntrace配置日志输出端口或者最后一次是调用log.openTrace(true,nil,921600)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false)即可
+2、最后一次是调用log.openTrace(true,1,115200)配置日志输出端口,此时要关闭输出日志,直接调用log.openTrace(false,1)即可
+]]
+--log.openTrace(true,1,115200)
+
+require "sys"
+
+require "net"
+--每1分钟查询一次GSM信号强度
+--每1分钟查询一次基站信息
+net.startQueryAll(60000, 60000)
+
+--此处关闭RNDIS网卡功能
+--否则,模块通过USB连接电脑后,会在电脑的网络适配器中枚举一个RNDIS网卡,电脑默认使用此网卡上网,导致模块使用的sim卡流量流失
+--如果项目中需要打开此功能,把ril.request("AT+RNDISCALL=0,1")修改为ril.request("AT+RNDISCALL=1,1")即可
+--注意:core固件:V0030以及之后的版本、V3028以及之后的版本,才以稳定地支持此功能
+ril.request("AT+RNDISCALL=0,1")
+
+--加载控制台调试功能模块(此处代码配置的是uart2,波特率115200)
+--此功能模块不是必须的,根据项目需求决定是否加载
+--使用时注意:控制台使用的uart不要和其他功能使用的uart冲突
+--使用说明参考demo/console下的《console功能使用说明.docx》
+--require "console"
+--console.setup(2, 115200)
+
+--加载网络指示灯和LTE指示灯功能模块
+--根据自己的项目需求和硬件配置决定:1、是否加载此功能模块;2、配置指示灯引脚
+--合宙官方出售的Air720U开发板上的网络指示灯引脚为pio.P0_1,LTE指示灯引脚为pio.P0_4
+require "netLed"
+pmd.ldoset(2,pmd.LDO_VLCD)
+netLed.setup(true,pio.P0_1,pio.P0_4)
+--网络指示灯功能模块中,默认配置了各种工作状态下指示灯的闪烁规律,参考netLed.lua中ledBlinkTime配置的默认值
+--如果默认值满足不了需求,此处调用netLed.updateBlinkTime去配置闪烁时长
+--LTE指示灯功能模块中,配置的是注册上4G网络,灯就常亮,其余任何状态灯都会熄灭
+
+--加载错误日志管理功能模块【强烈建议打开此功能】
+--如下2行代码,只是简单的演示如何使用errDump功能,详情参考errDump的api
+require "errDump"
+errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
+
+--加载远程升级功能模块【强烈建议打开此功能,如果使用了阿里云的OTA功能,可以不打开此功能】
+--如下3行代码,只是简单的演示如何使用update功能,详情参考update的api以及demo/update
+--PRODUCT_KEY = "v32xEAKsGTIEQxtqgwCldp5aPlcnPs3K"
+--require "update"
+--update.request()
+
+--加载crypto功能测试模块
+require "testCrypto"
+
+--启动系统框架
+sys.init(0, 0)
+sys.run()

+ 27 - 0
demo/crypto/private.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAx0+zurC2NFWgULkhQ4rEAvPeNnuxBz/0kbjbhrGNlD0gLccO
+ZdQHihJqwRdX2IuDDhienfNX+9qIeQgkf3owzp082k93I2ky/QLwNDvN9loDJ0Zv
+eIk0kwwz9yJZqD1FIiFabO+DkSVx+e+26yIKQjnS0i0D3IulzOGulSt56OuIl0/a
+/fgFWQqfMWoLL4cyBQBEFuQth0fTACTsY6XAQ3e2kshD0cMT3U55hJmCCbxFuJ+Q
+WOgtUuLt1SqlqZoYo/rYNQj5yBc3fd9HKXzLvmoKUMxFIW6Ez/ddubPx6F4B0eyz
+V3oZ8Fp6I4WsMDDoUxJIYQ1Z4Yg6l9lkwqdAzwIDAQABAoIBAQCdMAiJBfDM2XLz
+9u16/SeVRItN4MM++nuBqY7IbaNA8+w67jA2sr+3bsruueA4Ed8r8NK3s0ECidjz
+yy4ts0pmyK9DZUSKkt75l6WlLD1FOrwd73jeUSc7iXY6Q8b93kR1pGRSYZsbj7KR
+8TILwu7gSAYyZ/oRp7j9Gke7sWwV+rdgQAwlI/0Pkv7pCFEfSLe0pdG60mt80s6O
+tgW0m/xlCp+X20zmObh9DivBsera2hPUAVDM95pPaQLC2gxq2TD4BdglizcENLqA
+Mp9djr/hT0DfLzBu5DxDtki3bwN+pDlH9yabU328iJn6e5Lx5sPUOKG/XZKQAmlq
+ZTqIJl6hAoGBAOm7Tgfb0dZLAbycjPLW5SWagc/IYqlUHLs2RIMiGYWEFdTWEPNg
+PSFHL8B5TX8h4TwCpm4nXimxouAwgxNCrKblpaEtZ5RSZ+cw1Dzf/jBoRFgOa842
+pmhWdZ2gIdnWcx1FNcig4csrnEtAg505zYPBpnVUJGFSdR+2woWVHRC3AoGBANpM
+43YC6jtcNlxqNl3wCWH3k8ATAopGpuQSZ76VPCUHUwocjUoThbxtNwm4EY2xxjjc
+41iqQFPGKcion3PeDwQ8o87fHkIgwx9DBcrMgB2CtWa+cFsICmVxOQTE/CSLFroh
+oPtxLGWNWNewZAgFXhWm9uJ0SD812ML9TupJGoipAoGAQuxzqkJhsdcmNygoH3wy
+fnLgCmuY/FzuIRinw1hnMFiim59zmQwMVNP6M0VIUEeWI0Wq+81f49ZOCZ06WrBz
+mRIWO7ExgEGcKJFNo+SK9rdUIlZ2vcPeH+/pm2l3Z9VEfrQLc1fFbxQcm1tsk/8x
+/jDbharDA+7FRIBi8DbC7L8CgYEAlxXL/6s4zeiePwvLoOw2sjUVb0Q459bKPuN2
+JfNHcyFEmaT1LKWiU60LAJECpRy64jQOrRj3+IMX/CaoZRr1LauCe/T0DjR6lzJd
+2eP7b3E9d2SqgnZoK5lXKzPihrA1BJGtxxim74oKSQ1tzhdY7IdoK4brUcREx39l
+lMUPtjECgYAnoVCSO2DWOIKg8L35rghUr3/LpNPqqoK8QwIh/iOK4LDOPXQzNgc2
+v3YzGQPKuk2cDXaRam+WtABFgZl2NTIGxct/AwQbu0LjGBsoQpJRcMjAIH46lEP+
+XuGVYywF+LxuRKfJCcdO0RudQ1BiB5sWuTH9jfoHZHyMSJKZ/re6lg==
+-----END RSA PRIVATE KEY-----

Неке датотеке нису приказане због велике количине промена