mirror of
https://github.com/cesanta/mongoose.git
synced 2024-12-25 00:57:49 +08:00
150 lines
4.1 KiB
C
150 lines
4.1 KiB
C
|
/*
|
||
|
* Copyright (c) 2014-2016 Cesanta Software Limited
|
||
|
* All rights reserved
|
||
|
*/
|
||
|
|
||
|
#include "./../../mongoose.h"
|
||
|
#include "stm32f4xx_hal_msp.h"
|
||
|
#include "stm32f4xx.h"
|
||
|
#include "user_params.h"
|
||
|
|
||
|
enum SampleState { ssIniting, ssConnectedWLAN, ssWorking, ssStopped };
|
||
|
|
||
|
static enum SampleState state = ssIniting;
|
||
|
static struct mg_mgr mgr;
|
||
|
static int msg_id;
|
||
|
|
||
|
void Error_Handler() {
|
||
|
/* Turn LED4 (red) on/off */
|
||
|
while (1) {
|
||
|
BSP_LED_Toggle(LED4);
|
||
|
Delay(100);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SimpleLinkWlanEventHandler(SlWlanEvent_t *pWlanEvent) {
|
||
|
switch (pWlanEvent->Event) {
|
||
|
case SL_WLAN_CONNECT_EVENT:
|
||
|
CLI_Write("Connected to WiFi\r\n");
|
||
|
break;
|
||
|
case SL_WLAN_DISCONNECT_EVENT:
|
||
|
CLI_Write("Disconnected WiFi\r\n");
|
||
|
break;
|
||
|
default:
|
||
|
CLI_Write("Got Wlan event %d\r\n", pWlanEvent->Event);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void SimpleLinkNetAppEventHandler(SlNetAppEvent_t *pNetAppEvent) {
|
||
|
switch (pNetAppEvent->Event) {
|
||
|
case SL_NETAPP_IPV4_IPACQUIRED_EVENT:
|
||
|
CLI_Write("Got IP\r\n");
|
||
|
state = ssConnectedWLAN;
|
||
|
break;
|
||
|
default:
|
||
|
CLI_Write("Got NetApp Event: %d\r\n", pNetAppEvent->Event);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
struct mg_mqtt_topic_expression topic_expressions[] = {{"/test", 0}};
|
||
|
|
||
|
static void ev_handler(struct mg_connection *nc, int ev, void *p) {
|
||
|
struct mg_mqtt_message *msg = (struct mg_mqtt_message *) p;
|
||
|
|
||
|
switch (ev) {
|
||
|
case MG_EV_CONNECT:
|
||
|
if (*(int *) p != 0) {
|
||
|
CLI_Write("Failed to connect to %s\r\n", MQTT_BROKER_ADDRESS);
|
||
|
} else {
|
||
|
CLI_Write("Connected to %s\r\n", MQTT_BROKER_ADDRESS);
|
||
|
}
|
||
|
struct mg_send_mqtt_handshake_opts opts;
|
||
|
memset(&opts, 0, sizeof(opts));
|
||
|
opts.user_name = MQTT_USER_NAME;
|
||
|
opts.password = MQTT_USER_PWD;
|
||
|
mg_set_protocol_mqtt(nc);
|
||
|
mg_send_mqtt_handshake_opt(nc, "STM32", opts);
|
||
|
break;
|
||
|
case MG_EV_MQTT_CONNACK:
|
||
|
if (msg->connack_ret_code != MG_EV_MQTT_CONNACK_ACCEPTED) {
|
||
|
CLI_Write("Got mqtt connection error %d\n\r", msg->connack_ret_code);
|
||
|
} else {
|
||
|
CLI_Write("Connected to broker\n\r");
|
||
|
}
|
||
|
CLI_Write("Subscribing to /test\n\r");
|
||
|
mg_mqtt_subscribe(nc, topic_expressions,
|
||
|
sizeof(topic_expressions) / sizeof(*topic_expressions),
|
||
|
++msg_id);
|
||
|
break;
|
||
|
case MG_EV_MQTT_SUBACK:
|
||
|
CLI_Write("Subscription acknowledged\r\n");
|
||
|
state = ssWorking;
|
||
|
break;
|
||
|
case MG_EV_MQTT_PUBLISH:
|
||
|
CLI_Write("Got incoming message %s: %.*s\r\n", msg->topic,
|
||
|
(int) msg->payload.len, msg->payload.p);
|
||
|
break;
|
||
|
case MG_EV_POLL:
|
||
|
if (state == ssWorking) {
|
||
|
char msg[100];
|
||
|
uint32_t tick = HAL_GetTick();
|
||
|
int len = snprintf(msg, sizeof(msg), "Current tick: %u", tick);
|
||
|
CLI_Write("Publishing message with tick=%u\r\n", tick);
|
||
|
mg_mqtt_publish(nc, "/stuff", ++msg_id, MG_MQTT_QOS(0), msg, len);
|
||
|
}
|
||
|
break;
|
||
|
case MG_EV_CLOSE:
|
||
|
CLI_Write("Connection to broker is closed\r\n");
|
||
|
state = ssStopped;
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int main(void) {
|
||
|
stopWDT();
|
||
|
initClk();
|
||
|
|
||
|
BSP_LED_Init(LED3);
|
||
|
BSP_LED_Init(LED4);
|
||
|
|
||
|
CLI_Configure();
|
||
|
CLI_Write("\n\n\n**** Hello ****\r\n");
|
||
|
CLI_Write("Initializing CC3100 on SPI%d\r\n", SPIx_NUMBER);
|
||
|
|
||
|
int ret = sl_Start(NULL, NULL, NULL);
|
||
|
|
||
|
SlSecParams_t sec_params;
|
||
|
memset(&sec_params, 0, sizeof(sec_params));
|
||
|
sec_params.Key = NET_PWD;
|
||
|
sec_params.KeyLen = sizeof(NET_PWD) - 1;
|
||
|
sec_params.Type = NET_SECURITY;
|
||
|
|
||
|
CLI_Write("Starting WiFi connect\r\n");
|
||
|
|
||
|
ret = sl_WlanConnect(NET_SSID, sizeof(NET_SSID) - 1, 0, &sec_params, NULL);
|
||
|
|
||
|
CLI_Write("Done, waiting for events\n\r");
|
||
|
|
||
|
while (1) {
|
||
|
BSP_LED_Toggle(LED3);
|
||
|
_SlNonOsMainLoopTask();
|
||
|
if (state == 1) {
|
||
|
mg_mgr_init(&mgr, NULL);
|
||
|
if (mg_connect(&mgr, MQTT_BROKER_ADDRESS, ev_handler) == NULL) {
|
||
|
CLI_Write("Failed to create connection\n\r");
|
||
|
}
|
||
|
state = 2;
|
||
|
}
|
||
|
mg_mgr_poll(&mgr, 1000);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void HAL_UART_ErrorCallback(UART_HandleTypeDef *UartHandle) {
|
||
|
/* Turn LED4 (red) on: Transfer error in reception/transmission process */
|
||
|
BSP_LED_On(LED4);
|
||
|
}
|