123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #include "MQTTInterface.h"
- //#include "stm32f4xx_hal.h"
- #include "stm32h7xx_hal.h"
- #include <string.h>
- #include "lwip.h"
- #include "lwip/api.h"
- #include "lwip/sockets.h"
- #define MQTT_PORT 1883
- #define SERVER_IP1 192
- #define SERVER_IP2 168
- #define SERVER_IP3 1
- #define SERVER_IP4 34
- uint32_t MilliTimer;
- //Timer functions
- char TimerIsExpired(Timer *timer) {
- long left = timer->end_time - MilliTimer;
- return (left < 0);
- }
- void TimerCountdownMS(Timer *timer, unsigned int timeout) {
- timer->end_time = MilliTimer + timeout;
- }
- void TimerCountdown(Timer *timer, unsigned int timeout) {
- timer->end_time = MilliTimer + (timeout * 1000);
- }
- int TimerLeftMS(Timer *timer) {
- long left = timer->end_time - MilliTimer;
- return (left < 0) ? 0 : left;
- }
- void TimerInit(Timer *timer) {
- timer->end_time = 0;
- }
- #ifdef MQTT_LWIP_SOCKET
- void NewNetwork(Network *n) {
- n->socket = 0; //clear
- n->mqttread = net_read; //receive function
- n->mqttwrite = net_write; //send function
- n->disconnect = net_disconnect; //disconnection function
- }
- int ConnectNetwork(Network *n, char *ip, int port) {
- struct sockaddr_in server_addr;
- if(n->socket)
- {
- close(n->socket);
- }
- n->socket = socket(PF_INET, SOCK_STREAM, 0); //create socket
- if(n->socket < 0)
- {
- n->socket = 0;
- return -1;
- }
- memset(&server_addr, 0, sizeof(struct sockaddr_in)); //broker address info
- server_addr.sin_family = AF_INET;
- server_addr.sin_addr.s_addr = inet_addr(ip);
- server_addr.sin_port = htons(port);
- if(connect(n->socket, (struct sockaddr*)&server_addr, sizeof(struct sockaddr_in)) < 0) //connect to the broker
- {
- close(n->socket);
- return -1;
- }
- return 0;
- }
- int net_read(Network *n, unsigned char *buffer, int len, int timeout_ms) {
- int available;
- /* !!! LWIP_SO_RCVBUF must be enabled !!! */
- if(ioctl(n->socket, FIONREAD, &available) < 0) return -1; //check receive buffer
- if(available > 0)
- {
- return recv(n->socket, buffer, len, 0);
- }
- return 0;
- }
- int net_write(Network *n, unsigned char *buffer, int len, int timeout_ms) {
- return send(n->socket, buffer, len, 0);
- }
- void net_disconnect(Network *n) {
- close(n->socket);
- n->socket = 0;
- }
- #elif defined(MQTT_LWIP_NETCONN)
- void NewNetwork(Network *n) {
- n->conn = NULL;
- n->buf = NULL;
- n->offset = 0;
- n->mqttread = net_read;
- n->mqttwrite = net_write;
- n->disconnect = net_disconnect;
- }
- int ConnectNetwork(Network *n, char *ip, int port) {
- err_t err;
- ip_addr_t server_ip ;
- ipaddr_aton(ip, &server_ip);
- n->conn = netconn_new(NETCONN_TCP);
- if (n->conn != NULL) {
- err = netconn_connect(n->conn, &server_ip, port);
- if (err != ERR_OK) {
- netconn_delete(n->conn); //free memory
- return -1;
- }
- n->conn->recv_timeout = 1000;
- }
- return 0;
- }
- int net_read(Network *n, unsigned char *buffer, int len, int timeout_ms) {
- int rc;
- struct netbuf *inbuf;
- int offset = 0;
- int bytes = 0;
- while(bytes < len) {
- if(n->buf != NULL) {
- inbuf = n->buf;
- offset = n->offset;
- rc = ERR_OK;
- } else {
- rc = netconn_recv(n->conn, &inbuf);
- offset = 0;
- }
- if(rc != ERR_OK) {
- if(rc != ERR_TIMEOUT) {
- bytes = -1;
- }
- break;
- } else {
- int nblen = netbuf_len(inbuf) - offset;
- if((bytes+nblen) > len) {
- netbuf_copy_partial(inbuf, buffer+bytes, len-bytes,offset);
- n->buf = inbuf;
- n->offset = offset + len - bytes;
- bytes = len;
- } else {
- netbuf_copy_partial(inbuf, buffer+bytes, nblen, offset);
- bytes += nblen;
- netbuf_delete(inbuf);
- n->buf = NULL;
- n->offset = 0;
- }
- }
- }
- return bytes;
- }
- int net_write(Network *n, unsigned char *buffer, int len, int timeout_ms) {
- int rc = netconn_write(n->conn, buffer, len, NETCONN_NOCOPY);
- if(rc != ERR_OK) return -1;
- return len;
- }
- void net_disconnect(Network *n) {
- netconn_close(n->conn); //close session
- netconn_delete(n->conn); //free memory
- n->conn = NULL;
- }
- #endif
|