Browse Source

add: airlink,air8000添加wifi事件回调消息,详细用法看看 demo/airlink/air8000_wifi

Wendal Chen 9 months ago
parent
commit
cfcab6629c

+ 9 - 0
components/airlink/include/luat_airlink.h

@@ -251,6 +251,15 @@ int luat_airlink_drv_uart_close(int uart_id);
 
 extern uint32_t g_airlink_debug;
 
+int luat_airlink_syspub_addstring(const char* str, size_t len, uint8_t *dst, uint32_t limit);
+int luat_airlink_syspub_addfloat32(const float val, uint8_t *dst, uint32_t limit);
+int luat_airlink_syspub_addint32(const int32_t val, uint8_t *dst, uint32_t limit);
+int luat_airlink_syspub_addnil(const uint8_t *dst, uint32_t limit);
+int luat_airlink_syspub_addbool(const uint8_t b, uint8_t *dst, uint32_t limit);
+
+int luat_airlink_syspub_send(uint8_t* buff, size_t len);
+
+
 #ifdef TYPE_EC718M
 #include "platform_def.h"
 #endif

+ 13 - 6
components/airlink/src/exec/luat_airlink_cmd_exec_basic.c

@@ -134,21 +134,26 @@ static int push_args(lua_State *L, uint8_t* ptr, uint32_t* limit) {
     switch (type)
     {
     case LUA_TSTRING:
+        // LLOGD("添加字符串 %.*s", len, ptr + 2);
         lua_pushlstring(L, (const char*)ptr + 2, len);
         break;
     case LUA_TNUMBER:
         memcpy(&f, ptr + 2, 4);
+        // LLOGD("添加浮点数 %f", f);
         lua_pushnumber(L, f);
         break;
     case LUA_TINTEGER:
         memcpy(&i, ptr + 2, 4);
+        // LLOGD("添加整数 %d", i);
         lua_pushinteger(L, i);
         break;
     case LUA_TBOOLEAN:
         memcpy(&b, ptr + 2, 1);
+        // LLOGD("添加bool %d", b);
         lua_pushboolean(L, b);
         break;
     case LUA_TNIL:
+        // LLOGD("添加nil");
         lua_pushnil(L);
         break;
     
@@ -174,23 +179,25 @@ static int l_airlink_sys_pub(lua_State *L, void* ptr) {
         tmp += ret;
         c ++;
     }
-    lua_pcall(L, c + 1, 0, 0);
+    lua_pcall(L, c, 0, 0);
     return 0;
 }
 
 int luat_airlink_cmd_exec_notify_sys_pub(luat_airlink_cmd_t *cmd, void *userdata) {
-    if (cmd->len < 9) {
+    // LLOGD("收到sys_pub指令!!! %d", cmd->len);
+    if (cmd->len < 12) {
+        LLOGD("非法的sys_pub指令,长度不足 %d", cmd->len);
         return 0;
     }
     rtos_msg_t msg = {0};
     msg.handler = l_airlink_sys_pub;
-    msg.ptr = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, cmd->len);
+    msg.ptr = luat_heap_opt_malloc(AIRLINK_MEM_TYPE, cmd->len - 8);
     if (msg.ptr == NULL) {
-        LLOGE("l_airlink_sys_pub malloc fail!!! %d", cmd->len);
+        LLOGE("l_airlink_sys_pub malloc fail!!! %d", cmd->len - 8);
         return 0;
     }
-    memcpy(msg.ptr, cmd->data, cmd->len);
-    msg.arg1 = cmd->len;
+    memcpy(msg.ptr, cmd->data + 8, cmd->len - 8);
+    msg.arg1 = cmd->len - 8;
     luat_msgbus_put(&msg, 0);
     return 0;
 }

+ 71 - 0
components/airlink/src/luat_airlink.c

@@ -369,3 +369,74 @@ int luat_airlink_send_cmd_simple(uint16_t cmd_id, uint8_t* data, uint16_t len) {
     luat_heap_opt_free(AIRLINK_MEM_TYPE, cmd);
     return 0;
 }
+
+// 添加syspub所需的数据
+
+int luat_airlink_syspub_addstring(const char* str, size_t len, uint8_t *dst, uint32_t limit) {
+    if (len + 2 > limit) {
+        return -1;
+    }
+    uint8_t tmp = LUA_TSTRING;
+    memcpy(dst, &tmp, 1);
+    tmp = (uint8_t)len;
+    memcpy(dst + 1, &tmp, 1);
+    memcpy(dst + 2, str, len);
+    return len + 2;
+}
+
+int luat_airlink_syspub_addfloat32(const float val, uint8_t *dst, uint32_t limit) {
+    if (4 + 2 > limit) {
+        return -1;
+    }
+    uint8_t tmp = LUA_TNUMBER;
+    memcpy(dst, &tmp, 1);
+    tmp = (uint8_t)4;
+    memcpy(dst + 1, &tmp, 1);
+    memcpy(dst + 2, &val, 4);
+    return 4 + 2;
+}
+
+int luat_airlink_syspub_addint32(const int32_t val, uint8_t *dst, uint32_t limit) {
+    if (4 + 2 > limit) {
+        return -1;
+    }
+    uint8_t tmp = LUA_TINTEGER;
+    memcpy(dst, &tmp, 1);
+    tmp = (uint8_t)4;
+    memcpy(dst + 1, &tmp, 1);
+    memcpy(dst + 2, &val, 4);
+    return 4 + 2;
+}
+
+int luat_airlink_syspub_addnil(const uint8_t *dst, uint32_t limit) {
+    if (2 > limit) {
+        return -1;
+    }
+    uint8_t tmp = LUA_TBOOLEAN;
+    memcpy(dst, &tmp, 1);
+    tmp = (uint8_t)4;
+    memcpy(dst + 1, &tmp, 1);
+    return 2;
+}
+int luat_airlink_syspub_addbool(const uint8_t b, uint8_t *dst, uint32_t limit) {
+    if (1 + 2 > limit) {
+        return -1;
+    }
+    uint8_t tmp = LUA_TINTEGER;
+    memcpy(dst, &tmp, 1);
+    tmp = (uint8_t)4;
+    memcpy(dst + 1, &tmp, 1);
+    memcpy(dst + 2, &b, 1);
+    return 1 + 2;
+}
+
+int luat_airlink_syspub_send(uint8_t* buff, size_t len) {
+    // LLOGD("传输syspub命令数据 %d", len);
+    luat_airlink_cmd_t* cmd = luat_airlink_cmd_new(0x80, 8 + len);
+    uint64_t pkgid = luat_airlink_get_next_cmd_id();
+    memcpy(cmd->data, &pkgid, 8);
+    memcpy(cmd->data + 8, buff, len);
+    luat_airlink_send2slave(cmd);
+    luat_airlink_cmd_free(cmd);
+    return 0;
+}

+ 53 - 17
demo/airlink/air8000_wifi/main.lua

@@ -1,11 +1,8 @@
 
 -- LuaTools需要PROJECT和VERSION这两个信息
-PROJECT = "air8000_gpio_ext"
+PROJECT = "air8000_wifi"
 VERSION = "1.0.5"
 
--- sys库是标配
-_G.sys = require("sys")
-require "sysplus"
 dnsproxy = require("dnsproxy")
 dhcpsrv = require("dhcpsrv")
 httpplus = require("httpplus")
@@ -29,8 +26,15 @@ 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(100)
+    for i=1, 10 do
+        log.info("当前ip信息", netdrv.ipv4(socket.LWIP_AP))
+        sys.wait(100)
+    end
+    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
@@ -41,26 +45,55 @@ function test_ap()
     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)
