Pārlūkot izejas kodu

add:airlink powerSave设置省电模式

Jiangqian 9 mēneši atpakaļ
vecāks
revīzija
4bb120b410

+ 19 - 1
components/airlink/src/driver/luat_airlink_drv_wlan.c

@@ -167,7 +167,25 @@ const char* luat_airlink_drv_wlan_get_hostname(int id);
 int luat_airlink_drv_wlan_set_hostname(int id, const char* hostname);
 
 // 设置和获取省电模式
-int luat_airlink_drv_wlan_set_ps(int mode);
+int luat_airlink_drv_wlan_set_ps(int mode)
+{
+    uint8_t c_mode = mode;
+
+    uint64_t luat_airlink_next_cmd_id = luat_airlink_get_next_cmd_id();
+    airlink_queue_item_t item = {
+        .len = sizeof(luat_airlink_cmd_t) + 8 + 1
+    };
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x208, item.len) ;
+    if (cmd == NULL) {
+        return -101;
+    }
+    memcpy(cmd->data, &luat_airlink_next_cmd_id, 8);
+    memcpy(cmd->data + 8, &c_mode, 1);
+    
+    item.cmd = cmd;
+    luat_airlink_queue_send(LUAT_AIRLINK_QUEUE_CMD, &item);
+    return 0;
+}
 
 int luat_airlink_drv_wlan_get_ps(void);
 

+ 8 - 0
components/airlink/src/exec/luat_airlink_cmd_exec_wlan.c

@@ -102,3 +102,11 @@ int luat_airlink_cmd_exec_wlan_set_mac(luat_airlink_cmd_t* cmd, void* userdata)
     int ret = luat_wlan_set_mac((int)id, (char*)mac);
     return ret;
 }
+
+int luat_airlink_cmd_exec_wlan_set_ps(luat_airlink_cmd_t* cmd, void* userdata) {
+
+    uint8_t mode = cmd->data[8];
+
+    int ret = luat_wlan_set_ps((int)mode);
+    return ret;
+}

+ 2 - 0
components/airlink/src/luat_airlink_cmds.c

@@ -50,6 +50,7 @@ CMD_DEFINE(wlan_ap_stop);
 CMD_DEFINE(wlan_scan);
 CMD_DEFINE(wlan_scan_result_cb);
 CMD_DEFINE(wlan_set_mac);
+CMD_DEFINE(wlan_set_ps);
 
 // GPIO指令, 0x300开始
 CMD_DEFINE(gpio_setup);
@@ -105,6 +106,7 @@ __USER_FUNC_IN_RAM__ const luat_airlink_cmd_reg_t airlink_cmds[] = {
     CMD_REG(0x204, wlan_ap_stop),
     CMD_REG(0x205, wlan_scan),
     CMD_REG(0x207, wlan_set_mac),
+    CMD_REG(0x208, wlan_set_ps),
 #else
     CMD_REG(0x206, wlan_scan_result_cb),
 #endif

+ 1 - 0
components/drv/include/luat/drv_wlan.h

@@ -35,6 +35,7 @@ const char* luat_drv_wlan_get_hostname(int id);
 int luat_drv_wlan_set_hostname(int id, const char* hostname);
 
 // 设置和获取省电模式
+int luat_drv_wlan_drv_set_ps(int mode);
 int luat_drv_wlan_set_ps(int mode);
 
 int luat_drv_wlan_get_ps(void);

+ 4 - 5
components/drv/src/luat_drv_wlan.c

@@ -78,9 +78,8 @@ int luat_drv_wlan_set_hostname(int id, const char* hostname) {
     return -1;
 }
 
-// 设置和获取省电模式
-int luat_drv_wlan_set_ps(int mode) {
-    return -1;
+int luat_drv_wlan_drv_set_ps(int mode) {
+    return luat_airlink_drv_wlan_set_ps(mode);
 }
 
 int luat_drv_wlan_get_ps(void) {
@@ -186,8 +185,8 @@ int luat_wlan_set_hostname(int id, const char* hostname) {
 }
 
 // 设置和获取省电模式
-int luat_wlan_set_ps(int mode) {
-    return luat_drv_wlan_set_ps(mode);
+int luat_drv_wlan_set_ps(int mode) {
+    return luat_drv_wlan_drv_set_ps(mode);
 }
 
 int luat_wlan_get_ps(void) {

+ 4 - 0
components/wlan/luat_lib_wlan.c

@@ -551,7 +551,11 @@ static int l_wlan_powerSave(lua_State *L) {
     int mode = 0;
     if (lua_isinteger(L, 1)) {
         mode = luaL_checkinteger(L, 1);
+        #ifdef LUAT_USE_DRV_WLAN
+        luat_drv_wlan_set_ps(mode);
+        #else
         luat_wlan_set_ps(mode);
+        #endif
     }
     mode = luat_wlan_get_ps();
     lua_pushinteger(L, mode);

+ 148 - 0
module/Air8000/demo/wlan/Power_Save/main.lua

@@ -0,0 +1,148 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "power_save"
+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("uiot_5678", "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")
+
+    local n = 2
+    sys.wait(5000)
+    while n > 0 do
+        log.info("wlan", "info","n=",n ,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)
+        n = n - 1
+        -- 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脚本...")
+
+    wlan.init()
+    -- sys.wait(5000)
+    
+    sys.wait(300)
+    test_ap()
+    
+    -- 连接STA测试
+    -- sys.wait(300)
+    -- test_sta()
+
+    -- sys.wait(10000)
+    sys.wait(2000)
+    wlan.powerSave(0)
+    log.info("power save mode 000000")
+
+    -- wifi扫描测试
+    -- test_scan()
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!