版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28877125/article/details/83063443
键-值对事件注册
1、注册事件
/**
* Register system event filter callback.
*
* @param[in] type event type interested.
* @param[in] cb system event callback.
* @param[in] priv private data past to cb.
*
* @return the operation status, 0 is OK, others is error.
*/
int aos_register_event_filter(uint16_t type, aos_event_cb cb, void *priv);
int aos_register_event_filter(uint16_t type, aos_event_cb cb, void *priv)
{
return SYS_CALL3(SYS_REGISTER_EVENT_FILTER, int, uint16_t, type,
aos_event_cb, cb, void *, priv);
}
aos_register_event_filter(EV_WIFI, wifi_service_event, NULL);
比如,在上面注册了一个类型为"EV_WIFI"的事件过滤器。而该类型下又有五个类型的具体的事件。
/* WiFi event */
#define EV_WIFI 0x0002
#define CODE_WIFI_CMD_RECONNECT 1
#define CODE_WIFI_ON_CONNECTED 2
#define CODE_WIFI_ON_DISCONNECT 3
#define CODE_WIFI_ON_PRE_GOT_IP 4
#define CODE_WIFI_ON_GOT_IP 5
获得WiFi的一些信息
路径:middleware\linkkit\hal\HAL_AWSS_rhino.c
如果想知道一个模块有没有配过网要怎么样才能知道呢?可以通过HAL_Wifi_Get_Ap_Info()
函数获取得到,如果没有配过网,strlen(ssid)
是为零的。
char ssid[33];
char passwd[65];
uint8_t bssid[6];
// 获得wifi信息
HAL_Wifi_Get_Ap_Info(ssid, passwd, bssid);
printf(">>>>>%d\r\n", sizeof(ssid));
printf(">>>>>%d\r\n", strlen(ssid));
printf("ssid >>>>>>>%s\r\n", ssid);
printf("passwd >>>>>>>%s\r\n", passwd);
printf("bssid >>>>>>>%d\r\n", bssid);
但是,如果配过网想重新配网,HAL_Wifi_Get_Ap_Info()
函数
1、重新配网:
先awss复位
do_awss_reset();
再进入配网模式
do_awss_active(); // 配网模式
再次获取wifi信息,WiFi信息已经被清空
char ssid[33];
char passwd[65];
uint8_t bssid[6];
// 获得wifi信息
HAL_Wifi_Get_Ap_Info(ssid, passwd, bssid);
// strlen(ssid) 为 0
AWSS复位的实现其实是清空WiFi信息,然后再硬件复位:
static void linkkit_reset(void *p)
{
netmgr_clear_ap_config(); // 清空WiFi的信息
HAL_Sys_reboot(); //系统硬件复位
}
static void do_awss_reset()
{
aos_post_delayed_action(2000, linkkit_reset, NULL);
}