luckfox-pico-sdk/project/app/wifi_app/wifi/test/rk_wifi_test.c
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between
the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door
for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more
usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp:
Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for
compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem.
sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device
tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately.
sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick
boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades.
sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for
fastboot.

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
2024-10-14 09:47:04 +08:00

545 lines
12 KiB
C
Executable File

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <sys/prctl.h>
#include <sys/time.h>
#include <stdbool.h>
#include <sys/ioctl.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <time.h>
#include <stdbool.h>
#include "Rk_wifi.h"
#include "Rk_softap.h"
static volatile int wifi_onff_cnt = 0;
static pthread_t rkwifi_init_thread = 0;
static RK_WIFI_RUNNING_State_e g_wifi_state = RK_WIFI_State_OFF;
static void printf_wifi_link_info(RK_WIFI_INFO_Connection_s *info)
{
if (!info)
return;
printf("[===================================]\n");
printf(" id: %d\n", info->id);
printf(" bssid: %s\n", info->bssid);
printf(" ssid: %s\n", info->ssid);
printf(" freq: %d\n", info->freq);
printf(" channel: %s\n", info->channel);
printf(" mode: %s\n", info->mode);
printf(" wpa_state: %s\n", info->wpa_state);
printf(" ip_address: %s\n", info->ip_address);
printf(" mac_address: %s\n", info->mac_address);
printf(" gw_address: %s\n", info->gw);
printf(" dns_address: %s\n", info->dns);
printf("[===================================]\n");
}
/* SOFTAP CONFIG TEST */
static int rk_wifi_softap_state_callback(RK_SOFTAP_STATE state, const char* data)
{
switch (state) {
case RK_SOFTAP_STATE_CONNECTTING:
printf("RK_SOFTAP_STATE_CONNECTTING\n");
break;
case RK_SOFTAP_STATE_DISCONNECT:
printf("RK_SOFTAP_STATE_DISCONNECT\n");
break;
case RK_SOFTAP_STATE_FAIL:
printf("RK_SOFTAP_STATE_FAIL\n");
break;
case RK_SOFTAP_STATE_SUCCESS:
printf("RK_SOFTAP_STATE_SUCCESS\n");
break;
default:
break;
}
return true;
}
int rk_wifi_softap_start(int argc, char *argv[])
{
printf("%s enter\n", __func__);
RK_softap_register_callback(rk_wifi_softap_state_callback);
return RK_softap_start("Rockchip-SoftAp", RK_SOFTAP_TCP_SERVER);
}
int rk_wifi_softap_stop(int argc, char *argv[])
{
return RK_softap_stop();
}
/* SOFTAP TEST END */
static int rk_wifi_state_callback(RK_WIFI_RUNNING_State_e state, RK_WIFI_INFO_Connection_s *info)
{
printf("%s state: %d\n", __func__, state);
printf_wifi_link_info(info);
g_wifi_state = state;
if (state == RK_WIFI_State_CONNECTED) {
printf("RK_WIFI_State_CONNECTED\n");
} else if (state == RK_WIFI_State_CONNECTFAILED) {
printf("RK_WIFI_State_CONNECTFAILED\n");
} else if (state == RK_WIFI_State_CONNECTFAILED_WRONG_KEY) {
printf("RK_WIFI_State_CONNECTFAILED_WRONG_KEY\n");
} else if (state == RK_WIFI_State_OPEN) {
printf("RK_WIFI_State_OPEN\n");
} else if (state == RK_WIFI_State_OFF) {
printf("RK_WIFI_State_OFF\n");
} else if (state == RK_WIFI_State_DISCONNECTED) {
printf("RK_WIFI_State_DISCONNECTED\n");
} else if (state == RK_WIFI_State_SCAN_RESULTS) {
char *scan_r;
printf("RK_WIFI_State_SCAN_RESULTS\n");
scan_r = RK_wifi_scan_r();
free(scan_r);
} else if (state == RK_WIFI_State_LP_EVENT_TYPE) {
if (info->lp_event_type == RK_WIFI_LP_BAT_LEVEL) {
printf("RK_WIFI_MCU_BAT_LEVEL: %d\n", info->lp_data[0]);
} else if (info->lp_event_type == RK_WIFI_LP_PIR_DETECT) {
printf("RK_WIFI_MCU_PIR_DETECT: %d\n", info->lp_data[0]);
} else if (info->lp_event_type == RK_WIFI_LP_LONG_PRESS) {
printf("RK_WIFI_MCU_LONG_PRESS_KEY\n");
} else if(info->lp_event_type == RK_WIFI_LP_DOORBELL) {
printf("RK_WIFI_MCU_DOORBELL_PRESS_KEY\n");
} else if (info->lp_event_type == RK_WIFI_LP_SHORT_PRESS) {
printf("RK_WIFI_MCU_SHORT_PRESS_KEY\n");
} else if (info->lp_event_type == RK_WIFI_LP_KEEPALIVE_OK) {
printf("RK_WIFI_MCU_KEEPALIVE_OK\n");
} else if (info->lp_event_type == RK_WIFI_LP_KEEPALIVE_FAILED) {
printf("RK_WIFI_MCU_KEEPALIVE_FAILED\n");
} else if (info->lp_event_type == RK_WIFI_LP_WAKEUP_REASON) {
printf("RK_WIFI_LP_WAKEUP_REASON: %d\n", info->lp_data[0]);
}
}
return true;
}
int rk_wifi_open(void)
{
//pthread_t thread;
int timeout = 200; //200 * 10ms == 2s
RK_WIFI_INFO_Connection_s Info;
printf("%s\n", __func__);
RK_wifi_register_callback(rk_wifi_state_callback);
if (RK_wifi_enable(1) != true)
goto fail;
while ((timeout--) && (g_wifi_state == RK_WIFI_State_OFF)) {
usleep(10 * 1000);
printf("%s: TURNING ON ...\n", __func__);
}
if (g_wifi_state == RK_WIFI_State_OFF)
goto fail;
if (RK_wifi_running_getConnectionInfo(&Info))
printf_wifi_link_info(&Info);
return true;
fail:
printf("%s: RK_wifi_enable fail\n", __func__);
return false;
}
int rk_wifi_close(int argc, char *argv[])
{
if (RK_wifi_enable(0) != true)
printf("RK_wifi_enable 0 fail!\n");
return true;
}
//9 input fish1:rk12345678
int rk_wifi_connect(int argc, char *argv[])
{
if (argv[0] == NULL || argv[1] == NULL) {
printf("ssid or psk is NULL\n");
return false;
}
printf("%s: ssid: %s, psk: %s\n", __func__, argv[0], argv[1]);
if (RK_wifi_connect(argv[0], argv[1]) == false)
printf("rk_wifi_connect fail!\n");
return true;
}
int rk_wifi_scan(int argc, char *argv[])
{
if (RK_wifi_scan() != true)
printf("RK_wifi_scan fail!\n");
return true;
}
int rk_wifi_getSavedInfo(int argc, char *argv[])
{
RK_WIFI_SAVED_INFO_s *wsi;
int ap_cnt = 0;
RK_wifi_getSavedInfo(&wsi, &ap_cnt);
for (int i = 0; i < ap_cnt; i++) {
printf("id: %d, name: %s, bssid: %s, state: %s\n",
wsi[i].id, wsi[i].ssid,
wsi[i].bssid, wsi[i].state);
}
if (wsi != NULL)
free(wsi);
return true;
}
int rk_wifi_getConnectionInfo(int argc, char *argv[])
{
RK_WIFI_INFO_Connection_s info;
if (RK_wifi_running_getConnectionInfo(&info))
printf_wifi_link_info(&info);
return true;
}
int rk_wifi_connect_with_ssid(int argc, char *argv[])
{
if (RK_wifi_connect_with_ssid(argv[0]) != true)
printf("RK_wifi_connect_with_ssid fail!\n");
return true;
}
int rk_wifi_stop_keepalive(int argc, char *argv[])
{
if (!RK_wifi_stop_keepalive(866))
printf("RK_wifi_stop_keepalive fail!\n");
return true;
}
int rk_wifi_reset(int argc, char *argv[])
{
if (!RK_wifi_reset())
printf("RK_wifi_reset fail!\n");
return true;
}
int rk_wifi_cancel(int argc, char *argv[])
{
if (RK_wifi_cancel() != true)
printf("RK_wifi_cancel fail!\n");
return true;
}
int rk_wifi_forget_with_ssid(int argc, char *argv[])
{
if (RK_wifi_forget_with_ssid(argv[0]) != true) {
printf("rk_wifi_forget_with_ssid fail!\n");
}
return true;
}
int rk_wifi_disconnect(int argc, char *argv[])
{
RK_wifi_disconnect_network();
return true;
}
int rk_wifi_set_pir(int argc, char *argv[])
{
int enable = atoi(argv[0]);
printf("%s: %s\n", __func__, enable ? "enable" : "disable");
if (RK_wifi_set_pir(enable) != true)
printf("rk_wifi_set_pir fail!\n");
return true;
}
int rk_wifi_set_keepalive(int argc, char *argv[])
{
RK_WIFI_LOW_POWER_KEEPALIVE_s kp;
printf("argv: %s:%s:%s\n", argv[0], argv[1], argv[2]);
memset(&kp, 0, sizeof(RK_WIFI_LOW_POWER_KEEPALIVE_s));
strncpy(kp.domain, argv[0], strlen(argv[0]));
strncpy(kp.port, argv[1], strlen(argv[1]));
strncpy(kp.period, argv[2], strlen(argv[2]));
printf("domain:%s, port:%s, period:%s\n",
kp.domain, kp.port, kp.period);
if (RK_wifi_start_keepalive(&kp) != true)
printf("RK_wifi_start_keepalive fail!\n");
return true;
}
/* WIFI ON/OFF LOOP TEST */
void *wifi_test_onff_thread(void *arg)
{
while (1) {
//open
RK_wifi_register_callback(rk_wifi_state_callback);
if (RK_wifi_enable(1) != true)
printf("RK_wifi_enable 1 fail!\n");
while (g_wifi_state == RK_WIFI_State_OPEN) {
sleep(1);
printf("%s: RKWIFI TURNING ON ...\n", __func__);
}
//scan
RK_wifi_scan();
sleep(1);
//close
printf("%s: RKWIFI DEINIT\n", __func__);
if (RK_wifi_enable(0) != true)
printf("RK_wifi_enable 0 fail!\n");
while (g_wifi_state == RK_WIFI_State_OFF) {
sleep(1);
printf("%s: RKWIFI TURNING OFF ...\n", __func__);
}
printf("%s: RKWIFI TURN ONOFF CNT: [%d] \n", __func__, wifi_onff_cnt++);
}
}
int rk_wifi_openoff_test(int argc, char *argv[])
{
printf("%s: ", __func__);
if (rkwifi_init_thread) {
printf("rkwifi_init_thread already exist\n");
return false;
}
if (pthread_create(&rkwifi_init_thread, NULL, wifi_test_onff_thread, NULL)) {
printf("Createrkwifi_init_thread failed\n");
return false;
}
return true;
}
int rk_wifi_ota(int argc,char *argv[])
{
printf("arg nums is %d \n",argc);
if (argc < 1) {
printf("no path,pls enter correct path \n");
return false;
}
return Rk_wifi_ota(argv[0]);
}
#define CLI_SOCKET_PATH "/tmp/rkserver_socket"
#define RK_CMD_LINE_LEN 1600
#define MAX_ARGS 10
typedef struct {
const char *cmd;
const char *desc;
int (*exec)(int argc, char *argv[]);
} command_t;
static command_t socket_cmd_table[] = {
{"close", "rkwifi_server close", rk_wifi_close},
{"scan", "rkwifi_server scan", rk_wifi_scan},
{"connect", "rkwifi_server connect ssid password", rk_wifi_connect},
{"disconnect", "rkwifi_server disconnect", rk_wifi_disconnect},
{"getinfo", "rkwifi_server getinfo", rk_wifi_getConnectionInfo},
{"deepsleep", "rkwifi_server deepsleep [ONLY LOW POWER]", RK_wifi_enter_sleep},
{"reconnect", "rkwifi_server reconnect ssid", rk_wifi_connect_with_ssid},
{"forget", "rkwifi_server forget ssid", rk_wifi_forget_with_ssid},
{"getSavedInfo", "rkwifi_server getSavedInfo", rk_wifi_getSavedInfo},
{"cancel", "rkwifi_server cancel", rk_wifi_cancel},
{"reset", "rkwifi_server reset", rk_wifi_reset},
{"onoff_test", "rkwifi_server onoff_test", rk_wifi_openoff_test},
{"ap_cfg", "rkwifi_server ap_cfg", rk_wifi_softap_start},
{"ap_cfg_clr", "rkwifi_server ap_cfg_clr", rk_wifi_softap_stop},
{"setpir", "rkwifi_server setpir <0/1> = disable/enable PIR", rk_wifi_set_pir},
{"ota","rkwifi_server ota", rk_wifi_ota},
{"start_kp", "rkwifi_server start_kp <ip:port:expire>", rk_wifi_set_keepalive},
{"stop_kp", "rkwifi_server stop_kp", rk_wifi_stop_keepalive},
};
static int rk_tokenize_cmd(char *cmd, char *argv[], int is_at_cmd)
{
char *pos;
int argc = 0;
printf("rk_tokenize_cmd %s\n", cmd);
pos = cmd;
for (;;) {
while (*pos == ' ')
pos++;
if (*pos == '\0')
break;
if (*pos == '"') {
argv[argc] = pos + 1;
char *pos2 = strrchr(pos, '"');
if (pos2) {
*pos2 = '\0';
pos = pos2 + 1;
}
} else {
argv[argc] = pos;
}
argc++;
if (argc == MAX_ARGS)
break;
while (*pos != '\0' && *pos != ' ')
pos++;
if (*pos == ' ')
*pos++ = '\0';
}
return argc;
}
static int rk_cmd_parse(char *arg)
{
int i = 0;
int cnt = sizeof(socket_cmd_table) / sizeof(socket_cmd_table[0]);
char *argv[MAX_ARGS];
int argc;
int ret = 0;
printf("rk_cmd_parse %s\n", arg);
argc = rk_tokenize_cmd(arg, argv, 0);
printf("[%s %d]: %s %s\n", arg, argc, argv[0], argv[1]);
if (argc) {
for (i = 0; i < cnt; i++) {
if (!strcmp(socket_cmd_table[i].cmd, argv[0])) {
ret = socket_cmd_table[i].exec(argc - 1, &argv[1]);
if (ret == false) {
//printf("FAIL\n");
} else {
//printf("OK\n");
}
break;
}
}
}
return true;
}
void *rkwifi_server_command_func(void *arg)
{
struct sockaddr_un ser_un;
int socket_fd = 0;
int connect_fd = 0;
int ret = 0;
char recall[] = "OK";
char cmd_line[RK_CMD_LINE_LEN];
socket_fd = socket(AF_UNIX, SOCK_STREAM, 0);
if (socket_fd <= 0) {
printf("open socket err\n");
return NULL;
}
unlink(CLI_SOCKET_PATH);
memset(&ser_un, 0, sizeof(ser_un));
ser_un.sun_family = AF_UNIX;
strcpy(ser_un.sun_path, CLI_SOCKET_PATH);
ret = bind(socket_fd, (struct sockaddr *)&ser_un, sizeof(struct sockaddr_un));
if (ret < 0) {
printf("bind err %s %s\n", CLI_SOCKET_PATH, strerror(errno));
return NULL;
}
ret = listen(socket_fd, 5);
if (ret < 0) {
printf("listen err\n");
return NULL;
}
while (1) {
printf("accept ...\n");
connect_fd = accept(socket_fd, NULL, NULL);
if (connect_fd < 0) {
continue;
}
memset(cmd_line, 0, sizeof(cmd_line));
ret = read(connect_fd, cmd_line, sizeof(cmd_line));
if (ret <= 0) {
printf("cmd_line error!!!\n");
}
write(connect_fd, recall, strlen(recall) + 1);
close(connect_fd);
printf("cmd_line: %s [%d]\n", cmd_line, strlen(cmd_line));
if (!strncmp(cmd_line, "quit", strlen("quit"))) {
break;
}
rk_cmd_parse(cmd_line);
}
close(socket_fd);
return NULL;
}
static void show_help(void) {
unsigned int i;
printf("[Usage]:\n");
for (i = 0; i < sizeof(socket_cmd_table)/sizeof(command_t); i++)
printf("\t\"%s\"\n", socket_cmd_table[i].desc);
}
extern int rkwifi_cli(int argc, char *argv[]);
int main(int argc, char *argv[])
{
pthread_t sock_tid;
if (argc <= 1) {
show_help();
return true;
}
if (!strncmp("-h", argv[1], sizeof("-h"))) {
show_help();
return true;
}
if (!strncmp("start", argv[1], sizeof("start"))) {
printf("rkwifi_server: start");
if (!rk_wifi_open())
return false;
pthread_create(&sock_tid, NULL, rkwifi_server_command_func, NULL);
while (1)
sleep(1);
}
if (argc >= 2)
return rkwifi_cli(argc, argv);
return true;
}