+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("收到STA事件", evt)
+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("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请求")
+        -- 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()
+        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扫描")
@@ -77,21 +110,24 @@ sys.subscribe("WLAN_SCAN_DONE", function ()
 end)
 
 --  每隔6秒打印一次airlink统计数据, 调试用
-sys.taskInit(function()
-    while 1 do
-        sys.wait(6000)
-        airlink.statistics()
-    end
-end)
+-- sys.taskInit(function()
+--     while 1 do
+--         sys.wait(6000)
+--         airlink.statistics()
+--     end
+-- end)
 
 sys.taskInit(function()
     log.info("新的Air8000脚本...")
 
-    sys.wait(200) -- 稍微缓一下, Air8000S的启动大概需要300ms
+    -- sys.wait(200) -- 稍微缓一下, Air8000S的启动大概需要300ms
+    -- 启动AP测试
+    -- netdrv.setup(socket.LWIP_STA, netdrv.WHALE)
+    -- netdrv.setup(socket.LWIP_AP, netdrv.WHALE)
     wlan.init()
-    sys.wait(100)
+    -- sys.wait(5000)
     
-    -- 启动AP测试
+    -- sys.wait(300)
     -- test_ap()
 
     -- 连接STA测试

+ 0 - 12
demo/airlink/air8000_wifi_ap_httpsrv/main.lua

@@ -118,18 +118,6 @@ end)
 -- end)
 
 sys.taskInit(function()
-    -- -- 稍微缓一下
-    -- sys.wait(10)
-    -- -- 初始化airlink
-    -- airlink.init()
-    -- -- 启动底层线程, 从机模式
-    -- airlink.start(1)
-    -- PWR8000S(1)
-    -- sys.wait(500) -- 稍微缓一下
-    -- airlink.test(10)
-    -- sys.wait(100)
-    -- netdrv.setup(socket.LWIP_STA, netdrv.WHALE)
-    -- netdrv.setup(socket.LWIP_AP, netdrv.WHALE)
 
     -- sys.wait(100)
     wlan.init()

+ 2 - 2
demo/airlink/air8000s_nop/main.lua

@@ -11,8 +11,8 @@ _G.sysplus = require("sysplus")
 
 sys.taskInit(function()
     -- sys.wait(500)
-    airlink.start(0)
-    wlan.init()
+    -- airlink.start(0)
+    -- wlan.init()
 end)
 
 sys.taskInit(function()