167#include "mmagic_controller.h"
172#define SSID MorseMicro
176#ifndef SAE_PASSPHRASE
179#define SAE_PASSPHRASE 12345678
183#define _STRINGIFY(x) #x
185#define STRINGIFY(x) _STRINGIFY(x)
188#define LINK_STATE_TIMEOUT_MS 20000
191#define TCP_ECHCO_SERVER_PORT 5000
202 struct mmosal_semb *started = (
struct mmosal_semb *)arg;
203 printf(
"Agent start notification received\n");
220 printf(
"\n\n#### Example WLAN Connect using MMAGIC Controller ####\n\n");
223 printf(
"Attempting to connect to %s with passphrase %s\n",
STRINGIFY(
SSID),
225 printf(
"This may take some time (~10 seconds)\n");
229 printf(
"Error %d setting the wlan ssid\n", status);
236 printf(
"Error %d setting the wlan password\n", status);
246 printf(
"Error %d after sending the connect command\n", status);
259 printf(
"Link is up %s. Time: %lu ms, ",
285 printf(
"\n\n#### Example check WLAN connection using MMAGIC Controller ####\n\n");
288 printf(
"Checking SSID and password match expected values\n");
294 printf(
"Error %d getting the wlan ssid\n", status);
299 printf(
"SSID mismatch\n");
308 printf(
"Error %d getting the wlan password\n", status);
314 printf(
"Password mismatch\n");
318 printf(
"Checking STA connection status\n");
323 printf(
"Error %d getting wlan sta status\n", status);
328 printf(
"STA not connected\n");
332 printf(
"Checking link status\n");
334 for (
int attempts = 2; attempts > 0; --attempts)
340 printf(
"Link is up %s. Time: %lu ms, ",
352 printf(
"Link Down\n");
380 while (offset < args->vendor_ies.len)
388 printf(
"Beacon IEs malformed!\n");
399 printf(
"Beacon IEs malformed!\n");
403 printf(
" IE type 0x%02x, IE len 0x%02x, Contents: ", ie_type, ie_len);
404 for (ii = 0; ii < ie_len; ii++)
423 printf(
"\n\n#### Example Beacon Monitor using MMAGIC Controller ####\n\n");
435 printf(
"Error %d enabling beacon monitor\n", status);
438 printf(
"Enabled beacon monitor for OUI %02x:%02x:%02x\n",
453 printf(
"\n\n#### Example TCP Client using MMAGIC Controller ####\n\n");
457 .
url = {.
data =
"google.com", .len = strlen(
"google.com")},
464 printf(
"Error %d establishing TCP connection\n", status);
467 uint8_t tcp_stream_id = tcp_rsp_args.
stream_id;
468 printf(
"Opened TCP socket on stream_id %u\n", tcp_stream_id);
472 .buffer = {.data =
"GET /\n", .len = strlen(
"GET /\n")}
477 printf(
"Error %d whilst sending data\n", status);
480 printf(
"Successfully sent GET request\n");
491 printf(
"Error %d whilst receiving data\n", status);
495 printf(
"Received: %.12s, Length %u\n", tcp_recv_rsp_args.
buffer.
data,
503 printf(
"Error %d whilst closing tcp socket\n", status);
506 printf(
"Closed TCP Socket\n");
530 struct mmagic_controller *controller = thread_args->
controller;
531 uint8_t stream_id = thread_args->
stream_id;
533 printf(
"Accepted a TCP connection on stream_id %u\n", stream_id);
555 printf(
"Connection closed by the other side!\n");
560 printf(
"Error %d whilst receiving data\n", status);
563 printf(
"Received: %d bytes, echoing.\n", tcp_recv_rsp_args.
buffer.
len);
571 printf(
"Error %d whilst sending data\n", status);
583 printf(
"Error %u whilst trying to close the TCP socket on stream_id %u\n",
586 printf(
"Closed TCP socket\n");
600 printf(
"\n\n#### Example TCP Echo Server using MMAGIC Controller ####\n\n");
609 printf(
"Error %u whilst opening the tcp socket\n", status);
612 uint8_t tcp_socket_stream_id = tcp_bind_rsp_args.
stream_id;
613 printf(
"Opened listening socket (Port %u) on stream_id %u\n",
614 tcp_bind_cmd_args.
port, tcp_socket_stream_id);
623 &tcp_accept_cmd_args,
624 &tcp_accept_rsp_args);
627 printf(
"Error %u whilst trying to accept a TCP connection\n", status);
645 printf(
"Error %u whilst trying to close the listening socket on stream_id %u\n",
646 status, tcp_socket_stream_id);
650 printf(
"Closed listening socket\n");
672 AGENT_ACTION_TIMEOUT_MS = 1000,
675 bool agent_already_running =
false;
677 printf(
"M2M Controller enabled. Awaiting Agent start\n");
683 printf(
"No agent start notification, agent may already be running.\n");
684 printf(
"Attempting sync to recover connection.\n");
688 agent_already_running =
true;
692 printf(
"WLAN connection reattached\n");
693 goto agent_connected;
698 printf(
"Sync failed with status %d, attempting LLC agent reset.\n", status);
705 printf(
"LLC reset failed. Please hard reset the agent.\n");
711 printf(
"Failed to connect\n");
714 printf(
"WLAN connection established\n");
726 printf(
"TCP echo server ended with status %d\n", status);
736 printf(
"\n\nM2M Controller Example (Built " __DATE__
" " __TIME__
")\n\n");
mmagic_status
Enumeration of return status codes.
@ MMAGIC_IP_LINK_STATE_UP
Link is up.
@ MMAGIC_STA_STATE_CONNECTED
Connected to the AP.
@ MMAGIC_STATUS_OK
Operation was successful.
@ MMAGIC_STATUS_SOCKET_LISTEN_FAILED
Socket listen failed.
@ MMAGIC_STATUS_TIMEOUT
The operation timed out.
@ MMAGIC_STATUS_CLOSED
Failed due to stream being closed from the other side.
struct mmagic_controller * mmagic_controller_init(const struct mmagic_controller_init_args *args)
Initialize the Controller.
#define MMAGIC_CONTROLLER_ARGS_INIT
Initializer for mmagic_controller_init_args.
enum mmagic_status mmagic_controller_agent_sync(struct mmagic_controller *controller, uint32_t timeout_ms)
Sends a sync request to the agent and waits for a sync response.
enum mmagic_status mmagic_controller_request_agent_reset(struct mmagic_controller *controller)
Sends a reset request to the agent.
static enum mmagic_status mmagic_controller_ip_status(struct mmagic_controller *controller, struct mmagic_core_ip_status_rsp_args *rsp_args)
Gets the status of the IP stack.
static enum mmagic_status mmagic_controller_tcp_connect(struct mmagic_controller *controller, struct mmagic_core_tcp_connect_cmd_args *cmd_args, struct mmagic_core_tcp_connect_rsp_args *rsp_args)
Opens a client TCP socket and returns its stream ID.
static enum mmagic_status mmagic_controller_tcp_accept(struct mmagic_controller *controller, struct mmagic_core_tcp_accept_cmd_args *cmd_args, struct mmagic_core_tcp_accept_rsp_args *rsp_args)
Waits for an incoming socket connection and returns a new stream ID.
static enum mmagic_status mmagic_controller_tcp_recv(struct mmagic_controller *controller, struct mmagic_core_tcp_recv_cmd_args *cmd_args, struct mmagic_core_tcp_recv_rsp_args *rsp_args)
Reads from a socket.
static enum mmagic_status mmagic_controller_tcp_bind(struct mmagic_controller *controller, struct mmagic_core_tcp_bind_cmd_args *cmd_args, struct mmagic_core_tcp_bind_rsp_args *rsp_args)
Opens a server TCP socket and returns its stream ID.
static enum mmagic_status mmagic_controller_tcp_send(struct mmagic_controller *controller, struct mmagic_core_tcp_send_cmd_args *cmd_args)
Writes to a socket.
static enum mmagic_status mmagic_controller_tcp_close(struct mmagic_controller *controller, struct mmagic_core_tcp_close_cmd_args *cmd_args)
Closes and frees the socket.
static enum mmagic_status mmagic_controller_set_wlan_ssid(struct mmagic_controller *controller, const char *var)
Sets ssid setting for module wlan.
static enum mmagic_status mmagic_controller_set_wlan_password(struct mmagic_controller *controller, const char *var)
Sets password setting for module wlan.
static enum mmagic_status mmagic_controller_get_wlan_ssid(struct mmagic_controller *controller, struct string32 *var)
Gets ssid setting for module wlan.
static enum mmagic_status mmagic_controller_get_wlan_password(struct mmagic_controller *controller, struct string100 *var)
Gets password setting for module wlan.
static enum mmagic_status mmagic_controller_wlan_beacon_monitor_enable(struct mmagic_controller *controller, struct mmagic_core_wlan_beacon_monitor_enable_cmd_args *cmd_args)
Enable beacon monitoring with the given filter settings.
static enum mmagic_status mmagic_controller_wlan_get_sta_status(struct mmagic_controller *controller, struct mmagic_core_wlan_get_sta_status_rsp_args *rsp_args)
Retrieves the STA status of the WLAN interface.
void mmagic_controller_register_wlan_beacon_rx_handler(struct mmagic_controller *controller, mmagic_wlan_beacon_rx_event_handler_t handler, void *arg)
Register a handler for the wlan-beacon_rx event.
static enum mmagic_status mmagic_controller_wlan_connect(struct mmagic_controller *controller, struct mmagic_core_wlan_connect_cmd_args *cmd_args)
Brings up the WLAN interface and connects to the AP with configured parameters.
void mmhal_set_deep_sleep_veto(uint8_t veto_id)
Sets a deep sleep veto that will prevent the device from entering deep sleep.
uint32_t mmhal_random_u32(uint32_t min, uint32_t max)
Generate a random 32 bit integer within the given range.
@ MMHAL_VETO_ID_APP_MIN
Start of deep sleep veto ID range that is available for application use.
#define MMOSAL_ASSERT(expr)
Assert that the given expression evaluates to true and abort execution if not.
bool mmosal_semb_wait(struct mmosal_semb *semb, uint32_t timeout_ms)
Wait for a counting semaphore.
struct mmosal_semb * mmosal_semb_create(const char *name)
Create a new binary semaphore.
bool mmosal_semb_give(struct mmosal_semb *semb)
Give a binary semaphore.
struct mmosal_task * mmosal_task_create(mmosal_task_fn_t task_fn, void *argument, enum mmosal_task_priority priority, unsigned stack_size_u32, const char *name)
Create a new task.
void mmosal_task_sleep(uint32_t duration_ms)
Sleep for a period of time, yielding during that time.
@ MMOSAL_TASK_PRI_LOW
Low priority.
uint32_t mmosal_get_time_ms(void)
Get the system time in milliseconds.
static bool mmosal_time_lt(uint32_t a, uint32_t b)
Check if time a is less than time b, taking into account wrapping.
#define MM_UNUSED(_x)
Casts the given expression to void to avoid "unused" warnings from the compiler.
static void tcp_echo_server_task(void *args)
This task handles a single incoming TCP connection.
static void run_examples_task(void *args)
Runs the examples.
static struct mmosal_semb * agent_started_semb
Binary semaphore used to indicate when an agent start notification has been received.
static bool wlan_connect(struct mmagic_controller *controller)
This function illustrates how to establish a wlan connection using the mmagic_controller interface.
#define TCP_ECHCO_SERVER_PORT
Port the the TCP echo server will bind to.
void beacon_monitor_rx_handler(const struct mmagic_wlan_beacon_rx_event_args *args, void *arg)
Handler for the beacon monitor event handler callback.
static enum mmagic_status tcp_echo_server_start(struct mmagic_controller *controller, uint16_t port)
This function illustrates how to start a TCP server and listen for a connection.
#define STRINGIFY(x)
Convert the content of the given macro to a string.
#define SAE_PASSPHRASE
Passphrase of the AP (ignored if security type is not SAE).
static bool is_wlan_connected(struct mmagic_controller *controller)
This function illustrates how to check if the agent already has an active connection.
#define LINK_STATE_TIMEOUT_MS
Duration to wait for the link to be established after WLAN reports connected.
#define SSID
SSID of the AP to connect to.
static void tcp_client_example(struct mmagic_controller *controller)
This function illustrates how to open a tcp client, send and receive some data and close the connecti...
void app_init(void)
Main entry point to the application.
void agent_start_handler(struct mmagic_controller *controller, void *arg)
Handler for the "Agent start" callback.
static void beacon_monitor_example_start(struct mmagic_controller *controller)
This function illustrates how to subscribe to and receive custom vendor IEs from beacons.
Arguments for beacon monitor task.
uint8_t stream_id
The stream ID.
struct mmagic_controller * controller
The controller reference.
Initialization structure for mmagic_controller.
mmagic_controller_agent_start_cb_t agent_start_cb
Callback function to executed any time a event that the agent has started is received.
void * agent_start_arg
User argument that will be passed when the agent_start_cb is executed.
Response arguments structure for ip_status.
struct struct_ip_status status
Reference to the struct to return the IP status retrieved from the network stack.
Command arguments structure for tcp_accept.
uint8_t stream_id
Stream ID of the bound socket.
Response arguments structure for tcp_accept.
uint8_t stream_id
Stream ID of the new incoming connection.
Command arguments structure for tcp_bind.
uint16_t port
TCP port to listen on.
Response arguments structure for tcp_bind.
uint8_t stream_id
Stream ID of the opened socket.
Command arguments structure for tcp_close.
uint8_t stream_id
Stream ID of the socket to close.
Command arguments structure for tcp_connect.
struct string254 url
URL of the server to connect to.
Response arguments structure for tcp_connect.
uint8_t stream_id
Stream ID of the opened socket.
Command arguments structure for tcp_recv.
uint8_t stream_id
Stream ID of the socket to receive from.
Response arguments structure for tcp_recv.
struct raw1536 buffer
Buffer of read data.
Command arguments structure for tcp_send.
struct raw1536 buffer
Buffer to send.
uint8_t stream_id
Stream ID of the socket to send on.
Command arguments structure for wlan_beacon_monitor_enable.
struct struct_oui_list oui_filter
OUIs to monitor.
Command arguments structure for wlan_connect.
uint32_t timeout
Duration in milliseconds to wait for connection establish, if connection does not get established an ...
Response arguments structure for wlan_get_sta_status.
enum mmagic_sta_state sta_status
The current STA status.
Event arguments structure for wlan_beacon_rx.
struct raw1536 vendor_ies
Raw octet string of Vendor Information Elements contained in the beacon.
uint8_t data[1536]
The acutal data buffer.
uint16_t len
Length of data.
String type with maximum length of 100 (excluding null terminator).
uint8_t len
Length of string contents (excluding null terminator).
char data[100+1]
The string contents.
char data[254+1]
The string contents.
String type with maximum length of 32 (excluding null terminator).
uint8_t len
Length of string contents (excluding null terminator).
char data[32+1]
The string contents.
char addr[48]
Array containing the IP string.
struct struct_ip_addr netmask
Current IP network mask.
struct struct_ip_addr ip_addr
Current IP address.
bool dhcp_enabled
Whether or not dhcp is enabled.
enum mmagic_ip_link_state link_state
Current link state.
struct struct_ip_addr gateway
Current IP gateway.
struct struct_oui ouis[5]
The OUI data.
uint8_t count
The number of OUIs in the list.
uint8_t oui[3]
The 3 octet OUI.
Arguments for TCP echo server task.
uint8_t stream_id
The stream ID.
struct mmagic_controller * controller
The controller reference.