[Description] Added new APIs to DM module to start device in WiFi STA mode, perform DHCP and WiFi channel scans
#define NET_DEVNAME "wl1"
+#define WAKAAMA_CHECK_ARG() do {\
+ if (opt >= argc) { \
+ app_print_usage(); \
+ return 0; \
+ } \
+} \
+while (0);
+
+
+#if defined(CONFIG_NET_LWIP_DHCPC) && !defined(CONFIG_NETUTILS_DHCPC)
+struct dhcp dhcp_handle;
+#endif
+
+static dm_scan_info_t *appwifiscan_result = NULL;
+static dm_scan_info_t *wifi_iterator;
+
+static char *wifi_aps[] = {"hack07", "hack10", "hack13", "hack14", "hack17", "hack18", "hack21", "hack23", "hack24", "hack28", "hack11"};
+
+static uint8_t appscan_iteration;
+
#define DM_LIFETIME 300
#define DM_SERVERIP "192.168.1.152"
#define DM_SERVERPORT LWM2M_STANDARD_PORT_STR
static int g_wakaama_initialized;
struct wakaama_param_s {
- unsigned char serverip[20];
- unsigned char serverport[6];
+ char serverip[20];
+ char serverport[6];
unsigned int lifetime;
};
static wakaama_param_t wakaama_param;
static struct dm_lwm2m_context_s dm_context;
-static int isConnected = 0;
+static int g_isconnected;
struct work_s wakaama_wq;
}
static void prv_wakaama_start(void)
-{
- int ret;
- ret = dm_lwm2m_start_client(&dm_context);
- if (ret != DM_ERROR_NONE) {
+{
+ if (dm_lwm2m_start_client(&dm_context) != DM_ERROR_NONE) {
fprintf(stderr, "Error creating wakaama thread\n");
} else {
fprintf(stderr, "Successfully created wakaama thread\n");
}
}
-static int app_dhcp_main(void)
-{
- uint32_t timeleft = 15000;
- struct dhcpc_state state;
- void * dhcp_handle;
- int ret;
-
- dhcp_handle = dhcpc_open(NET_DEVNAME);
- ret = dhcpc_request(dhcp_handle, &state);
- if (ret != OK) {
- dhcpc_close(dhcp_handle);
- return -1;
- }
-
- netlib_set_ipv4addr(NET_DEVNAME, &state.ipaddr);
- netlib_set_ipv4netmask(NET_DEVNAME, &state.netmask);
- netlib_set_dripv4addr(NET_DEVNAME, &state.default_router);
-
- printf("IP address : %s ----\n", inet_ntoa(state.ipaddr));
- return 1;
-}
-
-static int change_resource(FAR void *arg)
+static void change_resource(FAR void *arg)
{
char argbuffer[20];
memset(argbuffer, 0x00, 20);
dm_lwm2m_change_client_resource(argbuffer);
}
-static conn_cb linkUpEvent()
+static void linkUpEvent(void)
{
- isConnected = 1;
+ g_isconnected = 1;
if (g_wakaama_initialized == 1) {
- int resource_val;
int ret;
printf("about to restart wakaama_client\n");
- resource_val = 7;
ret = dm_lwm2m_start_client(&dm_context);
if (ret != DM_ERROR_NONE) {
fprintf(stderr, "Error creating wakaama thread\n");
}
}
-static conn_cb linkDownEvent()
+static void linkDownEvent(void)
{
- isConnected = 0;
+ g_isconnected = 0;
if (g_wakaama_initialized == 1) {
- int resource_val;
printf("about to close wakaama_client\n");
dm_lwm2m_stop_client();
}
}
-static int wifiAutoConnectInit()
-{
- int8_t ret;
- uint8_t result;
-
- isConnected = 0;
- dm_conn_register_linkup_cb(linkUpEvent);
- dm_conn_register_linkdown_cb(linkDownEvent);
-
- if (WifiIsConnected(&result, NULL) != SLSI_STATUS_SUCCESS) {
- printf("failed to WifiIsConnected\n");
- return;
- }
-
- if (result > 0) {
- printf("Wi-Fi status - Connected : %d\n", result);
- isConnected = 1;
- return 1;
- }
-
- ret = WiFiStart(SLSI_WIFI_STATION_IF, NULL);
- if (ret == SLSI_STATUS_SUCCESS) {
- printf("[AutoConnect]STA mode started\n");
- ret = WiFiNetworkJoin(CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), NULL, get_security_config(CONFIG_DM_AP_SECURITY, CONFIG_DM_AP_PASS));
- sleep(1);
- if (ret == SLSI_STATUS_SUCCESS) {
- printf("[AutoConnect]Start doJoin with SSID %s\n", CONFIG_DM_AP_SSID);
- return 1;
- } else {
- printf("[AutoConnect]Failed to join the network.[%d]\n", ret);
- }
- return -1;
- } else {
- printf("[AutoConnect]Failed to start STA mode\n");
- }
- return -1;
-}
-
-static void wifiAutoConnectDeInit()
-{
- isConnected = 0;
- dm_conn_unregister_linkup_cb(linkUpEvent);
-}
-
-static void wifiAutoConnect()
-{
- int ret;
- if ((ret = wifiAutoConnectInit()) == 1) {
- int waitTime = 10;
- while (waitTime--) {
- if (isConnected == 1) {
- printf("[AutoConnect]WiFi Connected!\n");
- int dhcp_ret = app_dhcp_main();
- if (dhcp_ret == -1) {
- printf("Timeout fail to get ip address\n");
- return dhcp_ret;
- } else if (dhcp_ret == 0) {
- printf("No network interface\n");
- return dhcp_ret;
- }
- printf("DHCP done\n");
- break;
- }
- sleep(1);
- }
- if (waitTime <= 0) {
- printf("[AutoConnect]WiFi is not working. Test Canceled\n");
- return 0;
- }
- }
-}
-
int wakaamaclient_main(int argc, char *argv[])
{
int opt;
return 0;
}
-
-
if (!g_wakaama_initialized) {
app_init_param();
- wifiAutoConnect();
+ printf("trying connect\n");
+ if (dm_conn_wifi_connect(linkUpEvent, linkDownEvent) != DM_ERROR_NONE) {
+ return -1;
+ }
+ sleep(10);
+ printf("trying dhcp\n");
+ if (dm_conn_dhcp_init() != DM_ERROR_NONE) {
+ return -1;
+ }
}
opt = 1;
switch (argv[opt][1]) {
case 'b':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
bootstrap_requested = true;
strncpy(dm_context.server_info.ipAddress, \
argv[opt], strlen(argv[opt]));
break;
case 't':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
- if (1 != sscanf(argv[opt], "%d", \
- &(dm_context.client_info.lifetime))) {
+ WAKAAMA_CHECK_ARG();
+ if (sscanf(argv[opt], "%d", &(dm_context.client_info.lifetime)) != 1) {
app_print_usage();
return 0;
}
case 's':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
strncpy(dm_context.server_info.ipAddress, \
argv[opt], strlen(argv[opt]));
break;
#ifdef WITH_TINYDTLS
case 'i':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
break;
case 'S':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
break;
#endif
case 'n': {
char argbuffer[20];
- int val = 7;
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
memset(argbuffer, 0x00, 20);
strncpy(argbuffer, argv[opt], strlen(argv[opt]));
return 0;
case 'l':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
break;
case 'p':
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
strncpy(wakaama_param.serverport, argv[opt], strlen(argv[opt]));
break;
case 'g': {
char ipAddress[IPADDRLEN_MAX];
int ret;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
ret = dm_lwm2m_get_server_address(ipAddress);
if (ret == DM_ERROR_NONE) {
printf("Server ip address is %s\n", ipAddress);
return 0;
}
case 'h': {
- char *server_port[PORTLEN];
+ char server_port[PORTLEN];
int ret;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
ret = dm_lwm2m_get_server_port(server_port);
if (ret != DM_ERROR_NONE) {
printf("Server port is %s\n", server_port);
case 'd': {
char argbuffer[20];
opt++;
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
printf("Read all resource of an object instance %s\n", argv[opt]);
memset(argbuffer, 0x00, 20);
strncpy(argbuffer, argv[opt], strlen(argv[opt]));
return 0;
}
case 'r':
- if (opt >= argc) {
- app_print_usage();
- return 0;
- }
+ WAKAAMA_CHECK_ARG();
printf("Read a resource value\n");
return 0;
+ case 'f': {
+ int i;
+ int wifi_count;
+ while (1) {
+ wifi_count = 0;
+ if (dm_conn_wifi_scan() == DM_ERROR_NONE) {
+ printf("DM scan network PASS\n");
+ } else {
+ printf("Failed on wifi scan\n");
+ }
+ sleep(10);
+ if (dm_conn_get_scan_result(&appwifiscan_result) == DM_ERROR_NONE) {
+ wifi_iterator = appwifiscan_result;
+ while (wifi_iterator != NULL) {
+ for (i = 0; i < sizeof(wifi_aps) / sizeof(char *); i++) {
+ if (!strncmp(wifi_iterator->ssid, wifi_aps[i], strlen(wifi_aps[i]))) {
+ printf("AP:%d:%s:%s:%d\n", appscan_iteration,
+ wifi_iterator->ssid,
+ wifi_iterator->bssid,
+ wifi_iterator->rssi);
+ }
+ }
+ wifi_count++;
+ wifi_iterator = wifi_iterator->next;
+ }
+ } else {
+ printf("DM_ERROR_NO_DATA\n");
+ }
+ printf("AP:%d:totalAP#:%d\n", appscan_iteration, wifi_count);
+ dm_conn_free_scan_result(&appwifiscan_result);
+ appscan_iteration++;
+ }
+ }
+ return 0;
+
case 'x':
dm_lwm2m_stop_client();
return 0;
#ifdef CONFIG_CTRL_IFACE_UDP
amount = recvfrom(sock, pos, recv_len, 0, from, fromlen);
#else
- amount = read(sock, pos, recv_len);
+ amount += read(sock, pos, recv_len);
#endif
}
if (msg_size > len) {
{
#endif
-#ifdef DM_API_DEBUG
-#define dmdbg(format, ...) printf("DM_API (%s): " format, __FUNCTION__, ##__VA_ARGS__)
-#else
-#define dmdbg(a, ...) (void)0
-#endif
+struct dm_scan_info_s {
+ char ssid[33]; // 802.11 spec defined unspecified or uint8
+ char bssid[18]; // char string e.g. xx:xx:xx:xx:xx:xx
+ int8_t rssi; // rssi level of scanned device
+ struct dm_scan_info_s *next;
+};
+typedef struct dm_scan_info_s dm_scan_info_t;
typedef void (*conn_cb)(void);
*/
int dm_conn_unregister_linkdown_cb(conn_cb cb);
+/**
+ * @brief Perform a WiFi scan over all channels
+ *
+ * @param[in] None.
+ * @return On success, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_wifi_scan(void);
+
+/**
+ * @brief Fetch WiFi scan result
+ *
+ * @param[out] pointer to WiFi scan structure to hold result.
+ * @return On success, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_get_scan_result(dm_scan_info_t **result);
+
+/**
+ * @brief Free WiFi scan result
+ *
+ * @param[out] pointer to WiFi scan structure that holds result.
+ * @return On completion, 0 is returned.
+ */
+int dm_conn_free_scan_result(dm_scan_info_t **result);
+
+/**
+ * @brief Start device as WiFi station and connect to designated Access Point
+ *
+ * @param[in] callback functions to handle WiFi link being up and down.
+ * @return On completion, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_wifi_connect(conn_cb linkUpEvent, conn_cb linkDownEvent);
+
+/**
+ * @brief Perform DHCP client routine to obtain IP address for WiFi interface
+ *
+ * @param None
+ * @return On completion, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_dhcp_init(void);
+
+/**
+ * @brief Mark WiFi state as disconnected
+ *
+ * @param None
+ * @return On completion, 0 is returned. On failure, a negative value is returned.
+ */
+int dm_conn_wifi_disconnect(void);
+
#ifdef __cplusplus
}
#endif
#include <dm/dm_error.h>
#include <dm/dm_connectivity.h>
+#include <apps/netutils/dhcpc.h>
#include <apps/netutils/wifi/slsi_wifi_api.h>
+#include <apps/netutils/wifi/slsi_wifi_utils.h>
#include <arpa/inet.h>
#define DM_GET_INTERFACE_INFO 0
#define DM_GET_IP_ADDR_INFO 1
#define DM_CALLBACK_BUFFER_SIZE 10
+#define DM_BSSID_LEN 18
+#define DM_NET_DEVNAME "wl1"
+
+/* Static data structure to hold results of a WiFi scan.
+ */
+static slsi_scan_info_t *g_wifi_scan_result;
+static slsi_scan_info_t *g_wifi_scan_iter;
+
+/* WiFi connection status variable */
+static uint8_t g_dm_connected;
static sem_t g_dm_link_evt;
dmdbg("Link Down Callback UnRegistered Successfully\n");
return DM_ERROR_NONE;
}
+
+static int8_t prv_dm_conn_scan_result(slsi_reason_t *reason)
+{
+ if (reason->reason_code != 0) {
+ dmdbg("Failed to scan : reason %d, locally generated : %d\n", \
+ reason->reason_code, reason->locally_generated);
+ g_wifi_scan_result = NULL;
+ } else {
+ WiFiFreeScanResults(&g_wifi_scan_result);
+ WiFiGetScanResults(&g_wifi_scan_result);
+ WiFiNetworkJoin((uint8_t *) CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), \
+ NULL, (slsi_security_config_t *) getSecurityConfig(CONFIG_DM_AP_SECURITY, \
+ CONFIG_DM_AP_PASS, SLSI_WIFI_STATION_IF));
+ }
+ printf("scanned result\n");
+ return SLSI_STATUS_SUCCESS;
+}
+
+int dm_conn_get_scan_result(dm_scan_info_t **result)
+{
+ dm_scan_info_t *curr_record;
+ dm_scan_info_t *prev_record = NULL;
+ if (g_wifi_scan_result == NULL) {
+ return DM_ERROR_NO_DATA;
+ }
+ /* Initialize pointer */
+ g_wifi_scan_iter = g_wifi_scan_result;
+
+ do {
+ curr_record = (dm_scan_info_t *)malloc(sizeof(dm_scan_info_t));
+ if (curr_record == NULL) {
+ dm_conn_free_scan_result(result);
+ return DM_ERROR_UNKNOWN;
+ }
+ if (!prev_record) {
+ *result = curr_record;
+ } else {
+ prev_record->next = curr_record;
+ }
+
+ memset(curr_record->ssid, 0x00, SLSI_SSID_LEN + 1);
+ memset(curr_record->bssid, 0x00, DM_BSSID_LEN);
+ curr_record->rssi = g_wifi_scan_iter->rssi;
+ strncpy(curr_record->ssid, (char *) g_wifi_scan_iter->ssid, strlen((const char*)g_wifi_scan_iter->ssid));
+ strncpy(curr_record->bssid, (char *)g_wifi_scan_iter->bssid, strlen((const char*)g_wifi_scan_iter->bssid));
+ prev_record = curr_record;
+ g_wifi_scan_iter = g_wifi_scan_iter->next;
+ } while (g_wifi_scan_iter != NULL);
+
+ curr_record->next = NULL;
+
+ return DM_ERROR_NONE;
+}
+
+int dm_conn_free_scan_result(dm_scan_info_t **result)
+{
+ dm_scan_info_t *curr_record;
+ dm_scan_info_t *next_record;
+
+ curr_record = *result;
+ while (curr_record != NULL) {
+ next_record = curr_record->next;
+ free(curr_record);
+ curr_record = next_record;
+ }
+
+ *result = NULL;
+ return DM_ERROR_NONE;
+}
+
+
+int dm_conn_wifi_scan(void)
+{
+ if (WiFiScanNetwork() == SLSI_STATUS_SUCCESS) {
+ WiFiFreeScanResults(&g_wifi_scan_result);
+ WiFiGetScanResults(&g_wifi_scan_result);
+ WiFiNetworkJoin((uint8_t *) CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), \
+ NULL, (slsi_security_config_t *) getSecurityConfig(CONFIG_DM_AP_SECURITY, \
+ CONFIG_DM_AP_PASS, SLSI_WIFI_STATION_IF));
+ return DM_ERROR_NONE;
+ }
+ return DM_ERROR_UNKNOWN;
+}
+
+int dm_conn_wifi_connect(conn_cb linkUpEvent, conn_cb linkDownEvent)
+{
+ uint8_t ret;
+ uint8_t result;
+
+ if (g_dm_connected == 1) {
+ dmdbg("Already, Init!\n");
+ return DM_ERROR_NONE;
+ }
+
+ dm_conn_register_linkup_cb(linkUpEvent);
+ dm_conn_register_linkdown_cb(linkDownEvent);
+
+ g_dm_connected = 0;
+ ret = WiFiIsConnected(&result, NULL);
+ if (ret == SLSI_STATUS_SUCCESS) {
+ dmdbg("Wi-Fi status - Already Connected : %d\n", result);
+ g_dm_connected = 1;
+ return 1;
+ } else if (ret != SLSI_STATUS_NOT_STARTED)
+ return DM_ERROR_UNKNOWN;
+
+
+ ret = WiFiStart(SLSI_WIFI_STATION_IF, NULL);
+ if (ret == SLSI_STATUS_SUCCESS) {
+ dmdbg("STA mode started\n");
+ ret = WiFiNetworkJoin((uint8_t *)CONFIG_DM_AP_SSID, strlen(CONFIG_DM_AP_SSID), \
+ NULL, (slsi_security_config_t *) getSecurityConfig(CONFIG_DM_AP_SECURITY, CONFIG_DM_AP_PASS, SLSI_WIFI_STATION_IF));
+ sleep(1);
+ if (ret == SLSI_STATUS_SUCCESS) {
+ dmdbg("Start doJoin with SSID %s\n", CONFIG_DM_AP_SSID);
+ return DM_ERROR_NONE;
+ }
+ return DM_ERROR_UNKNOWN;
+ }
+ return DM_ERROR_UNKNOWN;
+}
+
+int dm_conn_wifi_disconnect(void)
+{
+ g_dm_connected = 0;
+ return DM_ERROR_NONE;
+}
+
+static int prv_dm_conn_dhcp(void)
+{
+ struct dhcpc_state state;
+ void *dhcp_handle;
+ int ret;
+
+ dhcp_handle = dhcpc_open(DM_NET_DEVNAME);
+ if (dhcp_handle == NULL) {
+ dmdbg("Invalid dhcp handle\n");
+ return -1;
+ }
+ ret = dhcpc_request(dhcp_handle, &state);
+ if (ret != OK) {
+ dhcpc_close(dhcp_handle);
+ return -1;
+ }
+
+ netlib_set_ipv4addr(DM_NET_DEVNAME, &state.ipaddr);
+ netlib_set_ipv4netmask(DM_NET_DEVNAME, &state.netmask);
+ netlib_set_dripv4addr(DM_NET_DEVNAME, &state.default_router);
+
+ dmdbg("IP address : %s ----\n", inet_ntoa(state.ipaddr));
+ return 1;
+}
+
+int dm_conn_dhcp_init(void)
+{
+ uint8_t wifi_status;
+ int8_t ret;
+
+ if (g_dm_connected == -1) {
+ dmdbg("First, Do Conn Init!\n");
+ return DM_ERROR_UNKNOWN;
+ }
+
+ if (g_dm_connected == 0) {
+ int waitTime = 10;
+ while (waitTime--) {
+ ret = WiFiIsConnected(&wifi_status, NULL);
+ dmdbg("retcode connect %d\n", ret);
+ if (ret != SLSI_STATUS_SUCCESS) {
+ dmdbg("Failed to WiFiIsConnected\n");
+ return DM_ERROR_UNKNOWN;
+ }
+
+ if (wifi_status > 0) {
+ g_dm_connected = 1;
+ dmdbg("WiFi Connected!\n");
+ int dhcp_ret = prv_dm_conn_dhcp();
+ if (dhcp_ret == -1) {
+ dmdbg("Timeout fail to get ip address\n");
+ return DM_ERROR_TIMED_OUT;
+ } else if (dhcp_ret == 0) {
+ dmdbg("No network interface\n");
+ return DM_ERROR_NOT_SUPPORTED;
+ }
+ dmdbg("DHCP done\n");
+ break;
+ }
+ sleep(1);
+ }
+ if (waitTime <= 0) {
+ dmdbg("WiFi is not working.\n");
+ return DM_ERROR_UNKNOWN;
+ }
+ }
+
+ return DM_ERROR_NONE;
+}