Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources
This commit is contained in:
182
sdk/lib/net/mqtt/paho/MQTT_port.c
Normal file
182
sdk/lib/net/mqtt/paho/MQTT_port.c
Normal file
@@ -0,0 +1,182 @@
|
||||
#include "MQTT_port.h"
|
||||
#include "osal/string.h"
|
||||
#include "lwip/api.h"
|
||||
#include "lwip/sockets.h"
|
||||
#include "lwip/netdb.h"
|
||||
|
||||
|
||||
|
||||
void MutexInit(Mutex* mutex)
|
||||
{
|
||||
os_mutex_init(mutex);
|
||||
}
|
||||
|
||||
int MutexLock(Mutex* mutex)
|
||||
{
|
||||
os_mutex_lock(mutex, osWaitForever);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int MutexUnlock(Mutex* mutex)
|
||||
{
|
||||
os_mutex_unlock(mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void TimerInit(Timer* timer)
|
||||
{
|
||||
timer->ticks = 0;
|
||||
}
|
||||
|
||||
char TimerIsExpired(Timer* timer)
|
||||
{
|
||||
char ret = 0;
|
||||
if (timer->ticks <= os_jiffies())
|
||||
{
|
||||
ret = 1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void TimerCountdownMS(Timer* timer, unsigned int timeout_ms)
|
||||
{
|
||||
timer->ticks = timeout_ms + os_jiffies();
|
||||
}
|
||||
|
||||
|
||||
void TimerCountdown(Timer* timer, unsigned int timeout)
|
||||
{
|
||||
timer->ticks = (timeout*1000) + os_jiffies();
|
||||
}
|
||||
|
||||
|
||||
int TimerLeftMS(Timer* timer)
|
||||
{
|
||||
if (timer->ticks > os_jiffies())
|
||||
{
|
||||
return (timer->ticks - os_jiffies());
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int mqtt_lwip_read(Network* n, unsigned char* buffer, int len, int timeout_ms)
|
||||
{
|
||||
#if 0
|
||||
struct timeval interval = {timeout_ms / 1000, (timeout_ms % 1000) * 1000};
|
||||
if (interval.tv_sec < 0 || (interval.tv_sec == 0 && interval.tv_usec <= 0))
|
||||
{
|
||||
interval.tv_sec = 0;
|
||||
interval.tv_usec = 100;
|
||||
}
|
||||
os_printf("timeout_ms:%d\n",timeout_ms);
|
||||
#endif
|
||||
setsockopt(n->my_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout_ms, sizeof(timeout_ms));
|
||||
|
||||
int bytes = 0;
|
||||
while (bytes < len)
|
||||
{
|
||||
int rc = recv(n->my_socket, &buffer[bytes], (size_t)(len - bytes), 0);
|
||||
if (rc == -1)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK)
|
||||
bytes = -1;
|
||||
break;
|
||||
}
|
||||
else if (rc == 0)
|
||||
{
|
||||
bytes = 0;
|
||||
break;
|
||||
}
|
||||
else
|
||||
bytes += rc;
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static int mqtt_lwip_write(Network* n, unsigned char* buffer, int len, int timeout_ms)
|
||||
{
|
||||
#if 0
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 0; /* 30 Secs Timeout */
|
||||
tv.tv_usec = timeout_ms * 1000; // Not init'ing this can cause strange errors
|
||||
#endif
|
||||
setsockopt(n->my_socket, SOL_SOCKET, SO_SNDTIMEO, (char *)&timeout_ms,sizeof(timeout_ms));
|
||||
int rc = write(n->my_socket, buffer, len);
|
||||
os_printf("%s:%d\trc:%d\n",__FUNCTION__,__LINE__,rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
void NetworkInit(Network* n)
|
||||
{
|
||||
n->my_socket = 0;
|
||||
n->mqttread = mqtt_lwip_read;
|
||||
n->mqttwrite = mqtt_lwip_write;
|
||||
}
|
||||
|
||||
int NetworkConnect(Network* n, char* addr, int port)
|
||||
{
|
||||
int type = SOCK_STREAM;
|
||||
struct sockaddr_in address;
|
||||
int rc = -1;
|
||||
sa_family_t family = AF_INET;
|
||||
struct addrinfo *result = NULL;
|
||||
struct addrinfo hints = {0, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP, 0, NULL, NULL, NULL};
|
||||
|
||||
if ((rc = getaddrinfo(addr, NULL, &hints, &result)) == 0)
|
||||
{
|
||||
struct addrinfo* res = result;
|
||||
|
||||
/* prefer ip4 addresses */
|
||||
while (res)
|
||||
{
|
||||
if (res->ai_family == AF_INET)
|
||||
{
|
||||
result = res;
|
||||
break;
|
||||
}
|
||||
res = res->ai_next;
|
||||
}
|
||||
|
||||
if (result->ai_family == AF_INET)
|
||||
{
|
||||
address.sin_port = htons(port);
|
||||
address.sin_family = family = AF_INET;
|
||||
address.sin_addr = ((struct sockaddr_in*)(result->ai_addr))->sin_addr;
|
||||
}
|
||||
else
|
||||
rc = -1;
|
||||
|
||||
freeaddrinfo(result);
|
||||
}
|
||||
|
||||
if (rc == 0)
|
||||
{
|
||||
n->my_socket = socket(family, type, 0);
|
||||
|
||||
if (n->my_socket != -1)
|
||||
{
|
||||
int keepalive = 1;
|
||||
setsockopt(n->my_socket, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive));
|
||||
fcntl( n->my_socket, F_SETFL, O_NONBLOCK );
|
||||
rc = connect_tmo(n->my_socket, (struct sockaddr*)&address, sizeof(address),1000);
|
||||
fcntl( n->my_socket, F_SETFL, ~O_NONBLOCK );
|
||||
}
|
||||
|
||||
else
|
||||
rc = -1;
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
void NetworkDisconnect(Network* n)
|
||||
{
|
||||
close(n->my_socket);
|
||||
}
|
||||
Reference in New Issue
Block a user