cc3200: Add nic.iwconfig() to set/get WLAN configuration.
Changes are based on this post: https://github.com/micropython/micropython/issues/876#issuecomment-115255551 The constructor can optionally take the same params of iwconfig in order to configure WiFi when creating the object. Params are keyworkd only. The WiPy accepts: - mode (int -> WLAN.AP or WLAN.STA) - ssdi (string) - security (int -> WLAN.OPEN, WLAN.WEP, WLAN.WPA, WLAN.WPA2) - key (string) - channel (int (1-11)) - antenna (int -> WLAN.INTERNAL, WLAN.EXTERNAL)
This commit is contained in:
parent
e86b47175f
commit
00c4d6562e
|
@ -86,32 +86,31 @@ typedef enum{
|
||||||
|
|
||||||
STATUS_BIT_PING_DONE // If this bit is set: the device has completed
|
STATUS_BIT_PING_DONE // If this bit is set: the device has completed
|
||||||
// the ping operation
|
// the ping operation
|
||||||
}e_StatusBits;
|
} e_StatusBits;
|
||||||
|
|
||||||
typedef struct _wlan_obj_t {
|
typedef struct _wlan_obj_t {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
SlWlanMode_t mode;
|
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
|
|
||||||
uint32_t ip;
|
uint32_t ip;
|
||||||
uint32_t gateway;
|
|
||||||
uint32_t dns;
|
int8_t mode;
|
||||||
|
uint8_t security;
|
||||||
|
uint8_t channel;
|
||||||
|
uint8_t antenna;
|
||||||
|
|
||||||
|
// my own ssid, key and mac
|
||||||
|
uint8_t ssid[33];
|
||||||
|
uint8_t key[65];
|
||||||
|
uint8_t mac[SL_MAC_ADDR_LEN];
|
||||||
|
|
||||||
|
// the sssid (or name) and mac of the other device
|
||||||
|
uint8_t ssid_o[33];
|
||||||
|
uint8_t bssid[6];
|
||||||
|
|
||||||
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
||||||
bool servers_enabled;
|
bool servers_enabled;
|
||||||
#endif
|
#endif
|
||||||
uint8_t security;
|
|
||||||
|
|
||||||
// my own name and mac
|
|
||||||
uint8_t ssid[33];
|
|
||||||
uint8_t mac[SL_MAC_ADDR_LEN];
|
|
||||||
|
|
||||||
// the name and mac of the other device
|
|
||||||
uint8_t ssid_o[33];
|
|
||||||
uint8_t bssid[6];
|
|
||||||
|
|
||||||
bool staconnected;
|
|
||||||
|
|
||||||
} wlan_obj_t;
|
} wlan_obj_t;
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -141,16 +140,13 @@ typedef struct _wlan_obj_t {
|
||||||
#define MODWLAN_SCAN_PERIOD_S 3600 // 1 hour
|
#define MODWLAN_SCAN_PERIOD_S 3600 // 1 hour
|
||||||
#define MODWLAN_WAIT_FOR_SCAN_MS 1050
|
#define MODWLAN_WAIT_FOR_SCAN_MS 1050
|
||||||
|
|
||||||
#define ASSERT_ON_ERROR( x ) ASSERT((x) >= 0 )
|
#define ASSERT_ON_ERROR(x) ASSERT((x) >= 0)
|
||||||
|
|
||||||
#define IPV4_ADDR_STR_LEN_MAX (16)
|
#define IPV4_ADDR_STR_LEN_MAX (16)
|
||||||
|
|
||||||
#define WLAN_MAX_RX_SIZE 16000
|
#define WLAN_MAX_RX_SIZE 16000
|
||||||
#define WLAN_MAX_TX_SIZE 1476
|
#define WLAN_MAX_TX_SIZE 1476
|
||||||
|
|
||||||
#define MODWLAN_IP_MODE_DYNAMIC 0
|
|
||||||
#define MODWLAN_IP_MODE_STATIC 1
|
|
||||||
|
|
||||||
#define MAKE_SOCKADDR(addr, ip, port) sockaddr addr; \
|
#define MAKE_SOCKADDR(addr, ip, port) sockaddr addr; \
|
||||||
addr.sa_family = AF_INET; \
|
addr.sa_family = AF_INET; \
|
||||||
addr.sa_data[0] = port >> 8; \
|
addr.sa_data[0] = port >> 8; \
|
||||||
|
@ -173,17 +169,16 @@ STATIC wlan_obj_t wlan_obj = {
|
||||||
.mode = -1,
|
.mode = -1,
|
||||||
.status = 0,
|
.status = 0,
|
||||||
.ip = 0,
|
.ip = 0,
|
||||||
.gateway = 0,
|
.security = MICROPY_PORT_WLAN_AP_SECURITY,
|
||||||
.dns = 0,
|
.channel = MICROPY_PORT_WLAN_AP_CHANNEL,
|
||||||
|
.ssid = MICROPY_PORT_WLAN_AP_SSID,
|
||||||
|
.key = MICROPY_PORT_WLAN_AP_KEY,
|
||||||
|
.mac = {0},
|
||||||
|
.ssid_o = {0},
|
||||||
|
.bssid = {0},
|
||||||
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
||||||
.servers_enabled = false,
|
.servers_enabled = false,
|
||||||
#endif
|
#endif
|
||||||
.security = SL_SEC_TYPE_OPEN,
|
|
||||||
.ssid = {0},
|
|
||||||
.bssid = {0},
|
|
||||||
.mac = {0},
|
|
||||||
.ssid_o = {0},
|
|
||||||
.staconnected = false
|
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC const mp_cb_methods_t wlan_cb_methods;
|
STATIC const mp_cb_methods_t wlan_cb_methods;
|
||||||
|
@ -196,7 +191,7 @@ OsiLockObj_t wlan_LockObj;
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
DECLARE PRIVATE FUNCTIONS
|
DECLARE PRIVATE FUNCTIONS
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
STATIC void wlan_initialize_data (void);
|
STATIC void wlan_clear_data (void);
|
||||||
STATIC void wlan_reenable (SlWlanMode_t mode);
|
STATIC void wlan_reenable (SlWlanMode_t mode);
|
||||||
STATIC void wlan_servers_start (void);
|
STATIC void wlan_servers_start (void);
|
||||||
STATIC void wlan_servers_stop (void);
|
STATIC void wlan_servers_stop (void);
|
||||||
|
@ -252,7 +247,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
|
||||||
memcpy(wlan_obj.bssid, pEventData->mac, SL_BSSID_LENGTH);
|
memcpy(wlan_obj.bssid, pEventData->mac, SL_BSSID_LENGTH);
|
||||||
memcpy(wlan_obj.ssid_o, pEventData->go_peer_device_name, pEventData->go_peer_device_name_len);
|
memcpy(wlan_obj.ssid_o, pEventData->go_peer_device_name, pEventData->go_peer_device_name_len);
|
||||||
wlan_obj.ssid_o[pEventData->go_peer_device_name_len] = '\0';
|
wlan_obj.ssid_o[pEventData->go_peer_device_name_len] = '\0';
|
||||||
wlan_obj.staconnected = true;
|
SET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
|
||||||
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
||||||
// we must reset the servers in case that the last connection
|
// we must reset the servers in case that the last connection
|
||||||
// was lost without any notification being received
|
// was lost without any notification being received
|
||||||
|
@ -261,7 +256,7 @@ void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SL_WLAN_STA_DISCONNECTED_EVENT:
|
case SL_WLAN_STA_DISCONNECTED_EVENT:
|
||||||
wlan_obj.staconnected = false;
|
CLR_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION);
|
||||||
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
#if (MICROPY_PORT_HAS_TELNET || MICROPY_PORT_HAS_FTP)
|
||||||
servers_reset();
|
servers_reset();
|
||||||
#endif
|
#endif
|
||||||
|
@ -306,10 +301,8 @@ void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent) {
|
||||||
// Ip Acquired Event Data
|
// Ip Acquired Event Data
|
||||||
pEventData = &pNetAppEvent->EventData.ipAcquiredV4;
|
pEventData = &pNetAppEvent->EventData.ipAcquiredV4;
|
||||||
|
|
||||||
// Get ip, gateway and dns
|
// Get the ip
|
||||||
wlan_obj.gateway = pEventData->gateway;
|
|
||||||
wlan_obj.ip = pEventData->ip;
|
wlan_obj.ip = pEventData->ip;
|
||||||
wlan_obj.dns = pEventData->dns;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SL_NETAPP_IPV6_IPACQUIRED_EVENT:
|
case SL_NETAPP_IPV6_IPACQUIRED_EVENT:
|
||||||
|
@ -416,7 +409,7 @@ void wlan_pre_init (void) {
|
||||||
|
|
||||||
void wlan_first_start (void) {
|
void wlan_first_start (void) {
|
||||||
if (wlan_obj.mode < 0) {
|
if (wlan_obj.mode < 0) {
|
||||||
wlan_initialize_data();
|
CLR_STATUS_BIT_ALL(wlan_obj.status);
|
||||||
wlan_obj.mode = sl_Start(0, 0, 0);
|
wlan_obj.mode = sl_Start(0, 0, 0);
|
||||||
sl_LockObjUnlock (&wlan_LockObj);
|
sl_LockObjUnlock (&wlan_LockObj);
|
||||||
}
|
}
|
||||||
|
@ -425,122 +418,118 @@ void wlan_first_start (void) {
|
||||||
wlan_get_sl_mac();
|
wlan_get_sl_mac();
|
||||||
}
|
}
|
||||||
|
|
||||||
modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ssid_len, uint8_t sec,
|
void wlan_sl_enable (int8_t mode, const char *ssid, uint8_t ssid_len, uint8_t sec,
|
||||||
const char *key, uint8_t key_len, uint8_t channel, bool append_mac) {
|
const char *key, uint8_t key_len, uint8_t channel, bool append_mac) {
|
||||||
|
|
||||||
if (mode == ROLE_STA || mode == ROLE_AP || mode == ROLE_P2P) {
|
// stop the servers
|
||||||
// stop the servers
|
wlan_servers_stop();
|
||||||
wlan_servers_stop();
|
|
||||||
|
|
||||||
// do a basic start
|
// do a basic start
|
||||||
wlan_first_start();
|
wlan_first_start();
|
||||||
|
|
||||||
// Device in station-mode. Disconnect previous connection if any
|
// Device in station-mode. Disconnect previous connection if any
|
||||||
// The function returns 0 if 'Disconnected done', negative number if already
|
// The function returns 0 if 'Disconnected done', negative number if already
|
||||||
// disconnected Wait for 'disconnection' event if 0 is returned, Ignore
|
// disconnected Wait for 'disconnection' event if 0 is returned, Ignore
|
||||||
// other return-codes
|
// other return-codes
|
||||||
if (0 == sl_WlanDisconnect()) {
|
if (0 == sl_WlanDisconnect()) {
|
||||||
while (IS_CONNECTED (wlan_obj.status)) {
|
while (IS_CONNECTED (wlan_obj.status)) {
|
||||||
HAL_Delay (5);
|
HAL_Delay (5);
|
||||||
wlan_update();
|
wlan_update();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Remove all profiles
|
|
||||||
ASSERT_ON_ERROR(sl_WlanProfileDel(0xFF));
|
|
||||||
|
|
||||||
// Enable the DHCP client
|
|
||||||
uint8_t value = 1;
|
|
||||||
ASSERT_ON_ERROR(sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE, 1, 1, &value));
|
|
||||||
|
|
||||||
// Set PM policy to normal
|
|
||||||
ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_PM, SL_NORMAL_POLICY, NULL, 0));
|
|
||||||
|
|
||||||
// Unregister mDNS services
|
|
||||||
ASSERT_ON_ERROR(sl_NetAppMDNSUnRegisterService(0, 0));
|
|
||||||
|
|
||||||
// Stop the internal HTTP server
|
|
||||||
sl_NetAppStop(SL_NET_APP_HTTP_SERVER_ID);
|
|
||||||
|
|
||||||
// Remove all 64 filters (8 * 8)
|
|
||||||
_WlanRxFilterOperationCommandBuff_t RxFilterIdMask;
|
|
||||||
memset ((void *)&RxFilterIdMask, 0 ,sizeof(RxFilterIdMask));
|
|
||||||
memset(RxFilterIdMask.FilterIdMask, 0xFF, 8);
|
|
||||||
ASSERT_ON_ERROR(sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (_u8 *)&RxFilterIdMask, sizeof(_WlanRxFilterOperationCommandBuff_t)));
|
|
||||||
|
|
||||||
// Set Tx power level for station or AP mode
|
|
||||||
// Number between 0-15, as dB offset from max power - 0 will set max power
|
|
||||||
uint8_t ucPower = 0;
|
|
||||||
if (mode == ROLE_AP) {
|
|
||||||
// Switch to AP mode
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSetMode(mode));
|
|
||||||
ASSERT (ssid != NULL && key != NULL);
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_AP_TX_POWER, sizeof(ucPower),
|
|
||||||
(unsigned char *)&ucPower));
|
|
||||||
memcpy(wlan_obj.ssid, (unsigned char *)ssid, ssid_len);
|
|
||||||
// append the last 2 bytes of the MAC address, since the use of this functionality is under our controll
|
|
||||||
// we can assume that the lenght of the ssid is less than (32 - 5)
|
|
||||||
if (append_mac) {
|
|
||||||
snprintf((char *)&wlan_obj.ssid[ssid_len], sizeof(wlan_obj.ssid) - ssid_len, "-%02x%02x", wlan_obj.mac[4], wlan_obj.mac[5]);
|
|
||||||
ssid_len += 5;
|
|
||||||
}
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, ssid_len, (unsigned char *)wlan_obj.ssid));
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, sizeof(uint8_t), &sec));
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, key_len, (unsigned char *)key));
|
|
||||||
_u8* country = (_u8*)"EU";
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, 2, country));
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_CHANNEL, 1, (_u8 *)&channel));
|
|
||||||
|
|
||||||
// stop and start again
|
|
||||||
wlan_reenable(mode);
|
|
||||||
ASSERT (wlan_obj.mode == mode);
|
|
||||||
|
|
||||||
SlNetCfgIpV4Args_t ipV4;
|
|
||||||
ipV4.ipV4 = (_u32)SL_IPV4_VAL(192,168,1,1); // _u32 IP address
|
|
||||||
ipV4.ipV4Mask = (_u32)SL_IPV4_VAL(255,255,255,0); // _u32 Subnet mask for this AP
|
|
||||||
ipV4.ipV4Gateway = (_u32)SL_IPV4_VAL(192,168,1,1); // _u32 Default gateway address
|
|
||||||
ipV4.ipV4DnsServer = (_u32)SL_IPV4_VAL(192,168,1,1); // _u32 DNS server address
|
|
||||||
ASSERT_ON_ERROR(sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4,
|
|
||||||
sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4));
|
|
||||||
|
|
||||||
// stop and start again
|
|
||||||
wlan_reenable(mode);
|
|
||||||
|
|
||||||
SlNetAppDhcpServerBasicOpt_t dhcpParams;
|
|
||||||
dhcpParams.lease_time = 4096; // lease time (in seconds) of the IP Address
|
|
||||||
dhcpParams.ipv4_addr_start = SL_IPV4_VAL(192,168,1,2); // first IP Address for allocation.
|
|
||||||
dhcpParams.ipv4_addr_last = SL_IPV4_VAL(192,168,1,254); // last IP Address for allocation.
|
|
||||||
ASSERT_ON_ERROR(sl_NetAppStop(SL_NET_APP_DHCP_SERVER_ID)); // Stop DHCP server before settings
|
|
||||||
ASSERT_ON_ERROR(sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT,
|
|
||||||
sizeof(SlNetAppDhcpServerBasicOpt_t), (_u8* )&dhcpParams)); // set parameters
|
|
||||||
ASSERT_ON_ERROR(sl_NetAppStart(SL_NET_APP_DHCP_SERVER_ID)); // Start DHCP server with new settings
|
|
||||||
|
|
||||||
// stop and start again
|
|
||||||
wlan_reenable(mode);
|
|
||||||
|
|
||||||
// save the security type
|
|
||||||
wlan_obj.security = sec;
|
|
||||||
}
|
|
||||||
// STA and P2P modes
|
|
||||||
else {
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER,
|
|
||||||
sizeof(ucPower), (unsigned char *)&ucPower));
|
|
||||||
ASSERT_ON_ERROR(sl_WlanSetMode(mode));
|
|
||||||
// stop and start again
|
|
||||||
wlan_reenable(mode);
|
|
||||||
// set connection policy to Auto + Fast (tries to connect to the last connected AP)
|
|
||||||
ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_CONNECTION,SL_CONNECTION_POLICY(1, 1, 0, 0, 0), NULL, 0));
|
|
||||||
}
|
|
||||||
|
|
||||||
// set current time and date (needed to validate certificates)
|
|
||||||
wlan_set_current_time (pybrtc_get_seconds());
|
|
||||||
|
|
||||||
// start the servers before returning
|
|
||||||
wlan_servers_start();
|
|
||||||
|
|
||||||
return MODWLAN_OK;
|
|
||||||
}
|
}
|
||||||
return MODWLAN_ERROR_INVALID_PARAMS;
|
|
||||||
|
// Remove all profiles
|
||||||
|
ASSERT_ON_ERROR(sl_WlanProfileDel(0xFF));
|
||||||
|
|
||||||
|
// Enable the DHCP client
|
||||||
|
uint8_t value = 1;
|
||||||
|
ASSERT_ON_ERROR(sl_NetCfgSet(SL_IPV4_STA_P2P_CL_DHCP_ENABLE, 1, 1, &value));
|
||||||
|
|
||||||
|
// Set PM policy to normal
|
||||||
|
ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_PM, SL_NORMAL_POLICY, NULL, 0));
|
||||||
|
|
||||||
|
// Unregister mDNS services
|
||||||
|
ASSERT_ON_ERROR(sl_NetAppMDNSUnRegisterService(0, 0));
|
||||||
|
|
||||||
|
// Stop the internal HTTP server
|
||||||
|
sl_NetAppStop(SL_NET_APP_HTTP_SERVER_ID);
|
||||||
|
|
||||||
|
// Remove all 64 filters (8 * 8)
|
||||||
|
_WlanRxFilterOperationCommandBuff_t RxFilterIdMask;
|
||||||
|
memset ((void *)&RxFilterIdMask, 0 ,sizeof(RxFilterIdMask));
|
||||||
|
memset(RxFilterIdMask.FilterIdMask, 0xFF, 8);
|
||||||
|
ASSERT_ON_ERROR(sl_WlanRxFilterSet(SL_REMOVE_RX_FILTER, (_u8 *)&RxFilterIdMask, sizeof(_WlanRxFilterOperationCommandBuff_t)));
|
||||||
|
|
||||||
|
// Set Tx power level for station or AP mode
|
||||||
|
// Number between 0-15, as dB offset from max power - 0 will set max power
|
||||||
|
uint8_t ucPower = 0;
|
||||||
|
if (mode == ROLE_AP) {
|
||||||
|
// switch to AP mode
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSetMode(mode));
|
||||||
|
ASSERT (ssid != NULL && key != NULL);
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_AP_TX_POWER, sizeof(ucPower),
|
||||||
|
(unsigned char *)&ucPower));
|
||||||
|
memcpy(wlan_obj.ssid, (unsigned char *)ssid, ssid_len);
|
||||||
|
// append the last 2 bytes of the MAC address, since the use of this functionality is under our controll
|
||||||
|
// we can assume that the lenght of the ssid is less than (32 - 5)
|
||||||
|
if (append_mac) {
|
||||||
|
snprintf((char *)&wlan_obj.ssid[ssid_len], sizeof(wlan_obj.ssid) - ssid_len, "-%02x%02x", wlan_obj.mac[4], wlan_obj.mac[5]);
|
||||||
|
ssid_len += 5;
|
||||||
|
}
|
||||||
|
wlan_obj.ssid[ssid_len] = '\0';
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, ssid_len, (unsigned char *)wlan_obj.ssid));
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SECURITY_TYPE, sizeof(uint8_t), &sec));
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_PASSWORD, key_len, (unsigned char *)key));
|
||||||
|
_u8* country = (_u8*)"EU";
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE, 2, country));
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_CHANNEL, 1, (_u8 *)&channel));
|
||||||
|
|
||||||
|
// stop and start again
|
||||||
|
wlan_reenable(mode);
|
||||||
|
ASSERT (wlan_obj.mode == mode);
|
||||||
|
|
||||||
|
SlNetCfgIpV4Args_t ipV4;
|
||||||
|
ipV4.ipV4 = (_u32)SL_IPV4_VAL(192,168,1,1); // _u32 IP address
|
||||||
|
ipV4.ipV4Mask = (_u32)SL_IPV4_VAL(255,255,255,0); // _u32 Subnet mask for this AP
|
||||||
|
ipV4.ipV4Gateway = (_u32)SL_IPV4_VAL(192,168,1,1); // _u32 Default gateway address
|
||||||
|
ipV4.ipV4DnsServer = (_u32)SL_IPV4_VAL(192,168,1,1); // _u32 DNS server address
|
||||||
|
ASSERT_ON_ERROR(sl_NetCfgSet(SL_IPV4_AP_P2P_GO_STATIC_ENABLE, IPCONFIG_MODE_ENABLE_IPV4,
|
||||||
|
sizeof(SlNetCfgIpV4Args_t), (_u8 *)&ipV4));
|
||||||
|
|
||||||
|
// stop and start again
|
||||||
|
wlan_reenable(mode);
|
||||||
|
|
||||||
|
SlNetAppDhcpServerBasicOpt_t dhcpParams;
|
||||||
|
dhcpParams.lease_time = 4096; // lease time (in seconds) of the IP Address
|
||||||
|
dhcpParams.ipv4_addr_start = SL_IPV4_VAL(192,168,1,2); // first IP Address for allocation.
|
||||||
|
dhcpParams.ipv4_addr_last = SL_IPV4_VAL(192,168,1,254); // last IP Address for allocation.
|
||||||
|
ASSERT_ON_ERROR(sl_NetAppStop(SL_NET_APP_DHCP_SERVER_ID)); // Stop DHCP server before settings
|
||||||
|
ASSERT_ON_ERROR(sl_NetAppSet(SL_NET_APP_DHCP_SERVER_ID, NETAPP_SET_DHCP_SRV_BASIC_OPT,
|
||||||
|
sizeof(SlNetAppDhcpServerBasicOpt_t), (_u8* )&dhcpParams)); // set parameters
|
||||||
|
ASSERT_ON_ERROR(sl_NetAppStart(SL_NET_APP_DHCP_SERVER_ID)); // Start DHCP server with new settings
|
||||||
|
|
||||||
|
// stop and start again
|
||||||
|
wlan_reenable(mode);
|
||||||
|
|
||||||
|
// save the security type
|
||||||
|
wlan_obj.security = sec;
|
||||||
|
}
|
||||||
|
// STA and P2P modes
|
||||||
|
else {
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID, WLAN_GENERAL_PARAM_OPT_STA_TX_POWER,
|
||||||
|
sizeof(ucPower), (unsigned char *)&ucPower));
|
||||||
|
ASSERT_ON_ERROR(sl_WlanSetMode(mode));
|
||||||
|
// stop and start again
|
||||||
|
wlan_reenable(mode);
|
||||||
|
// set connection policy to Auto + Fast (tries to connect to the last connected AP)
|
||||||
|
ASSERT_ON_ERROR(sl_WlanPolicySet(SL_POLICY_CONNECTION,SL_CONNECTION_POLICY(1, 1, 0, 0, 0), NULL, 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
// set current time and date (needed to validate certificates)
|
||||||
|
wlan_set_current_time (pybrtc_get_seconds());
|
||||||
|
|
||||||
|
// start the servers before returning
|
||||||
|
wlan_servers_start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlan_update(void) {
|
void wlan_update(void) {
|
||||||
|
@ -553,6 +542,7 @@ void wlan_stop (uint32_t timeout) {
|
||||||
wlan_servers_stop();
|
wlan_servers_stop();
|
||||||
sl_LockObjLock (&wlan_LockObj, SL_OS_WAIT_FOREVER);
|
sl_LockObjLock (&wlan_LockObj, SL_OS_WAIT_FOREVER);
|
||||||
sl_Stop(timeout);
|
sl_Stop(timeout);
|
||||||
|
wlan_clear_data();
|
||||||
wlan_obj.mode = -1;
|
wlan_obj.mode = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -575,8 +565,8 @@ void wlan_get_ip (uint32_t *ip) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wlan_is_connected (void) {
|
bool wlan_is_connected (void) {
|
||||||
return ((GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION) &&
|
return (GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_CONNECTION) &&
|
||||||
GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED)) || wlan_obj.staconnected);
|
(GET_STATUS_BIT(wlan_obj.status, STATUS_BIT_IP_ACQUIRED) || wlan_obj.mode != ROLE_STA));
|
||||||
}
|
}
|
||||||
|
|
||||||
void wlan_set_current_time (uint32_t seconds_since_2000) {
|
void wlan_set_current_time (uint32_t seconds_since_2000) {
|
||||||
|
@ -597,14 +587,9 @@ void wlan_set_current_time (uint32_t seconds_since_2000) {
|
||||||
// DEFINE STATIC FUNCTIONS
|
// DEFINE STATIC FUNCTIONS
|
||||||
//*****************************************************************************
|
//*****************************************************************************
|
||||||
|
|
||||||
STATIC void wlan_initialize_data (void) {
|
STATIC void wlan_clear_data (void) {
|
||||||
CLR_STATUS_BIT_ALL(wlan_obj.status);
|
CLR_STATUS_BIT_ALL(wlan_obj.status);
|
||||||
wlan_obj.dns = 0;
|
|
||||||
wlan_obj.gateway = 0;
|
|
||||||
wlan_obj.ip = 0;
|
wlan_obj.ip = 0;
|
||||||
wlan_obj.security = SL_SEC_TYPE_OPEN;
|
|
||||||
wlan_obj.staconnected = false;
|
|
||||||
memset(wlan_obj.ssid, 0, sizeof(wlan_obj.ssid));
|
|
||||||
memset(wlan_obj.ssid_o, 0, sizeof(wlan_obj.ssid));
|
memset(wlan_obj.ssid_o, 0, sizeof(wlan_obj.ssid));
|
||||||
memset(wlan_obj.bssid, 0, sizeof(wlan_obj.bssid));
|
memset(wlan_obj.bssid, 0, sizeof(wlan_obj.bssid));
|
||||||
}
|
}
|
||||||
|
@ -613,8 +598,7 @@ STATIC void wlan_reenable (SlWlanMode_t mode) {
|
||||||
// stop and start again
|
// stop and start again
|
||||||
sl_LockObjLock (&wlan_LockObj, SL_OS_WAIT_FOREVER);
|
sl_LockObjLock (&wlan_LockObj, SL_OS_WAIT_FOREVER);
|
||||||
sl_Stop(SL_STOP_TIMEOUT);
|
sl_Stop(SL_STOP_TIMEOUT);
|
||||||
CLR_STATUS_BIT_ALL(wlan_obj.status);
|
wlan_clear_data();
|
||||||
wlan_obj.staconnected = false;
|
|
||||||
wlan_obj.mode = sl_Start(0, 0, 0);
|
wlan_obj.mode = sl_Start(0, 0, 0);
|
||||||
sl_LockObjUnlock (&wlan_LockObj);
|
sl_LockObjUnlock (&wlan_LockObj);
|
||||||
ASSERT (wlan_obj.mode == mode);
|
ASSERT (wlan_obj.mode == mode);
|
||||||
|
@ -667,7 +651,7 @@ STATIC void wlan_get_sl_mac (void) {
|
||||||
sl_NetCfgGet(SL_MAC_ADDRESS_GET, NULL, &macAddrLen, wlan_obj.mac);
|
sl_NetCfgGet(SL_MAC_ADDRESS_GET, NULL, &macAddrLen, wlan_obj.mac);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// \method init(mode, ssid=None, *, security=wlan.OPEN, key=None, channel=5)
|
/// \method iwconfig(*, mode, ssid, security, key, channel, antenna)
|
||||||
///
|
///
|
||||||
/// Initialise the WLAN engine with the given parameters:
|
/// Initialise the WLAN engine with the given parameters:
|
||||||
///
|
///
|
||||||
|
@ -676,39 +660,103 @@ STATIC void wlan_get_sl_mac (void) {
|
||||||
/// - `security` is the security type for AP mode
|
/// - `security` is the security type for AP mode
|
||||||
/// - `key` is the key when in AP mode
|
/// - `key` is the key when in AP mode
|
||||||
/// - `channel` is the channel to use for the AP network
|
/// - `channel` is the channel to use for the AP network
|
||||||
STATIC const mp_arg_t wlan_init_args[] = {
|
/// - `antenna` selects between the internal or the external one
|
||||||
{ MP_QSTR_mode, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = ROLE_STA} },
|
STATIC const mp_arg_t wlan_iwconfig_args[] = {
|
||||||
{ MP_QSTR_ssid, MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
{ MP_QSTR_mode, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
{ MP_QSTR_security, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = SL_SEC_TYPE_OPEN} },
|
{ MP_QSTR_ssid, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
{ MP_QSTR_key, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = mp_const_none} },
|
{ MP_QSTR_security, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
{ MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 5} },
|
{ MP_QSTR_key, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
{ MP_QSTR_channel, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
|
{ MP_QSTR_antenna, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
|
||||||
};
|
};
|
||||||
|
|
||||||
STATIC mp_obj_t wlan_init_helper(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t wlan_iwconfig(mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
// parse args
|
// parse args
|
||||||
mp_arg_val_t args[MP_ARRAY_SIZE(wlan_init_args)];
|
mp_arg_val_t args[MP_ARRAY_SIZE(wlan_iwconfig_args)];
|
||||||
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(wlan_init_args), wlan_init_args, args);
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, MP_ARRAY_SIZE(wlan_iwconfig_args), wlan_iwconfig_args, args);
|
||||||
|
|
||||||
// get the ssid
|
bool config = false;
|
||||||
mp_uint_t ssid_len;
|
// all params are kw only, so check 'em one by one
|
||||||
const char *ssid = mp_obj_str_get_data(args[1].u_obj, &ssid_len);
|
if (args[0].u_obj != MP_OBJ_NULL) {
|
||||||
if (ssid_len > 32) {
|
int8_t mode = mp_obj_get_int(args[0].u_obj);
|
||||||
goto arg_error;
|
if (mode != ROLE_AP && mode != ROLE_STA && mode != ROLE_P2P) {
|
||||||
|
goto arg_error;
|
||||||
|
}
|
||||||
|
wlan_obj.mode = mode;
|
||||||
|
config = true;
|
||||||
|
}
|
||||||
|
if (args[1].u_obj != MP_OBJ_NULL) {
|
||||||
|
// get the ssid
|
||||||
|
mp_uint_t ssid_len;
|
||||||
|
const char *ssid = mp_obj_str_get_data(args[1].u_obj, &ssid_len);
|
||||||
|
if (ssid_len > 32) {
|
||||||
|
goto arg_error;
|
||||||
|
}
|
||||||
|
memcpy (wlan_obj.ssid, ssid, ssid_len);
|
||||||
|
wlan_obj.ssid[ssid_len] = '\0';
|
||||||
|
config = true;
|
||||||
|
}
|
||||||
|
if (args[2].u_obj != MP_OBJ_NULL) {
|
||||||
|
int8_t security = mp_obj_get_int(args[2].u_obj);
|
||||||
|
if (security != SL_SEC_TYPE_OPEN && security != SL_SEC_TYPE_WEP && security != SL_SEC_TYPE_WPA_WPA2) {
|
||||||
|
goto arg_error;
|
||||||
|
}
|
||||||
|
wlan_obj.security = security;
|
||||||
|
config = true;
|
||||||
|
}
|
||||||
|
if (args[3].u_obj != MP_OBJ_NULL) {
|
||||||
|
// get the key
|
||||||
|
mp_uint_t key_len;
|
||||||
|
const char *key = mp_obj_str_get_data(args[3].u_obj, &key_len);
|
||||||
|
if (key_len < 5 || key_len > 64) {
|
||||||
|
goto arg_error;
|
||||||
|
}
|
||||||
|
memcpy (wlan_obj.key, key, key_len);
|
||||||
|
wlan_obj.key[key_len] = '\0';
|
||||||
|
config = true;
|
||||||
|
}
|
||||||
|
if (args[4].u_obj != MP_OBJ_NULL) {
|
||||||
|
int8_t channel = mp_obj_get_int(args[4].u_obj);
|
||||||
|
if (channel < 1 || channel > 11) {
|
||||||
|
goto arg_error;
|
||||||
|
}
|
||||||
|
wlan_obj.channel = channel;
|
||||||
|
config = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the key
|
if (config) {
|
||||||
mp_uint_t key_len;
|
wlan_sl_enable (wlan_obj.mode, (const char *)wlan_obj.ssid, strlen((const char *)wlan_obj.ssid), wlan_obj.security,
|
||||||
const char *key = mp_obj_str_get_data(args[3].u_obj, &key_len);
|
(const char *)wlan_obj.key, strlen((const char *)wlan_obj.key), wlan_obj.channel, false);
|
||||||
if (key_len < 8) {
|
|
||||||
goto arg_error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// force the channel to be between 1-11
|
if (args[5].u_obj != MP_OBJ_NULL) {
|
||||||
uint8_t channel = args[4].u_int;
|
#if MICROPY_HW_ANTENNA_DIVERSITY
|
||||||
channel = (channel > 0 && channel != 12) ? channel % 12 : 1;
|
int8_t antenna = mp_obj_get_int(args[5].u_obj);
|
||||||
|
if (antenna != ANTENNA_TYPE_INTERNAL && antenna != ANTENNA_TYPE_EXTERNAL) {
|
||||||
|
goto arg_error;
|
||||||
|
}
|
||||||
|
wlan_obj.antenna = antenna;
|
||||||
|
antenna_select (antenna);
|
||||||
|
#endif
|
||||||
|
config = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (MODWLAN_OK != wlan_sl_enable (args[0].u_int, ssid, ssid_len, args[2].u_int, key, key_len, channel, false)) {
|
if (!config) {
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
// return the current configuration
|
||||||
|
STATIC const qstr iwconfig_fields[] = {
|
||||||
|
MP_QSTR_mode, MP_QSTR_ssid,
|
||||||
|
MP_QSTR_security, MP_QSTR_key,
|
||||||
|
MP_QSTR_channel, MP_QSTR_antenna
|
||||||
|
};
|
||||||
|
|
||||||
|
mp_obj_t iwconfig[6];
|
||||||
|
iwconfig[0] = mp_obj_new_int(wlan_obj.mode);
|
||||||
|
iwconfig[1] = mp_obj_new_str((const char *)wlan_obj.ssid, strlen((const char *)wlan_obj.ssid), false);
|
||||||
|
iwconfig[2] = mp_obj_new_int(wlan_obj.security);
|
||||||
|
iwconfig[3] = mp_obj_new_str((const char *)wlan_obj.key, strlen((const char *)wlan_obj.key), false);
|
||||||
|
iwconfig[4] = mp_obj_new_int(wlan_obj.channel);
|
||||||
|
iwconfig[5] = mp_obj_new_int(wlan_obj.antenna);
|
||||||
|
return mp_obj_new_attrtuple(iwconfig_fields, MP_ARRAY_SIZE(iwconfig), iwconfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
@ -716,6 +764,7 @@ STATIC mp_obj_t wlan_init_helper(mp_uint_t n_args, const mp_obj_t *pos_args, mp_
|
||||||
arg_error:
|
arg_error:
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
||||||
}
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_iwconfig_obj, 1, wlan_iwconfig);
|
||||||
|
|
||||||
STATIC void wlan_lpds_callback_enable (mp_obj_t self_in) {
|
STATIC void wlan_lpds_callback_enable (mp_obj_t self_in) {
|
||||||
mp_obj_t _callback = mpcallback_find(self_in);
|
mp_obj_t _callback = mpcallback_find(self_in);
|
||||||
|
@ -740,36 +789,19 @@ STATIC bool wlan_scan_result_is_unique (const mp_obj_list_t *nets, _u8 *bssid) {
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
// Micro Python bindings; WLAN class
|
// Micro Python bindings; WLAN class
|
||||||
|
|
||||||
/// \class WLAN - driver for the WLAN functionality of the SoC
|
/// \class WLAN - WiFi driver
|
||||||
|
|
||||||
/// \classmethod \constructor()
|
/// \classmethod \constructor()
|
||||||
/// Create a wlan obecjt and initialise the simplelink engine
|
/// Create a wlan object. See iwconfig for parameters of initialization.
|
||||||
//
|
|
||||||
STATIC mp_obj_t wlan_make_new (mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
|
STATIC mp_obj_t wlan_make_new (mp_obj_t type_in, mp_uint_t n_args, mp_uint_t n_kw, const mp_obj_t *args) {
|
||||||
// check arguments
|
// check arguments
|
||||||
mp_arg_check_num(n_args, n_kw, 0, MP_ARRAY_SIZE(wlan_init_args), true);
|
mp_arg_check_num(n_args, n_kw, 0, MP_ARRAY_SIZE(wlan_iwconfig_args), true);
|
||||||
|
|
||||||
if (n_args > 0) {
|
|
||||||
// get the mode
|
|
||||||
SlWlanMode_t mode = mp_obj_get_int(args[0]);
|
|
||||||
if (mode == ROLE_AP) {
|
|
||||||
// start the peripheral
|
|
||||||
mp_map_t kw_args;
|
|
||||||
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
|
|
||||||
wlan_init_helper(n_args, args, &kw_args);
|
|
||||||
}
|
|
||||||
// TODO only STA mode supported for the moment. What if P2P?
|
|
||||||
else if (n_args == 1) {
|
|
||||||
if (MODWLAN_OK != wlan_sl_enable (mode, NULL, 0, 0, NULL, 0, 0, false)) {
|
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, mpexception_os_operation_failed));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, mpexception_num_type_invalid_arguments));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wlan_obj.base.type = (mp_obj_type_t*)&mod_network_nic_type_wlan;
|
wlan_obj.base.type = (mp_obj_type_t*)&mod_network_nic_type_wlan;
|
||||||
|
if (n_kw > 0) {
|
||||||
|
mp_map_t kw_args;
|
||||||
|
mp_map_init_fixed_table(&kw_args, n_kw, args);
|
||||||
|
wlan_iwconfig(1, (const mp_obj_t *)&wlan_obj, &kw_args);
|
||||||
|
}
|
||||||
return &wlan_obj;
|
return &wlan_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -977,7 +1009,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(wlan_urn_obj, 1, 2, wlan_urn);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// \method wlan_netlist()
|
/// \method wlan_netlist()
|
||||||
/// Return a list of tuples with all the acces points within range
|
/// Return a list of tuples with all the access points within range
|
||||||
STATIC mp_obj_t wlan_scan(mp_obj_t self_in) {
|
STATIC mp_obj_t wlan_scan(mp_obj_t self_in) {
|
||||||
STATIC const qstr wlan_scan_info_fields[] = {
|
STATIC const qstr wlan_scan_info_fields[] = {
|
||||||
MP_QSTR_ssid, MP_QSTR_bssid,
|
MP_QSTR_ssid, MP_QSTR_bssid,
|
||||||
|
@ -1032,7 +1064,7 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_scan_obj, wlan_scan);
|
||||||
|
|
||||||
/// \method callback(handler, pwrmode)
|
/// \method callback(handler, pwrmode)
|
||||||
/// Create a callback object associated with WLAN
|
/// Create a callback object associated with WLAN
|
||||||
/// min num of arguments is 1 (pwrmode)
|
/// min num of arguments is 1 (wakes)
|
||||||
STATIC mp_obj_t wlan_callback (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
STATIC mp_obj_t wlan_callback (mp_uint_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
mp_arg_val_t args[mpcallback_INIT_NUM_ARGS];
|
mp_arg_val_t args[mpcallback_INIT_NUM_ARGS];
|
||||||
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, mpcallback_INIT_NUM_ARGS, mpcallback_init_args, args);
|
mp_arg_parse_all(n_args - 1, pos_args + 1, kw_args, mpcallback_INIT_NUM_ARGS, mpcallback_init_args, args);
|
||||||
|
@ -1057,23 +1089,12 @@ STATIC mp_obj_t wlan_callback (mp_uint_t n_args, const mp_obj_t *pos_args, mp_ma
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_callback_obj, 1, wlan_callback);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(wlan_callback_obj, 1, wlan_callback);
|
||||||
|
|
||||||
/// \method info()
|
/// \method mac()
|
||||||
/// returns (mode, ssid, security, mac)
|
/// returns the MAC address
|
||||||
STATIC mp_obj_t wlan_info (mp_obj_t self_in) {
|
STATIC mp_obj_t wlan_mac (mp_obj_t self_in) {
|
||||||
STATIC const qstr wlan_info_fields[] = {
|
return mp_obj_new_bytes((const byte *)wlan_obj.mac, SL_BSSID_LENGTH);
|
||||||
MP_QSTR_mode, MP_QSTR_ssid,
|
|
||||||
MP_QSTR_security, MP_QSTR_mac
|
|
||||||
};
|
|
||||||
|
|
||||||
mp_obj_t wlan_info[4];
|
|
||||||
wlan_info[0] = mp_obj_new_int(wlan_obj.mode);
|
|
||||||
wlan_info[1] = wlan_obj.mode != ROLE_STA ?
|
|
||||||
mp_obj_new_str((const char *)wlan_obj.ssid, strlen((const char *)wlan_obj.ssid), false) : MP_OBJ_NEW_QSTR(MP_QSTR_);
|
|
||||||
wlan_info[2] = mp_obj_new_int(wlan_obj.security);
|
|
||||||
wlan_info[3] = mp_obj_new_bytes((const byte *)wlan_obj.mac, SL_BSSID_LENGTH);
|
|
||||||
return mp_obj_new_attrtuple(wlan_info_fields, MP_ARRAY_SIZE(wlan_info), wlan_info);
|
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_info_obj, wlan_info);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_mac_obj, wlan_mac);
|
||||||
|
|
||||||
/// \method connections()
|
/// \method connections()
|
||||||
/// returns (ssid/name, bssi), name is the P2P name if in this mode
|
/// returns (ssid/name, bssi), name is the P2P name if in this mode
|
||||||
|
@ -1091,52 +1112,29 @@ STATIC mp_obj_t wlan_connections (mp_obj_t self_in) {
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_connections_obj, wlan_connections);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(wlan_connections_obj, wlan_connections);
|
||||||
|
|
||||||
#if MICROPY_HW_ANTENNA_DIVERSITY
|
|
||||||
/// \method antenna()
|
|
||||||
/// select the antenna type to use (internal or external)
|
|
||||||
STATIC mp_obj_t wlan_antenna (mp_obj_t self_in, mp_obj_t antenna_o) {
|
|
||||||
antenna_type_t _antenna = mp_obj_get_int(antenna_o);
|
|
||||||
|
|
||||||
if (_antenna != ANTENNA_TYPE_INTERNAL && _antenna != ANTENNA_TYPE_EXTERNAL) {
|
|
||||||
// invalid antenna type
|
|
||||||
nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, mpexception_value_invalid_arguments));
|
|
||||||
}
|
|
||||||
|
|
||||||
antenna_select (_antenna);
|
|
||||||
|
|
||||||
return mp_const_none;
|
|
||||||
}
|
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(wlan_antenna_obj, wlan_antenna);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
STATIC const mp_map_elem_t wlan_locals_dict_table[] = {
|
STATIC const mp_map_elem_t wlan_locals_dict_table[] = {
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&wlan_connect_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_iwconfig), (mp_obj_t)&wlan_iwconfig_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_scan), (mp_obj_t)&wlan_scan_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_scan), (mp_obj_t)&wlan_scan_obj },
|
||||||
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_connect), (mp_obj_t)&wlan_connect_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_disconnect), (mp_obj_t)&wlan_disconnect_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_disconnect), (mp_obj_t)&wlan_disconnect_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_isconnected), (mp_obj_t)&wlan_isconnected_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_isconnected), (mp_obj_t)&wlan_isconnected_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_ifconfig), (mp_obj_t)&wlan_ifconfig_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_ifconfig), (mp_obj_t)&wlan_ifconfig_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_info), (mp_obj_t)&wlan_info_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_mac), (mp_obj_t)&wlan_mac_obj },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_connections), (mp_obj_t)&wlan_connections_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_connections), (mp_obj_t)&wlan_connections_obj },
|
||||||
#if MICROPY_HW_ANTENNA_DIVERSITY
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_antenna), (mp_obj_t)&wlan_antenna_obj },
|
|
||||||
#endif
|
|
||||||
#if MICROPY_PORT_WLAN_URN
|
#if MICROPY_PORT_WLAN_URN
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_urn), (mp_obj_t)&wlan_urn_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_urn), (mp_obj_t)&wlan_urn_obj },
|
||||||
#endif
|
#endif
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&wlan_callback_obj },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_callback), (mp_obj_t)&wlan_callback_obj },
|
||||||
|
|
||||||
// class constants
|
// class constants
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_OPEN), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_OPEN) },
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WEP), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WEP) },
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WPA_WPA2), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WPA_WPA2) },
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WPA_ENT), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WPA_ENT) },
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WPS_PBC), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WPS_PBC) },
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_WPS_PIN), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WPS_PIN) },
|
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_STA), MP_OBJ_NEW_SMALL_INT(ROLE_STA) },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_STA), MP_OBJ_NEW_SMALL_INT(ROLE_STA) },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_AP), MP_OBJ_NEW_SMALL_INT(ROLE_AP) },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_AP), MP_OBJ_NEW_SMALL_INT(ROLE_AP) },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_P2P), MP_OBJ_NEW_SMALL_INT(ROLE_P2P) },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_OPEN), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_OPEN) },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_INT_ANTENNA), MP_OBJ_NEW_SMALL_INT(ANTENNA_TYPE_INTERNAL) },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_WEP), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WEP) },
|
||||||
{ MP_OBJ_NEW_QSTR(MP_QSTR_EXT_ANTENNA), MP_OBJ_NEW_SMALL_INT(ANTENNA_TYPE_EXTERNAL) },
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_WPA), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WPA_WPA2) },
|
||||||
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_WPA2), MP_OBJ_NEW_SMALL_INT(SL_SEC_TYPE_WPA_WPA2) },
|
||||||
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_INTERNAL), MP_OBJ_NEW_SMALL_INT(ANTENNA_TYPE_INTERNAL) },
|
||||||
|
{ MP_OBJ_NEW_QSTR(MP_QSTR_EXTERNAL), MP_OBJ_NEW_SMALL_INT(ANTENNA_TYPE_EXTERNAL) },
|
||||||
};
|
};
|
||||||
STATIC MP_DEFINE_CONST_DICT(wlan_locals_dict, wlan_locals_dict_table);
|
STATIC MP_DEFINE_CONST_DICT(wlan_locals_dict, wlan_locals_dict_table);
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ typedef enum {
|
||||||
MODWLAN_ERROR_INVALID_PARAMS = -1,
|
MODWLAN_ERROR_INVALID_PARAMS = -1,
|
||||||
MODWLAN_ERROR_TIMEOUT = -2,
|
MODWLAN_ERROR_TIMEOUT = -2,
|
||||||
MODWLAN_ERROR_UNKNOWN = -3,
|
MODWLAN_ERROR_UNKNOWN = -3,
|
||||||
}modwlan_Status_t;
|
} modwlan_Status_t;
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
DECLARE PUBLIC DATA
|
DECLARE PUBLIC DATA
|
||||||
|
@ -54,8 +54,8 @@ extern _SlLockObj_t wlan_LockObj;
|
||||||
DECLARE PUBLIC FUNCTIONS
|
DECLARE PUBLIC FUNCTIONS
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
extern void wlan_pre_init (void);
|
extern void wlan_pre_init (void);
|
||||||
extern modwlan_Status_t wlan_sl_enable (SlWlanMode_t mode, const char *ssid, uint8_t ssid_len, uint8_t sec,
|
extern void wlan_sl_enable (int8_t mode, const char *ssid, uint8_t ssid_len, uint8_t sec,
|
||||||
const char *key, uint8_t key_len, uint8_t channel, bool append_mac);
|
const char *key, uint8_t key_len, uint8_t channel, bool append_mac);
|
||||||
extern void wlan_first_start (void);
|
extern void wlan_first_start (void);
|
||||||
extern void wlan_update(void);
|
extern void wlan_update(void);
|
||||||
extern void wlan_stop (uint32_t timeout);
|
extern void wlan_stop (uint32_t timeout);
|
||||||
|
|
|
@ -264,6 +264,7 @@ Q(server_timeout)
|
||||||
|
|
||||||
// for WLAN class
|
// for WLAN class
|
||||||
Q(WLAN)
|
Q(WLAN)
|
||||||
|
Q(iwconfig)
|
||||||
Q(key)
|
Q(key)
|
||||||
Q(security)
|
Q(security)
|
||||||
Q(ssid)
|
Q(ssid)
|
||||||
|
@ -277,7 +278,9 @@ Q(rssi)
|
||||||
Q(ifconfig)
|
Q(ifconfig)
|
||||||
Q(info)
|
Q(info)
|
||||||
Q(connections)
|
Q(connections)
|
||||||
|
#if MICROPY_PORT_WLAN_URN
|
||||||
Q(urn)
|
Q(urn)
|
||||||
|
#endif
|
||||||
Q(mode)
|
Q(mode)
|
||||||
Q(ip)
|
Q(ip)
|
||||||
Q(subnet)
|
Q(subnet)
|
||||||
|
@ -287,15 +290,12 @@ Q(mac)
|
||||||
Q(antenna)
|
Q(antenna)
|
||||||
Q(STA)
|
Q(STA)
|
||||||
Q(AP)
|
Q(AP)
|
||||||
Q(P2P)
|
|
||||||
Q(OPEN)
|
Q(OPEN)
|
||||||
Q(WEP)
|
Q(WEP)
|
||||||
Q(WPA_WPA2)
|
Q(WPA)
|
||||||
Q(WPA_ENT)
|
Q(WPA2)
|
||||||
Q(WPS_PBC)
|
Q(INTERNAL)
|
||||||
Q(WPS_PIN)
|
Q(EXTERNAL)
|
||||||
Q(INT_ANTENNA)
|
|
||||||
Q(EXT_ANTENNA)
|
|
||||||
|
|
||||||
// for WDT class
|
// for WDT class
|
||||||
Q(WDT)
|
Q(WDT)
|
||||||
|
|
|
@ -242,8 +242,8 @@ class WLAN
|
||||||
|
|
||||||
import network
|
import network
|
||||||
# setup as a station
|
# setup as a station
|
||||||
nic = network.WLAN(WLAN.STA)
|
nic = network.WLAN(mode=WLAN.STA)
|
||||||
nic.connect('your-ssid', security=WLAN.WPA_WPA2, key='your-key')
|
nic.connect('your-ssid', security=WLAN.WPA2, key='your-key')
|
||||||
while not nic.isconnected():
|
while not nic.isconnected():
|
||||||
pyb.delay(50)
|
pyb.delay(50)
|
||||||
print(nic.ifconfig())
|
print(nic.ifconfig())
|
||||||
|
@ -254,32 +254,41 @@ class WLAN
|
||||||
Constructors
|
Constructors
|
||||||
------------
|
------------
|
||||||
|
|
||||||
.. class:: WLAN(mode, ssid, \*, security=WLAN.OPEN, key=None, channel=5)
|
.. class:: WLAN(..)
|
||||||
|
|
||||||
Create a WLAN driver object, initialise the WLAN engine in station or AP mode.
|
Create a WLAN object, and optionally configure it. See ``iwconfig`` for params of configuration.
|
||||||
|
|
||||||
|
Methods
|
||||||
|
-------
|
||||||
|
|
||||||
|
.. method:: iwconfig(\*, mode, ssid, security, key, channel, antenna)
|
||||||
|
|
||||||
|
Set or get the WiFi network processor configuration.
|
||||||
|
|
||||||
Arguments are:
|
Arguments are:
|
||||||
|
|
||||||
- ``mode`` can be either ``WLAN.STA`` or ``WLAN.AP``.
|
- ``mode`` can be either ``WLAN.STA`` or ``WLAN.AP``.
|
||||||
- ``ssid`` is a string with the ssid name. Only needed when mode is ``WLAN.AP``.
|
- ``ssid`` is a string with the ssid name. Only needed when mode is ``WLAN.AP``.
|
||||||
- ``security`` can be ``WLAN.OPEN``, ``WLAN.WEP`` or ``WLAN.WPA_WPA2``.
|
- ``security`` can be ``WLAN.OPEN``, ``WLAN.WEP``, ``WLAN.WPA`` or ``WLAN.WPA2``.
|
||||||
Only needed when mode is ``WLAN.AP``.
|
Only needed when mode is ``WLAN.AP``.
|
||||||
- ``key`` is a string with the ``WLAN.WPA_WPA2`` key or a byte array with the
|
- ``key`` is a string with the network password. Not needed when mode is ``WLAN.STA``
|
||||||
``WLAN.WEP`` key. Not needed when mode is ``WLAN.STA`` or security is ``WLAN.OPEN``.
|
or security is ``WLAN.OPEN``.
|
||||||
- ``channel`` a number in the range 1-11. Only needed when mode is ``WLAN.AP``.
|
- ``channel`` a number in the range 1-11. Only needed when mode is ``WLAN.AP``.
|
||||||
|
- ``antenna`` selects between the internal and the external antenna. Can be either
|
||||||
|
``WLAN.INTERNAL`` or ``WLAN.EXTERNAL``.
|
||||||
|
|
||||||
For example, you can use::
|
For example, you can do::
|
||||||
|
|
||||||
# configure as an access point
|
# create and configure as an access point
|
||||||
nic = network.WLAN(WLAN.AP, 'wipy-wlan', security=WLAN.WPA_WPA2, key='www.wipy.io', channel=7)
|
nic.iwconfig(mode=WLAN.AP, ssid='wipy-wlan', security=WLAN.WPA2, key='www.wipy.io', channel=7, antenna=WLAN.INTERNAL)
|
||||||
|
|
||||||
or::
|
or::
|
||||||
|
|
||||||
# configure as an station
|
# configure as an station
|
||||||
nic = network.WLAN(WLAN.STA)
|
nic.iwconfig(mode=WLAN.STA)
|
||||||
|
|
||||||
Methods
|
With no arguments given, the current configuration is returned as a namedtuple that looks like this:
|
||||||
-------
|
``(mode=2, ssid='wipy-wlan', security=2, key='www.wipy.io', channel=5, antenna=0)``
|
||||||
|
|
||||||
.. method:: wlan.connect(ssid, \*, security=WLAN.OPEN, key=None, bssid=None, timeout=5000)
|
.. method:: wlan.connect(ssid, \*, security=WLAN.OPEN, key=None, bssid=None, timeout=5000)
|
||||||
|
|
||||||
|
@ -301,8 +310,8 @@ class WLAN
|
||||||
|
|
||||||
.. method:: wlan.isconnected()
|
.. method:: wlan.isconnected()
|
||||||
|
|
||||||
Returns True if connected to a wifi access point and has a valid IP address,
|
In case of STA mode, returns ``True`` if connected to a wifi access point and has a valid IP address.
|
||||||
False otherwise.
|
In AP mode returns ``True`` when a station is connected. Returns ``False`` otherwise.
|
||||||
|
|
||||||
.. method:: wlan.ifconfig(['dhcp' or configtuple])
|
.. method:: wlan.ifconfig(['dhcp' or configtuple])
|
||||||
|
|
||||||
|
@ -315,26 +324,15 @@ class WLAN
|
||||||
|
|
||||||
nic.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))
|
nic.ifconfig(('192.168.0.4', '255.255.255.0', '192.168.0.1', '8.8.8.8'))
|
||||||
|
|
||||||
.. method:: wlan.info()
|
.. method:: wlan.mac()
|
||||||
|
|
||||||
Provides information about the current WLAN configuration. Returns a named tuple
|
Returns a 6-byte long bytes object with the MAC address.
|
||||||
of (mode, ssid, security, mac)
|
|
||||||
|
|
||||||
- ``mode`` can be either ``WLAN.STA`` or ``WLAN.AP``.
|
|
||||||
- ``ssid`` is a string with our ssid if in AP mode, ``None`` oterwise.
|
|
||||||
- ``security`` security type currently used.
|
|
||||||
- ``mac`` our MAC address.
|
|
||||||
|
|
||||||
.. method:: wlan.connections()
|
.. method:: wlan.connections()
|
||||||
|
|
||||||
Returns a list of the devices currently connected. Each item in the list is a
|
Returns a list of the devices currently connected. Each item in the list is a
|
||||||
tuple of ``(ssid, mac)``.
|
tuple of ``(ssid, mac)``.
|
||||||
|
|
||||||
.. method:: wlan.antenna(antenna_type)
|
|
||||||
|
|
||||||
Selects the antenna type to be used. Must be either ``WLAN.INT_ANTENNA`` or
|
|
||||||
``WLAN.EXT_ANTENNA``.
|
|
||||||
|
|
||||||
.. method:: wlan.callback(wakes)
|
.. method:: wlan.callback(wakes)
|
||||||
|
|
||||||
Create a callback to be triggered when a WLAN event occurs during ``pyb.Sleep.SUSPENDED``
|
Create a callback to be triggered when a WLAN event occurs during ``pyb.Sleep.SUSPENDED``
|
||||||
|
@ -356,21 +354,13 @@ class WLAN
|
||||||
WiFi access point mode
|
WiFi access point mode
|
||||||
|
|
||||||
.. data:: WLAN.OPEN
|
.. data:: WLAN.OPEN
|
||||||
|
|
||||||
open network (no security)
|
|
||||||
|
|
||||||
.. data:: WLAN.WEP
|
.. data:: WLAN.WEP
|
||||||
|
.. data:: WLAN.WPA
|
||||||
|
.. data:: WLAN.WPA2
|
||||||
|
|
||||||
WEP network security
|
selects the network security
|
||||||
|
|
||||||
.. data:: WLAN.WPA_WPA2
|
.. data:: WLAN.INTERNAL
|
||||||
|
.. data:: WLAN.EXTERNAL
|
||||||
|
|
||||||
WPA/WPA2 network security
|
selects the antenna type
|
||||||
|
|
||||||
.. data:: WLAN.INT_ANTENNA
|
|
||||||
|
|
||||||
selects the internal antenna
|
|
||||||
|
|
||||||
.. data:: WLAN.EXT_ANTENNA
|
|
||||||
|
|
||||||
selects the external antenna
|
|
||||||
|
|
Loading…
Reference in New Issue