699 lines
24 KiB
C
699 lines
24 KiB
C
|
|
/*==========================================================================================================
|
|
Copyright (c) 2025, Quectel Wireless Solutions Co., Ltd. All rights reserved.
|
|
Quectel Wireless Solutions Proprietary and Confidential.
|
|
===========================================================================================================*/
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include "ql_wifi.h"
|
|
#include "ql_application.h"
|
|
#include "ql_log.h"
|
|
#include "ql_rtos.h"
|
|
#include "ql_nw.h"
|
|
#include "ql_uart.h"
|
|
#include "ql_gpio.h"
|
|
#include "ql_spi.h"
|
|
#include "sockets.h"
|
|
#include "ip4_addr.h"
|
|
#include "ql_data_call.h"
|
|
#include "ql_ping.h"
|
|
#include "ql_fs.h"
|
|
#include "ql_http_client.h"
|
|
|
|
#if 0
|
|
// EC800MCNLE+FGM842D
|
|
#define QL_WIFI_LDO_GPIO GPIO_PIN_NO_27
|
|
#define QL_WIFI_CHIP_EN_GPIO GPIO_PIN_NO_31
|
|
#define QL_WIFI_SPI_PORT QL_SPI_PORT0
|
|
#define QL_WIFI_SPI_CS_GPIO GPIO_PIN_NO_17
|
|
#define QL_WIFI_SPI_SLAVE_CTS_GPIO GPIO_PIN_NO_53
|
|
#define QL_WIFI_SPI_SLAVE_RDY_GPIO GPIO_PIN_NO_54
|
|
#define QL_WIFI_SPI_CLK QL_SPI_CLK_13MHZ
|
|
#define QL_WIFI_SPI_MODE QL_SPI_MODE0
|
|
#else
|
|
// EG800AKCN91LC+FGM842D
|
|
#define QL_WIFI_LDO_GPIO GPIO_PIN_NO_84
|
|
#define QL_WIFI_CHIP_EN_GPIO GPIO_PIN_NO_85
|
|
#define QL_WIFI_SPI_PORT SPI_PORT2
|
|
#define QL_WIFI_SPI_CS_GPIO GPIO_PIN_NO_13
|
|
#define QL_WIFI_SPI_SLAVE_CTS_GPIO GPIO_PIN_NO_90
|
|
#define QL_WIFI_SPI_SLAVE_RDY_GPIO GPIO_PIN_NO_89
|
|
#define QL_WIFI_SPI_CLK SPI_CLK_13MHZ
|
|
#define QL_WIFI_SPI_MODE SPI_MODE0
|
|
#endif
|
|
#define QL_WIFI_UART_PORT QL_MAIN_UART_PORT
|
|
|
|
#define QL_WIFI_DEMO_SOCKET_BUF_SIZE (128)
|
|
#define QL_WIFI_STA_MODE_CID 2
|
|
|
|
static char send_buf[QL_WIFI_DEMO_SOCKET_BUF_SIZE] = {0};
|
|
static int send_len = 0;
|
|
static char recv_buf[QL_WIFI_DEMO_SOCKET_BUF_SIZE] = {0};
|
|
static int recv_len = 0;
|
|
|
|
static ql_queue_t wifi_msg_queue = NULL;
|
|
static ql_task_t wifi_tcp_task = NULL;
|
|
|
|
typedef struct
|
|
{
|
|
char ssid[QL_WIFI_SSID_MAX_LEN];
|
|
char password[QL_WIFI_PASSWORD_MAX_LEN];
|
|
} ql_wifi_app_user_ap_info_s;
|
|
|
|
#include "ql_wifi_ble.h"
|
|
|
|
#define QL_WIFI_BLE_COMMAND_DELAY_MS 1000
|
|
static ql_queue_t wifi_ble_msg_queue = NULL;
|
|
static ql_wifi_ble_send_data_info_s ql_wifi_ble_send_data_info = {0};
|
|
|
|
typedef enum
|
|
{
|
|
QL_WIFI_DEMO_BLE_OPEN = 0,
|
|
QL_WIFI_DEMO_BLE_CLOSE,
|
|
QL_WIFI_DEMO_BLE_WIFI_TRY_OPEN,
|
|
QL_WIFI_DEMO_BLE_WIFI_OPEN,
|
|
QL_WIFI_DEMO_BLE_DATA_SEND,
|
|
QL_WIFI_DEMO_BLE_ADV_RESTART,
|
|
} ql_wifi_demo_ble_state_e;
|
|
|
|
typedef struct
|
|
{
|
|
ql_wifi_demo_ble_state_e state;
|
|
} ql_wifi_demo_ble_msg_s;
|
|
|
|
static void ql_wifi_demo_ble_send_msg(ql_wifi_demo_ble_state_e state)
|
|
{
|
|
ql_wifi_demo_ble_msg_s msg =
|
|
{
|
|
.state = state,
|
|
};
|
|
if (wifi_ble_msg_queue)
|
|
{
|
|
ql_rtos_queue_release(wifi_ble_msg_queue, sizeof(ql_wifi_demo_ble_msg_s), (uint8 *)&msg, QL_NO_WAIT);
|
|
}
|
|
return;
|
|
}
|
|
|
|
static void ql_wifi_hardware_reset(void)
|
|
{
|
|
ql_gpio_set_level(QL_WIFI_CHIP_EN_GPIO, PIN_LEVEL_HIGH);
|
|
ql_rtos_task_sleep_ms(100);
|
|
ql_gpio_set_level(QL_WIFI_CHIP_EN_GPIO, PIN_LEVEL_LOW);
|
|
|
|
}
|
|
|
|
static void ql_wifi_callback(ql_wifi_ind_t *ctx)
|
|
{
|
|
ql_wifi_ind_t wifi_ind = {0};
|
|
memcpy(&wifi_ind, ctx, sizeof(ql_wifi_ind_t));
|
|
if (wifi_msg_queue)
|
|
{
|
|
ql_rtos_queue_release(wifi_msg_queue, sizeof(ql_wifi_ind_t), (uint8 *)&wifi_ind, QL_NO_WAIT);
|
|
}
|
|
return;
|
|
}
|
|
|
|
static void ql_wifi_link_info_callback(void *ctx)
|
|
{
|
|
ql_wifi_link_info_t *info = (ql_wifi_link_info_t *)ctx;
|
|
|
|
printf("\r\nconne_state:%d, wifi_strength:%d", info->conn_state, info->wifi_strength);
|
|
|
|
printf("\r\nssid:%s, bssid=%02X:%02X:%02X:%02X:%02X:%02X", info->ssid, \
|
|
info->bssid[0], info->bssid[1], info->bssid[2], \
|
|
info->bssid[3], info->bssid[4], info->bssid[5]);
|
|
printf("\r\naid:%hu, channel:%d, security:%d\r\n", info->aid, info->channel, info->security);
|
|
}
|
|
|
|
|
|
static void ql_wifi_scan_callback(void *ctx)
|
|
{
|
|
ql_wifi_scan_result_s *scan_result = (ql_wifi_scan_result_s *)ctx;
|
|
ql_wifi_ap_info_s *ApList = scan_result->ApList;
|
|
printf("scan_result->ApNum:%d\n", scan_result->ApNum);
|
|
for (int i = 0; i < scan_result->ApNum; i++)
|
|
{
|
|
printf("ssid:%s,ap_power:%d,bssid=%02X:%02X:%02X:%02X:%02X:%02X,channel=%d,security=%s\n",
|
|
ApList->ssid,
|
|
ApList->ap_power,
|
|
ApList->bssid[0],ApList->bssid[1],ApList->bssid[2],ApList->bssid[3],ApList->bssid[4],ApList->bssid[5],
|
|
ApList->channel,
|
|
ApList->security);
|
|
|
|
ApList++;
|
|
}
|
|
}
|
|
|
|
void ql_wifi_ldo_ctrl(int val)
|
|
{
|
|
ql_gpio_init(QL_WIFI_LDO_GPIO, PIN_DIRECTION_OUT, PIN_PULL_DISABLE, PIN_LEVEL_LOW);
|
|
ql_gpio_init(QL_WIFI_CHIP_EN_GPIO, PIN_DIRECTION_OUT, PIN_PULL_DISABLE, PIN_LEVEL_LOW);
|
|
ql_gpio_set_level(QL_WIFI_LDO_GPIO, val);
|
|
ql_rtos_task_sleep_ms(100);
|
|
}
|
|
|
|
static void ql_wifi_tcp_client_thread(void)
|
|
{
|
|
int ret = 0;
|
|
int i = 0;
|
|
int flags = 0;
|
|
int connected = 0;
|
|
int socket_fd = -1;
|
|
fd_set read_fds;
|
|
fd_set write_fds;
|
|
fd_set exp_fds;
|
|
int fd_changed = 0;
|
|
int closing = false;
|
|
struct sockaddr_in local4, server_ipv4;
|
|
ip_addr_t ip = {0};
|
|
char ip4_addr_str[16] = {0};
|
|
struct ql_data_call_info info = {0};
|
|
|
|
uint8_t destip[] = {112, 31, 84, 164};
|
|
uint16_t destport = 8305;
|
|
ip_addr_t int_destip;
|
|
IP4_ADDR(&int_destip, destip[0], destip[1], destip[2], destip[3]);
|
|
|
|
ql_get_data_call_info(QL_WIFI_STA_MODE_CID, 0, &info);
|
|
inet_ntop(AF_INET, &info.v4.addr.ip, ip4_addr_str, sizeof(ip4_addr_str));
|
|
printf("info.v4.addr.ip: %s\r\n", ip4_addr_str);
|
|
|
|
inet_aton(ip4_addr_str, &ip);
|
|
|
|
memset(&local4, 0x00, sizeof(struct sockaddr_in));
|
|
local4.sin_family = AF_INET;
|
|
local4.sin_port = 2345;
|
|
memcpy(&local4.sin_addr, &ip.addr, sizeof(ip_addr_t));
|
|
|
|
FD_ZERO(&read_fds);
|
|
FD_ZERO(&write_fds);
|
|
FD_ZERO(&exp_fds);
|
|
|
|
printf("socket start!\r\n");
|
|
socket_fd = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (socket_fd < 0)
|
|
{
|
|
printf("*** socket create fail ***\r\n");
|
|
goto exit;
|
|
}
|
|
ret = bind(socket_fd, (struct sockaddr *)&local4, sizeof(struct sockaddr));
|
|
if (ret < 0)
|
|
{
|
|
printf("*** bind fail ***\r\n");
|
|
close(socket_fd);
|
|
socket_fd = -1;
|
|
goto exit;
|
|
}
|
|
flags |= O_NONBLOCK; // set nonblock
|
|
fcntl(socket_fd, F_SETFL, flags);
|
|
memset(&server_ipv4, 0x00, sizeof(struct sockaddr_in));
|
|
server_ipv4.sin_family = AF_INET;
|
|
server_ipv4.sin_port = htons(destport);
|
|
memcpy(&(server_ipv4.sin_addr), &int_destip, sizeof(int_destip));
|
|
ret = connect(socket_fd, (struct sockaddr *)&server_ipv4, sizeof(server_ipv4));
|
|
if (ret == 0)
|
|
{
|
|
connected = 1;
|
|
printf("\r\n[%s][%d]tcp connected\r\n", __func__, __LINE__);
|
|
}
|
|
else
|
|
{
|
|
if (ql_get_soc_errno() != EINPROGRESS) // 115
|
|
{
|
|
printf("\r\n[%s][%d]tcp connect failed\r\n", __func__, __LINE__);
|
|
close(socket_fd);
|
|
socket_fd = -1;
|
|
goto exit;
|
|
}
|
|
|
|
FD_SET(socket_fd, &write_fds); // write_fds
|
|
}
|
|
|
|
FD_SET(socket_fd, &exp_fds); // exp_fds
|
|
|
|
printf("\r\n[%s][%d]into while\r\n", __func__, __LINE__);
|
|
while (1)
|
|
{
|
|
fd_changed = select(socket_fd + 1, &read_fds, &write_fds, &exp_fds, NULL); // &tv
|
|
printf("\r\n[%s][%d]select\r\n", __func__, __LINE__);
|
|
if (fd_changed > 0)
|
|
{
|
|
if (FD_ISSET(socket_fd, &write_fds))
|
|
{
|
|
FD_CLR(socket_fd, &write_fds);
|
|
if (connected == 0)
|
|
{
|
|
int value = 0;
|
|
char con[128] = {0};
|
|
u32_t len = sizeof(value);
|
|
getsockopt(socket_fd, SOL_SOCKET, SO_ERROR, &value, &len);
|
|
if (value == 0 || value == EISCONN)
|
|
{
|
|
printf("\r\n[%s][%d]tcp connected\r\n", __func__, __LINE__);
|
|
connected = 1;
|
|
FD_SET(socket_fd, &read_fds); // read_fds
|
|
len = snprintf(con, 128, "tcp connected\r\n");
|
|
write(socket_fd, con, len);
|
|
}
|
|
else
|
|
{
|
|
printf("\r\n[%s][%d]tcp connect failed\r\n", __func__, __LINE__);
|
|
close(socket_fd);
|
|
socket_fd = -1;
|
|
break;
|
|
}
|
|
}
|
|
else // seldom go here
|
|
{
|
|
printf("\r\n[%s][%d]1234\r\n", __func__, __LINE__);
|
|
memset(send_buf, 0x00, 128);
|
|
send_len = snprintf(send_buf, 128, "%d%s%d\r\n", i, "#!&*1234end", i);
|
|
write(socket_fd, send_buf, send_len);
|
|
i++;
|
|
}
|
|
} // write_fds
|
|
else if (FD_ISSET(socket_fd, &read_fds))
|
|
{
|
|
FD_CLR(socket_fd, &read_fds);
|
|
memset(recv_buf, 0x00, 128);
|
|
recv_len = read(socket_fd, recv_buf, 128);
|
|
if (recv_len > 0)
|
|
{
|
|
printf("\r\n[%s][%d]recv: %s\r\n", __func__, __LINE__, recv_buf);
|
|
if(i++ > 1)
|
|
goto exit;
|
|
memset(send_buf, 0x00, 128);
|
|
send_len = snprintf(send_buf, 128, "%d%s%d\r\n", i, "]Quectel[", i);
|
|
write(socket_fd, send_buf, send_len);
|
|
ql_rtos_task_sleep_s(2);
|
|
FD_SET(socket_fd, &read_fds);
|
|
}
|
|
else if (recv_len == 0)
|
|
{
|
|
if (closing == false)
|
|
{
|
|
printf("\r\n[%s][%d]shut down\r\n", __func__, __LINE__);
|
|
shutdown(socket_fd, SHUT_WR);
|
|
closing = true;
|
|
FD_SET(socket_fd, &read_fds);
|
|
}
|
|
else
|
|
{
|
|
printf("\r\n[%s][%d]\r\n", __func__, __LINE__);
|
|
close(socket_fd);
|
|
socket_fd = -1;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ql_get_soc_errno() == EAGAIN)
|
|
{
|
|
FD_SET(socket_fd, &read_fds);
|
|
}
|
|
else
|
|
{
|
|
printf("\r\n[%s][%d]\r\n", __func__, __LINE__);
|
|
close(socket_fd);
|
|
socket_fd = -1;
|
|
break;
|
|
}
|
|
}
|
|
} // read_fds
|
|
else if (FD_ISSET(socket_fd, &exp_fds))
|
|
{
|
|
FD_CLR(socket_fd, &exp_fds);
|
|
printf("\r\n[%s][%d]\r\n", __func__, __LINE__);
|
|
close(socket_fd);
|
|
socket_fd = -1;
|
|
break;
|
|
} // exp_fds
|
|
} // if (fd_changed > 0)
|
|
} // while(1)
|
|
printf("\r\n[%s][%d]next to exit\r\n", __func__, __LINE__);
|
|
exit:
|
|
printf("wifi tcp client end\r\n");
|
|
close(socket_fd);
|
|
|
|
ql_wifi_psm_info wifi_psm_cfg = {0};
|
|
wifi_psm_cfg.mode = 2;
|
|
wifi_psm_cfg.enable = 1;
|
|
wifi_psm_cfg.para = 10;
|
|
ret = ql_wifi_app_psm(&wifi_psm_cfg);
|
|
printf("\r\n[ql_wifi_app_psm]ret[%d]\r\n", ret);
|
|
|
|
wifi_tcp_task = NULL;
|
|
ql_rtos_task_delete(NULL);
|
|
}
|
|
|
|
static void ql_842d_sta_test(void *argv)
|
|
{
|
|
int ret = 0;
|
|
char *ssid = "Visitor-QuecteK";
|
|
char *password = "v@quectel";
|
|
ql_wifi_ind_t ql_wifi_status = {0};
|
|
char wifi_version[64] = {0};
|
|
|
|
ql_wifi_config_t wifi_config = {0};
|
|
/* Hardware-related configuration*/
|
|
wifi_config.port_cfg = QL_WIFI_PORT_SPI_UART;
|
|
wifi_config.spi_config.port = QL_WIFI_SPI_PORT;
|
|
wifi_config.spi_config.clk = QL_WIFI_SPI_CLK;
|
|
wifi_config.spi_config.mode = QL_WIFI_SPI_MODE;
|
|
wifi_config.spi_config.cs = QL_WIFI_SPI_CS_GPIO;
|
|
wifi_config.spi_config.slave_rdy = QL_WIFI_SPI_SLAVE_RDY_GPIO;
|
|
wifi_config.spi_config.slave_cts = QL_WIFI_SPI_SLAVE_CTS_GPIO;
|
|
wifi_config.uart_port = QL_WIFI_UART_PORT;
|
|
|
|
/* Software-related configuration */
|
|
wifi_config.mode = QL_WIFI_MODE_STA;
|
|
wifi_config.simid = 0;
|
|
wifi_config.cid = QL_WIFI_STA_MODE_CID;
|
|
wifi_config.auth_type = QL_WIFI_AUTH_TYPE_WPA_WPA2;
|
|
memcpy(wifi_config.ssid, ssid, strlen(ssid) + 1);
|
|
memcpy(wifi_config.password, password, strlen(password) + 1); // QL_WIFI_AUTH_TYPE_WPA_WPA2
|
|
// memset(wifi_config.password, 0, sizeof(wifi_config.password)); // QL_WIFI_AUTH_TYPE_NONE
|
|
printf("\r\n[%s][%d]passwd strlen[%d]\r\n", __func__, __LINE__, strlen(wifi_config.password));
|
|
|
|
// Set log port
|
|
ql_log_mask_set(QL_LOG_APP_MASK, QL_LOG_PORT_UART);
|
|
printf("ql_wifi_sta_test\n");
|
|
|
|
/* Create msg queue. */
|
|
if (0 != ql_rtos_queue_create(&wifi_msg_queue, sizeof(ql_wifi_ind_t), 10))
|
|
{
|
|
printf("ql_rtos_queue_create failed");
|
|
}
|
|
|
|
ql_uart_close(QL_WIFI_UART_PORT);
|
|
|
|
ret = ql_wifi_set_config(&wifi_config);
|
|
if (ret == -1)
|
|
{
|
|
printf("ql_wifi_set_config failed\n");
|
|
return;
|
|
}
|
|
|
|
ql_wifi_ldo_ctrl(true);
|
|
ql_wifi_hardware_reset();
|
|
|
|
printf("reset wifi\n");
|
|
// wait wifi reset ok
|
|
ql_rtos_task_sleep_s(1);
|
|
|
|
ql_wifi_get_version(wifi_version, sizeof(wifi_version));
|
|
printf("wifi version=%s\n", wifi_version);
|
|
|
|
// Start wifi as station mode
|
|
ret = ql_wifi_open(ql_wifi_callback);
|
|
printf("ql_wifi_open %d\n", ret);
|
|
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ql_wifi_demo_ble_send_msg(QL_WIFI_DEMO_BLE_OPEN); // enable ble
|
|
|
|
while (1)
|
|
{
|
|
ret = ql_rtos_queue_wait(wifi_msg_queue, (uint8_t *)&ql_wifi_status, sizeof(ql_wifi_ind_t), 5*1000); // 5*1000 QL_WAIT_FOREVER
|
|
if (ret != 0)
|
|
{
|
|
printf("\r\n[%s][%d]queue ret[%d]\r\n", __func__, __LINE__, ret);
|
|
ql_wifi_app_sta_link_info(ql_wifi_link_info_callback);
|
|
continue;
|
|
}
|
|
|
|
printf("ind_type=%d, wifi status=%d, mac=%s\n", ql_wifi_status.ind_type ,ql_wifi_status.state, ql_wifi_status.mac_str);
|
|
switch (ql_wifi_status.state)
|
|
{
|
|
case QL_WIFI_IND_STATE_CONNECTED:
|
|
{
|
|
if (wifi_tcp_task == NULL)
|
|
{
|
|
ret = ql_rtos_task_create(&wifi_tcp_task, 4096, 100, "wifi_tcp", ql_wifi_tcp_client_thread, NULL, 0);
|
|
}
|
|
break;
|
|
}
|
|
case QL_WIFI_IND_STATE_DISCONNECT:
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static int ql_wifi_demo_ble_gatt_data_parse(void* in_info,ql_wifi_app_user_ap_info_s *out_info)
|
|
{
|
|
if(!in_info || !out_info)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
uint8_t *ptr = (uint8_t*)in_info;
|
|
uint8_t uuid_len = *(uint8_t*)ptr;
|
|
printf("wifi ble uuid_len %d",uuid_len);
|
|
if(2 != uuid_len && 16 != uuid_len)
|
|
{
|
|
return -1;
|
|
}
|
|
ptr += sizeof(uuid_len);
|
|
|
|
uint8_t uuid[16] = {0};
|
|
char uuid_str[32] = {0};
|
|
memcpy((void*)uuid,(void*)ptr,uuid_len);
|
|
for(uint8_t i = 0; i < uuid_len;i++)
|
|
{
|
|
sprintf((char*)uuid_str,"%02X",uuid[i]);
|
|
}
|
|
printf("wifi ble uuid %s",uuid_str);
|
|
|
|
ptr += uuid_len;
|
|
/* Move to data_len */
|
|
uint16_t data_len = *(uint16_t*)ptr;
|
|
printf("wifi ble data_len %d",data_len);
|
|
if(data_len > QL_WIFI_SSID_MAX_LEN + QL_WIFI_PASSWORD_MAX_LEN)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
ptr += sizeof(data_len);
|
|
printf("wifi ble peek %02x %02x %02x %02x",ptr[0],ptr[1],ptr[2],ptr[3]);
|
|
|
|
ql_wifi_app_user_ap_info_s ap_info = {0};
|
|
uint8_t ssid_len = ptr[0];
|
|
uint8_t password_len = ptr[0 + 1 + ssid_len];
|
|
printf("wifi ble len %d/%d/%d/%d",data_len,ssid_len,password_len,ssid_len + password_len + 2);
|
|
if(data_len != ssid_len + password_len + 2)
|
|
{
|
|
return -1;
|
|
}
|
|
memcpy((void*)ap_info.ssid,(void*)(&ptr[1]),ssid_len);
|
|
memcpy((void*)ap_info.password,(void*)(&ptr[1 + ssid_len + 1]),password_len);
|
|
*out_info = ap_info;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void ql_wifi_demo_ble_gatt_data_callback(void* ctx)
|
|
{
|
|
uint8_t *ptr = (uint8_t*)ctx;
|
|
uint8_t uuid_len = *(uint8_t*)ptr;
|
|
ptr += sizeof(uuid_len);
|
|
ptr += uuid_len;
|
|
uint16_t data_len = *(uint16_t*)ptr;
|
|
|
|
printf("\r\n[%s][%d]data_len[%d]\r\n", __func__, __LINE__,data_len);
|
|
|
|
ql_wifi_app_user_ap_info_s ap_user_info = {0};
|
|
|
|
ql_wifi_demo_ble_send_msg(QL_WIFI_DEMO_BLE_DATA_SEND);
|
|
|
|
// Visitor-Quectel 56697369746f722d5175656374656c
|
|
// v@quectel 76407175656374656c
|
|
// 0f56697369746f722d5175656374656c0976407175656374656c
|
|
if(0 != ql_wifi_demo_ble_gatt_data_parse(ctx,&ap_user_info))
|
|
{
|
|
printf("\r\n[%s][%d]\r\n", __func__, __LINE__);
|
|
return;
|
|
}
|
|
printf("ssid = [%s], pwd = [%s]", ap_user_info.ssid, ap_user_info.password);
|
|
|
|
ql_wifi_config_t wifi_config = {0};
|
|
/* Software-related config */
|
|
wifi_config.mode = QL_WIFI_MODE_STA;
|
|
wifi_config.simid = 0;
|
|
wifi_config.cid = QL_WIFI_STA_MODE_CID;
|
|
wifi_config.auth_type = QL_WIFI_AUTH_TYPE_WPA_WPA2;
|
|
memcpy(wifi_config.ssid, ap_user_info.ssid, strlen(ap_user_info.ssid) + 1);
|
|
memcpy(wifi_config.password, ap_user_info.password, strlen(ap_user_info.password) + 1);
|
|
if ((ql_wifi_set_config(&wifi_config)) == -1)
|
|
{
|
|
printf("ql_wifi_set_config failed\n");
|
|
return;
|
|
}
|
|
ql_wifi_demo_ble_send_msg(QL_WIFI_DEMO_BLE_WIFI_TRY_OPEN);
|
|
|
|
return;
|
|
}
|
|
|
|
static void ql_wifi_demo_ble_gatt_link_callback(void* ctx)
|
|
{
|
|
ql_wifi_ble_msg_e msg = *(ql_wifi_ble_msg_e*)ctx;
|
|
switch(msg)
|
|
{
|
|
case QL_WIFI_BLE_MSG_CONNECTED:
|
|
{
|
|
printf("wifi ble conn");
|
|
break;
|
|
}
|
|
case QL_WIFI_BLE_MSG_DISCONNECTED:
|
|
{
|
|
printf("wifi ble disconn");
|
|
ql_wifi_demo_ble_send_msg(QL_WIFI_DEMO_BLE_ADV_RESTART);
|
|
break;
|
|
}
|
|
case QL_WIFI_BLE_MSG_MTU_UPDATED:
|
|
{
|
|
uint16_t mtu = *((uint16_t*)(((ql_wifi_ble_gatt_link_ctx_s*)ctx)->value));
|
|
printf("wifi ble mtu updated %d",mtu);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
printf("link unknown msg");
|
|
break;
|
|
};
|
|
}
|
|
return;
|
|
}
|
|
|
|
static void ql_wifi_demo_ble_init()
|
|
{
|
|
int ret = 0;
|
|
ql_wifi_ble_service_info_s ble_service = {0};
|
|
ble_service.uuid_len = 2;
|
|
ble_service.uuid[0] = 0xFF;
|
|
ble_service.uuid[1] = 0xF1;
|
|
ret = ql_wifi_ble_init(&ble_service);
|
|
printf("ql_wifi_ble_init ret = %x",ret);
|
|
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ql_wifi_ble_service_info_s ble_characteristic = {0};
|
|
ble_characteristic.uuid_len = 2;
|
|
ble_characteristic.uuid[0] = 0xFF;
|
|
ble_characteristic.uuid[1] = 0xF2;
|
|
ret = ql_wifi_ble_set_characteristic(&ble_characteristic);
|
|
printf("ql_wifi_ble_set_characteristic ret = %x", ret);
|
|
|
|
/* Update uuid16_data_buf */
|
|
if(2 == ble_characteristic.uuid_len)
|
|
{
|
|
ql_wifi_ble_send_data_info.uuid_len = ble_characteristic.uuid_len;
|
|
memcpy((void*)ql_wifi_ble_send_data_info.uuid,(void*)ble_characteristic.uuid,ble_characteristic.uuid_len);
|
|
}
|
|
|
|
ql_wifi_ble_register_gatt_data_cb(ql_wifi_demo_ble_gatt_data_callback);
|
|
ql_wifi_ble_register_gatt_link_cb(ql_wifi_demo_ble_gatt_link_callback);
|
|
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ql_wifi_ble_set_name("quectel_wifi_ble");
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ql_wifi_ble_adv_start(NULL);
|
|
}
|
|
|
|
static void ql_wifi_ble_test(void *argv)
|
|
{
|
|
ql_task_t taskRef =NULL;
|
|
u8 wifi_ble_task_priority;
|
|
|
|
/* Create msg queue. */
|
|
if (0 != ql_rtos_queue_create(&wifi_ble_msg_queue, sizeof(ql_wifi_ind_t), 10))
|
|
{
|
|
printf("ql_rtos_queue_create failed");
|
|
}else
|
|
{
|
|
ql_rtos_task_get_current_ref(&taskRef);
|
|
ql_rtos_task_get_priority(taskRef, &wifi_ble_task_priority);
|
|
printf("\r\n[%s][%d]priority[%d]\r\n", __func__, __LINE__,wifi_ble_task_priority);
|
|
}
|
|
|
|
int ret = 0;
|
|
ql_wifi_demo_ble_msg_s ql_wifi_demo_ble_msg = {0};
|
|
ql_wifi_link_info_t info = {0};
|
|
|
|
while (1)
|
|
{
|
|
ret = ql_rtos_queue_wait(wifi_ble_msg_queue, (uint8_t *)&ql_wifi_demo_ble_msg, sizeof(ql_wifi_demo_ble_msg_s), QL_WAIT_FOREVER);
|
|
switch (ql_wifi_demo_ble_msg.state)
|
|
{
|
|
case QL_WIFI_DEMO_BLE_OPEN:
|
|
{
|
|
ql_wifi_demo_ble_init();
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
break;
|
|
}
|
|
case QL_WIFI_DEMO_BLE_CLOSE:
|
|
{
|
|
ql_wifi_ble_adv_stop(NULL);
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ql_wifi_ble_deinit(NULL);
|
|
break;
|
|
}
|
|
case QL_WIFI_DEMO_BLE_ADV_RESTART:
|
|
{
|
|
ql_wifi_ble_adv_start(NULL);;
|
|
break;
|
|
}
|
|
case QL_WIFI_DEMO_BLE_WIFI_OPEN:
|
|
{
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ret = ql_wifi_open(ql_wifi_callback);
|
|
printf("ql_wifi_open %d", ret);
|
|
break;
|
|
}
|
|
case QL_WIFI_DEMO_BLE_WIFI_TRY_OPEN:
|
|
{
|
|
ql_rtos_task_sleep_ms(QL_WIFI_BLE_COMMAND_DELAY_MS);
|
|
ret = ql_wifi_close();
|
|
printf("ql_wifi_close %d", ret);
|
|
ql_wifi_demo_ble_send_msg(QL_WIFI_DEMO_BLE_WIFI_OPEN);
|
|
break;
|
|
}
|
|
case QL_WIFI_DEMO_BLE_DATA_SEND:
|
|
{
|
|
/* Data test */
|
|
ql_wifi_ble_data_info_s ble_data = {0};
|
|
ble_data.data_len = strlen("wifi ble send data");
|
|
/* MAX:MTU-3, default: 20 */
|
|
uint32_t mtu_3 = 20;
|
|
if(ble_data.data_len > mtu_3)
|
|
{
|
|
printf("wifi ble data overflow");
|
|
break;
|
|
}
|
|
strcpy((char *)ble_data.data, "wifi ble send data");
|
|
|
|
/* uuid has been set in ql_wifi_demo_ble_init. */
|
|
ql_wifi_ble_send_data_info.data_len = ble_data.data_len;
|
|
ql_wifi_ble_send_data_info.data = (uint8_t *)ble_data.data;
|
|
printf("\r\ndata info:%d/0x%X%X/%d/%s/0x%x\r\n",ql_wifi_ble_send_data_info.uuid_len
|
|
,ql_wifi_ble_send_data_info.uuid[0],ql_wifi_ble_send_data_info.uuid[1]
|
|
,ql_wifi_ble_send_data_info.data_len
|
|
,(char*)ql_wifi_ble_send_data_info.data
|
|
, ql_wifi_ble_send_data_info.data);
|
|
ql_wifi_ble_sent_gatt_data(&ql_wifi_ble_send_data_info);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
printf("\r\nble_msg[%d] is not define\r\n", ql_wifi_demo_ble_msg.state);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
// application_init(ql_842d_sta_test, "842d_sta", 10, 100);
|
|
// application_init(ql_wifi_ble_test, "wifi_ble", 10, 100);
|