Browse Source

add: demo,将原有的luat/demo目录,重新添加回来,改名olddemo

Wendal Chen 3 tháng trước cách đây
mục cha
commit
f164f92cb6
100 tập tin đã thay đổi với 5590 bổ sung16 xóa
  1. 3 16
      olddemo/README.md
  2. 53 0
      olddemo/SC7A20/main.lua
  3. 24 0
      olddemo/adc/main.lua
  4. 113 0
      olddemo/adc/testAdc.lua
  5. 49 0
      olddemo/adxl345/main.lua
  6. 81 0
      olddemo/air153C_wtd/main.lua
  7. 53 0
      olddemo/air530z/offline/main.lua
  8. 16 0
      olddemo/air780eg_gnsstest/README.md
  9. 35 0
      olddemo/air780eg_gnsstest/main.lua
  10. 50 0
      olddemo/air780eg_gnsstest/testGnss.lua
  11. 23 0
      olddemo/air780eg_gnsstest/testGpio.lua
  12. 127 0
      olddemo/air780eg_gnsstest/testMqtt.lua
  13. 190 0
      olddemo/air780eg_gnsstest/testTcp.lua
  14. 281 0
      olddemo/air780eg_gnsstest/uc6228.lua
  15. 22 0
      olddemo/air780epvh_gnsstest/README.md
  16. 284 0
      olddemo/air780epvh_gnsstest/hdgnss.lua
  17. 35 0
      olddemo/air780epvh_gnsstest/main.lua
  18. 48 0
      olddemo/air780epvh_gnsstest/testGnss.lua
  19. 23 0
      olddemo/air780epvh_gnsstest/testGpio.lua
  20. 127 0
      olddemo/air780epvh_gnsstest/testMqtt.lua
  21. 190 0
      olddemo/air780epvh_gnsstest/testTcp.lua
  22. BIN
      olddemo/air8000_airlink_fota/air8000s_v11.bin
  23. 34 0
      olddemo/air8000_airlink_fota/main.lua
  24. 106 0
      olddemo/airlbs/main.lua
  25. 7 0
      olddemo/airlink/README.md
  26. 154 0
      olddemo/airlink/air7000_wifi/main.lua
  27. 45 0
      olddemo/airlink/air724ug_test/main.lua
  28. 133 0
      olddemo/airlink/air780ehm_spi_slave/main.lua
  29. 36 0
      olddemo/airlink/air780epm/main.lua
  30. 39 0
      olddemo/airlink/air780epm_test/main.lua
  31. 92 0
      olddemo/airlink/air8000/main.lua
  32. 57 0
      olddemo/airlink/air80000_wifi_start_stop/main.lua
  33. 75 0
      olddemo/airlink/air8000_LAN_WAN/air780epm_WAN/main.lua
  34. 85 0
      olddemo/airlink/air8000_LAN_WAN/air8000_LAN/main.lua
  35. BIN
      olddemo/airlink/air8000_airlink_fota/air8000s_v10.bin
  36. BIN
      olddemo/airlink/air8000_airlink_fota/air8000s_v9.bin
  37. 34 0
      olddemo/airlink/air8000_airlink_fota/main.lua
  38. 129 0
      olddemo/airlink/air8000_ap_lan/main.lua
  39. 76 0
      olddemo/airlink/air8000_ap_sta_ping/air8000_ap_ping/main.lua
  40. 61 0
      olddemo/airlink/air8000_ap_sta_ping/air8101_sta_httpsrv/main.lua
  41. 64 0
      olddemo/airlink/air8000_ble/ibeacon/main.lua
  42. 83 0
      olddemo/airlink/air8000_ble/master/main.lua
  43. 127 0
      olddemo/airlink/air8000_ble/peripheral/main.lua
  44. 85 0
      olddemo/airlink/air8000_ble/scan/main.lua
  45. 41 0
      olddemo/airlink/air8000_gpio/main.lua
  46. 43 0
      olddemo/airlink/air8000_gpio_get/main.lua
  47. 73 0
      olddemo/airlink/air8000_uart/main.lua
  48. 49 0
      olddemo/airlink/air8000_uart11_gnss/main.lua
  49. 146 0
      olddemo/airlink/air8000_wifi/main.lua
  50. 115 0
      olddemo/airlink/air8000_wifi_ap_httpsrv/index.html
  51. 115 0
      olddemo/airlink/air8000_wifi_ap_httpsrv/index2.html
  52. 139 0
      olddemo/airlink/air8000_wifi_ap_httpsrv/main.lua
  53. 72 0
      olddemo/airlink/air8000_wifi_ap_ping/main.lua
  54. 118 0
      olddemo/airlink/air8000_wifi_eth/main.lua
  55. 39 0
      olddemo/airlink/air8000s/main.lua
  56. 38 0
      olddemo/airlink/air8000s_nop/main.lua
  57. 173 0
      olddemo/airlink/air8000s_nop/nop.txt
  58. 35 0
      olddemo/airlink/air8101/main.lua
  59. 48 0
      olddemo/airlink/air8101_air780ehm_http/README.md
  60. 36 0
      olddemo/airlink/air8101_air780ehm_http/air780ehm/main.lua
  61. 29 0
      olddemo/airlink/air8101_air780ehm_http/air8101/main.lua
  62. 67 0
      olddemo/airlink/air8101_air780epm_fota/main.lua
  63. 44 0
      olddemo/airlink/air8101_air780epm_sdata/main.lua
  64. 166 0
      olddemo/airlink/for_ccc/main.lua
  65. 78 0
      olddemo/airlink/uart_http/main.lua
  66. 64 0
      olddemo/airlink/uart_sdata/main.lua
  67. 339 0
      olddemo/airtalk/airtalk_dev_ctrl.lua
  68. 79 0
      olddemo/airtalk/audio_config.lua
  69. 27 0
      olddemo/airtalk/demo_define.lua
  70. 68 0
      olddemo/airtalk/main.lua
  71. BIN
      olddemo/airui/0804_demo/A1.jpg
  72. BIN
      olddemo/airui/0804_demo/A2.jpg
  73. BIN
      olddemo/airui/0804_demo/A3.jpg
  74. BIN
      olddemo/airui/0804_demo/A4.jpg
  75. BIN
      olddemo/airui/0804_demo/A5.jpg
  76. BIN
      olddemo/airui/0804_demo/A6.jpg
  77. BIN
      olddemo/airui/0804_demo/A7.jpg
  78. BIN
      olddemo/airui/0804_demo/A8.jpg
  79. BIN
      olddemo/airui/0804_demo/A9.jpg
  80. BIN
      olddemo/airui/0804_demo/B1.jpg
  81. BIN
      olddemo/airui/0804_demo/B2.jpg
  82. BIN
      olddemo/airui/0804_demo/B3.jpg
  83. BIN
      olddemo/airui/0804_demo/B4.jpg
  84. BIN
      olddemo/airui/0804_demo/B5.jpg
  85. BIN
      olddemo/airui/0804_demo/B6.jpg
  86. BIN
      olddemo/airui/0804_demo/B7.jpg
  87. BIN
      olddemo/airui/0804_demo/B8.jpg
  88. BIN
      olddemo/airui/0804_demo/B9.jpg
  89. BIN
      olddemo/airui/0804_demo/C1.jpg
  90. BIN
      olddemo/airui/0804_demo/C2.jpg
  91. BIN
      olddemo/airui/0804_demo/C3.jpg
  92. BIN
      olddemo/airui/0804_demo/C4.jpg
  93. BIN
      olddemo/airui/0804_demo/C5.jpg
  94. BIN
      olddemo/airui/0804_demo/C6.jpg
  95. BIN
      olddemo/airui/0804_demo/C7.jpg
  96. BIN
      olddemo/airui/0804_demo/C8.jpg
  97. BIN
      olddemo/airui/0804_demo/C9.jpg
  98. BIN
      olddemo/airui/0804_demo/D1.jpg
  99. BIN
      olddemo/airui/0804_demo/D7.jpg
  100. BIN
      olddemo/airui/0804_demo/D9.jpg

+ 3 - 16
olddemo/README.md

@@ -1,18 +1,5 @@
-本目录里面的存放的,都是历史上官方发布的 demo 代码。
+# LuatOS 内部测试代码
 
-这个 olddemo 目录里面的代码,要么是已经过时,要么是官方不再提供支持。
+## 重要提示
 
-这些代码仅仅有参考价值,不一定能正常工作,看看就行。
-
-提供官方支持的,保证可以正常工作的 demo 代码,在本仓库的 module 目录。
-
-
-授权协议
-
-MIT License
-
-```lua
-print("感谢您使用LuatOS ^_^")
-
-print("Thank you for using LuatOS ^_^")
-```
+本目录仅供研发内部测试使用, 普通客户请勿使用.

+ 53 - 0
olddemo/SC7A20/main.lua

@@ -0,0 +1,53 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "sc7a20_demo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 一定要添加sys.lua !!!!
+sys = require("sys")
+
+-- 添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000) -- 初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
+end
+ 
+local sc7a20 = require "sc7a20"
+
+i2cid = 0
+i2c_speed = i2c.FAST
+
+gpio.setup(24, function() --配置中断,外部唤醒用
+    log.info("gpio 24")
+end, gpio.PULLUP, gpio.BOTH)
+
+gpio.setup(2, function() --配置中断,外部唤醒用
+    log.info("gpio 2")
+end, gpio.PULLUP, gpio.BOTH)
+
+sys.taskInit(function()
+    i2c.setup(i2cid, i2c_speed)
+
+    sc7a20.init(i2cid)--初始化,传入i2c_id
+
+    sys.wait(50)
+    sc7a20.set_thresh(i2cid, string.char(0x05), string.char(0x05))  -- 设置活动阀值
+    sys.wait(50)
+    sc7a20.set_irqf(i2cid, 1, string.char(0x1F), string.char(0x03), string.char(0xFF))  -- AOI1中断映射到INT1上
+    sys.wait(50)
+    sc7a20.set_irqf(i2cid, 2, string.char(0x1F), string.char(0x03), string.char(0xFF))  -- AOI2中断映射到INT2上
+
+    while 1 do
+        local sc7a20_data = sc7a20.get_data()
+        log.info("sc7a20_data", "sc7a20_data.x"..(sc7a20_data.x),"sc7a20_data.y"..(sc7a20_data.y),"sc7a20_data.z"..(sc7a20_data.z))
+        sys.wait(1000)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 24 - 0
olddemo/adc/main.lua

@@ -0,0 +1,24 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "adcdemo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 一定要添加sys.lua !!!!
+sys = require("sys")
+
+-- 添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000) -- 初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
+end
+
+local testAdc = require "testAdc"
+sys.taskInit(testAdc.dotest)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 113 - 0
olddemo/adc/testAdc.lua

@@ -0,0 +1,113 @@
+
+--[[
+1. Air101,Air103 模块上的ADC0脚-PA1, 0~2.4v,不要超过范围使用!!!
+2. Air101,Air103模块上的ADC1脚-PA4, 0~2.4v,不要超过范围使用!!!
+3. Air103 模块上的ADC2脚-PA2, 0~2.4v,不要超过范围使用!!! 
+4. Air103 模块上的ADC3脚-PA3, 0~2.4v,不要超过范围使用!!! 
+5. Air101,Air103 adc.CH_CPU 为内部温度 ,adc.CH_VBAT为VBAT
+6. Air105 adc参考电压是1.88V,所有通道一致,
+7. Air105内部分压没有隔离措施,在开启内部分压后,量程有所变化,具体看寄存器手册,1~5分压后能测到3.6,6通道能接近5V,但是不能直接测5V,可以测4.2V 0通道是始终开启无法关闭分压。
+8. Air780E内部ADC接口为12bits 外部直流分压为0-3.4V
+9. Air780E内部具有2个ADC接口,ADC0 -- AIO3 ADC1 -- AIO4 
+10. 特殊通道, CPU内部温度Temp -- adc.CH_CPU 主供电脚电压 VBAT -- adc.CH_VBAT
+11. 设置分压(adc.setRange)要在adc.open之前设置,否则无效!!
+]]
+
+local testAdc = {}
+
+local rtos_bsp = rtos.bsp()
+function adc_pin() -- 根据不同开发板,设置ADC编号
+    if rtos_bsp == "AIR101" then -- Air101开发板ADC编号
+        return 0,1,255,255,adc.CH_CPU ,adc.CH_VBAT 
+    elseif rtos_bsp == "AIR103" then -- Air103开发板ADC编号
+        return 0,1,2,3,adc.CH_CPU ,adc.CH_VBAT 
+    elseif rtos_bsp == "AIR105" then -- Air105开发板ADC编号
+        -- 默认不开启分压,范围是0-1.8v精度高
+        -- 设置分压要在adc.open之前设置,否则无效!!
+        -- adc.setRange(adc.ADC_RANGE_3_6)
+        return 0,5,6,255,255,255
+    elseif rtos_bsp == "ESP32C3" then -- ESP32C3开发板ADC编号
+        return 0,1,2,3,adc.CH_CPU , 255
+    elseif rtos_bsp == "ESP32C2" then -- ESP32C2开发板ADC编号
+        return 0,1,2,3,adc.CH_CPU , 255
+    elseif rtos_bsp == "ESP32S3" then -- ESP32S3开发板ADC编号
+        return 0,1,2,3,adc.CH_CPU , 255
+    elseif rtos_bsp == "EC618" then --Air780E开发板ADC编号
+        -- 默认不开启分压,范围是0-1.2v精度高
+        -- 设置分压要在adc.open之前设置,否则无效!!
+        -- adc.setRange(adc.ADC_RANGE_3_8)
+        return 0,1,255,255,adc.CH_CPU ,adc.CH_VBAT 
+    elseif string.find(rtos_bsp,"EC718") then --Air780EP开发板ADC编号
+        -- 默认不开启分压,范围是0-1.6v精度高
+        -- 开启分压后,外部输入最大不可超过3.3V
+        -- 设置分压要在adc.open之前设置,否则无效!!
+        -- adc.setRange(adc.ADC_RANGE_MAX)
+        return 0,1,255,255,adc.CH_CPU ,adc.CH_VBAT 
+    elseif string.find(rtos_bsp,"UIS") then 
+        return 0,1,255,255, adc.CH_CPU ,adc.CH_VBAT 
+    else
+        log.info("main", "define ADC pin in main.lua")
+        return 255,255,255,255, adc.CH_CPU ,adc.CH_VBAT 
+    end
+end
+local adc_pin_0,adc_pin_1,adc_pin_2,adc_pin_3,adc_pin_temp,adc_pin_vbat=adc_pin()
+
+
+function testAdc.dotest()
+    if rtos_bsp == "AIR105" then
+        adc.setRange(adc.ADC_RANGE_3_6) --开启的内部分压,可以把量程扩大
+    end
+    if adc_pin_0 and adc_pin_0 ~= 255 then adc.open(adc_pin_0) end
+    if adc_pin_1 and adc_pin_1 ~= 255 then adc.open(adc_pin_1) end
+    if adc_pin_2 and adc_pin_2 ~= 255 then adc.open(adc_pin_2) end
+    if adc_pin_3 and adc_pin_3 ~= 255 then adc.open(adc_pin_3) end
+    if adc_pin_temp and adc_pin_temp ~= 255 then adc.open(adc_pin_temp) end
+    if adc_pin_vbat and adc_pin_vbat ~= 255 then adc.open(adc_pin_vbat) end
+
+    if adc_pin_0 and adc_pin_0 ~= 255 and mcu and mcu.ticks then
+        sys.wait(1000)
+        log.info("开始读取ADC")
+        local ms_start = mcu.ticks()
+        for i = 1, 100, 1 do
+            adc.get(adc_pin_0)
+        end
+        local ms_end = mcu.ticks()
+        log.info("结束读取ADC")
+        log.info("adc", "读取耗时", "100次", ms_end - ms_start, "ms", "单次", (ms_end - ms_start) // 100, "ms")
+    end
+
+    -- 下面是循环打印, 接地不打印0也是正常现象
+    -- ADC的精度都不会太高, 若需要高精度ADC, 建议额外添加adc芯片
+    while true do
+        if adc_pin_0 and adc_pin_0 ~= 255 then
+            log.debug("adc", "adc" .. tostring(adc_pin_0), adc.get(adc_pin_0)) -- 若adc.get报nil, 改成adc.read
+        end
+        if adc_pin_1 and adc_pin_1 ~= 255 then
+            log.debug("adc", "adc" .. tostring(adc_pin_1), adc.get(adc_pin_1))
+        end
+        if adc_pin_2 and adc_pin_2 ~= 255 then
+            log.debug("adc", "adc" .. tostring(adc_pin_2), adc.get(adc_pin_2))
+        end
+        if adc_pin_3 and adc_pin_3 ~= 255 then
+            log.debug("adc", "adc" .. tostring(adc_pin_3), adc.get(adc_pin_3))
+        end
+        if adc_pin_temp and adc_pin_temp ~= 255 then
+            log.debug("adc", "CPU TEMP", adc.get(adc_pin_temp), "单位0.001摄氏度")
+        end
+        if adc_pin_vbat and adc_pin_vbat ~= 255 then
+            log.debug("adc", "VBAT", adc.get(adc_pin_vbat), "单位毫伏(mV)")
+        end
+        sys.wait(1000)
+    end
+
+    -- 若不再读取, 可关掉adc, 降低功耗, 非必须
+    if adc_pin_0 and adc_pin_0 ~= 255 then adc.close(adc_pin_0) end
+    if adc_pin_1 and adc_pin_1 ~= 255 then adc.close(adc_pin_1) end
+    if adc_pin_2 and adc_pin_2 ~= 255 then adc.close(adc_pin_2) end
+    if adc_pin_3 and adc_pin_3 ~= 255 then adc.close(adc_pin_3) end
+    if adc_pin_temp and adc_pin_temp ~= 255 then adc.close(adc_pin_temp) end
+    if adc_pin_vbat and adc_pin_vbat ~= 255 then adc.close(adc_pin_vbat) end
+
+end
+
+return testAdc

+ 49 - 0
olddemo/adxl345/main.lua

@@ -0,0 +1,49 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "adxl345_demo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 一定要添加sys.lua !!!!
+sys = require("sys")
+
+-- 添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000) -- 初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
+end
+
+local adxl34x = require "adxl34x"
+
+i2cid = 0
+i2c_speed = i2c.FAST
+
+gpio.setup(24, function() --配置wakeup中断,外部唤醒用  连接ADXL34X INT1引脚
+    log.info("gpio ri")
+end, gpio.PULLUP, gpio.FALLING)
+
+sys.taskInit(function()
+    i2c.setup(i2cid, i2c_speed)
+
+    adxl34x.init(i2cid)--初始化,传入i2c_id
+
+    sys.wait(50)
+    adxl34x.set_thresh(i2cid, string.char(0x05), string.char(0x02), string.char(0x05))  -- 设置阀值
+    sys.wait(50)
+    adxl34x.set_irqf(i2cid, string.char(0x00), string.char(0xff), string.char(0x10))     -- activity映射到到INT1,并开启对应中断功能
+
+    while 1 do
+        adxl34x.get_int_source(i2cid)    -- 不加这个不会触发中断
+        
+        local adxl34x_data = adxl34x.get_data()
+        log.info("adxl34x_data", "adxl34x_data.x"..(adxl34x_data.x),"adxl34x_data.y"..(adxl34x_data.y),"adxl34x_data.z"..(adxl34x_data.z))
+        sys.wait(1000)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 81 - 0
olddemo/air153C_wtd/main.lua

@@ -0,0 +1,81 @@
+PROJECT = 'air153C_wtd'
+VERSION = '2.0.0'
+LOG_LEVEL = log.LOG_INFO
+log.setLevel(LOG_LEVEL )
+require 'air153C_wtd'
+local sys = require "sys"
+_G.sysplus = require("sysplus")
+
+--[[
+    对于喂狗以及关闭喂狗,调用函数时需要等待对应的时间
+    例如:   1. 喂狗是410ms,那么需要等待至少400ms,即
+            air153C_wtd.feed_dog(pin)
+            sys.wait(410ms)
+            2. 关闭喂狗是710ms,那么需要等待至少700ms
+            air153C_wtd.close_watch_dog(pin)
+            sys.wait(710ms)
+]]
+
+sys.taskInit(function ()
+    log.info("main","taskInit")
+    local flag = 0
+    air153C_wtd.init(28)
+    air153C_wtd.feed_dog(28)--模块开机第一步需要喂狗一次
+    sys.wait(3000)--此处延时3s,防止1s内喂狗2次导致进入测试模式
+
+
+    --不喂狗
+    log.info("WTD","not eatdog test start!")
+    while 1 do
+        flag=flag+1
+        log.info("not feed dog",flag)
+        sys.wait(1000)
+    end
+
+
+    --喂狗
+    -- log.info("WTD","eatdog test start!")
+    -- while 1 do
+    -- air153C_wtd.feed_dog(28)--28为看门狗控制引脚
+    -- log.info("main","feed dog")
+    -- sys.wait(200000)
+    -- end
+
+    
+    --关闭喂狗
+    -- log.info("WTD","close eatdog test start!")
+    -- air153C_wtd.close_watch_dog(28)--28为看门狗控制引脚
+    -- sys.wait(1000)
+    
+
+    --先关闭喂狗,再打开喂狗
+    -- log.info("WTD","close eatdog and open eatdog test start!")
+    -- while 1 do
+    --     if flag==0 then
+    --         flag = 1
+    --         log.info("main","close watch dog")
+    --         air153C_wtd.close_watch_dog(28)--28为看门狗控制引脚
+    --         sys.wait(30000) --方便观察设置的时间长一点
+    --     end
+    --     flag=flag+1
+    --     if flag == 280 then
+    --         log.info("main","feed dog")
+    --         air153C_wtd.feed_dog(28)
+    --     end
+    --     sys.wait(1000)
+    --     log.info("Timer count(1s):", flag);
+    -- end
+
+
+    --测试模式复位
+    --测试模式: 1s内喂狗2次,会使模块复位重启
+    -- log.info("WTD","testmode test start!")
+    -- while flag<2 do
+    -- flag =flag+ 1
+    -- air153C_wtd.feed_dog(28)--28为看门狗控制引脚
+    -- log.info("main","feed dog")
+    -- sys.wait(500)
+    -- end
+end)
+
+sys.run()

+ 53 - 0
olddemo/air530z/offline/main.lua

@@ -0,0 +1,53 @@
+
+_G.sys = require("sys")
+require "sysplus"
+--[[
+接Air530Z-BD, 本demo演示的是不带AGPS的, 带AGPS的请参考demo/air530z/agps (还没写完)
+
+提醒:
+1. Air530Z-BD的串口默认是9600波特率, 单北斗
+2. Air530Z 是北斗+GPS双模, 默认是9600波特率
+3. UART的TX/RX要交叉接, 否则无法正常工作
+]]
+
+local gps_uart_id = 2
+
+sys.taskInit(function()
+    libgnss.clear() -- 清空数据,兼初始化
+    sys.wait(100)
+    -- 先尝试9600波特率, 并切换波特率
+    uart.setup(gps_uart_id, 9600)
+    uart.write(gps_uart_id, "$PCAS01,5*19\r\n")
+    sys.wait(200)
+
+    -- 按115200开始读取数据
+    uart.setup(gps_uart_id, 115200)
+    -- 调试日志,可选
+    -- libgnss.debug(true)
+    libgnss.bind(gps_uart_id)
+end)
+
+sys.taskInit(function()
+    while 1 do
+        sys.wait(1000)
+        log.info("RMC", json.encode(libgnss.getRmc(2) or {}, "7f"))
+        -- log.info("INT", libgnss.getIntLocation())
+        -- log.info("GGA", libgnss.getGga(3))
+        -- log.info("GLL", json.encode(libgnss.getGll(2) or {}, "7f"))
+        -- log.info("GSA", json.encode(libgnss.getGsa(1) or {}, "7f"))
+        -- log.info("GSV", json.encode(libgnss.getGsv(2) or {}, "7f"))
+        -- log.info("VTG", json.encode(libgnss.getVtg(2) or {}, "7f"))
+        -- log.info("ZDA", json.encode(libgnss.getZda(2) or {}, "7f"))
+        -- log.info("date", os.date())
+        -- log.info("sys", rtos.meminfo("sys"))
+        -- log.info("lua", rtos.meminfo("lua"))
+
+        -- 打印全部卫星
+        -- local gsv = libgnss.getGsv() or {sats={}}
+        -- for i, v in ipairs(gsv.sats) do
+        --     log.info("sat", i, v.nr, v.snr, v.azimuth, v.elevation)
+        -- end
+    end
+end)
+
+sys.run()

+ 16 - 0
olddemo/air780eg_gnsstest/README.md

@@ -0,0 +1,16 @@
+# Air780EG定位数据测试程序
+
+## 使用条件
+
+硬件条件: Air780EG 或 Air780E + Air530H, 或春节内测开发板
+
+## 固件要求
+
+若使用 Air780EG, V1105或以上
+
+## 提醒, 本demo需要很多流量
+
+若持续开启, 日流量需要**100M**以上, 务必留意!!
+
+本demo完全没有优化流量, 会上报**全部**GNSS数据, 以便分析!!!
+

+ 35 - 0
olddemo/air780eg_gnsstest/main.lua

@@ -0,0 +1,35 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "gnsstest"
+VERSION = "1.0.1"
+PRODUCT_KEY = "" -- 基站定位需要用到
+
+--[[
+本demo需要很多流量!!!
+注意: 室内无信号!! 无法定位!!!
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+require("sysplus")
+
+_G.gps_uart_id = 2
+
+-- 演示GNSS定位, 含AGPS
+require "testGnss"
+
+-- 演示上报到MQTT服务器 对应的网页是 https://iot.openluat.com/iot/device-gnss
+-- require "testMqtt"
+
+-- 演示定位成功后切换GPIO高低电平
+-- require "testGpio"
+
+-- 本TCP演示是连接到 gps.nutz.cn 19002 端口, irtu的自定义包格式
+-- 网页是 https://gps.nutz.cn/ 输入IMEI号可参考当前位置
+-- 微信小程序是 irtu寻物, 点击IMEI号, 扫描模块的二维码可查看当前位置和历史轨迹
+-- 服务器源码地址: https://gitee.com/wendal/irtu-gps
+require "testTcp"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 50 - 0
olddemo/air780eg_gnsstest/testGnss.lua

@@ -0,0 +1,50 @@
+
+-- libgnss库初始化
+libgnss.clear() -- 清空数据,兼初始化
+
+-- LED和ADC初始化
+LED_GNSS = 24
+gpio.setup(LED_GNSS, 0) -- GNSS定位成功灯
+
+local gnss = require("uc6228")
+
+sys.taskInit(function()
+    log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
+    gnss.setup({
+        uart_id=2,
+        uart_forward = uart.VUART_0, -- 转发到虚拟串口,方便对接GnssToolKit3
+        debug=true
+    })
+    pm.power(pm.GPS, true)
+    gnss.start()
+    gnss.agps()
+end)
+
+sys.taskInit(function()
+    while 1 do
+        sys.wait(5000)
+        -- log.info("RMC", json.encode(libgnss.getRmc(2) or {}, "7f"))
+        -- log.info("INT", libgnss.getIntLocation())
+        -- log.info("GGA", libgnss.getGga(3))
+        -- log.info("GLL", json.encode(libgnss.getGll(2) or {}, "7f"))
+        -- log.info("GSA", json.encode(libgnss.getGsa(1) or {}, "7f"))
+        -- log.info("GSV", json.encode(libgnss.getGsv(2) or {}, "7f"))
+        -- log.info("VTG", json.encode(libgnss.getVtg(2) or {}, "7f"))
+        -- log.info("ZDA", json.encode(libgnss.getZda(2) or {}, "7f"))
+        -- log.info("date", os.date())
+        -- log.info("sys", rtos.meminfo("sys"))
+        -- log.info("lua", rtos.meminfo("lua"))
+    end
+end)
+
+-- 订阅GNSS状态编码
+sys.subscribe("GNSS_STATE", function(event, ticks)
+    -- event取值有 
+    -- FIXED 定位成功
+    -- LOSE  定位丢失
+    -- ticks是事件发生的时间,一般可以忽略
+    local onoff = libgnss.isFix() and 1 or 0
+    log.info("GNSS", "LED", onoff)
+    gpio.set(LED_GNSS, onoff)
+end)
+

+ 23 - 0
olddemo/air780eg_gnsstest/testGpio.lua

@@ -0,0 +1,23 @@
+
+
+LED_VBAT = 26
+gpio.setup(LED_VBAT, 0) -- 低电压警告灯
+
+adc.open(adc.CH_CPU)
+
+-- 适配GNSS测试设备的GPIO
+sys.taskInit(function()
+    while 1 do
+        local vbat = adc.get(adc.CH_VBAT)
+        log.info("vbat", vbat)
+        if vbat < 3400 then
+            gpio.set(LED_VBAT, 1)
+            sys.wait(100)
+            gpio.set(LED_VBAT, 0)
+            sys.wait(900)
+        else
+            sys.wait(1000)
+        end
+    end
+end)
+

+ 127 - 0
olddemo/air780eg_gnsstest/testMqtt.lua

@@ -0,0 +1,127 @@
+
+local mqttc = nil
+
+-- mqtt 上传任务
+sys.taskInit(function()
+    sys.waitUntil("IP_READY", 15000)
+    mqttc = mqtt.create(nil, "lbsmqtt.airm2m.com", 1886) -- mqtt客户端创建
+
+    mqttc:auth(mobile.imei(), mobile.imei(), mobile.muid()) -- mqtt三元组配置
+    log.info("mqtt", mobile.imei(), mobile.imei(), mobile.muid())
+    mqttc:keepalive(30) -- 默认值240s
+    mqttc:autoreconn(true, 3000) -- 自动重连机制
+
+    mqttc:on(function(mqtt_client, event, data, payload) -- mqtt回调注册
+        -- 用户自定义代码,按event处理
+        -- log.info("mqtt", "event", event, mqtt_client, data, payload)
+        if event == "conack" then -- mqtt成功完成鉴权后的消息
+            sys.publish("mqtt_conack") -- 小写字母的topic均为自定义topic
+            -- 订阅不是必须的,但一般会有
+            mqtt_client:subscribe("/gnss/" .. mobile.imei() .. "/down/#")
+        elseif event == "recv" then -- 服务器下发的数据
+            log.info("mqtt", "downlink", "topic", data, "payload", payload)
+            local dl = json.decode(data)
+            if dl then
+                -- 检测命令
+                if dl.cmd then
+                    -- 直接写uart
+                    if dl.cmd == "uart" and dl.data then
+                        uart.write(gps_uart_id, dl.data)
+                    -- 重启命令
+                    elseif dl.cmd == "reboot" then
+                        rtos.reboot()
+                    elseif dl.cmd == "stat" then
+                        upload_stat()
+                    end
+                end
+            end
+        elseif event == "sent" then -- publish成功后的事件
+            log.info("mqtt", "sent", "pkgid", data)
+        end
+    end)
+
+    -- 发起连接之后,mqtt库会自动维护链接,若连接断开,默认会自动重连
+    mqttc:connect()
+    -- sys.waitUntil("mqtt_conack")
+    -- log.info("mqtt连接成功")
+    sys.timerStart(upload_stat, 3000) -- 一秒后主动上传一次
+    while true do
+        sys.wait(60*1000)
+    end
+    mqttc:close()
+    mqttc = nil
+end)
+
+sys.taskInit(function()
+    while 1 do
+        sys.wait(3600 * 1000) -- 一小时检查一次
+        local fixed, time_fixed = libgnss.isFix()
+        if not fixed then
+            exec_agnss()
+        end
+    end
+end)
+
+sys.timerLoopStart(upload_stat, 60000)
+
+sys.taskInit(function()
+    local msgs = {}
+    while 1 do
+        local ret, topic, data, qos = sys.waitUntil("uplink", 30000)
+        if ret then
+            if topic == "close" then
+                break
+            end
+            log.info("mqtt", "publish", "topic", topic)
+            -- if #data > 512 then
+            --     local start = mcu.ticks()
+            --     local cdata = miniz.compress(data)
+            --     local endt = mcu.ticks() - start
+            --     if cdata then
+            --         log.info("miniz", #data, #cdata, endt)
+            --     end
+            -- end
+            if mqttc:ready() then
+                local tmp = msgs
+                if #tmp > 0 then
+                    log.info("mqtt", "ready, send buff", #tmp)
+                    msgs = {}
+                    for k, msg in pairs(tmp) do
+                        mqttc:publish(msg.topic, msg.data, 0)
+                    end
+                end
+                mqttc:publish(topic, data, qos)
+            else
+                log.info("mqtt", "not ready, insert into buff")
+                if #msgs > 60 then
+                    table.remove(msgs, 1)
+                end
+                table.insert(msgs, {
+                    topic = topic,
+                    data = data
+                })
+            end
+        end
+    end
+end)
+
+function upload_stat()
+    if mqttc == nil or not mqttc:ready() then return end
+    local stat = {
+        csq = mobile.csq(),
+        rssi = mobile.rssi(),
+        rsrq = mobile.rsrq(),
+        rsrp = mobile.rsrp(),
+        -- iccid = mobile.iccid(),
+        snr = mobile.snr(),
+        vbat = adc.get(adc.CH_VBAT),
+        temp = adc.get(adc.CH_CPU),
+        memsys = {rtos.meminfo("sys")},
+        memlua = {rtos.meminfo()},
+        fixed = libgnss.isFix()
+    }
+    sys.publish("uplink", "/gnss/" .. mobile.imei() .. "/up/stat", (json.encode(stat)), 1)
+end
+
+sys.timerLoopStart(upload_stat, 60 * 1000)
+

+ 190 - 0
olddemo/air780eg_gnsstest/testTcp.lua

@@ -0,0 +1,190 @@
+--[[
+连到gps.nutz.cn 19002 端口, irtu的自定义包格式
+]]
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "scdemo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 一定要添加sys.lua !!!!
+sys = require("sys")
+sysplus = require("sysplus")
+libnet = require "libnet"
+
+if pm and pm.PWK_MODE then
+    pm.power(pm.PWK_MODE, false)
+end
+
+if wdt then
+    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+adc.open(adc.CH_VBAT)
+
+--=============================================================
+-- 本TCP演示是连接到 gps.nutz.cn 19002 端口, irtu的自定义包格式
+-- 网页是 https://gps.nutz.cn/ 输入IMEI号可参考当前位置
+-- 微信小程序是 irtu寻物, 点击IMEI号, 扫描模块的二维码可查看当前位置和历史轨迹
+local host = "gps.nutz.cn"  -- 服务器ip或者域名, 都可以的
+local port = 19002          -- 服务器端口号
+local is_udp = false        -- 如果是UDP, 要改成true, false就是TCP
+local is_tls = false        -- 加密与否, 要看服务器的实际情况
+--=============================================================
+
+-- 处理未识别的网络消息
+local function netCB(msg)
+	log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
+end
+
+local socket_ready = false
+local taskName = "sc"
+local topic = taskName .. "_txrx"
+log.info("socket", "event topic", topic)
+
+-- 演示task
+local function sockettest()
+    sys.waitUntil("IP_READY")
+
+    -- 开始正在的逻辑, 发起socket链接,等待数据/上报心跳
+    local txqueue = {}
+    sysplus.taskInitEx(sockettask, taskName, netCB, taskName, txqueue, topic)
+    while 1 do
+        local result, tp, data = sys.waitUntil(topic, 30000)
+        -- log.info("event", result, tp, data)
+        if not result then
+            -- 等很久了,没数据上传/下发, 发个日期心跳包吧
+            table.insert(txqueue, string.char(0))
+            sys_send(taskName, socket.EVENT, 0)
+        elseif tp == "uplink" then
+            -- 上行数据, 主动上报的数据,那就发送呀
+            table.insert(txqueue, data)
+            sys_send(taskName, socket.EVENT, 0)
+        elseif tp == "downlink" then
+            -- 下行数据,接收的数据, 从ipv6task来的
+            -- 其他代码可以通过 sys.publish()
+            log.info("socket", "收到下发的数据了", #data)
+        end
+    end
+end
+
+
+
+function sockettask(d1Name, txqueue, rxtopic)
+    -- 打印准备连接的服务器信息
+    log.info("socket", host, port, is_udp and "UDP" or "TCP", is_tls and "TLS" or "RAW")
+
+    -- 准备好所需要的接收缓冲区
+    local rx_buff = zbuff.create(1024)
+    local netc = socket.create(nil, d1Name)
+    socket.config(netc, nil, is_udp, is_tls)
+    log.info("任务id", d1Name)
+
+    while true do
+        -- 连接服务器, 15秒超时
+        log.info("socket", "开始连接服务器")
+        sysplus.cleanMsg(d1Name)
+        local result = libnet.connect(d1Name, 15000, netc, host, port)
+        if result then
+			log.info("socket", "服务器连上了")
+            local tmp = {imei=mobile.imei(),iccid=mobile.iccid()}
+			libnet.tx(d1Name, 0, netc, json.encode(tmp))
+            socket_ready = true
+        else
+            log.info("socket", "服务器没连上了!!!")
+		end
+		while result do
+            -- 连接成功之后, 先尝试接收
+            -- log.info("socket", "调用rx接收数据")
+			local succ, param = socket.rx(netc, rx_buff)
+			if not succ then
+				log.info("服务器断开了", succ, param, ip, port)
+				break
+			end
+            -- 如果服务器有下发数据, used()就必然大于0, 进行处理
+			if rx_buff:used() > 0 then
+				log.info("socket", "收到服务器数据,长度", rx_buff:used())
+                local data = rx_buff:query() -- 获取数据
+                sys.publish(rxtopic, "downlink", data)
+				rx_buff:del()
+			end
+            -- log.info("libnet", "调用wait开始等待消息")
+            -- 等待事件, 例如: 服务器下发数据, 有数据准备上报, 服务器断开连接
+			result, param, param2 = libnet.wait(d1Name, 15000, netc)
+            log.info("libnet", "wait", result, param, param2)
+			if not result then
+                -- 网络异常了, 那就断开了, 执行清理工作
+				log.info("socket", "服务器断开了", result, param)
+				break
+            elseif #txqueue > 0 then
+                -- 有待上报的数据,处理之
+                while #txqueue > 0 do
+                    local data = table.remove(txqueue, 1)
+                    if not data then
+                        break
+                    end
+                    result,param = libnet.tx(d1Name, 15000, netc,data)
+                    -- log.info("libnet", "发送数据的结果", result, param)
+                    if not result then
+                        log.info("socket", "数据发送异常", result, param)
+                        break
+                    end
+                end
+            end
+            -- 循环尾部, 继续下一轮循环
+		end
+        socket_ready = false
+        -- 能到这里, 要么服务器断开连接, 要么上报(tx)失败, 或者是主动退出
+		libnet.close(d1Name, 5000, netc)
+		-- log.info(rtos.meminfo("sys"))
+		sys.wait(3000) -- 这是重连时长, 自行调整
+    end
+end
+
+sys.taskInit(sockettest)
+
+
+sys.taskInit(function()
+    sys.waitUntil("IP_READY")
+    local stat_t = 0
+    local buff = zbuff.create(64)
+    while true do
+        if socket_ready then
+            -- 发送设备状态  >b7IHb  ==  1*7+4+2+1 = 14
+            if os.time() - stat_t > 30 then
+                -- 30秒上报一次
+                local vbat = adc.get(adc.CH_VBAT)
+                buff:seek(0)
+                buff:pack(">b7IHb", 0x55, 0, 0, 0, 0, 0, 0, 0, vbat, mobile.csq())
+                sys.publish(topic, "uplink", buff:query())
+                stat_t = os.time()
+                sys.wait(100)
+            end
+            -- 发送位置信息 >b2i3H2b3 == 1*2+4*3+2*2+1*3 == 2+12+4+3 = 21
+            if true then
+                local rmc = libgnss.getRmc(1)
+                local gsa = libgnss.getGsa()
+                local gsv = libgnss.getGsv()
+                -- log.info("socket", "rmc", rmc.lat, rmc.lng, rmc.alt, rmc.course, rmc.speed)
+                buff:seek(0)
+                buff:pack(">b2i3H2b3", 0xAA, libgnss.isFix() and 1 or 0,
+                        os.time(),
+                        rmc and rmc.lng or 0,
+                        rmc and rmc.lat or 0,
+                        0, -- rmc and rmc.alt or 0,
+                        math.floor(rmc and rmc.course or 0),
+                        math.floor(rmc and rmc.speed or 0),
+                        gsa and #gsa.sats or 0, -- msg.sateCno
+                        gsv and gsv.total_sats or 0 -- msg.sateCnt
+                )
+                sys.publish(topic, "uplink", buff:query())
+            end
+            sys.wait(1000)
+        else
+            sys.wait(100)
+        end
+    end
+end)

+ 281 - 0
olddemo/air780eg_gnsstest/uc6228.lua

@@ -0,0 +1,281 @@
+--[[
+
+]]
+
+local uc6228 = {
+    version = "1.0.1"
+}
+
+local sys = require("sys")
+
+function uc6228.setup(opts)
+    uc6228.opts = opts
+    if not uc6228.opts.uart_id then
+        uc6228.opts.uart_id = 2
+    end
+end
+
+function uc6228.start()
+    -- 初始化串口
+    local gps_uart_id = uc6228.opts.uart_id
+    local opts = uc6228.opts
+    local write = uc6228.writeCmd
+    uart.setup(gps_uart_id, 115200)
+    -- 是否为调试模式
+    if opts.debug then
+        libgnss.debug(true)
+    end
+    if uc6228.opts.uart_forward then
+        uart.setup(uc6228.opts.uart_forward, 115200)
+        libgnss.bind(gps_uart_id, uc6228.opts.uart_forward)
+    else
+        libgnss.bind(gps_uart_id)
+    end
+
+    -- 是否需要切换定位系统呢?
+    if opts.sys then
+        if type(opts.sys) == "number" then
+            if opts.sys == 1 then
+                uart.write(gps_uart_id, "$CFGSYS,H01\r\n")
+            elseif opts.sys == 2 then
+                uart.write(gps_uart_id, "$CFGSYS,H10\r\n")
+            elseif opts.sys == 5 then
+                uart.write(gps_uart_id, "$CFGSYS,H101\r\n")
+            else
+                uart.write(gps_uart_id, "$CFGSYS,H11\r\n")
+            end
+        end
+    end
+
+    if not opts.nmea_ver or opts.nmea_ver == 41 then
+        uart.write(gps_uart_id, "$CFGNMEA,h51\r\n") -- 切换到NMEA 4.1
+    end
+
+    -- 打开全部NMEA语句
+    if opts.rmc_only then
+        uart.write(gps_uart_id, "$CFGMSG,0,0,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,1,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,2,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,3,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,4,1\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,5,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,6,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,7,0\r\n")
+        sys.wait(20)
+    elseif uc6228.opts.no_nmea then
+        uart.write(gps_uart_id, "$CFGMSG,0,0,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,1,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,2,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,3,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,4,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,5,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,6,0\r\n")
+        sys.wait(20)
+        uart.write(gps_uart_id, "$CFGMSG,0,7,0\r\n")
+        sys.wait(20)
+    else
+        uart.write(gps_uart_id, "$CFGMSG,0,0,1\r\n") -- GGA
+        sys.wait(10)
+        uart.write(gps_uart_id, "$CFGMSG,0,1,1\r\n") -- GLL
+        sys.wait(10)
+        uart.write(gps_uart_id, "$CFGMSG,0,2,1\r\n") -- GSA
+        sys.wait(10)
+        uart.write(gps_uart_id, "$CFGMSG,0,3,1\r\n") -- GSV
+        sys.wait(10)
+        uart.write(gps_uart_id, "$CFGMSG,0,4,1\r\n") -- RMC
+        sys.wait(10)
+        uart.write(gps_uart_id, "$CFGMSG,0,5,1\r\n") -- VTG
+        sys.wait(10)
+        uart.write(gps_uart_id, "$CFGMSG,0,6,1\r\n") -- ZDA
+        sys.wait(10)
+        -- uart.write(gps_uart_id, "$CFGMSG,0,7,1\r\n") -- GST
+        -- sys.wait(10)
+    end
+end
+
+function uc6228.writeCmd(cmd)
+    log.info("uc6228", "写入指令", cmd:trim())
+    uart.write(uc6228.opts.uart_id, cmd)
+end
+
+function uc6228.reboot(mode)
+    local cmd = "$RESET,0,"
+    if not mode then
+        mode = 0
+    end
+    if mode == 2 then
+        cmd = cmd .. "hff\r\n"
+    elseif mode == 1 then
+        cmd = cmd .. "h01\r\n"
+    else
+        cmd = cmd .. "h00\r\n"
+    end
+    uart.write(uc6228.opts.uart_id, cmd)
+    if mode == 2 then
+        uc6228.agps_tm = nil
+    end
+    libgnss.clear()
+end
+
+function uc6228.stop()
+    uart.close(uc6228.opts.uart_id)
+end
+
+local function do_agps()
+    -- 首先, 发起位置查询
+    local lat, lng
+    if mobile then
+        mobile.reqCellInfo(6)
+        sys.waitUntil("CELL_INFO_UPDATE", 6000)
+        local lbsLoc2 = require("lbsLoc2")
+        lat, lng = lbsLoc2.request(5000)
+        -- local lat, lng, t = lbsLoc2.request(5000, "bs.openluat.com")
+        log.info("lbsLoc2", lat, lng)
+        if lat and lng then
+            lat = tonumber(lat)
+            lng = tonumber(lng)
+            log.info("lbsLoc2", lat, lng)
+            -- 转换单位
+            local lat_dd,lat_mm = math.modf(lat)
+            local lng_dd,lng_mm = math.modf(lng)
+            lat = lat_dd * 100 + lat_mm * 60
+            lng = lng_dd * 100 + lng_mm * 60
+        end
+    elseif wlan then
+        -- wlan.scan()
+        -- sys.waitUntil("WLAN_SCAN_DONE", 5000)
+    end
+    if not lat then
+        -- 获取最后的本地位置
+        local locStr = io.readFile("/hxxtloc")
+        if locStr then
+            local jdata = json.decode(locStr)
+            if jdata and jdata.lat then
+                lat = jdata.lat
+                lng = jdata.lng
+            end
+        end
+    end
+    -- 然后, 判断星历时间和下载星历
+    local now = os.time()
+    local agps_time = tonumber(io.readFile("/hxxt_tm") or "0") or 0
+    if now - agps_time > 3600 then
+        local url = uc6228.opts.url
+        if not uc6228.opts.url then
+            if uc6228.opts.sys and 2 == uc6228.opts.sys then
+                -- 单北斗
+                url = "http://download.openluat.com/9501-xingli/HXXT_BDS_AGNSS_DATA.dat"
+            else
+                url = "http://download.openluat.com/9501-xingli/HXXT_GPS_BDS_AGNSS_DATA.dat"
+            end
+        end
+        local code = http.request("GET", url, nil, nil, {dst="/hxxt.dat"}).wait()
+        if code and code == 200 then
+            log.info("uc6228", "下载星历成功", url)
+            io.writeFile("/hxxt_tm", tostring(now))
+        else
+            log.info("uc6228", "下载星历失败", code)
+        end
+    else
+        log.info("uc6228", "星历不需要更新", now - agps_time)
+    end
+
+    local gps_uart_id = uc6228.opts.uart_id or 2
+
+    -- 写入星历
+    local agps_data = io.readFile("/hxxt.dat")
+    if agps_data and #agps_data > 1024 then
+        log.info("uc6228", "写入星历数据", "长度", #agps_data)
+        for offset=1,#agps_data,512 do
+            log.info("gnss", "AGNSS", "write >>>", #agps_data:sub(offset, offset + 511))
+            uart.write(gps_uart_id, agps_data:sub(offset, offset + 511))
+            sys.wait(100) -- 等100ms反而更成功
+        end
+        -- uart.write(gps_uart_id, agps_data)
+    else
+        log.info("uc6228", "没有星历数据")
+        return
+    end
+
+    -- 写入参考位置
+    -- "lat":23.4068813,"min":27,"valid":true,"day":27,"lng":113.2317505
+    if not lat or not lng then
+        -- lat, lng = 23.4068813, 113.2317505
+        log.info("uc6228", "没有GPS坐标", lat, lng)
+        return -- TODO 暂时不写入参考位置
+    end
+    if socket.sntp then
+        socket.sntp()
+        sys.waitUntil("NTP_UPDATE", 1000)
+    end
+    local date = os.date("!*t")
+    if date.year > 2023 then
+        local str = string.format("$AIDTIME,%d,%d,%d,%d,%d,%d,000", date["year"], date["month"], date["day"],
+            date["hour"], date["min"], date["sec"])
+        log.info("uc6228", "参考时间", str)
+        uart.write(gps_uart_id, str .. "\r\n")
+        sys.wait(20)
+    end
+
+    local str = string.format("$AIDPOS,%.7f,%s,%.7f,%s,1.0\r\n",
+    lat > 0 and lat or (0 - lat), lat > 0 and 'N' or 'S',
+    lng > 0 and lng or (0 - lng), lng > 0 and 'E' or 'W')
+    log.info("uc6228", "写入AGPS参考位置", str)
+    uart.write(gps_uart_id, str)
+
+    -- 结束
+    uc6228.agps_tm = now
+end
+
+function uc6228.agps(force)
+    -- 如果不是强制写入AGPS信息, 而且是已经定位成功的状态,那就没必要了
+    if not force and libgnss.isFix() then return end
+    -- 先判断一下时间
+    local now = os.time()
+    if force or not uc6228.agps_tm or now - uc6228.agps_tm > 3600 then
+        -- 执行AGPS
+        log.info("uc6228", "开始执行AGPS")
+        do_agps()
+    else
+        log.info("uc6228", "暂不需要写入AGPS")
+    end
+end
+
+function uc6228.saveloc(lat, lng)
+    if not lat or not lng then
+        if libgnss.isFix() then
+            local rmc = libgnss.getRmc(3)
+            if rmc then
+                lat, lng = rmc.lat, rmc.lng
+            end
+        end
+    end
+    if lat and lng then
+        log.info("待保存的GPS位置", lat, lng)
+        local locStr = string.format('{"lat":%7f,"lng":%7f}', lat, lng)
+        log.info("uc6228", "保存GPS位置", locStr)
+        io.writeFile("/hxxtloc", locStr)
+    end
+end
+
+sys.subscribe("GNSS_STATE", function(event)
+    if event == "FIXED" then
+        uc6228.saveloc()
+    end
+end)
+
+
+return uc6228

+ 22 - 0
olddemo/air780epvh_gnsstest/README.md

@@ -0,0 +1,22 @@
+# Air780EPVH定位数据测试程序
+
+## 使用条件
+
+硬件条件: Air780EVPH
+
+## 固件要求
+
+2024.6.1之后的编译的Air780EP或者Air780EPV固件
+
+## 提醒, 本demo需要很多流量
+
+若持续开启, 日流量需要**100M**以上, 务必留意!!
+
+本demo完全没有优化流量, 会上报**全部**GNSS数据, 以便分析!!!
+
+## demo说明
+
+1. 开启 testGnss 是定位功能演示, 含开启GNSS功能, 获取GNSS数据, 注入辅助定位信息(AGPS)
+2. 开启 testMqtt 是上报定位信息到MQTT服务器, 对应的演示网页是 https://iot.openluat.com/iot/device-gnss
+3. 开启 testGpio 是演示GPIO功能, 定位成功后切换GPIO输出
+4. 开启 testTcp 是演示上传数据到TCP服务器, 对应的网页是 https://gps.nutz.cn 微信小程序 iRTU寻物

+ 284 - 0
olddemo/air780epvh_gnsstest/hdgnss.lua

@@ -0,0 +1,284 @@
+
+local lbsLoc2 = require "lbsLoc2"
+
+local hdgnss = {}
+
+function hdcrc(str, len)
+    if not len then
+        len = #str
+    end
+    local crc1 = 0
+    local crc2 = 0
+    for i = 3, len do
+        crc1 = crc1 + str:byte(i)
+        crc2 = crc2 + (crc1 & 0xff)
+    end
+    -- print(string.format("%02X%02X", crc1 & 0xFF, crc2 & 0xFF))
+    return string.char(crc1 & 0xFF, crc2 & 0xFF)
+end
+
+function hdgnss.aideph()
+    local url = "http://download.openluat.com/9501-xingli/HD_GPS_BDS.hdb"
+    local eph_body = nil
+    if io.fileSize("/hdgnss.bin") > 1024 then
+        local date = os.date("!*t")
+        -- log.info("gnss", "当前系统时间", os.date())
+        if date.year < 2024 then
+            date = os.date("!*t")
+        end
+        if date.year > 2023 then
+            local tm = io.readFile("/hdgnss_tm")
+            if tm then
+                local t = tonumber(tm)
+                if t and (os.time() - t < 3600*2) then
+                    log.info("hdgnss", "重用星历文件")
+                    eph_body = io.readFile("/hdgnss.bin")
+                else
+                    log.info("hdgnss", "星历过期了")
+                    os.remove("/hdgnss.bin")
+                end
+            else
+                log.info("hdgnss", "星历时间有问题")
+            end
+        else
+            log.info("hdgnss", "系统时间有问题")
+        end
+    end
+    if http and not eph_body then
+        -- AGNSS 已调通
+        for i = 1, 3 do
+            local code, _, body = http.request("GET", url, nil, nil, {timeout=3000}).wait()
+            log.info("hdgnss", "AGNSS", code, body and #body or 0)
+            if code == 200 and body and #body > 1024 then
+                io.writeFile("/hdgnss.bin", body)
+                sys.wait(1000)
+                local date = os.date("!*t")
+                if date.year > 2022 then
+                    io.writeFile("/hdgnss_tm", tostring(os.time()))
+                end
+                eph_body = body
+                break
+            end
+            sys.wait(6 * 1000)
+        end
+    end
+    if eph_body and #eph_body > 1024 then
+        local body = eph_body
+        -- for offset = 1, #body, 512 do
+        --     -- log.info("hdgnss", "AGNSS", "write >>>", #body:sub(offset, offset + 511))
+        --     -- uart.write(gps_uart_id, body:sub(offset, offset + 511))
+        --     -- sys.waitUntil("UART2_SEND", 100)
+        --     sys.wait(100) -- 等100ms反而更成功
+        -- end
+        -- uart.write(gps_uart_id, body)
+        local offset = 1
+        local size = #body
+        while offset < size do
+            -- 前两个字符是F1D9
+            if body:byte(offset) == 0xF1 and body:byte(offset + 1) == 0xD9 then
+                -- log.info("hdgnss", "星历数据", body:sub(1, 16):toHex())
+                local len = body:byte(offset + 4) + body:byte(offset + 5) * 256
+                local tmp = body:sub(offset, offset + len + 7)
+                -- log.info("hdgnss", "写入星历片段", offset, len, #tmp, tmp:toHex())
+                uart.write(gps_uart_id, tmp)
+                offset = offset + len + 8
+                sys.wait(20)
+            else
+                log.warn("hdgnss", "分隔出错了", offset, size)
+                break
+            end
+        end
+    end
+    sys.wait(20)
+end
+
+local function exec_agnss()
+    for i = 1, 3 do
+        local ip = socket.localIP()
+        if ip and ip ~= "0.0.0.0" then
+            break
+        end
+        sys.waitUntil("IP_READY", 3000)
+    end
+
+    socket.sntp()
+    sys.waitUntil("NTP_UPDATE", 1000)
+
+    -- 注入当前时间
+    if os.date("*t").year > 2023 then
+        hdgnss.aidtime()
+        sys.wait(100)
+    end
+
+    -- 读取之前的位置信息
+    local lat, lng
+    local gnssloc = io.readFile("/hdloc")
+    if gnssloc then
+        log.info("hdgnss", "最后已知位置信息", gnssloc)
+        local tmp = gnssloc:split(",")
+        if tmp and #tmp == 2 then
+            lat = tonumber(tmp[1])
+            lng = tonumber(tmp[2])
+        end
+    end
+
+    -- 写入参考位置
+    if lat and lng and lat ~= 0 and lng ~= 0 then
+        hdgnss.aidpos(lat, lng)
+        sys.wait(100)
+    else
+        log.info("hdgnss", "当前无辅助位置信息")
+    end
+
+    -- 发起基站定位, 暂时禁用
+    if mobile and false then
+        mobile.reqCellInfo(6)
+        sys.waitUntil("CELL_INFO_UPDATE", 6000)
+        local lat2, lng2, t = lbsLoc2.request(5000)
+        log.info("hdgnss", "基站定位结果", lat2, lng2)
+        if lat2 and lng2 then
+            lat2 = tonumber(lat2:sub(1, 3) .. lat2:sub(5))
+            lng2 = tonumber(lng2:sub(1, 3) .. lng2:sub(5))
+            if lat2 and lng2 then
+                lat = lat
+                lng = lng
+                log.info("hdgnss", "基站定位结果", lat, lng)
+                hdgnss.aidpos(lat, lng)
+            end
+        end
+    end
+
+    hdgnss.aideph()
+
+    -- sys.wait(1000)
+end
+
+function hdgnss.aidpos(lat, lng)
+    local gps_uart_id = hdgnss.opts.uart_id
+    -- AID-POS
+    local str = string.char(
+        0xF1, 0xD9,                       -- 帧头
+        0x0B, 0x10, 0x11, 0x00,           -- 指令ID: 0x0B 0x11, 载荷17字节
+        0x01                              -- LLA 1, ECEF 0
+    )
+    -- lat =  234068458 1132310388
+    --        234072543	1132310160
+    log.info("hdgnss", "参考坐标(单位1/10000000度)", lat, lng)
+    str = str .. pack.pack("<IIII", lat, lng, 5000, 0)
+    str = str .. hdcrc(str)
+    log.info("hdgnss", "写入AID-POS", str:toHex())
+    uart.write(gps_uart_id, str)
+end
+
+function hdgnss.aidtime()
+    local gps_uart_id = hdgnss.opts.uart_id
+    local date = os.date("!*t")
+    if date.year > 2023 then
+        -- AID-TIME, 时间精度要在3秒以内
+        log.info("hdgnss", "当前时间", date.year, date.month, date.day, date.hour, date.min, date.sec)
+        local str = string.char(
+            0xF1, 0xD9,                       -- 帧头
+            0x0B, 0x11, 0x14, 0x00,           -- 指令ID: 0x0B 0x11, 载荷20字节
+            0x00,                             -- UTC 0, TNOW 1
+            0x00,                             -- 保留参数,填0
+            0x11,                             -- 闰秒
+            date.year & 0xFF, date.year >> 8, -- 年
+            date.month,                       -- 月
+            date.day,                         -- 日
+            date.hour,                        -- 小时
+            date.min,                         -- 分钟
+            date.sec,                         -- 秒
+            0x00, 0x00, 0x00, 0x00,           -- 亚毫秒
+            0x00, 0x00,                       -- 时间精度(秒)
+            0x00, 0x00, 0x00, 0x00            -- 时间精度(亚毫秒)
+        )
+        str = str .. hdcrc(str)
+        log.info("hdgnss", "写入AID-TIME", str:toHex())
+        uart.write(gps_uart_id, str)
+        -- sys.wait(20)
+    end
+end
+
+function hdgnss.setup(opts)
+    if not opts then
+        opts = {}
+    end
+    if not opts.uart_id then
+        opts.uart_id = 2
+    end
+    hdgnss.opts = opts
+end
+
+function hdgnss.start()
+    log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
+    local gps_uart_id = hdgnss.opts.uart_id
+    local uart_forward = hdgnss.opts.uart_forward
+    log.info("hdgnss", "start")
+    libgnss.on("raw", function(data)
+        -- sys.publish("uplink", nmea_topic, data, 1)
+        if data:byte(1) == 0xF1 then
+            log.info("hdgnss", "二进制协议数据", data:toHex())
+        end
+    end)
+    uart.setup(gps_uart_id, 9600)
+    if uart_forward then
+        uart.setup(uart_forward, 115200)
+    end
+
+    pm.power(pm.GPS, true)
+    sys.wait(250) -- GPNSS芯片启动需要时间,大概250ms
+    -- 串口配置, 切换到115200
+    uart.write(gps_uart_id, (string.fromHex("F1D9060008000000000000C20100D1E0")))
+    sys.wait(20)
+    uart.close(gps_uart_id)
+    sys.wait(10)
+    uart.setup(gps_uart_id, 115200)
+    -- 调试日志,可选
+    libgnss.debug(hdgnss.opts.debug)
+    libgnss.bind(gps_uart_id, uart_forward)
+
+    if not hdgnss.opts.no_agps then
+        exec_agnss()
+    end
+    hdgnss.running = true
+end
+
+function hdgnss.stop()
+    hdgnss.running = false
+    if hdgnss.opts and hdgnss.opts.uart_id then
+        uart.close(hdgnss.opts.uart_id)
+    end
+end
+
+function hdgnss.saveloc()
+    local rmc = libgnss.getRmc(1)
+    log.info("hdgnss", "rmc", rmc.lat, rmc.lng)
+    io.writeFile("/hdloc", string.format("%d,%d", rmc.lat, rmc.lng))
+end
+
+-- 订阅GNSS状态编码
+sys.subscribe("GNSS_STATE", function(event, ticks)
+    -- event取值有 
+    -- FIXED 定位成功
+    -- LOSE  定位丢失
+    -- ticks是事件发生的时间,一般可以忽略
+    log.info("hdgnss", "state", event, ticks)
+    if event == "FIXED" then
+        hdgnss.saveloc()
+    end
+end)
+
+sys.taskInit(function()
+    while 1 do
+        sys.wait(600 * 1000) -- 10分钟检查一次
+        local fixed = libgnss.isFix()
+        if not fixed and not hdgnss.opts.no_agps and hdgnss.running then
+            exec_agnss()
+        end
+        if fixed then
+            hdgnss.saveloc()
+        end
+    end
+end)
+
+return hdgnss

+ 35 - 0
olddemo/air780epvh_gnsstest/main.lua

@@ -0,0 +1,35 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "gnsstest"
+VERSION = "1.0.1"
+PRODUCT_KEY = "" -- 基站定位需要用到
+
+--[[
+本demo需要很多流量!!!
+注意: 室内无信号!! 无法定位!!!
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+require("sysplus")
+
+_G.gps_uart_id = 2
+
+-- 演示GNSS定位, 含AGPS
+require "testGnss"
+
+-- 演示上报到MQTT服务器 对应的网页是 https://iot.openluat.com/iot/device-gnss
+-- require "testMqtt"
+
+-- 演示定位成功后切换GPIO高低电平
+-- require "testGpio"
+
+-- 本TCP演示是连接到 gps.nutz.cn 19002 端口, irtu的自定义包格式
+-- 网页是 https://gps.nutz.cn/ 输入IMEI号可参考当前位置
+-- 微信小程序是 irtu寻物, 点击IMEI号, 扫描模块的二维码可查看当前位置和历史轨迹
+-- 服务器源码地址: https://gitee.com/wendal/irtu-gps
+require "testTcp"
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 48 - 0
olddemo/air780epvh_gnsstest/testGnss.lua

@@ -0,0 +1,48 @@
+
+-- libgnss库初始化
+libgnss.clear() -- 清空数据,兼初始化
+
+-- LED和ADC初始化
+LED_GNSS = 24
+gpio.setup(LED_GNSS, 0) -- GNSS定位成功灯
+
+local hdgnss = require("hdgnss")
+
+sys.taskInit(function()
+    log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")
+    hdgnss.setup({
+        uart_id=2,
+        uart_forward = uart.VUART_0, -- 转发到虚拟串口,方便对接GnssToolKit3
+        debug=true
+    })
+    hdgnss.start()
+end)
+
+sys.taskInit(function()
+    while 1 do
+        sys.wait(5000)
+        -- log.info("RMC", json.encode(libgnss.getRmc(2) or {}, "7f"))
+        -- log.info("INT", libgnss.getIntLocation())
+        -- log.info("GGA", libgnss.getGga(3))
+        -- log.info("GLL", json.encode(libgnss.getGll(2) or {}, "7f"))
+        -- log.info("GSA", json.encode(libgnss.getGsa(1) or {}, "7f"))
+        -- log.info("GSV", json.encode(libgnss.getGsv(2) or {}, "7f"))
+        -- log.info("VTG", json.encode(libgnss.getVtg(2) or {}, "7f"))
+        -- log.info("ZDA", json.encode(libgnss.getZda(2) or {}, "7f"))
+        -- log.info("date", os.date())
+        -- log.info("sys", rtos.meminfo("sys"))
+        -- log.info("lua", rtos.meminfo("lua"))
+    end
+end)
+
+-- 订阅GNSS状态编码
+sys.subscribe("GNSS_STATE", function(event, ticks)
+    -- event取值有 
+    -- FIXED 定位成功
+    -- LOSE  定位丢失
+    -- ticks是事件发生的时间,一般可以忽略
+    local onoff = libgnss.isFix() and 1 or 0
+    log.info("GNSS", "LED", onoff)
+    gpio.set(LED_GNSS, onoff)
+end)
+

+ 23 - 0
olddemo/air780epvh_gnsstest/testGpio.lua

@@ -0,0 +1,23 @@
+
+
+LED_VBAT = 26
+gpio.setup(LED_VBAT, 0) -- 低电压警告灯
+
+adc.open(adc.CH_CPU)
+
+-- 适配GNSS测试设备的GPIO
+sys.taskInit(function()
+    while 1 do
+        local vbat = adc.get(adc.CH_VBAT)
+        log.info("vbat", vbat)
+        if vbat < 3400 then
+            gpio.set(LED_VBAT, 1)
+            sys.wait(100)
+            gpio.set(LED_VBAT, 0)
+            sys.wait(900)
+        else
+            sys.wait(1000)
+        end
+    end
+end)
+

+ 127 - 0
olddemo/air780epvh_gnsstest/testMqtt.lua

@@ -0,0 +1,127 @@
+
+local mqttc = nil
+
+-- mqtt 上传任务
+sys.taskInit(function()
+    sys.waitUntil("IP_READY", 15000)
+    mqttc = mqtt.create(nil, "lbsmqtt.airm2m.com", 1886) -- mqtt客户端创建
+
+    mqttc:auth(mobile.imei(), mobile.imei(), mobile.muid()) -- mqtt三元组配置
+    log.info("mqtt", mobile.imei(), mobile.imei(), mobile.muid())
+    mqttc:keepalive(30) -- 默认值240s
+    mqttc:autoreconn(true, 3000) -- 自动重连机制
+
+    mqttc:on(function(mqtt_client, event, data, payload) -- mqtt回调注册
+        -- 用户自定义代码,按event处理
+        -- log.info("mqtt", "event", event, mqtt_client, data, payload)
+        if event == "conack" then -- mqtt成功完成鉴权后的消息
+            sys.publish("mqtt_conack") -- 小写字母的topic均为自定义topic
+            -- 订阅不是必须的,但一般会有
+            mqtt_client:subscribe("/gnss/" .. mobile.imei() .. "/down/#")
+        elseif event == "recv" then -- 服务器下发的数据
+            log.info("mqtt", "downlink", "topic", data, "payload", payload)
+            local dl = json.decode(data)
+            if dl then
+                -- 检测命令
+                if dl.cmd then
+                    -- 直接写uart
+                    if dl.cmd == "uart" and dl.data then
+                        uart.write(gps_uart_id, dl.data)
+                    -- 重启命令
+                    elseif dl.cmd == "reboot" then
+                        rtos.reboot()
+                    elseif dl.cmd == "stat" then
+                        upload_stat()
+                    end
+                end
+            end
+        elseif event == "sent" then -- publish成功后的事件
+            log.info("mqtt", "sent", "pkgid", data)
+        end
+    end)
+
+    -- 发起连接之后,mqtt库会自动维护链接,若连接断开,默认会自动重连
+    mqttc:connect()
+    -- sys.waitUntil("mqtt_conack")
+    -- log.info("mqtt连接成功")
+    sys.timerStart(upload_stat, 3000) -- 一秒后主动上传一次
+    while true do
+        sys.wait(60*1000)
+    end
+    mqttc:close()
+    mqttc = nil
+end)
+
+sys.taskInit(function()
+    while 1 do
+        sys.wait(3600 * 1000) -- 一小时检查一次
+        local fixed, time_fixed = libgnss.isFix()
+        if not fixed then
+            exec_agnss()
+        end
+    end
+end)
+
+sys.timerLoopStart(upload_stat, 60000)
+
+sys.taskInit(function()
+    local msgs = {}
+    while 1 do
+        local ret, topic, data, qos = sys.waitUntil("uplink", 30000)
+        if ret then
+            if topic == "close" then
+                break
+            end
+            log.info("mqtt", "publish", "topic", topic)
+            -- if #data > 512 then
+            --     local start = mcu.ticks()
+            --     local cdata = miniz.compress(data)
+            --     local endt = mcu.ticks() - start
+            --     if cdata then
+            --         log.info("miniz", #data, #cdata, endt)
+            --     end
+            -- end
+            if mqttc:ready() then
+                local tmp = msgs
+                if #tmp > 0 then
+                    log.info("mqtt", "ready, send buff", #tmp)
+                    msgs = {}
+                    for k, msg in pairs(tmp) do
+                        mqttc:publish(msg.topic, msg.data, 0)
+                    end
+                end
+                mqttc:publish(topic, data, qos)
+            else
+                log.info("mqtt", "not ready, insert into buff")
+                if #msgs > 60 then
+                    table.remove(msgs, 1)
+                end
+                table.insert(msgs, {
+                    topic = topic,
+                    data = data
+                })
+            end
+        end
+    end
+end)
+
+function upload_stat()
+    if mqttc == nil or not mqttc:ready() then return end
+    local stat = {
+        csq = mobile.csq(),
+        rssi = mobile.rssi(),
+        rsrq = mobile.rsrq(),
+        rsrp = mobile.rsrp(),
+        -- iccid = mobile.iccid(),
+        snr = mobile.snr(),
+        vbat = adc.get(adc.CH_VBAT),
+        temp = adc.get(adc.CH_CPU),
+        memsys = {rtos.meminfo("sys")},
+        memlua = {rtos.meminfo()},
+        fixed = libgnss.isFix()
+    }
+    sys.publish("uplink", "/gnss/" .. mobile.imei() .. "/up/stat", (json.encode(stat)), 1)
+end
+
+sys.timerLoopStart(upload_stat, 60 * 1000)
+

+ 190 - 0
olddemo/air780epvh_gnsstest/testTcp.lua

@@ -0,0 +1,190 @@
+--[[
+连到gps.nutz.cn 19002 端口, irtu的自定义包格式
+]]
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "scdemo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 一定要添加sys.lua !!!!
+sys = require("sys")
+sysplus = require("sysplus")
+libnet = require "libnet"
+
+if pm and pm.PWK_MODE then
+    pm.power(pm.PWK_MODE, false)
+end
+
+if wdt then
+    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+adc.open(adc.CH_VBAT)
+
+--=============================================================
+-- 本TCP演示是连接到 gps.nutz.cn 19002 端口, irtu的自定义包格式
+-- 网页是 https://gps.nutz.cn/ 输入IMEI号可参考当前位置
+-- 微信小程序是 irtu寻物, 点击IMEI号, 扫描模块的二维码可查看当前位置和历史轨迹
+local host = "gps.nutz.cn"  -- 服务器ip或者域名, 都可以的
+local port = 19002          -- 服务器端口号
+local is_udp = false        -- 如果是UDP, 要改成true, false就是TCP
+local is_tls = false        -- 加密与否, 要看服务器的实际情况
+--=============================================================
+
+-- 处理未识别的网络消息
+local function netCB(msg)
+	log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
+end
+
+local socket_ready = false
+local taskName = "sc"
+local topic = taskName .. "_txrx"
+log.info("socket", "event topic", topic)
+
+-- 演示task
+local function sockettest()
+    sys.waitUntil("IP_READY")
+
+    -- 开始正在的逻辑, 发起socket链接,等待数据/上报心跳
+    local txqueue = {}
+    sysplus.taskInitEx(sockettask, taskName, netCB, taskName, txqueue, topic)
+    while 1 do
+        local result, tp, data = sys.waitUntil(topic, 30000)
+        -- log.info("event", result, tp, data)
+        if not result then
+            -- 等很久了,没数据上传/下发, 发个日期心跳包吧
+            table.insert(txqueue, string.char(0))
+            sys_send(taskName, socket.EVENT, 0)
+        elseif tp == "uplink" then
+            -- 上行数据, 主动上报的数据,那就发送呀
+            table.insert(txqueue, data)
+            sys_send(taskName, socket.EVENT, 0)
+        elseif tp == "downlink" then
+            -- 下行数据,接收的数据, 从ipv6task来的
+            -- 其他代码可以通过 sys.publish()
+            log.info("socket", "收到下发的数据了", #data)
+        end
+    end
+end
+
+
+
+function sockettask(d1Name, txqueue, rxtopic)
+    -- 打印准备连接的服务器信息
+    log.info("socket", host, port, is_udp and "UDP" or "TCP", is_tls and "TLS" or "RAW")
+
+    -- 准备好所需要的接收缓冲区
+    local rx_buff = zbuff.create(1024)
+    local netc = socket.create(nil, d1Name)
+    socket.config(netc, nil, is_udp, is_tls)
+    log.info("任务id", d1Name)
+
+    while true do
+        -- 连接服务器, 15秒超时
+        log.info("socket", "开始连接服务器")
+        sysplus.cleanMsg(d1Name)
+        local result = libnet.connect(d1Name, 15000, netc, host, port)
+        if result then
+			log.info("socket", "服务器连上了")
+            local tmp = {imei=mobile.imei(),iccid=mobile.iccid()}
+			libnet.tx(d1Name, 0, netc, json.encode(tmp))
+            socket_ready = true
+        else
+            log.info("socket", "服务器没连上了!!!")
+		end
+		while result do
+            -- 连接成功之后, 先尝试接收
+            -- log.info("socket", "调用rx接收数据")
+			local succ, param = socket.rx(netc, rx_buff)
+			if not succ then
+				log.info("服务器断开了", succ, param, ip, port)
+				break
+			end
+            -- 如果服务器有下发数据, used()就必然大于0, 进行处理
+			if rx_buff:used() > 0 then
+				log.info("socket", "收到服务器数据,长度", rx_buff:used())
+                local data = rx_buff:query() -- 获取数据
+                sys.publish(rxtopic, "downlink", data)
+				rx_buff:del()
+			end
+            -- log.info("libnet", "调用wait开始等待消息")
+            -- 等待事件, 例如: 服务器下发数据, 有数据准备上报, 服务器断开连接
+			result, param, param2 = libnet.wait(d1Name, 15000, netc)
+            log.info("libnet", "wait", result, param, param2)
+			if not result then
+                -- 网络异常了, 那就断开了, 执行清理工作
+				log.info("socket", "服务器断开了", result, param)
+				break
+            elseif #txqueue > 0 then
+                -- 有待上报的数据,处理之
+                while #txqueue > 0 do
+                    local data = table.remove(txqueue, 1)
+                    if not data then
+                        break
+                    end
+                    result,param = libnet.tx(d1Name, 15000, netc,data)
+                    -- log.info("libnet", "发送数据的结果", result, param)
+                    if not result then
+                        log.info("socket", "数据发送异常", result, param)
+                        break
+                    end
+                end
+            end
+            -- 循环尾部, 继续下一轮循环
+		end
+        socket_ready = false
+        -- 能到这里, 要么服务器断开连接, 要么上报(tx)失败, 或者是主动退出
+		libnet.close(d1Name, 5000, netc)
+		-- log.info(rtos.meminfo("sys"))
+		sys.wait(3000) -- 这是重连时长, 自行调整
+    end
+end
+
+sys.taskInit(sockettest)
+
+
+sys.taskInit(function()
+    sys.waitUntil("IP_READY")
+    local stat_t = 0
+    local buff = zbuff.create(64)
+    while true do
+        if socket_ready then
+            -- 发送设备状态  >b7IHb  ==  1*7+4+2+1 = 14
+            if os.time() - stat_t > 30 then
+                -- 30秒上报一次
+                local vbat = adc.get(adc.CH_VBAT)
+                buff:seek(0)
+                buff:pack(">b7IHb", 0x55, 0, 0, 0, 0, 0, 0, 0, vbat, mobile.csq())
+                sys.publish(topic, "uplink", buff:query())
+                stat_t = os.time()
+                sys.wait(100)
+            end
+            -- 发送位置信息 >b2i3H2b3 == 1*2+4*3+2*2+1*3 == 2+12+4+3 = 21
+            if true then
+                local rmc = libgnss.getRmc(1)
+                local gsa = libgnss.getGsa()
+                local gsv = libgnss.getGsv()
+                -- log.info("socket", "rmc", rmc.lat, rmc.lng, rmc.alt, rmc.course, rmc.speed)
+                buff:seek(0)
+                buff:pack(">b2i3H2b3", 0xAA, libgnss.isFix() and 1 or 0,
+                        os.time(),
+                        rmc and rmc.lng or 0,
+                        rmc and rmc.lat or 0,
+                        0, -- rmc and rmc.alt or 0,
+                        math.floor(rmc and rmc.course or 0),
+                        math.floor(rmc and rmc.speed or 0),
+                        gsa and #gsa.sats or 0, -- msg.sateCno
+                        gsv and gsv.total_sats or 0 -- msg.sateCnt
+                )
+                sys.publish(topic, "uplink", buff:query())
+            end
+            sys.wait(1000)
+        else
+            sys.wait(100)
+        end
+    end
+end)

BIN
olddemo/air8000_airlink_fota/air8000s_v11.bin


+ 34 - 0
olddemo/air8000_airlink_fota/main.lua

@@ -0,0 +1,34 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "wififota"
+VERSION = "1.0.11"
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+
+PWR8000S = function(level)
+    gpio.set(23, level)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+sys.taskInit(function()
+    sys.wait(1000)
+    airlink.debug(1)
+    airlink.sfota("/luadb/air8000s_v11.bin")
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 106 - 0
olddemo/airlbs/main.lua

@@ -0,0 +1,106 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "helloworld"
+VERSION = "1.0.0"
+
+-- 使用合宙iot平台时需要这个参数
+PRODUCT_KEY = "xxx" -- 到 iot.openluat.com 创建项目,获取正确的项目id
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+sysplus = require("sysplus")
+libnet = require "libnet"
+
+log.info("main", PROJECT, VERSION)
+
+if wdt then
+    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
+    wdt.init(20000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+local airlbs = require "airlbs"
+
+-- 此为收费服务,需自行联系销售申请
+local airlbs_project_id = "xxx"
+local airlbs_project_key = "xxx"
+
+sys.taskInit(function()
+    sys.waitUntil("IP_READY")
+
+    -- 如需wifi定位,需要硬件以及固件支持wifi扫描功能
+    local wifi_info = nil
+    if wlan then
+        sys.wait(3000) -- 网络可用后等待一段时间才再调用wifi扫描功能,否则可能无法获取wifi信息
+        wlan.init()
+        wlan.scan()
+        sys.waitUntil("WLAN_SCAN_DONE", 15000)
+        wifi_info = wlan.scanResult()
+        log.info("scan", "wifi_info", #wifi_info)
+    end
+
+    socket.sntp()
+    sys.waitUntil("NTP_UPDATE", 1000)
+
+    while 1 do
+        local result , data = airlbs.request({project_id = airlbs_project_id, project_key = airlbs_project_key, wifi_info = wifi_info, timeout = 1000})
+        if result then
+            log.info("airlbs", json.encode(data))
+        end
+        sys.wait(20000)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 7 - 0
olddemo/airlink/README.md

@@ -0,0 +1,7 @@
+# AirLink的演示
+
+注意: 这里的demo是需要搭配使用的
+
+* Air8101 与 Air780EPM 搭配
+* Air8000 与 Air8000S 搭配, 实际就是Air8000模块内部
+

+ 154 - 0
olddemo/airlink/air7000_wifi/main.lua

@@ -0,0 +1,154 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "airlink"
+VERSION = "1.0.4"
+
+-- Air724UG要用SPI1, CS选GPIO10, RDY选GPIO18
+
+airlink.config(airlink.CONF_SPI_ID, 1) -- SPI1
+airlink.config(airlink.CONF_SPI_CS, 10) -- GPIO10
+airlink.config(airlink.CONF_SPI_RDY, 18) -- GPIO18
+airlink.config(airlink.CONF_SPI_SPEED, 20*1000000) -- 20MHz速度
+
+function test_ap()
+    log.info("执行AP创建操作")
+    wlan.createAP("uiot5678", "12345678")
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    sys.wait(5000)
+    -- netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    -- log.info("创建dns代理", netdrv.ipv4(socket.LWIP_AP))
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    -- log.info('创建DHCP服务器', netdrv.ipv4(socket.LWIP_AP))
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+end
+
+-- wifi的STA相关事件
+sys.subscribe("WLAN_STA_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
+    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
+    log.info("收到STA事件", evt, data)
+end)
+
+-- wifi的AP相关事件
+sys.subscribe("WLAN_AP_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
+    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
+    log.info("收到AP事件", evt, data and data:toHex())
+end)
+
+function test_sta()
+    log.info("执行STA连接操作")
+    -- netdrv.debug(0, true)
+    wlan.connect("luatos1234", "12341234")
+    -- airlink.debug(1)
+    -- netdrv.dhcp(socket.LWIP_STA, true)
+    while 1 do
+        if wlan.ready() then
+            break
+        end
+        sys.wait(100)
+    end
+    -- sys.wait(8000)
+    -- iperf.server(socket.LWIP_STA)
+    -- iperf.client(socket.LWIP_STA, "47.94.236.172")
+
+    -- sys.wait(5000)
+    while 1 do
+        log.info("wlan", "info", json.encode(wlan.getInfo()))
+        -- log.info("MAC地址", netdrv.mac(socket.LWIP_STA))
+        -- log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
+        -- log.info("ready?", netdrv.ready(socket.LWIP_STA))
+        -- sys.wait(1000)
+        -- log.info("执行http请求")
+        -- local code = http.request("GET", "http://192.168.1.15:8000/README.md", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
+        -- local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil).wait()
+        log.info("http执行结果", code, headers, body and #body)
+        -- socket.sntp(nil, socket.LWIP_STA)
+        -- sys.wait(12000)
+
+        -- socket.sntp(nil)
+        -- sys.wait(2000)
+        -- log.info("执行ping操作")
+        -- icmp.ping(socket.LWIP_STA, "183.2.172.177")
+        -- sys.wait(2000)
+        local re_ip = httpdns.ali("air32.cn", {adapter=socket.LWIP_STA, timeout=3000})
+        log.info("httpdns", re_ip)
+        sys.wait(3000)
+        -- pm.request(pm.LIGHT, 1)
+    end
+end
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+function test_scan()
+    while 1 do
+        log.info("执行wifi扫描")
+        wlan.scan()
+        sys.wait(30 * 1000)
+    end
+end
+sys.subscribe("WLAN_SCAN_DONE", function ()
+    local results = wlan.scanResult()
+    log.info("scan", "results", #results)
+    for k,v in pairs(results) do
+        log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
+    end
+end)
+
+--  每隔6秒打印一次airlink统计数据, 调试用
+-- sys.taskInit(function()
+--     while 1 do
+--         sys.wait(6000)
+--         airlink.statistics()
+--     end
+-- end)
+
+sys.taskInit(function()
+    log.info("新的Air7000脚本...")
+    -- log.info("5秒后开始测试")
+    -- sys.wait(5000)
+    airlink.init()
+    airlink.start(1)
+    
+    sys.wait(200) -- 稍微缓一下, Air8000S的启动大概需要300ms
+
+    -- 等待初始化完成
+    while not airlink.ready() do
+        log.info("等待Airlink初始化完成")
+        sys.wait(1000)
+    end
+
+    -- 启动AP测试
+    netdrv.setup(socket.LWIP_STA, netdrv.WHALE)
+    netdrv.setup(socket.LWIP_AP, netdrv.WHALE)
+    wlan.init()
+    -- sys.wait(5000)
+    
+    -- sys.wait(300)
+    -- test_ap()
+
+    -- 连接STA测试
+    test_sta()
+
+    -- wifi扫描测试
+    -- sys.wait(2000)
+    -- test_scan()
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 45 - 0
olddemo/airlink/air724ug_test/main.lua

@@ -0,0 +1,45 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "airlink"
+VERSION = "1.0.4"
+
+-- Air724UG要用SPI1, CS选GPIO10, RDY选GPIO22
+
+airlink.config(airlink.CONF_SPI_ID, 1) -- SPI1
+airlink.config(airlink.CONF_SPI_CS, 10) -- GPIO10
+airlink.config(airlink.CONF_SPI_RDY, 18) -- GPIO18
+airlink.config(airlink.CONF_SPI_SPEED, 20*1000000) -- 20MHz速度
+
+sys.taskInit(function()
+    log.info("5秒后开始测试")
+    gpio.setup(10, 1, gpio.PULLUP) -- CS
+    sys.wait(5000)
+    -- airlink.init()
+    -- sys.wait(10)
+    -- airlink.start(1)
+    -- sys.wait(800)
+    -- log.info("Airlink初始化完成")
+    -- airlink.pause(1)
+
+    local result = spi.setup(
+        1,--spi id
+        nil,
+        1,--CPHA
+        1,--CPOL
+        8,--数据宽度
+        20000000--,--波特率
+    )
+    sys.wait(1000)
+    while 1 do
+        gpio.setup(10, 0)
+        spi.send(1, "12345678901234567890") -- 发送一个字节, 这里可以是任意值, 只是为了测试SPI通信
+        gpio.setup(10, 1)
+        sys.wait(100)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 133 - 0
olddemo/airlink/air780ehm_spi_slave/main.lua

@@ -0,0 +1,133 @@
+
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "airlink_spi_slave"
+VERSION = "1.0.0"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+_G.sysplus = require("sysplus")
+dnsproxy = require ("dnsproxy")
+
+local rtos_bsp = rtos.bsp()
+
+local mode = "slave"
+
+-- 订阅airlink的SDATA事件,打印收到的信息。
+local function airlink_sdata(data)
+    -- 打印收到的信息。
+    log.info("收到AIRLINK_SDATA!!", data)
+end
+
+local function airlink_sdata_MOBILE()
+    sys.waitUntil("IP_READY")
+    -- 设置网络时间同步。
+    socket.sntp()
+    while 1 do
+        -- rtos.bsp():设备硬件bsp型号;os.date():本地时间。
+        local data = rtos_bsp .. " " .. os.date()
+        log.info("发送数据给对端设备", data, "当前airlink状态", airlink.ready())
+        airlink.sdata(data)
+        sys.wait(200)
+    end
+end
+
+-- 订阅airlink的SDATA事件,打印收到的信息。
+sys.subscribe("AIRLINK_SDATA", airlink_sdata)
+
+sys.subscribe("IP_READY", function(id, ip)
+    log.info("收到IP_READY!!", id, ip)
+end)
+
+local function spi_slave_task()
+    local suc_request_num, fail_request_num = 0, 0
+    sys.wait(100)
+    -- 初始化airlink
+    airlink.init()
+    -- 注册网卡
+    netdrv.setup(socket.LWIP_GP_GW, netdrv.WHALE)
+    -- 启动airlink从机模式
+    airlink.start(0)
+
+    -- 配置网关ip
+    -- netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+    netdrv.ipv4(socket.LWIP_GP_GW, "192.168.111.2", "255.255.255.0", "192.168.111.1")
+    sys.wait(100)
+    sys.waitUntil("IP_READY", 10000)
+    netdrv.napt(socket.LWIP_GP)
+    -- 设置DNS代理。
+    dnsproxy.setup(socket.LWIP_GP_GW, socket.LWIP_GP)
+
+    while 1 do
+        sys.wait(1000)
+        -- log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
+        -- airlink.statistics()
+        -- log.info("执行http请求")
+        -- local code, headers, body = http.request("GET", "http://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_GP,timeout=3000}).wait()
+        -- local code, headers, body = http.request("GET", "http://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_USER0,timeout=3000}).wait()
+        -- log.info("http执行结果", code, code, headers, body)
+        -- if code == 200 then
+        --     suc_request_num = suc_request_num + 1
+        -- else
+        --     fail_request_num = fail_request_num + 1
+        -- end
+        -- log.info("当前成功请求次数", suc_request_num, "失败请求次数", fail_request_num)
+    end
+end
+
+local function spi_master_task()
+    sys.wait(100)
+    -- 初始化airlink
+    airlink.init()
+    log.info("创建桥接网络设备")
+    netdrv.setup(socket.LWIP_GP_GW, netdrv.WHALE)
+    -- 启动底层线程, 主机模式
+    airlink.start(1)
+
+    -- netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1")
+    netdrv.ipv4(socket.LWIP_GP_GW, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+    -- sys.wait(100)
+    -- sys.waitUntil("IP_READY", 10000)
+    -- netdrv.napt(socket.LWIP_GP)
+    -- -- 设置DNS代理。
+    -- dnsproxy.setup(socket.LWIP_USER0, socket.LWIP_GP)
+    -- airlink.test(1000)
+    while 1 do
+        sys.wait(1000)
+        log.info("airlink", "从机固件版本号", airlink.sver())
+        -- log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
+        -- airlink.statistics()
+        log.info("执行http请求")
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_GP_GW,timeout=3000}).wait()
+        -- log.info("http执行结果", code, code, headers, body)
+    end
+end
+
+sys.taskInit(function()
+    sys.wait(300)
+    log.info("main", rtos_bsp)
+    -- netdrv.debug(0, true)
+    -- 测试使用Air780EHM模块作为从机演示,如果使用其他模块测试,修改下面的代码。
+    if string.find(rtos_bsp, "780EHM") then
+        mode = "slave"
+    else
+        mode = "master"
+    end
+
+    if mode == "slave" then
+        spi_slave_task()
+    elseif mode == "master" then
+        spi_master_task()
+    else
+        log.info("airlink_spi", "未知的通讯模式:", mode)
+    end
+end)
+
+-- sys.taskInit(airlink_sdata_MOBILE) 
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 36 - 0
olddemo/airlink/air780epm/main.lua

@@ -0,0 +1,36 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "netdrv"
+VERSION = "1.0.4"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+_G.sysplus = require("sysplus")
+dnsproxy = require ("dnsproxy")
+
+sys.taskInit(function()
+    sys.wait(100)
+    -- 初始化airlink
+    airlink.init()
+    log.info("创建桥接网络设备")
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
+    -- 启动底层线程, 从机模式
+    airlink.start(1)
+
+    netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1")
+    sys.wait(100)
+    sys.waitUntil("IP_READY", 10000)
+    netdrv.napt(socket.LWIP_GP)
+    dnsproxy.setup(socket.LWIP_USER0, socket.LWIP_GP)
+end)
+
+sys.subscribe("IP_READY", function(id, ip)
+    log.info("收到IP_READY!!", id, ip)
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 39 - 0
olddemo/airlink/air780epm_test/main.lua

@@ -0,0 +1,39 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "airlink"
+VERSION = "1.0.4"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+
+sys.taskInit(function()
+    sys.wait(100)
+    airlink.init()
+    airlink.start(1)
+    sys.wait(10)
+    airlink.test(1)
+    sys.wait(10)
+
+    airlink.statistics()
+
+    airlink.test(1000)
+    sys.wait(1000)
+    airlink.statistics()
+    -- wlan.init()
+    -- wlan.connect("luatos1234", "12341234")
+    -- airlink.test(1000)
+    for i = 1, 20, 1 do
+        airlink.test(1000)
+        sys.wait(1000)
+    end
+    -- sys.wait(1000)
+    airlink.statistics()
+
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 92 - 0
olddemo/airlink/air8000/main.lua

@@ -0,0 +1,92 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "netdrv"
+VERSION = "1.0.5"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+_G.sysplus = require("sysplus")
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+
+gpio.setup(0, function()
+    sys.publish("WIFI_RESET")
+end, gpio.PULLDOWN, gpio.RISING)
+gpio.debounce(0, 100)
+
+gpio.setup(23, 0, gpio.PULLUP) -- 关闭Air8000S的LDO供电
+
+sys.taskInit(function()
+    sys.wait(100)
+    while 1 do
+        sys.waitUntil("WIFI_RESET")
+        log.info("复位WIFI部分")
+        gpio.set(23, 0)
+        sys.wait(100)
+        gpio.setup(23, 1)
+    end
+end)
+
+sys.taskInit(function()
+    -- 设置电平, 关闭小核的供电
+    pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)
+    sys.wait(100)
+    -- 初始化airlink
+    airlink.init()
+    log.info("注册STA和AP设备")
+    netdrv.setup(socket.LWIP_STA, netdrv.WHALE)
+    netdrv.setup(socket.LWIP_AP, netdrv.WHALE)
+    -- 启动底层线程, 从机模式
+    airlink.start(1)
+    sys.wait(100)
+    log.info("打开Air8000S的LDO供电")
+    gpio.setup(23, 1) -- 打开Air8000S的LDO供电
+    log.info("一切就绪了")
+    sys.wait(5000)
+
+    netdrv.ipv4(socket.LWIP_STA, "192.168.1.35", "255.255.255.0", "192.168.1.1")
+    sys.wait(1000)
+    -- while 1 do
+    --     -- log.info("MAC地址", netdrv.mac(socket.LWIP_STA))
+    --     -- log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
+    --     -- log.info("ready?", netdrv.ready(socket.LWIP_STA))
+    --     sys.wait(1000)
+    --     log.info("执行http请求")
+    --     -- local code = http.request("GET", "http://192.168.1.15:8000/README.md", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
+    --     local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
+    --     log.info("http执行结果", code, code, headers, body)
+    -- end
+end)
+
+sys.subscribe("IP_READY", function(ip, id)
+    log.info("收到IP_READY!!", ip, id)
+end)
+
+sys.subscribe("IP_LOSE", function(id)
+    log.info("收到IP_LOSE!!", id)
+end)
+
+sys.taskInit(function()
+    while netdrv.ready(socket.LWIP_AP) == false do
+        sys.wait(100)
+    end
+    sys.wait(100)
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    sys.wait(100)
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 57 - 0
olddemo/airlink/air80000_wifi_start_stop/main.lua

@@ -0,0 +1,57 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_wifi"
+VERSION = "1.0.5"
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+sys.subscribe("IP_READY", function(ip, id)
+    log.info("ip_ready", ip, id)
+end)
+
+sys.subscribe("IP_LOSE", function(id)
+    log.info("ip_lose", id)
+end)
+
+-- wifi的STA相关事件
+sys.subscribe("WLAN_STA_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
+    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
+    log.info("收到STA事件", evt, data)
+end)
+
+sys.taskInit(function()
+
+    while 1 do
+        log.info("初始化wifi")
+        wlan.init()
+        log.info("尝试连接sta")
+        wlan.connect("luatos1234", "12341234")
+        sys.wait(15000)
+        log.info("关闭wifi芯片")
+        PWR8000S(0)
+        sys.wait(10*1000) -- 等10秒
+        log.info("打开wifi芯片, 然后等10秒")
+        PWR8000S(1)
+        sys.wait(10*1000)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 75 - 0
olddemo/airlink/air8000_LAN_WAN/air780epm_WAN/main.lua

@@ -0,0 +1,75 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air780epm_WAN"
+VERSION = "1.0.5"
+
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+
+gpio.setup(20, 1) -- 打开lan供电
+
+function eth_wan()
+
+    sys.wait(3000)
+    local result = spi.setup(
+        0,--spi id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        25600000--,--频率
+        -- spi.MSB,--高低位顺序    可选,默认高位在前
+        -- spi.master,--主模式     可选,默认主
+        -- spi.full--全双工       可选,默认全双工
+    )
+    log.info("main", "open",result)
+    if result ~= 0 then--返回值为0,表示打开成功
+        log.info("main", "spi open error",result)
+        return
+    end
+    
+    sys.wait(200)
+    log.info("netdrv", "初始化WAN")    
+    
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8})
+    sys.wait(100)
+    netdrv.dhcp(socket.LWIP_ETH, true)
+    log.info("netdrv", "以太网就绪")
+
+
+end
+
+
+
+sys.taskInit(function()
+
+    
+    sys.taskInit(eth_wan)
+    sys.wait(1000)
+    while 1 do
+        sys.wait(1000)
+        local result, ip, adapter = sys.waitUntil("IP_READY", 3000)
+        log.info("ready?", result, ip, adapter)
+        if adapter and adapter ==  socket.LWIP_ETH then
+            break
+        end
+    end
+    sys.wait(500)
+
+    iperf.server(socket.LWIP_ETH)
+
+    while 1 do
+        sys.wait(6000)
+        -- local code, headers, body = http.request("GET", "http://httpbin.air32.cn/bytes/4096", nil, nil, {adapter=socket.LWIP_ETH}).wait()
+        local code, headers, body = http.request("GET", "http://www.baidu.com/", nil, nil, {adapter=socket.LWIP_ETH}).wait()
+        log.info("http", code, headers, body and #body)
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 85 - 0
olddemo/airlink/air8000_LAN_WAN/air8000_LAN/main.lua

@@ -0,0 +1,85 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_wifi"
+VERSION = "1.0.5"
+
+--[[
+本demo演示的功能是:
+1. 创建AP, 提供wifi设备, 通过4G上网
+2. 创建以太网, 为局域网内的设备, 通过4G上网
+]]
+
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+
+gpio.setup(140, 1, gpio.PULLUP)
+
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+function eth_lan()
+    -- sys.wait(3000)
+    local result = spi.setup(
+        1,--spi id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        51200000--,--波特率
+    )
+    log.info("main", "open spi",result)
+    if result ~= 0 then--返回值为0,表示打开成功
+        log.info("main", "spi open error",result)
+        return
+    end
+    log.info("netdrv", "初始化以太网")
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12,irq=255})
+    log.info("netdrv", "等待以太网就绪")
+    sys.wait(1000)
+    netdrv.ipv4(socket.LWIP_ETH, "192.168.5.1", "255.255.255.0", "0.0.0.0")
+    while netdrv.ready(socket.LWIP_ETH) ~= true do
+        -- log.info("netdrv", "等待以太网就绪")
+        sys.wait(100)
+    end
+    log.info("netdrv", "以太网就绪")
+    log.info("netdrv", "创建dhcp服务器, 供以太网使用")
+    dhcpsrv.create({adapter=socket.LWIP_ETH, gw={192,168,5,1}})
+    log.info("netdrv", "创建dns代理服务, 供以太网使用")
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
+end
+
+sys.taskInit(function()
+    while airlink.ready() ~= true do
+        sys.wait(100)
+    end
+    wlan.init()
+    sys.taskInit(eth_lan)
+    sys.wait(3000)
+    log.info("socket", "ip",socket.localIP(socket.LWIP_ETH))
+
+    
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            log.info("netdrv", "4G作为网关")
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+
+        -- for i = 0, 2, 1 do
+        --     local ip = "192.168.5." .. (i+100)
+        --     icmp.ping(socket.LWIP_AP, ip)
+        --     sys.waitUntil("PING_RESULT", 3000)
+        -- end
+        -- sys.wait(1000)
+
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

BIN
olddemo/airlink/air8000_airlink_fota/air8000s_v10.bin


BIN
olddemo/airlink/air8000_airlink_fota/air8000s_v9.bin


+ 34 - 0
olddemo/airlink/air8000_airlink_fota/main.lua

@@ -0,0 +1,34 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "wififota"
+VERSION = "1.0.10"
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+
+PWR8000S = function(level)
+    gpio.set(23, level)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+sys.taskInit(function()
+    sys.wait(1000)
+    airlink.debug(1)
+    airlink.sfota("/luadb/air8000s_v10.bin")
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 129 - 0
olddemo/airlink/air8000_ap_lan/main.lua

@@ -0,0 +1,129 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_wifi"
+VERSION = "1.0.5"
+
+--[[
+本demo演示的功能是:
+1. 创建AP, 提供wifi设备, 通过4G上网
+2. 创建以太网, 为局域网内的设备, 通过4G上网
+]]
+
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+
+gpio.setup(140, 1, gpio.PULLUP)
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+function test_ap()
+    log.info("执行AP创建操作", airlink.ready() , "正常吗?")
+    wlan.createAP("uiot5678", "12345678")
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    log.info("netdrv", "等待AP就绪")
+    while netdrv.ready(socket.LWIP_AP) ~= true do
+        sys.wait(100)
+    end
+    log.info("netdrv", "创建dhcp服务器, 供AP使用")
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    log.info("netdrv", "等待4G就绪")
+    while netdrv.ready(socket.LWIP_GP) ~= true do
+        sys.wait(100)
+    end
+    log.info("netdrv", "创建dns代理服务, 供AP使用")
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+end
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping.result", id, time, dst);
+end)
+
+-- wifi的AP相关事件
+sys.subscribe("WLAN_AP_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
+    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
+    log.info("收到AP事件", evt, data and data:toHex())
+end)
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+--  每隔6秒打印一次airlink统计数据, 调试用
+-- sys.taskInit(function()
+--     while 1 do
+--         sys.wait(6000)
+--         airlink.statistics()
+--     end
+-- end)
+
+
+function eth_lan()
+    -- sys.wait(3000)
+    local result = spi.setup(
+        1,--spi id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        51200000--,--波特率
+    )
+    log.info("main", "open spi",result)
+    if result ~= 0 then--返回值为0,表示打开成功
+        log.info("main", "spi open error",result)
+        return
+    end
+    log.info("netdrv", "初始化以太网")
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12,irq=255})
+    log.info("netdrv", "等待以太网就绪")
+    sys.wait(1000)
+    netdrv.ipv4(socket.LWIP_ETH, "192.168.5.1", "255.255.255.0", "0.0.0.0")
+    while netdrv.ready(socket.LWIP_ETH) ~= true do
+        -- log.info("netdrv", "等待以太网就绪")
+        sys.wait(100)
+    end
+    log.info("netdrv", "以太网就绪")
+    log.info("netdrv", "创建dhcp服务器, 供以太网使用")
+    dhcpsrv.create({adapter=socket.LWIP_ETH, gw={192,168,5,1}})
+    log.info("netdrv", "创建dns代理服务, 供以太网使用")
+    dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)
+end
+
+sys.taskInit(function()
+    while airlink.ready() ~= true do
+        sys.wait(100)
+    end
+    wlan.init()
+    sys.taskInit(eth_lan)
+    sys.taskInit(test_ap)
+
+    
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            log.info("netdrv", "4G作为网关")
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 76 - 0
olddemo/airlink/air8000_ap_sta_ping/air8000_ap_ping/main.lua

@@ -0,0 +1,76 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_ap_ping"
+VERSION = "1.0.0"
+
+-- sys库是标配
+_G.sys = require("sys")
+require "sysplus"
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+
+function create_ap()
+    log.info("执行AP创建操作", "luatos8888")
+    wlan.createAP("luatos8888", "12345678")
+    sys.wait(1000)
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+end
+
+function wifi_networking()
+   sys.wait(3000)
+    -- AP的ssid和password
+    wlan.scan()
+    -- sys.wait(500)
+    httpsrv.start(80, function(fd, method, uri, headers, body)
+        log.info("httpsrv", method, uri, json.encode(headers), body)
+    end, socket.LWIP_AP)
+end
+
+
+sys.subscribe("IP_READY", function()
+    -- 联网成功后, 模拟上报到服务器
+    log.info("wlan", "已联网", "通知服务器")
+
+end)
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+sys.taskInit(function()
+
+    -- sys.wait(100)
+    wlan.init()
+    sys.wait(100)
+
+    -- 启动AP测试
+    create_ap()
+    wifi_networking()
+
+    icmp.setup(socket.LWIP_AP)
+    while 1 do
+        log.info("开始ping STA")
+
+        for i = 0, 10, 1 do
+            local ip = "192.168.4." .. (i+100)
+            log.info("STA客户端", ip)
+            icmp.ping(socket.LWIP_AP, ip)
+            sys.waitUntil("PING_RESULT", 3000)
+        end
+        sys.wait(1000)
+    end
+
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 61 - 0
olddemo/airlink/air8000_ap_sta_ping/air8101_sta_httpsrv/main.lua

@@ -0,0 +1,61 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8101_sta_httpsrv"
+VERSION = "1.0.5"
+
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+
+-- wifi的STA相关事件
+sys.subscribe("WLAN_STA_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
+    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
+    log.info("收到STA事件", evt, data)
+end)
+
+function test_sta()
+    log.info("执行STA连接操作")
+    wlan.connect("luatos8888", "12345678")
+    sys.wait(8000)
+    iperf.server(socket.LWIP_STA)
+
+
+    sys.wait(5000)
+    sys.wait(200)
+    wifi_networking()
+    
+    while 1 do
+        log.info("wlan", "info", json.encode(wlan.getInfo()))
+           
+        sys.wait(30*1000)
+        local code, headers, body = http.request("GET", "http://httpbin.air32.cn/get", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
+        log.info("http执行结果", code, headers, body and #body)
+ 
+    end
+end
+
+function wifi_networking()
+   sys.wait(3000)
+    -- AP的ssid和password
+    wlan.scan()
+    -- sys.wait(500)
+    httpsrv.start(80, function(fd, method, uri, headers, body)
+        log.info("httpsrv", method, uri, json.encode(headers), body)
+    end, socket.LWIP_STA)
+end
+
+sys.taskInit(function()
+    wlan.init()
+   
+    -- 连接STA测试
+    log.info("STA_httpsrv测试启动...")
+    test_sta()
+
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 64 - 0
olddemo/airlink/air8000_ble/ibeacon/main.lua

@@ -0,0 +1,64 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val) gpio.set(23, val) end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+function ble_callback()
+    -- 无事可做
+end
+
+sys.taskInit(function()
+    local ret = 0
+    sys.wait(500)
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    sys.wait(100)
+
+    sys.wait(100)
+    log.info("开始设置广播内容")
+    local adv_data = string.char(0x4C, 0x00,
+                                0x02, 0x15, 0x01, 0x02, 0x03, 0x04, 0x05,
+                                        0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
+                                        0x00, 0x01,
+                                        0x00, 0x02,
+                                        0x00)
+    ble_device:adv_create({
+        addr_mode = ble.PUBLIC,
+        channel_map = ble.CHNLS_ALL,
+        intv_min = 120,
+        intv_max = 120,
+        adv_data = {
+            {ble.FLAGS, string.char(0x06)},
+            {ble.MANUFACTURER_SPECIFIC_DATA, adv_data}
+        }
+    })
+
+    sys.wait(100)
+    log.info("开始广播")
+    ble_device:adv_start()
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 83 - 0
olddemo/airlink/air8000_ble/master/main.lua

@@ -0,0 +1,83 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val) gpio.set(23, val) end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+local scan_count = 0
+
+local function ble_callback(ble_device, ble_event, ble_param)
+    if ble_event == ble.EVENT_CONN then
+        log.info("ble", "connect 成功")
+    elseif ble_event == ble.EVENT_DISCONN then
+        log.info("ble", "disconnect", ble_param.reason)
+        sys.timerStart(function() ble_device:scan_start() end, 1000)
+    elseif ble_event == ble.EVENT_WRITE then
+        log.info("ble", "write", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex())
+        log.info("ble", "data", ble_param.data:toHex())
+    elseif ble_event == ble.EVENT_READ_VALUE then
+        log.info("ble", "read", ble_param.handle,ble_param.uuid_service:toHex(),ble_param.uuid_characteristic:toHex(),ble_param.data:toHex())
+    elseif ble_event == ble.EVENT_SCAN_REPORT then
+        print("ble scan report",ble_param.addr_type,ble_param.rssi,ble_param.adv_addr:toHex(),ble_param.data:toHex())
+        scan_count = scan_count + 1
+        if scan_count > 100 then
+            log.info("ble", "扫描次数超过100次, 停止扫描, 15秒后重新开始")
+            scan_count = 0
+            ble_device:scan_stop()
+            sys.timerStart(function() ble_device:scan_start() end, 15000)
+        end
+        -- 注意, 这里是连接到另外一个设备, 设备名称带LuatOS字样
+        if ble_param.addr_type == 0 and ble_param.data:find("LuatOS") then
+            log.info("ble", "停止扫描, 连接设备", ble_param.adv_addr:toHex(), ble_param.addr_type)
+            ble_device:scan_stop()
+            ble_device:connect(ble_param.adv_addr,ble_param.addr_type)
+        end
+    elseif ble_event == ble.EVENT_GATT_ITEM then
+        -- 读取GATT完成, 打印出来
+        log.info("ble", "gatt item", ble_param)
+    elseif ble_event == ble.EVENT_GATT_DONE then
+        log.info("ble", "gatt done", ble_param.service_num)
+        local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA01")}
+        ble_device:notify_enable(wt, true) -- 开启通知
+
+        -- 主动写入数据, 但不带通知, 带通知是 write_notify
+        local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA02")}
+        ble_device:write_value(wt,string.fromHex("1234"))
+
+        local wt = {uuid_service = string.fromHex("FA00"), uuid_characteristic = string.fromHex("EA03")}
+        ble_device:read_value(wt)
+    end
+end
+
+
+sys.taskInit(function()
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+
+    -- master
+    ble_device:scan_create({})
+    ble_device:scan_start()
+    -- ble_device:scan_stop()
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 127 - 0
olddemo/airlink/air8000_ble/peripheral/main.lua

@@ -0,0 +1,127 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val) gpio.set(23, val) end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+local att_db = { -- Service
+    string.fromHex("FA00"), -- Service UUID
+    -- Characteristic
+    { -- Characteristic 1
+        string.fromHex("EA01"), -- Characteristic UUID Value
+        ble.NOTIFY | ble.READ | ble.WRITE -- Properties
+    }, { -- Characteristic 2
+        string.fromHex("EA02"), ble.WRITE
+    }, { -- Characteristic 3
+        string.fromHex("EA03"), ble.READ
+    }, { -- Characteristic 4
+        string.fromHex("EA04"), ble.IND | ble.READ
+    }
+}
+
+ble_stat = false
+
+local function ble_callback(dev, evt, param)
+    if evt == ble.EVENT_CONN then
+        log.info("ble", "connect 成功", param, param and param.addr and param.addr:toHex() or "unknow")
+        ble_stat = true
+    elseif evt == ble.EVENT_DISCONN then
+        log.info("ble", "disconnect")
+        ble_stat = false
+        -- 1秒后重新开始广播
+        sys.timerStart(function() dev:adv_start() end, 1000)
+    elseif evt == ble.EVENT_WRITE then
+        -- 收到写请求
+        log.info("ble", "接收到写请求", param.uuid_service:toHex(), param.uuid_characteristic:toHex(), param.data:toHex())
+    end
+end
+
+local bt_scan = false -- 是否扫描蓝牙
+
+sys.taskInit(function()
+    local ret = 0
+    sys.wait(500)
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    if ble_device == nil then
+        log.error("当前固件不支持完整的BLE")
+        return
+    end
+    sys.wait(100)
+
+    log.info('开始创建GATT')
+    ret = ble_device:gatt_create(att_db)
+    log.info("创建的GATT", ret)
+
+    sys.wait(100)
+    log.info("开始设置广播内容")
+    ble_device:adv_create({
+        addr_mode = ble.PUBLIC,
+        channel_map = ble.CHNLS_ALL,
+        intv_min = 120,
+        intv_max = 120,
+        adv_data = {
+            {ble.FLAGS, string.char(0x06)},
+            {ble.COMPLETE_LOCAL_NAME, "LuatOS123"},
+            {ble.SERVICE_DATA, string.fromHex("FE01")},
+            {ble.MANUFACTURER_SPECIFIC_DATA, string.fromHex("05F0")}
+        }
+    })
+
+    sys.wait(100)
+    log.info("开始广播")
+    ble_device:adv_start()
+
+        
+    -- 放入预设值, 注意是有READ属性的特性才能读取
+    -- 手机APP设置MTU到256
+    local wt = {
+        uuid_service = string.fromHex("FA00"),
+        uuid_characteristic = string.fromHex("EA01"), 
+    }
+    ble_device:write_value(wt, "12345678901234567890")
+
+    while 1 do
+        sys.wait(3000)
+        if ble_stat then
+            local wt = {
+                uuid_service = string.fromHex("FA00"),
+                uuid_characteristic = string.fromHex("EA01"), 
+            }
+            local result = ble_device:write_notify(wt, "123456" .. os.date())
+            log.info("ble", "发送数据", result)
+        else
+            -- log.info("等待连接成功之后发送数据")
+        end
+        
+        local wt = {
+            uuid_service = string.fromHex("FA00"),
+            uuid_characteristic = string.fromHex("EA03"), 
+        }
+        ble_device:write_value(wt, "8888 123454")
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 85 - 0
olddemo/airlink/air8000_ble/scan/main.lua

@@ -0,0 +1,85 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "ble"
+VERSION = "1.0.0"
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+
+log.info("main", "project name is ", PROJECT, "version is ", VERSION)
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+local function ble_callback(ble_device, ble_event, ble_param)
+    if ble_event == ble.EVENT_SCAN_INIT then
+        log.info("ble", "scan init")
+    elseif ble_event == ble.EVENT_SCAN_REPORT then
+        log.info("ble", "scan report", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- 解析广播数据, 日志很多, 按需使用
+        -- local adv_data = ble_device:adv_decode(ble_param.data)
+        -- if adv_data then
+        --     for k, v in pairs(adv_data) do
+        --         log.info("ble", "adv data", v.len, v.tp, v.data:toHex())
+        --     end
+        -- end
+        -- if ble_param.data:byte(1) == 0x1A then
+        --     log.info("ble", "ibeacon数据", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+        -- end
+    elseif ble_event == ble.EVENT_SCAN_STOP then
+        log.info("ble", "scan stop")
+    end
+end
+
+local bt_scan = false   -- 是否扫描蓝牙
+
+sys.taskInit(function()
+    sys.wait(500)
+    log.info("开始初始化蓝牙核心")
+    bluetooth_device = bluetooth.init()
+    sys.wait(100)
+    log.info("初始化BLE功能")
+    ble_device = bluetooth_device:ble(ble_callback)
+    if ble_device == nil then
+        log.error("当前固件不支持完整的BLE")
+        return
+    end
+    sys.wait(100)
+    -- 扫描模式
+    sys.wait(1000)
+    ble_device:scan_create() -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
+    -- ble_device:scan_create(0, 10, 10) -- 使用自定义参数
+    sys.wait(100)
+    log.info("开始扫描")
+    ble_device:scan_start()
+
+    -- sys.wait(15000)
+    -- log.info("停止扫描")
+    -- ble_device:scan_stop()
+
+end)
+
+-- sys.timerLoopStart(function()
+--     print("hi, LuatOS")
+--     print("mem.lua", rtos.meminfo())
+--     print("mem.sys", rtos.meminfo("sys"))
+--     print("mem.psram", rtos.meminfo("psram"))
+-- end, 3000)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 41 - 0
olddemo/airlink/air8000_gpio/main.lua

@@ -0,0 +1,41 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_gpio_ext"
+VERSION = "1.0.5"
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+sys.taskInit(function()
+    -- 闪灯开始
+    sys.wait(100)
+    pin = 164
+    while 1 do
+        gpio.setup(pin, 0, gpio.PULLUP)
+        sys.wait(500)
+        gpio.setup(pin, 1, gpio.PULLUP)
+        sys.wait(500)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 43 - 0
olddemo/airlink/air8000_gpio_get/main.lua

@@ -0,0 +1,43 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_gpio_get"
+VERSION = "1.0.5"
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+sys.taskInit(function()
+
+    -- GPIO153 输出电平
+    -- GPIO160 读取电平
+    sys.wait(3000)
+    IN = gpio.setup(160, nil, gpio.PULLUP)
+    OUT = gpio.setup(153, 0, gpio.PULLUP)
+    while 1 do
+        gpio.toggle(153)
+        log.info("gpio", "读出的值是", gpio.get(160)) 
+        sys.wait(1000)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 73 - 0
olddemo/airlink/air8000_uart/main.lua

@@ -0,0 +1,73 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_gpio_ext"
+VERSION = "1.0.5"
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+
+PWR8000S = function(level)
+    gpio.set(23, level)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+local uartid = 11
+local buff = zbuff.create(1024)
+function uart_on()
+    local result = uart.on(uartid, "receive", function(id, len)
+        local s = ""
+        log.info("uart", "recv", id, len)
+        repeat
+            -- s = uart.read(id, 128)
+            uart.rx(id, buff)
+            s = buff:query()
+            if s and #s > 0 then -- #s 是取字符串的长度
+                -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
+                -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
+                log.info("uart", "receive", id, #s, s)
+                -- log.info("uart", "receive", id, #s, s:toHex())
+                buff:del()
+            else
+                break
+            end
+        until s == ""
+    end)
+    log.info("uart.on", "receive", result)
+
+    uart.on(uartid, "sent", function(id)
+        log.info("uart", id, "sent")
+    end)
+end
+
+sys.taskInit(function()
+    sys.wait(1000)
+    airlink.debug(1)
+    local ret = uart.setup(uartid, 115200)
+    log.info("执行初始化", ret);
+    uart_on()
+    while 1 do
+        uart.write(uartid, "1234123412341234")
+        -- gpio.setup(164, 0, gpio.PULLDOWN)
+        sys.wait(1000)
+        -- break
+        -- airlink.statistics()
+    end
+    -- while 1 do
+    --     uart.write(11, "ABC\r\n")
+    --     sys.wait(1000)
+    -- end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 49 - 0
olddemo/airlink/air8000_uart11_gnss/main.lua

@@ -0,0 +1,49 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "uart11"
+VERSION = "1.0.5"
+
+--[[
+注意!!!
+这个demo演示的是外挂一个GNSS模组, 不是使用Air8000里面的GNSS芯片
+]]
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+sys.taskInit(function()
+    
+    -- 首先, 初始化uart11
+    uart.setup(11, 115200)
+    libgnss.bind(11)
+    libgnss.debug(true) -- 调试开关,非必须,生产环境要关掉
+    while 1 do
+        -- 这段代码是演示注入假数据的, 真实接GNSS模组的话, 这段代码不需要
+        log.info("uart11", "注入假的GNSS数据")
+        uart.write(11, "$GPGGA,055258.000,3027.4932,N,11424.2381,E,1,06,2.9,101.9,M,-13.6,M,,0000*7E\r\n")
+        uart.write(11, "$GPGSA,A,3,28,06,57,58,30,02,,,,,,,4.1,2.9,2.9*35\r\n")
+        uart.write(11, "$GPRMC,055258.000,A,3027.4932,N,11424.2381,E,0.00,15.90,120620,,,A*5B\r\n")
+
+        -- 打印定位信息
+        log.info("RMC", json.encode(libgnss.getRmc(2) or {}, "7f"))
+        sys.wait(1000)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 146 - 0
olddemo/airlink/air8000_wifi/main.lua

@@ -0,0 +1,146 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_wifi"
+VERSION = "1.0.5"
+
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+-- if airlink.irqmode then
+--     log.info("尝试开启IRQ模式", "GPIO20 <--> GPIO140")
+--     airlink.irqmode(true, 20, 140)
+-- end
+
+function test_ap()
+    log.info("执行AP创建操作")
+    wlan.createAP("uiot5678", "12345678")
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    sys.wait(5000)
+    -- netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    -- log.info("创建dns代理", netdrv.ipv4(socket.LWIP_AP))
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    -- log.info('创建DHCP服务器', netdrv.ipv4(socket.LWIP_AP))
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+end
+
+-- wifi的STA相关事件
+sys.subscribe("WLAN_STA_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的ssid, 字符串类型
+    -- 当evt=DISCONNECTED, data断开的原因, 整数类型
+    log.info("收到STA事件", evt, data)
+end)
+
+-- wifi的AP相关事件
+sys.subscribe("WLAN_AP_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
+    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
+    log.info("收到AP事件", evt, data and data:toHex())
+end)
+
+function test_sta()
+    log.info("执行STA连接操作")
+    wlan.connect("luatos1234", "12341234")
+    -- netdrv.dhcp(socket.LWIP_STA, true)
+    sys.wait(8000)
+    iperf.server(socket.LWIP_STA)
+    -- iperf.client(socket.LWIP_STA, "47.94.236.172")
+
+    sys.wait(5000)
+    while 1 do
+        log.info("wlan", "info", json.encode(wlan.getInfo()))
+        -- log.info("MAC地址", netdrv.mac(socket.LWIP_STA))
+        -- log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
+        -- log.info("ready?", netdrv.ready(socket.LWIP_STA))
+        -- sys.wait(1000)
+        -- log.info("执行http请求")
+        -- local code = http.request("GET", "http://192.168.1.15:8000/README.md", nil, nil, {adapter=socket.LWIP_STA,timeout=3000}).wait()
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_STA,timeout=5000,debug=false}).wait()
+        log.info("http执行结果", code, headers, body and #body)
+        -- socket.sntp(nil, socket.LWIP_STA)
+        sys.wait(2000)
+
+        -- socket.sntp(nil)
+        -- sys.wait(2000)
+        -- log.info("执行ping操作")
+        -- icmp.ping(socket.LWIP_STA, "183.2.172.177")
+        -- sys.wait(2000)
+    end
+end
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+function test_scan()
+    while 1 do
+        log.info("执行wifi扫描")
+        wlan.scan()
+        sys.wait(30 * 1000)
+    end
+end
+sys.subscribe("WLAN_SCAN_DONE", function ()
+    local results = wlan.scanResult()
+    log.info("scan", "results", #results)
+    for k,v in pairs(results) do
+        log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
+    end
+end)
+
+--  每隔6秒打印一次airlink统计数据, 调试用
+-- sys.taskInit(function()
+--     while 1 do
+--         sys.wait(6000)
+--         airlink.statistics()
+--     end
+-- end)
+
+sys.taskInit(function()
+    log.info("新的Air8000脚本...")
+
+    -- sys.wait(200) -- 稍微缓一下, Air8000S的启动大概需要300ms
+    -- 启动AP测试
+    -- netdrv.setup(socket.LWIP_STA, netdrv.WHALE)
+    -- netdrv.setup(socket.LWIP_AP, netdrv.WHALE)
+    wlan.init()
+    -- sys.wait(5000)
+    
+    -- sys.wait(300)
+    -- test_ap()
+
+    -- 连接STA测试
+    test_sta()
+
+    -- wifi扫描测试
+    -- test_scan()
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 115 - 0
olddemo/airlink/air8000_wifi_ap_httpsrv/index.html

@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+<header>
+    <meta charset="utf-8" />
+    <title>Http Server Get-Start</title>
+    <!-- fetch api-->
+    <!-- <script type="text/javascript" src="/petite-vue.js"></script> -->
+    <script type="text/javascript">
+        function led(key) {
+            fetch("/led/" + key)
+        }
+        function wifi_get_aplist() {
+            var resp = fetch("/scan/list").then(function (resp) {
+                console.log(resp, resp.status)
+                if (resp.status != 200) {
+                    return
+                }
+                resp.json().then(function (data) {
+                    console.log("data", data)
+                    var tmp = ""
+                    for (let index = 0; index < data.data.length; index++) {
+                        const apname = data.data[index];
+                        if (index == 0) {
+                            tmp += "<option vaule='" + index + "' selected>" + apname+"</option>\n"
+                        }
+                        else {
+                            tmp += "<option vaule='" + index + "'>" + apname+"</option>\n"
+                        }
+                        
+                    }
+                    document.getElementById("aplist").innerHTML = tmp
+                })
+            })
+        }
+        function wifi_scan() {
+            fetch("/scan/go")
+            setTimeout(wifi_get_aplist, 3000)
+        }
+        function wifi_connect() {
+            var ssid = document.getElementById("ssid").value
+            var passwd = document.getElementById("passwd").value
+            console.log(ssid, passwd)
+            fetch("/connect", {
+                method : "POST",
+                body : JSON.stringify({ssid:ssid, passwd:passwd})
+            }).then(function(resp) {
+                if (resp.status == 200) {
+                    alert("正在尝试连接")
+                }
+                else {
+                    alert("出了点问题")
+                }
+            })
+        }
+        function wifi_ipstat() {
+            fetch("/connok").then(function(resp){
+                if (resp.status != 200)
+                    return
+                resp.json().then(function(data){
+                    console.log(data)
+                    if (data && data.ip != "0.0.0.0") {
+                        document.getElementById("ipstat").innerHTML = "已联网"
+                    }
+                })
+            })
+        }
+        function select_changed(event) {
+            var apselect = document.getElementById("aplist")
+            var ssid = document.getElementById("ssid")
+            ssid.value = apselect.options[apselect.selectedIndex].text
+        }
+        setTimeout(wifi_get_aplist, 3000)
+        // setInterval(wifi_ipstat, 3000)
+    </script>
+</header>
+
+<body>
+    <h2>点击按钮, led灯会亮起或熄灭</h2>
+    <div>
+        <div>
+            <button onclick="led(1)">LED亮</button>
+        </div>
+        <div>
+            <button onclick="led(0)">LED灭</button>
+        </div>
+    </div>
+    <h2>AP WEB 配网</h2>
+    <div v-scope="{aps:[]}">
+        <div>
+            <button onclick="wifi_scan()">扫描wifi</button>
+        </div>
+        <div>
+            <h4>wifi列表</h4>
+            <select id="aplist" onchange="select_changed()">
+                <option vaule="">luatos1234</option>
+            </select>
+            <p></p>
+            wifi名称: <input id="ssid">
+            <p></p>
+            密码: <input id="passwd">
+            <p></p>
+            <button onclick="wifi_connect()">连接</button>
+        </div>
+        <div>
+            <h4>联网状态:</h4><span id="ipstat">未联网</span>
+            <p></p>
+            <button onclick="wifi_ipstat()">检查状态</button>
+        </div>
+    </div>
+    <div>
+        <h4>Power by <a href="https://wiki.luatos.com">LuatOS</a></h4>
+    </div>
+</body>
+
+</html>

+ 115 - 0
olddemo/airlink/air8000_wifi_ap_httpsrv/index2.html

@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+<html>
+<header>
+    <meta charset="utf-8" />
+    <title>Http Server Get-Start</title>
+    <!-- fetch api-->
+    <!-- <script type="text/javascript" src="/petite-vue.js"></script> -->
+    <script type="text/javascript">
+        function led(key) {
+            fetch("/led/" + key)
+        }
+        function wifi_get_aplist() {
+            var resp = fetch("/scan/list").then(function (resp) {
+                console.log(resp, resp.status)
+                if (resp.status != 200) {
+                    return
+                }
+                resp.json().then(function (data) {
+                    console.log("data", data)
+                    var tmp = ""
+                    for (let index = 0; index < data.data.length; index++) {
+                        const apname = data.data[index];
+                        if (index == 0) {
+                            tmp += "<option vaule='" + index + "' selected>" + apname+"</option>\n"
+                        }
+                        else {
+                            tmp += "<option vaule='" + index + "'>" + apname+"</option>\n"
+                        }
+                        
+                    }
+                    document.getElementById("aplist").innerHTML = tmp
+                })
+            })
+        }
+        function wifi_scan() {
+            fetch("/scan/go")
+            setTimeout(wifi_get_aplist, 3000)
+        }
+        function wifi_connect() {
+            var ssid = document.getElementById("ssid").value
+            var passwd = document.getElementById("passwd").value
+            console.log(ssid, passwd)
+            fetch("/connect", {
+                method : "POST",
+                body : JSON.stringify({ssid:ssid, passwd:passwd})
+            }).then(function(resp) {
+                if (resp.status == 200) {
+                    alert("正在尝试连接")
+                }
+                else {
+                    alert("出了点问题")
+                }
+            })
+        }
+        function wifi_ipstat() {
+            fetch("/connok").then(function(resp){
+                if (resp.status != 200)
+                    return
+                resp.json().then(function(data){
+                    console.log(data)
+                    if (data && data.ip != "0.0.0.0") {
+                        document.getElementById("ipstat").innerHTML = "已联网"
+                    }
+                })
+            })
+        }
+        function select_changed(event) {
+            var apselect = document.getElementById("aplist")
+            var ssid = document.getElementById("ssid")
+            ssid.value = apselect.options[apselect.selectedIndex].text
+        }
+        setTimeout(wifi_get_aplist, 3000)
+        // setInterval(wifi_ipstat, 3000)
+    </script>
+</header>
+
+<body>
+    <h2>点击按钮, led灯会亮起或熄灭</h2>
+    <div>
+        <div>
+            <button onclick="led(1)">LED亮</button>
+        </div>
+        <div>
+            <button onclick="led(0)">LED灭</button>
+        </div>
+    </div>
+    <h2>AP WEB 配网</h2>
+    <div v-scope="{aps:[]}">
+        <div>
+            <button onclick="wifi_scan()">扫描wifi</button>
+        </div>
+        <div>
+            <h4>wifi列表</h4>
+            <select id="aplist" onchange="select_changed()">
+                <option vaule="">luatos1234</option>
+            </select>
+            <p></p>
+            wifi名称: <input id="ssid">
+            <p></p>
+            密码: <input id="passwd">
+            <p></p>
+            <button onclick="wifi_connect()">连接</button>
+        </div>
+        <div>
+            <h4>联网状态:</h4><span id="ipstat">未联网</span>
+            <p></p>
+            <button onclick="wifi_ipstat()">检查状态</button>
+        </div>
+    </div>
+    <div>
+        <h4>Power by <a href="https://wiki.luatos.com">LuatOS</a></h4>
+    </div>
+</body>
+
+</html>

+ 139 - 0
olddemo/airlink/air8000_wifi_ap_httpsrv/main.lua

@@ -0,0 +1,139 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "WIFI_AP"
+VERSION = "1.0.0"
+--[[
+本demo演示AP的配网实例
+1. 启动后, 会创建一个 luatos_ + mac地址的热点
+2. 热点密码是 12345678
+3. 热点网关是 192.168.4.1, 同时也是配网网页的ip
+4. http://192.168.4.1
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+require "sysplus"
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+local LEDA= gpio.setup(20, 0, gpio.PULLUP)
+
+function create_ap()
+    log.info("执行AP创建操作", "luatos8888")
+    wlan.createAP("luatos8888", "12345678")
+    sys.wait(1000)
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+end
+
+function wifi_networking()
+   sys.wait(3000)
+    -- AP的ssid和password
+    wlan.scan()
+    -- sys.wait(500)
+    httpsrv.start(80, function(fd, method, uri, headers, body)
+        log.info("httpsrv", method, uri, json.encode(headers), body)
+        -- /led是控制灯的API
+        if uri == "/led/1" then
+            LEDA(1)
+            return 200, {}, "ok"
+        elseif uri == "/led/0" then
+            LEDA(0)
+            return 200, {}, "ok"
+        -- 扫描AP
+        elseif uri == "/scan/go" then
+            wlan.scan()
+            return 200, {}, "ok"
+        -- 前端获取AP列表
+        elseif uri == "/scan/list" then
+            return 200, {["Content-Type"]="applaction/json"}, (json.encode({data=_G.scan_result, ok=true}))
+        -- 前端填好了ssid和密码, 那就连接吧
+        elseif uri == "/connect" then
+            if method == "POST" and body and #body > 2 then
+                local jdata = json.decode(body)
+                if jdata and jdata.ssid then
+                    -- 开启一个定时器联网, 否则这个情况可能会联网完成后才执行完
+                    sys.timerStart(wlan.connect, 500, jdata.ssid, jdata.passwd)
+                    return 200, {}, "ok"
+                end
+            end
+            return 400, {}, "ok"
+        -- 根据ip地址来判断是否已经连接成功
+        elseif uri == "/connok" then
+            return 200, {["Content-Type"]="applaction/json"}, json.encode({ip=socket.localIP()})
+        end
+        -- 其他情况就是找不到了
+        return 404, {}, "Not Found" .. uri
+    end, socket.LWIP_AP)
+    log.info("web", "pls open url http://192.168.4.1/")
+end
+
+-- wifi扫描成功后, 会有WLAN_SCAN_DONE消息, 读取即可
+sys.subscribe("WLAN_SCAN_DONE", function ()
+    local result = wlan.scanResult()
+    _G.scan_result = {}
+    for k,v in pairs(result) do
+        log.info("scan", (v["ssid"] and #v["ssid"] > 0) and v["ssid"] or "[隐藏SSID]", v["rssi"], (v["bssid"]:toHex()))
+        if v["ssid"] and #v["ssid"] > 0 then
+            table.insert(_G.scan_result, v["ssid"])
+        end
+    end
+    log.info("scan", "aplist", json.encode(_G.scan_result))
+end)
+
+sys.subscribe("IP_READY", function()
+    -- 联网成功后, 模拟上报到服务器
+    log.info("wlan", "已联网", "通知服务器")
+
+end)
+
+function test_scan()
+    while 1 do
+        log.info("执行wifi扫描")
+        wlan.scan()
+        sys.wait(30 * 1000)
+    end
+end
+sys.subscribe("WLAN_SCAN_DONE", function ()
+    local results = wlan.scanResult()
+    log.info("scan", "results", #results)
+    for k,v in pairs(results) do
+        log.info("scan", v["ssid"], v["rssi"], (v["bssid"]:toHex()))
+    end
+end)
+
+--  每隔6秒打印一次airlink统计数据, 调试用
+-- sys.taskInit(function()
+--     while 1 do
+--         sys.wait(6000)
+--         airlink.statistics()
+--     end
+-- end)
+
+sys.taskInit(function()
+
+    -- sys.wait(100)
+    wlan.init()
+    sys.wait(100)
+
+    -- 启动AP测试
+    create_ap()
+    wifi_networking()
+    -- 连接STA测试
+    -- test_sta()
+
+    -- wifi扫描测试
+    -- test_scan()
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 72 - 0
olddemo/airlink/air8000_wifi_ap_ping/main.lua

@@ -0,0 +1,72 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "WIFI_AP"
+VERSION = "1.0.0"
+--[[
+本demo演示AP的配网实例
+1. 启动后, 会创建一个 luatos_ + mac地址的热点
+2. 热点密码是 12345678
+3. 热点网关是 192.168.4.1, 同时也是配网网页的ip
+4. http://192.168.4.1
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+require "sysplus"
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+
+function create_ap()
+    log.info("执行AP创建操作", "luatos8888")
+    wlan.createAP("luatos8888", "12345678")
+    sys.wait(1000)
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)
+    apdhcpd = dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_GP) then
+            netdrv.napt(socket.LWIP_GP)
+            break
+        end
+        sys.wait(1000)
+    end
+
+    icmp.setup(socket.LWIP_AP)
+    while 1 do
+        log.info("开始ping STA")
+        -- for k, v in pairs(apdhcpd.clients) do
+        --     local ip = "192.168.4." .. k
+        --     log.info("STA客户端", ip, v.mac and v.mac:toHex())
+        --     icmp.ping(socket.LWIP_AP, ip)
+        --     sys.waitUntil("PING_RESULT", 3000)
+        --     -- sys.wait(2000)
+        -- end
+        for i = 1, 10, 1 do
+            local ip = "192.168.4." .. (i+100)
+            log.info("STA客户端", ip)
+            icmp.ping(socket.LWIP_AP, ip)
+            sys.waitUntil("PING_RESULT", 3000)
+            -- sys.wait(2000)
+        end
+        sys.wait(1000)
+    end
+end
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+sys.taskInit(function()
+
+    -- sys.wait(100)
+    wlan.init()
+    sys.wait(100)
+
+    -- 启动AP测试
+    create_ap()
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 118 - 0
olddemo/airlink/air8000_wifi_eth/main.lua

@@ -0,0 +1,118 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_wifi"
+VERSION = "1.0.5"
+
+dnsproxy = require("dnsproxy")
+dhcpsrv = require("dhcpsrv")
+httpplus = require("httpplus")
+
+gpio.setup(140, 1, gpio.PULLUP)
+
+-- 通过boot按键方便刷Air8000S
+function PWR8000S(val)
+    gpio.set(23, val)
+end
+
+gpio.debounce(0, 1000)
+gpio.setup(0, function()
+    sys.taskInit(function()
+        log.info("复位Air8000S")
+        PWR8000S(0)
+        sys.wait(20)
+        PWR8000S(1)
+    end)
+end, gpio.PULLDOWN)
+
+function test_ap()
+    log.info("执行AP创建操作")
+    wlan.createAP("uiot5678", "12345678")
+    netdrv.ipv4(socket.LWIP_AP, "192.168.4.1", "255.255.255.0", "0.0.0.0")
+    sys.wait(5000)
+    dnsproxy.setup(socket.LWIP_AP, socket.LWIP_ETH)
+    dhcpsrv.create({adapter=socket.LWIP_AP})
+    while 1 do
+        if netdrv.ready(socket.LWIP_ETH) then
+            log.info("以太网作为网关")
+            netdrv.napt(socket.LWIP_ETH)
+            break
+        end
+        sys.wait(1000)
+    end
+    icmp.setup(socket.LWIP_ETH)
+    while 1 do
+        -- 持续ping网关
+        local ip,mark,gw = netdrv.ipv4(socket.LWIP_ETH)
+        if gw then
+            log.info("ping", gw)
+            icmp.ping(socket.LWIP_ETH, gw)
+        end
+        sys.wait(3000)
+    end
+end
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping.result", id, time, dst);
+end)
+
+-- wifi的AP相关事件
+sys.subscribe("WLAN_AP_INC", function(evt, data)
+    -- evt 可能的值有: "CONNECTED", "DISCONNECTED"
+    -- 当evt=CONNECTED, data是连接的AP的新STA的MAC地址
+    -- 当evt=DISCONNECTED, data是断开与AP连接的STA的MAC地址
+    log.info("收到AP事件", evt, data and data:toHex())
+end)
+
+sys.subscribe("PING_RESULT", function(id, time, dst)
+    log.info("ping", id, time, dst);
+end)
+
+--  每隔6秒打印一次airlink统计数据, 调试用
+-- sys.taskInit(function()
+--     while 1 do
+--         sys.wait(6000)
+--         airlink.statistics()
+--     end
+-- end)
+
+
+function eth_wan()
+    -- sys.wait(3000)
+    local result = spi.setup(
+        1,--spi id
+        nil,
+        0,--CPHA
+        0,--CPOL
+        8,--数据宽度
+        51200000--,--波特率
+    )
+    log.info("main", "open spi",result)
+    if result ~= 0 then--返回值为0,表示打开成功
+        log.info("main", "spi open error",result)
+        return
+    end
+
+    netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=1,cs=12})
+    netdrv.dhcp(socket.LWIP_ETH, true)
+
+    while 1 do
+        local ip = netdrv.ipv4(socket.LWIP_ETH)
+        if ip and ip ~= "0.0.0.0" then
+            break
+        end
+        sys.wait(100)
+    end
+    iperf.server(socket.LWIP_ETH)
+end
+
+sys.taskInit(function()
+    eth_wan()
+    wlan.init()
+    sys.wait(300)
+    test_ap()
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 39 - 0
olddemo/airlink/air8000s/main.lua

@@ -0,0 +1,39 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "netdrv"
+VERSION = "1.0.5"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+_G.sysplus = require("sysplus")
+
+wdt.init(3000)
+sys.timerLoopStart(wdt.feed, 1000)
+
+sys.taskInit(function()
+    -- sys.wait(500)
+    airlink.start(0)
+    -- wlan.init()
+    -- sys.wait(5000)
+end)
+
+sys.taskInit(function()
+    -- sys.waitUntil("IP_READY")
+    sys.wait(6000)
+    while 1 do
+        sys.wait(6000)
+        -- log.info("http", http.request("GET", "http://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_ETH,timeout=3000}).wait())
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
+        airlink.statistics()
+        -- log.info("ip", socket.localIP(socket.LWIP_ETH))
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 38 - 0
olddemo/airlink/air8000s_nop/main.lua

@@ -0,0 +1,38 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "netdrv"
+VERSION = "1.0.5"
+--[[特别注意, 生成量产文件的时候要带上nop.txt,否则会造成fota失败]]
+--[[特别注意, 生成量产文件的时候要带上nop.txt,否则会造成fota失败]]
+--[[特别注意, 生成量产文件的时候要带上nop.txt,否则会造成fota失败]]
+
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+_G.sysplus = require("sysplus")
+
+sys.taskInit(function()
+    -- sys.wait(500)
+    -- airlink.start(0)
+    -- wlan.init()
+end)
+
+sys.taskInit(function()
+    -- sys.waitUntil("IP_READY")
+    sys.wait(6000)
+    while 1 do
+        sys.wait(6000)
+        -- log.info("http", http.request("GET", "http://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_ETH,timeout=3000}).wait())
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+        -- log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
+        -- log.info("ip", socket.localIP(socket.LWIP_ETH))
+        airlink.statistics()
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 173 - 0
olddemo/airlink/air8000s_nop/nop.txt

@@ -0,0 +1,173 @@
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+cover/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+.pybuilder/
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+#   For a library or package, you might want to ignore these files since the code is
+#   intended to run in multiple environments; otherwise, check them in:
+# .python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# poetry
+#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
+#   This is especially recommended for binary packages to ensure reproducibility, and is more
+#   commonly ignored for libraries.
+#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
+#poetry.lock
+
+# pdm
+#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
+#pdm.lock
+#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
+#   in version control.
+#   https://pdm.fming.dev/latest/usage/project/#working-with-version-control
+.pdm.toml
+.pdm-python
+.pdm-build/
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
+
+# pytype static type analyzer
+.pytype/
+
+# Cython debug symbols
+cython_debug/
+
+# PyCharm
+#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can
+#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
+#  and can be added to the global gitignore or merged into this file.  For a more nuclear
+#  option (not recommended) you can uncomment the following to ignore the entire idea folder.
+#.idea/
+
+data/
+.settings/
+.classpath
+.project
+Cargo.lock
+Cargo.toml
+dependency-reduced-pom.xml
+temp/
+
+**/node_modules/
+webapi/Scripts/

+ 35 - 0
olddemo/airlink/air8101/main.lua

@@ -0,0 +1,35 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "netdrv"
+VERSION = "1.0.4"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+--[[特别注意, 使用http库需要下列语句]]
+_G.sysplus = require("sysplus")
+
+sys.taskInit(function()
+    -- sys.wait(500)
+    airlink.init()
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
+    airlink.start(0)
+    netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+end)
+
+sys.taskInit(function()
+    -- sys.waitUntil("IP_READY")
+    sys.wait(6000)
+    while 1 do
+        sys.wait(500)
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_USER0,timeout=3000}).wait()
+        log.info("http", code, body and #body)
+        log.info("lua", rtos.meminfo())
+        log.info("sys", rtos.meminfo("sys"))
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 48 - 0
olddemo/airlink/air8101_air780ehm_http/README.md

@@ -0,0 +1,48 @@
+# AirLink-SPI通信
+
+## 协议通信描述
+
+整个协议主要分为2层:
+1. 物理层协议:以整体封包的形式,为上层包提供无错误的传输支持
+2. 应用层协议:以TLV形式,提供命令类型、命令长度、命令数据(若有)的数据封装
+
+### 物理管脚说明
+
+| 功能说明 | 从机(以Air8101为例) | 主机(以Air780EHM为例) | 备注 |
+| --- | --- | --- | --- |
+| GND | GND | GND | 接2根,确保稳定共地 |
+| SPI_CLK | GPIO14 | SPI0_CLK/GPIO11 | 主从时钟,必须连接,杜邦线尽量保持相同长度 |
+| SPI_CS | GPIO15 | SPI0_CS/GPIO8 | 从机片选,必须连接 |
+| SPI_MOSI | GPIO16 | SPI0_MOSI/GPIO9 | 主发从收,必须连接 |
+| SPI_MISO | GPIO17 | SPI0_MISO/GPIO10 | 主收从发,必须连接 |
+| RDY | GPIO48 | GPIO22/WAKEUP5 | 从机就绪,必须连接,杜邦线尽量保持相同长度 |
+| IRQ | GPIO28 | GPIO1 | 从机通知主机有新数据,可选,中间串0R电阻 |
+
+### 通信时序介绍
+
+1. 主机初始化SPI相关参数,CS脚拉高
+2. 从机初始化SPI相关参数,RDY脚拉高,监听CS脚中断信息
+3. 主机拉低CS脚
+4. 从机就绪后,启动SPI从机通信,然后拉低RDY脚
+5. 主机等待RDY脚低电平后,开始传输1600字节的SPI数据
+6. 主机传输完毕后,拉高CS脚,分析SPI数据
+7. 从机监听到CS脚拉高的中断,分析SPI数据,若数据非法,立即重置SPI外设驱动,重新等待下一次传输
+8. 主机分析SPI数据后,若有其他待传输数据,从步骤3重新开始传输逻辑,否则等待传输事件唤醒
+
+## 脚本介绍
+
+* 功能角色:Air8101作为SPI主机,发送网络请求;Air780EHM作为SPI从机,开启dnsproxy、napt,做网关
+
+### 1. SPI从机模式(Air780EHM)
+- 初始化AirLink并注册网卡
+- 启动AirLink从机模式,配置本地IP、网关等
+- 等待网络就绪(IP_READY)
+- 启用NAPT(网络地址端口转换)
+
+### 2. SPI主机模式(如Air8101)
+- 初始化AirLink并注册网卡
+- 配置SPI CS和RDY引脚
+- 启动AirLink主机模式,配置本地IP、网关
+- 等待网络就绪(IP_READY)
+- 循环打印设备信息和AirLink统计数据
+- 定时发起HTTP请求,测试网络连通性

+ 36 - 0
olddemo/airlink/air8101_air780ehm_http/air780ehm/main.lua

@@ -0,0 +1,36 @@
+PROJECT = "airlink_spi_slave"
+VERSION = "1.0.0"
+
+_G.sys = require("sys")
+_G.sysplus = require("sysplus")
+dnsproxy = require ("dnsproxy")
+
+-- 订阅airlink的SDATA事件,打印收到的信息。
+local function airlink_sdata(data)
+    log.info("收到AIRLINK_SDATA!!", data)
+end
+
+sys.subscribe("AIRLINK_SDATA", airlink_sdata)
+sys.subscribe("IP_READY", function(id, ip)
+    log.info("收到IP_READY!!", id, ip)
+end)
+
+sys.taskInit(function()
+    sys.wait(100)
+    airlink.init()
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
+    sys.wait(100)
+    airlink.start(0)
+    netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+    sys.waitUntil("IP_READY")
+    netdrv.napt(socket.LWIP_GP)
+
+    dnsproxy.setup(socket.LWIP_USER0, socket.LWIP_GP)
+    while 1 do
+        sys.wait(1000)
+        log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
+        airlink.statistics()
+    end
+end)
+
+sys.run()

+ 29 - 0
olddemo/airlink/air8101_air780ehm_http/air8101/main.lua

@@ -0,0 +1,29 @@
+PROJECT = "airlink_spi_master"
+VERSION = "1.0.0"
+
+_G.sys = require("sys")
+_G.sysplus = require("sysplus")
+dnsproxy = require ("dnsproxy")
+
+sys.taskInit(function()
+    sys.wait(100)
+    airlink.init()
+    log.info("创建桥接网络设备")
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
+    airlink.config(airlink.CONF_SPI_CS, 15)
+    airlink.config(airlink.CONF_SPI_RDY, 48)
+    airlink.start(1)
+    netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1")
+    sys.wait(100)
+    sys.waitUntil("IP_READY", 10000)
+    while 1 do
+        sys.wait(1000)
+        log.info("ticks", mcu.ticks(), hmeta.chip(), hmeta.model(), hmeta.hwver())
+        airlink.statistics()
+        log.info("执行http请求")
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_USER0,timeout=3000}).wait()
+        log.info("http执行结果", code, code, headers, body)
+    end
+end)
+
+sys.run()

+ 67 - 0
olddemo/airlink/air8101_air780epm_fota/main.lua

@@ -0,0 +1,67 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "fota2"
+VERSION = "1.0.0"
+
+-- 使用合宙iot平台时需要这个参数
+PRODUCT_KEY = "1234" -- 到 iot.openluat.com 创建项目,获取正确的项目id
+
+sys = require "sys"
+libfota2 = require "libfota2"
+sys.taskInit(function()
+    -- sys.wait(500)
+    airlink.init()
+    airlink.start(0)
+    log.info("创建桥接网络设备")
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
+    netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+end)
+
+-- 循环打印版本号, 方便看版本号变化, 非必须
+sys.taskInit(function()
+    while 1 do
+        sys.wait(2000)
+        log.info("fota", "version", VERSION)
+    end
+end)
+
+-- 升级结果的回调函数
+local function fota_cb(ret)
+    log.info("fota", ret)
+    if ret == 0 then
+        rtos.reboot()
+    end
+end
+
+-- 使用合宙iot平台进行升级, 支持自定义参数, 也可以不配置
+local ota_opts = {
+    -- 合宙IOT平台的默认升级URL, 不填就是这个默认值
+    -- 如果是自建的OTA服务器, 则需要填写正确的URL, 例如 http://192.168.1.5:8000/update
+    -- 如果自建OTA服务器,且url包含全部参数,不需要额外添加参数, 请在url前面添加 ### 
+    -- url="http://iot.openluat.com/api/site/firmware_upgrade",
+    -- 请求的版本号, 合宙IOT有一套版本号体系,不传就是合宙规则, 自建服务器的话当然是自行约定版本号了
+    -- version=_G.VERSION,
+    -- 其他更多参数, 请查阅libfota2的文档 https://wiki.luatos.com/api/libs/libfota2.html
+    url = "https://www.air32.cn/fota/air8101/adcdemo_1003.1.0_LuatOS-SoC_Air8101.bin?"
+}
+sys.taskInit(function()
+    -- 这个判断是提醒要设置PRODUCT_KEY的,实际生产请删除
+    if "123" == _G.PRODUCT_KEY and not ota_opts.url then
+        while 1 do
+            sys.wait(1000)
+            log.info("fota", "请修改正确的PRODUCT_KEY")
+        end
+    end
+    -- 等待网络就行后开始检查升级
+    sys.waitUntil("net_ready",10000)
+    sys.wait(500)
+    libfota2.request(fota_cb, ota_opts)
+end)
+
+-- 演示定时自动升级, 每隔4小时自动检查一次
+sys.timerLoopStart(libfota2.request, 4*3600000, fota_cb, ota_opts)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 44 - 0
olddemo/airlink/air8101_air780epm_sdata/main.lua

@@ -0,0 +1,44 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "netdrv"
+VERSION = "1.0.4"
+
+
+-- sys库是标配
+_G.sys = require("sys")
+
+wdt.init(3000)
+sys.timerLoopStart(function()
+    wdt.feed()
+    log.info("喂狗")
+end, 1000)
+
+sys.taskInit(function()
+    sys.wait(100)
+    -- 初始化airlink
+    airlink.init()
+
+    if rtos.bsp() == "Air8101" then
+        airlink.start(0)
+    else
+        airlink.start(1)
+    end
+    sys.wait(100)
+
+    while 1 do
+        -- 发送给对端设备
+        local data = rtos.bsp() .. " " .. os.date()
+        log.info("发送数据给对端设备", data, "当前airlink状态", airlink.ready())
+        airlink.sdata(data)
+        sys.wait(1000)
+    end
+end)
+
+sys.subscribe("AIRLINK_SDATA", function(data)
+    log.info("收到AIRLINK_SDATA!!", data)
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 166 - 0
olddemo/airlink/for_ccc/main.lua

@@ -0,0 +1,166 @@
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "air8000_factory"
+VERSION = "001.000.012"
+
+log.info("main", PROJECT, VERSION)
+
+-- 引入必要的库文件(lua编写), 内部库不需要require
+sys = require("sys")
+
+if wdt then
+    --添加硬狗防止程序卡死,在支持的设备上启用这个功能
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+-- log.setLevel(log.LOG_ERROR)
+
+local uartid = 1 -- 根据实际设备选取不同的uartid
+
+--初始化
+uart.setup(
+    uartid,--串口id
+    115200,--波特率
+    8,--数据位
+    1--停止位
+)
+
+-- gpio.setup(140, 1, gpio.PULLUP)
+
+local topic_uart_receive = "air8000_uart1_receive"
+
+-- --循环发数据
+-- sys.timerLoopStart(uart.write,1000, uartid, "test")
+uart.on(uartid, "sent", function(id)
+    log.info("uart", "sent", id)
+end)
+
+-- 收取数据会触发回调, 这里的"receive" 是固定值
+uart.on(uartid, "receive", function(id, len)
+    log.info("uart", "receive", id,len)
+    data = uart.read(id, len)
+    if data and len==#data then
+        log.info("uart", "receive", data)
+        sys.publish(topic_uart_receive,data)
+    elseif #data > 2 then
+        log.info("uart", "receive", data:toHex())
+        uart.write(uartid, "ERROR\r\n")
+    end
+end)
+
+local function ble_callback(ble_device, ble_event, ble_param)
+    if ble_event == ble.EVENT_SCAN_INIT then
+        log.info("ble", "scan init")
+    elseif ble_event == ble.EVENT_SCAN_REPORT then
+        log.info("ble", "scan report", ble_param.rssi, ble_param.adv_addr:toHex(), ble_param.data:toHex())
+    elseif ble_event == ble.EVENT_SCAN_STOP then
+        log.info("ble", "scan stop")
+    end
+end
+
+sys.taskInit(function()
+    while 1 do
+        local ret, data = sys.waitUntil(topic_uart_receive)
+        if ret then
+            if data:sub(1,10) == "AT+WIFIOFF" then--关闭wifi------------
+                local result = airlink.power(false)
+                log.info("关闭wifi")
+                if not result then
+                    uart.write(uartid, "OK\r\n")
+                else
+                    uart.write(uartid, "ERROR\r\n")
+                end
+            elseif data:sub(1,9) == "AT+WIFION" then--开启wifi
+                airlink.power(true)
+                while airlink.ready() ~= true do
+                    sys.wait(100)
+                end
+                local result = wlan.init()
+                log.info("开启wifi",result)
+                if result then
+                    uart.write(uartid, "OK\r\n")
+                else
+                    uart.write(uartid, "ERROR\r\n")--------------
+                end
+            elseif data:sub(1,11) == "AT+WIFISCAN" then--wifi扫描---------------
+                while airlink.ready() ~= true do
+                    sys.wait(100)
+                end
+                wlan.init()
+                wlan.scan()
+                log.info("扫描wifi")
+                sys.waitUntil("WLAN_SCAN_DONE", 5000)
+                local results = wlan.scanResult()
+                if results then
+                    uart.write(uartid, "OK\r\n")
+                else
+                    uart.write(uartid, "ERROR\r\n")
+                end
+            elseif data:sub(1,8) == "AT+WIFI=" then -- 连接指定ssid/passwd--------
+                wlan.init()
+
+                local SSID = data:sub(9,data:find(",")-1)
+                local PWD = data:sub(data:find(",")+1,data:find('\r')-1)
+
+                log.info("SSID", SSID,"PWD", PWD)
+                local result = wlan.connect(SSID, PWD)
+                log.info("连接指定wifi",result)
+
+                local result, ip, adapter = sys.waitUntil("IP_READY",5000)
+                log.info("ready?", result, ip, adapter)
+
+                if not result then
+                    uart.write(uartid, "ERROR\r\n")
+                else
+                    -- netdrv.ipv4(socket.LWIP_STA)
+                    log.info("IP地址", netdrv.ipv4(socket.LWIP_STA))
+
+                    uart.write(uartid, "OK\r\n")
+                end
+
+            elseif data:sub(1,10) == "AT+BLEINIT" then--初始化蓝牙
+                bluetooth_device = bluetooth.init()
+                ble_device = bluetooth_device:ble(ble_callback)
+                log.info("初始化蓝牙")
+                if ble_device then
+                    uart.write(uartid, "OK\r\n")
+                else
+                    uart.write(uartid, "ERROR\r\n")
+                end
+            elseif data:sub(1,10) == "AT+BLESCAN" then--蓝牙扫描
+
+                -- 扫描模式
+                sys.wait(1000)
+                local result = ble_device:scan_create() -- 使用默认参数, addr_mode=0, scan_interval=100, scan_window=100
+                -- ble_device:scan_create(0, 10, 10) -- 使用自定义参数
+                sys.wait(100)
+                log.info("开始扫描")
+                ble_device:scan_start()
+
+                sys.wait(5000)
+                log.info("停止扫描")
+                ble_device:scan_stop()
+                if result then
+                    uart.write(uartid, "OK\r\n")
+                else
+                    uart.write(uartid, "ERROR\r\n")
+                end
+
+            elseif data:sub(1,11) == "AT+RESETALL" then--整体复位
+                uart.write(uartid, "OK\r\n")
+                sys.wait(500)
+                rtos.reboot()
+
+            elseif #data > 2 then
+                log.info("uart", data:toHex())
+                uart.write(uartid, "ERROR\r\n")
+            end
+        end
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 78 - 0
olddemo/airlink/uart_http/main.lua

@@ -0,0 +1,78 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "airlink_uart_http"
+VERSION = "1.0.1"
+
+dnsproxy = require("dnsproxy")
+
+-----------------------------------
+-- 配置区域
+-----------------------------------
+is_gw = false -- 是否是网关模式, 要插卡, 要能联网
+uart_id = 1   -- 按实际接到UART的ID来设置, 1或2
+airlink.config(airlink.CONF_UART_ID, uart_id) -- 设置airlink使用的UART ID
+uart.setup(uart_id, 115200) -- 初始化UART1, 波特率115200, 8N1
+-- 注意, uart波特率的设置值,取决于两个设备的都支持的最高波特率, 例如2M也是可以的, 但要确保两个设备都支持2M波特率
+-------------------------------------
+
+
+sys.taskInit(function()
+    sys.wait(500)
+    log.info("airlink", "Starting airlink with UART task")
+    -- 初始化airlink
+    airlink.init()
+    -- 注册网卡
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE)
+    -- 启动airlink uart任务
+    airlink.start(2)
+
+    -- 网关模式下, ip设置为.1, 对端设置为.2
+    if is_gw then
+        netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+    else
+        netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1")
+    end
+    -- netdrv.debug(0, true)
+
+end)
+
+sys.taskInit(function()
+    sys.wait(1000)
+    while 1 do
+        -- 发送给对端设备
+        local data = rtos.bsp() .. " " .. os.date() .. " " .. (mobile and mobile.imei() or "")
+        log.info("client 发送数据给sever设备", data, "当前airlink状态", airlink.ready())
+        airlink.sdata(data)
+        -- airlink.test(1000) -- 要测试高速连续发送的情况
+        sys.wait(1000)
+    end
+end)
+
+sys.taskInit(function()
+    -- sys.waitUntil("IP_READY")
+    sys.wait(3000)
+    if is_gw then
+        log.info("airlink", "Gateway mode")
+        -- while netdrv.ready(socket.LWIP_USER0) == false do
+        while netdrv.ready(socket.LWIP_GP) == false do
+            sys.wait(100)
+        end
+        netdrv.napt(socket.LWIP_GP)
+        return
+    else
+        log.info("airlink", "Client mode")
+    end
+    while 1 do
+        sys.wait(500)
+        local code, headers, body = http.request("GET", "https://httpbin.air32.cn/bytes/2048", nil, nil, {adapter=socket.LWIP_USER0,timeout=3000}).wait()
+        log.info("http", code, body and #body)
+        -- log.info("lua", rtos.meminfo())
+        -- log.info("sys", rtos.meminfo("sys"))
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 64 - 0
olddemo/airlink/uart_sdata/main.lua

@@ -0,0 +1,64 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "airlink_uart"
+VERSION = "1.0.1"
+
+dnsproxy = require("dnsproxy")
+
+is_gw = true
+
+sys.taskInit(function()
+    sys.wait(500)
+    log.info("airlink", "Starting airlink with UART task")
+    -- 首先, 初始化uart1, 115200波特率 8N1
+    uart.setup(1, 115200)
+    -- 初始化airlink
+    airlink.init()
+    netdrv.setup(socket.LWIP_USER0, netdrv.WHALE) -- 初始化netdrv
+    -- 启动airlink uart任务
+    airlink.start(2)
+    if is_gw then
+        netdrv.ipv4(socket.LWIP_USER0, "192.168.111.1", "255.255.255.0", "192.168.111.2")
+    else
+        netdrv.ipv4(socket.LWIP_USER0, "192.168.111.2", "255.255.255.0", "192.168.111.1")
+    end
+    sys.wait(100)
+    --等待IP_READY事件
+    sys.waitUntil("IP_READY", 1000)
+    while 1 do
+        -- 发送给对端设备
+        local data = rtos.bsp() .. " " .. os.date() .. " " .. (mobile and mobile.imei() or "")
+        log.info("sever 发送数据给client设备", data, "当前airlink状态", airlink.ready())
+        airlink.sdata(data)
+        -- airlink.test(1000) -- 要测试高速连续发送的情况
+        sys.wait(1000)
+    end
+end)
+
+sys.taskInit(function()
+    -- sys.waitUntil("IP_READY")
+    sys.wait(3000)
+    if is_gw then
+        log.info("airlink", "Gateway mode")
+        while netdrv.ready(socket.LWIP_GP) == false do
+            sys.wait(100)
+            log.info("airlink", "Waiting for netdrv_READY")
+        end
+        log.info("airlink", "netdrv_READY")
+        netdrv.napt(socket.LWIP_GP)
+        dnsproxy.setup(socket.LWIP_USER0,socket.LWIP_GP)
+        return
+    else
+        log.info("airlink", "Client mode")
+    end
+end)
+
+--订阅IP_READY事件,打印收到的信息
+sys.subscribe("IP_READY", function(id,ip)
+    log.info("收到IP_READY!!", id,ip)
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 339 - 0
olddemo/airtalk/airtalk_dev_ctrl.lua

@@ -0,0 +1,339 @@
+local g_state = SP_T_NO_READY   --device状态
+local g_mqttc = nil             --mqtt客户端
+local g_local_id                  --本机ID
+local g_remote_id                 --对端ID
+local g_s_type                  --对讲的模式,字符串形式的
+local g_s_topic                 --对讲用的topic
+local g_s_mode                  --对讲的模式
+local g_dev_list                --对讲列表
+
+
+
+
+local function auth()
+    if g_state == SP_T_NO_READY then
+        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0001", json.encode({["key"] = PRODUCT_KEY, ["device_type"] = 1}))
+    end
+end
+
+local function heart()
+    if g_state == SP_T_CONNECTED then
+        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0005", json.encode({["from"] = g_local_id, ["to"] = g_remote_id}))
+    end
+end
+
+local function wait_speech_to()
+    log.info("主动请求对讲超时无应答")
+    speech_off(true, false)
+end
+
+--对讲开始,topic,ssrc,采样率(8K或者16K)这3个参数都有了之后就能进行对讲了,可以通过其他协议传入
+local function speech_on(ssrc, sample)
+    g_state = SP_T_CONNECTED
+    g_mqttc:subscribe(g_s_topic)
+    airtalk.set_topic(g_s_topic)
+    airtalk.set_ssrc(ssrc)
+    log.info("对讲模式", g_s_mode)
+    airtalk.speech(true, g_s_mode, sample)
+    sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_ON_IND, true) 
+    sys.timerLoopStart(heart, 150000)
+    sys.timerStopAll(wait_speech_to)
+    log.info("对讲接通,可以说话了")
+end
+--对讲结束
+local function speech_off(need_upload, need_ind)
+    if g_state ==  SP_T_CONNECTED then
+        g_mqttc:unsubscribe(g_s_topic)
+        airtalk.speech(false)
+        g_s_topic = nil
+    end
+    g_state = SP_T_IDLE
+    sys.timerStopAll(auth)
+    sys.timerStopAll(heart)
+    sys.timerStopAll(wait_speech_to)
+    log.info("对讲断开了")
+    if need_upload then
+        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0004", json.encode({["to"] = g_remote_id}))
+    end
+    if need_ind then
+        sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_OFF_IND, true)
+    end
+end
+
+
+local function analyze_v1(cmd, topic, obj)
+    if cmd == "8005" or cmd == "8004" then       -- 对讲心跳保持和结束对讲的应答不做处理
+        return
+    end
+    if cmd == "8003" then       -- 请求对讲应答
+        if g_state ~= SP_T_CONNECTING then  --没有发起对讲请求
+            log.error("state", g_state, "need", SP_T_CONNECTING)
+            return
+        else
+            if obj and obj["result"] == SUCC and g_s_topic == obj["topic"]then  --完全正确,开始对讲
+                speech_on(obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
+                return
+            else
+                log.info(obj["result"], obj["topic"], g_s_topic)
+                sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_ON_IND, false)   --有异常,无法对讲
+            end
+            
+        end
+        g_s_topic = nil
+        g_state = SP_T_IDLE
+        return
+    end
+    local new_obj = nil
+    if cmd == "0102" then       -- 对端打过来
+        if obj and obj["topic"] and obj["ssrc"] and obj["audio_code"] and obj["type"] then
+            if g_state ~= SP_T_IDLE then    -- 空闲状态下才可以进入对讲状态
+                log.error("state", g_state, "need", SP_T_IDLE)
+                new_obj = {["result"] = "failed", ["topic"] = obj["topic"], ["info"] = "device is busy"}
+            else
+                if obj["type"] == "one-on-one" then -- 1对1对讲
+                    local from = string.match(obj["topic"], "audio/.*/(.*)/.*")
+                    if from then
+                        log.info("remote id ", from)
+                        g_s_topic = obj["topic"]
+                        g_remote_id = from
+                        new_obj = {["result"] = SUCC, ["topic"] = obj["topic"], ["info"] = ""}
+                        g_s_type = "one-on-one"
+                        g_s_mode = airtalk.MODE_PERSON
+                        speech_on(obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
+                    else
+                        new_obj = {["result"] = "failed", ["topic"] = obj["topic"], ["info"] = "topic error"}
+                    end
+                elseif obj["type"] == "broadcast" then  -- 1对多对讲
+                    g_s_topic = obj["topic"]
+                    new_obj = {["result"] = SUCC, ["topic"] = obj["topic"], ["info"] = ""}
+                    g_s_mode = airtalk.MODE_GROUP_LISTENER
+                    g_s_type = "broadcast"
+                    speech_on(obj["ssrc"], obj["audio_code"] == "amr-nb" and 8000 or 16000)
+                end
+            end
+        else
+            new_obj = {["result"] = "failed", ["topic"] = obj["topic"], ["info"] = "json info error"}
+        end
+        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/8102", json.encode(new_obj))
+        return
+    end
+
+    if cmd == "0103" then   --对端挂断
+        if g_state == SP_T_IDLE then
+            new_obj = {["result"] = "failed", ["info"] = "no speech"}
+        else
+            if obj and obj["type"] == g_s_type then
+                new_obj = {["result"] = SUCC, ["info"] = ""}
+                speech_off(false, true)
+            else
+                new_obj = {["result"] = "failed", ["info"] = "type mismatch"}
+            end
+        end
+        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/8103", json.encode(new_obj))
+        return
+    end
+
+    if cmd == "0101" then                        --更新设备列表
+        if obj then
+            g_dev_list = obj["dev_list"]
+            -- for i=1,#g_dev_list do
+            --     log.info(g_dev_list[i]["id"],g_dev_list[i]["name"])
+            -- end
+            new_obj = {["result"] = SUCC, ["info"] = ""}
+        else
+            new_obj = {["result"] = "failed", ["info"] = "json info error"}
+        end
+        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/8101", json.encode(new_obj))
+        return
+    end
+    if cmd == "8001" then
+        if obj and obj["result"] == SUCC then
+            g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0002","")  -- 更新列表
+        else
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_AUTH_IND, false, "鉴权失败" .. obj["info"]) 
+        end
+        return
+    end
+    if cmd == "8002" then
+        if obj and obj["result"] == SUCC then   --收到设备列表更新应答,才能认为相关网络服务准备好了
+            g_dev_list = obj["dev_list"]
+            -- for i=1,#g_dev_list do
+            --     log.info(g_dev_list[i]["id"],g_dev_list[i]["name"])
+            -- end
+            g_state = SP_T_IDLE
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_AUTH_IND, true)  --完整登录流程结束
+        else
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_AUTH_IND, false, "更新设备列表失败") 
+        end
+        return
+    end
+end
+
+local function mqtt_cb(mqttc, event, topic, payload)
+    log.info(event, topic)
+    local msg,data,obj
+    if event == "conack" then
+        sys.sendMsg(AIRTALK_TASK_NAME, MSG_CONNECT_ON_IND) --mqtt连上了,开始自定义的鉴权流程
+        g_mqttc:subscribe("ctrl/downlink/" .. g_local_id .. "/#")--单主题订阅
+    elseif event == "suback" then
+        if g_state == SP_T_NO_READY then
+            if topic then
+                auth()
+            else
+                sys.sendMsg(AIRTALK_TASK_NAME, MSG_AUTH_IND, false, "订阅失败" .. "ctrl/downlink/" .. g_local_id .. "/#") 
+            end
+        elseif g_state == SP_T_CONNECTED then
+            if not topic then
+                speech_off(false, true)
+            end
+        end
+    elseif event == "recv" then
+        local result = string.match(topic, g_dl_topic)
+        if result then 
+            local obj,res,err = json.decode(payload)
+            analyze_v1(result, topic, obj)
+        end
+        result = nil
+        data = nil
+        obj = nil
+        
+    elseif event == "sent" then
+        -- log.info("mqtt", "sent", "pkgid", data)
+    elseif event == "disconnect" then
+        speech_off(false, true)
+        g_state = SP_T_NO_READY
+    elseif event == "error" then
+
+    end
+end
+
+local function task_cb(msg)
+    if msg[1] == MSG_SPEECH_CONNECT_TO then
+        speech_off(true,false)
+    else
+        log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
+    end
+end
+
+local function airtalk_event_cb(event, param)
+    log.info("airtalk event", event, param)
+    if event == airtalk.EVENT_ERROR then
+        if param == airtalk.ERROR_NO_DATA then
+            log.error("长时间没有收到音频数据")
+            speech_off(true, true)
+        end
+    end
+end
+
+local function airtalk_mqtt_task()
+    local msg,data,obj,online,num,res
+    --g_local_id也可以自己设置
+    g_local_id = mobile.imei()
+    g_dl_topic = "ctrl/downlink/" .. g_local_id .. "/(%w%w%w%w)"
+    sys.timerLoopStart(next_auth, 900000)
+
+    g_mqttc = mqtt.create(nil, "mqtt.airtalk.luatos.com", 1883, false, {rxSize = 32768})
+    airtalk.config(airtalk.PROTOCOL_MQTT, g_mqttc, 200) -- 缓冲至少200ms播放
+    airtalk.on(airtalk_event_cb)
+    airtalk.start()
+
+    g_mqttc:auth(g_local_id,g_local_id,mobile.muid()) -- g_local_id必填,其余选填
+    g_mqttc:keepalive(240) -- 默认值240s
+    g_mqttc:autoreconn(true, 15000) -- 自动重连机制
+    g_mqttc:debug(false)
+    g_mqttc:on(mqtt_cb)
+    log.info("设备信息", g_local_id, mobile.muid())
+    -- mqttc自动处理重连, 除非自行关闭
+    g_mqttc:connect()
+    online = false
+    while true do
+        msg = sys.waitMsg(AIRTALK_TASK_NAME, MSG_CONNECT_ON_IND)   --等服务器连上
+        log.info("connected")
+        while not online do
+            msg = sys.waitMsg(AIRTALK_TASK_NAME, MSG_AUTH_IND, 30000)   --登录流程不应该超过30秒
+            if type(msg) == 'table' then
+                online = msg[2]
+                if online then
+                    sys.timerLoopStart(auth, 3600000) --鉴权通过则60分钟后尝试重新鉴权
+                else
+                    log.info(msg[3])
+                    sys.timerLoopStart(auth, 300000)       --5分钟后重新鉴权
+                end
+            else
+                auth()  --30秒鉴权无效后重新鉴权
+            end
+        end
+        log.info("对讲管理平台已连接")
+        while online do
+            msg = sys.waitMsg(AIRTALK_TASK_NAME)
+            if type(msg) == 'table' and type(msg[1]) == "number" then
+                if msg[1] == MSG_PERSON_SPEECH_TEST_START then
+                    if g_state ~= SP_T_IDLE then
+                        log.info("正在对讲无法开始")
+                    else
+                        log.info("测试一下主动1对1对讲功能,找一个有效的IMEI")
+
+                        for i=1,#g_dev_list do
+                            res = string.match(g_dev_list[i]["id"], "(%w%w%w%w%w%w%w%w%w%w%w%w%w%w%w)")
+                            if res and res ~= g_local_id then
+                                break
+                            end
+                        end
+                        if res then
+                            log.info("向", res, "主动发起对讲")
+                            g_state = SP_T_CONNECTING
+                            g_remote_id = res
+                            g_s_mode = airtalk.MODE_PERSON
+                            g_s_type = "one-on-one"
+                            g_s_topic = "audio/" .. g_local_id .. "/" .. g_remote_id .. "/" .. (string.sub(tostring(mcu.ticks()), -4, -1))
+                            g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0003", json.encode({["topic"] = g_s_topic, ["type"] = g_s_type}))
+                            sys.timerStart(wait_speech_to, 15000)
+                        else
+                            log.info("找不到有效的设备ID")
+                        end
+                    end
+                elseif msg[1] == MSG_GROUP_SPEECH_TEST_START then
+                    if g_state ~= SP_T_IDLE then
+                        log.info("正在对讲无法开始")
+                    else
+                        log.info("测试一下1对多对讲功能")
+                        g_remote_id = "all"
+                        g_state = SP_T_CONNECTING
+                        g_s_mode = airtalk.MODE_GROUP_SPEAKER
+                        g_s_type = "broadcast"
+                        g_s_topic = "audio/" .. g_local_id .. "/all/" .. (string.sub(tostring(mcu.ticks()), -4, -1))
+                        g_mqttc:publish("ctrl/uplink/" .. g_local_id .."/0003", json.encode({["topic"] = g_s_topic, ["type"] = g_s_type}))
+                        sys.timerStart(wait_speech_to, 15000)
+                    end
+                elseif msg[1] == MSG_SPEECH_STOP_TEST_END then
+                    if g_state ~= SP_T_CONNECTING and g_state ~= SP_T_CONNECTED then
+                        log.info("没有对讲", g_state)
+                    else
+                        log.info("主动断开对讲")
+                        speech_off(true, false)
+                    end
+                elseif msg[1] == MSG_SPEECH_ON_IND then
+                    if msg[2] then
+                        log.info("对讲接通")
+                    else
+                        log.info("对讲断开")
+                    end
+                elseif msg[1] == MSG_CONNECT_OFF_IND then
+                    log.info("connect", msg[2])
+                    online = msg[2]
+                end
+                obj = nil
+            else
+                log.info(type(msg), type(msg[1]))
+            end
+            msg = nil
+        end
+        online = false
+    end
+end
+
+function airtalk_mqtt_init()
+    sys.taskInitEx(airtalk_mqtt_task, AIRTALK_TASK_NAME, task_cb)
+end
+
+

+ 79 - 0
olddemo/airtalk/audio_config.lua

@@ -0,0 +1,79 @@
+function audio_init()
+    pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)
+    -- local multimedia_id = 0
+
+    -- local i2s_id = 0
+    -- local i2s_mode = 0
+    -- local i2s_sample_rate = 16000
+    -- local i2s_bits_per_sample = 16
+    -- local i2s_channel_format = i2s.MONO_R
+    -- local i2s_communication_format = i2s.MODE_LSB
+    -- local i2s_channel_bits = 16
+    -- --air8000 core开发版+音频小板配置
+    -- local voice_vol = 60 --音频小板喇叭太容易失真了,不能太大
+    -- local i2c_id = 0
+    -- local pa_pin = 162           -- 喇叭pa功放脚
+    -- local pa_on_level = 1
+    -- local pa_delay = 200
+    -- local dac_power_pin = 164
+    -- local dac_power_on_level = 1
+    -- local dac_power_off_delay = 600
+    -- gpio.setup(24, 1)   --air8000的I2C0需要拉高gpio24才能用
+    -- gpio.setup(26, 0)
+    -- i2c.setup(0, i2c.FAST)
+    -- gpio.setup(24, 1, gpio.PULLUP)          -- i2c工作的电压域
+    -- sys.wait(100)
+    -- gpio.setup(dac_power_pin, 1, gpio.PULLUP)   -- 打开音频编解码供电
+    -- gpio.setup(pa_pin, 1, gpio.PULLUP)      -- 打开音频放大器
+    -- audio.on(0, audio_callback)
+
+    -- i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,i2s_channel_bits)
+
+    -- audio.config(multimedia_id, pa_pin, pa_on_level, 0, pa_delay, dac_power_pin, dac_power_on_level, dac_power_off_delay)
+    -- audio.setBus(multimedia_id, audio.BUS_I2S,{chip = "es8311",i2cid = i2c_id , i2sid = i2s_id})	--通道0的硬件输出通道设置为I2S
+
+    -- audio.vol(multimedia_id, voice_vol)
+    -- audio.micVol(multimedia_id, 75)
+     local multimedia_id = 0
+ local i2c_id = 0 -- i2c_id 0
+
+    local pa_pin = gpio.AUDIOPA_EN -- 喇叭pa功放脚
+    local power_pin = 20 -- es8311电源脚
+
+    local i2s_id = 0 -- i2s_id 0
+    local i2s_mode = 0 -- i2s模式 0 主机 1 从机
+    local i2s_sample_rate = 16000 -- 采样率
+    local i2s_bits_per_sample = 16 -- 数据位数
+    local i2s_channel_format = i2s.MONO_R -- 声道, 0 左声道, 1 右声道, 2 立体声
+    local i2s_communication_format = i2s.MODE_LSB -- 格式, 可选MODE_I2S, MODE_LSB, MODE_MSB
+    local i2s_channel_bits = 16 -- 声道的BCLK数量
+
+    local multimedia_id = 0 -- 音频通道 0
+    local pa_on_level = 1 -- PA打开电平 1 高电平 0 低电平
+    local power_delay = 3 -- 在DAC启动前插入的冗余时间,单位100ms
+    local pa_delay = 100 -- 在DAC启动后,延迟多长时间打开PA,单位1ms
+    local power_on_level = 1 -- 电源控制IO的电平,默认拉高
+    local power_time_delay = 100 -- 音频播放完毕时,PA与DAC关闭的时间间隔,单位1ms
+
+    local voice_vol = 70 -- 喇叭音量
+    local mic_vol = 80 -- 麦克风音量
+    gpio.setup(power_pin, 1, gpio.PULLUP)
+    gpio.setup(pa_pin, 1, gpio.PULLUP)
+
+    sys.wait(200)
+
+    i2c.setup(i2c_id, i2c.FAST) -- 设置i2c
+    i2s.setup(i2s_id, i2s_mode, i2s_sample_rate, i2s_bits_per_sample, i2s_channel_format, i2s_communication_format,
+        i2s_channel_bits) -- 设置i2s
+
+    audio.config(multimedia_id, pa_pin, pa_on_level, power_delay, pa_delay, power_pin, power_on_level, power_time_delay)
+    audio.setBus(multimedia_id, audio.BUS_I2S, {
+        chip = "es8311",
+        i2cid = i2c_id,
+        i2sid = i2s_id,
+    }) -- 通道0的硬件输出通道设置为I2S
+
+    audio.vol(multimedia_id, voice_vol)
+    audio.micVol(multimedia_id, mic_vol)
+
+end

+ 27 - 0
olddemo/airtalk/demo_define.lua

@@ -0,0 +1,27 @@
+
+AIRTALK_TASK_NAME = "airtalk_task"
+USER_TASK_NAME = "user"
+
+MSG_CONNECT_ON_IND = 0
+MSG_CONNECT_OFF_IND = 1
+MSG_AUTH_IND = 2
+MSG_SPEECH_ON_IND = 3
+MSG_SPEECH_OFF_IND = 4
+MSG_SPEECH_CONNECT_TO = 5
+
+MSG_PERSON_SPEECH_TEST_START = 20
+MSG_GROUP_SPEECH_TEST_START = 21
+MSG_SPEECH_STOP_TEST_END = 22
+
+
+MSG_READY = 10
+MSG_NOT_READY = 11
+MSG_KEY_PRESS = 12
+
+SP_T_NO_READY = 0           -- 离线状态无法对讲
+SP_T_IDLE = 1               -- 对讲空闲状态
+SP_T_CONNECTING = 2         -- 主动发起对讲
+SP_T_CONNECTED = 3          -- 对讲中
+
+
+SUCC = "success"

+ 68 - 0
olddemo/airtalk/main.lua

@@ -0,0 +1,68 @@
+--演示airtalk基本功能
+--按一次boot,开始1对1对讲,再按一次boot,结束对讲
+--按一次powerkey,开始1对多对讲,再按一次powerkey或者boot,结束对讲
+PROJECT = "airtalk_demo"
+VERSION = "1.0.1"
+PRODUCT_KEY = "s1uUnY6KA06ifIjcutm5oNbG3MZf5aUv" -- 到 iot.openluat.com 创建项目,获取正确的项目id
+_G.sys=require"sys"
+log.style(1)
+require "demo_define"
+require "airtalk_dev_ctrl"
+require "audio_config"
+
+--errDump.config(true, 600, "airtalk_test")
+mcu.hardfault(0)
+local function boot_key_cb()
+    sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, false)
+end
+
+local function power_key_cb()
+    sys.sendMsg(USER_TASK_NAME, MSG_KEY_PRESS, true)
+end
+
+--按下boot开始上传,再按下停止,加入了软件去抖,不需要长按了
+gpio.setup(0, boot_key_cb, gpio.PULLDOWN, gpio.RISING)
+gpio.debounce(0, 200, 1)
+gpio.setup(gpio.PWR_KEY, power_key_cb, gpio.PULLUP, gpio.FALLING)
+gpio.debounce(gpio.PWR_KEY, 200, 1)
+
+local test_ready = false
+local function task_cb(msg)
+    log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
+    if msg[1] == MSG_SPEECH_IND then
+
+    elseif msg[1] == MSG_NOT_READY then
+        test_ready = false
+        msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)
+    end
+end
+
+local function user_task()
+    audio_init()
+    airtalk_mqtt_init()
+    local msg
+    while true do
+        msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)
+        if msg[2] then  -- true powerkey false boot key
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_GROUP_SPEECH_TEST_START)   --测试阶段自动给一个device打
+        else
+            sys.sendMsg(AIRTALK_TASK_NAME, MSG_PERSON_SPEECH_TEST_START)   --测试阶段自动给一个device打
+        end 
+        msg = sys.waitMsg(USER_TASK_NAME, MSG_KEY_PRESS)
+        sys.sendMsg(AIRTALK_TASK_NAME, MSG_SPEECH_STOP_TEST_END)        --再按一次就自动挂断
+    end
+end
+
+sys.taskInitEx(user_task, USER_TASK_NAME, task_cb)
+
+--定期检查ram使用情况,及时发现内存泄露
+sys.taskInit(function()
+    while true do
+        sys.wait(60000)
+        log.info("time", os.time())
+        log.info("lua", rtos.meminfo("lua"))
+        log.info("sys", rtos.meminfo("sys"))
+        log.info("psram", rtos.meminfo("psram"))
+    end
+end)
+sys.run()

BIN
olddemo/airui/0804_demo/A1.jpg


BIN
olddemo/airui/0804_demo/A2.jpg


BIN
olddemo/airui/0804_demo/A3.jpg


BIN
olddemo/airui/0804_demo/A4.jpg


BIN
olddemo/airui/0804_demo/A5.jpg


BIN
olddemo/airui/0804_demo/A6.jpg


BIN
olddemo/airui/0804_demo/A7.jpg


BIN
olddemo/airui/0804_demo/A8.jpg


BIN
olddemo/airui/0804_demo/A9.jpg


BIN
olddemo/airui/0804_demo/B1.jpg


BIN
olddemo/airui/0804_demo/B2.jpg


BIN
olddemo/airui/0804_demo/B3.jpg


BIN
olddemo/airui/0804_demo/B4.jpg


BIN
olddemo/airui/0804_demo/B5.jpg


BIN
olddemo/airui/0804_demo/B6.jpg


BIN
olddemo/airui/0804_demo/B7.jpg


BIN
olddemo/airui/0804_demo/B8.jpg


BIN
olddemo/airui/0804_demo/B9.jpg


BIN
olddemo/airui/0804_demo/C1.jpg


BIN
olddemo/airui/0804_demo/C2.jpg


BIN
olddemo/airui/0804_demo/C3.jpg


BIN
olddemo/airui/0804_demo/C4.jpg


BIN
olddemo/airui/0804_demo/C5.jpg


BIN
olddemo/airui/0804_demo/C6.jpg


BIN
olddemo/airui/0804_demo/C7.jpg


BIN
olddemo/airui/0804_demo/C8.jpg


BIN
olddemo/airui/0804_demo/C9.jpg


BIN
olddemo/airui/0804_demo/D1.jpg


BIN
olddemo/airui/0804_demo/D7.jpg


BIN
olddemo/airui/0804_demo/D9.jpg


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác