mirror of
https://gitee.com/beecue/fastbee.git
synced 2025-12-21 10:25:54 +08:00
更新硬件SDK
This commit is contained in:
21
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/CMakeLists.txt
vendored
Normal file
21
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
#*******************************************************************************
|
||||
# Copyright (c) 2017 IBM Corp.
|
||||
#
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are made available under the terms of the Eclipse Public License v1.0
|
||||
# and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
#
|
||||
# The Eclipse Public License is available at
|
||||
# http://www.eclipse.org/legal/epl-v10.html
|
||||
# and the Eclipse Distribution License is available at
|
||||
# http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
#
|
||||
# Contributors:
|
||||
# Ian Craggs - initial version
|
||||
#*******************************************************************************/
|
||||
|
||||
project("paho-mqttclient" C)
|
||||
|
||||
#ADD_SUBDIRECTORY(src)
|
||||
ADD_SUBDIRECTORY(samples)
|
||||
ADD_SUBDIRECTORY(test)
|
||||
17
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/CMakeLists.txt
vendored
Normal file
17
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
#*******************************************************************************
|
||||
# Copyright (c) 2017 IBM Corp.
|
||||
#
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are made available under the terms of the Eclipse Public License v1.0
|
||||
# and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
#
|
||||
# The Eclipse Public License is available at
|
||||
# http://www.eclipse.org/legal/epl-v10.html
|
||||
# and the Eclipse Distribution License is available at
|
||||
# http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
#
|
||||
# Contributors:
|
||||
# Ian Craggs - initial version
|
||||
#*******************************************************************************/
|
||||
|
||||
ADD_SUBDIRECTORY(linux)
|
||||
131
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/arduino/Hello/Hello.ino
vendored
Normal file
131
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/arduino/Hello/Hello.ino
vendored
Normal file
@@ -0,0 +1,131 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014 IBM Corp. and others
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial contribution
|
||||
* Benjamin Cabe - adapt to IPStack, and add Yun instructions
|
||||
*******************************************************************************/
|
||||
|
||||
#define MQTTCLIENT_QOS2 1
|
||||
|
||||
#include <SPI.h>
|
||||
#include <Ethernet.h>
|
||||
#include <IPStack.h>
|
||||
#include <Countdown.h>
|
||||
#include <MQTTClient.h>
|
||||
|
||||
char printbuf[100];
|
||||
|
||||
int arrivedcount = 0;
|
||||
|
||||
void messageArrived(MQTT::MessageData& md)
|
||||
{
|
||||
MQTT::Message &message = md.message;
|
||||
|
||||
sprintf(printbuf, "Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n",
|
||||
++arrivedcount, message.qos, message.retained, message.dup, message.id);
|
||||
Serial.print(printbuf);
|
||||
sprintf(printbuf, "Payload %s\n", (char*)message.payload);
|
||||
Serial.print(printbuf);
|
||||
}
|
||||
|
||||
EthernetClient c; // replace by a YunClient if running on a Yun
|
||||
IPStack ipstack(c);
|
||||
MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
|
||||
|
||||
byte mac[] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55 }; // replace with your device's MAC
|
||||
const char* topic = "arduino-sample";
|
||||
|
||||
void connect()
|
||||
{
|
||||
char hostname[] = "iot.eclipse.org";
|
||||
int port = 1883;
|
||||
sprintf(printbuf, "Connecting to %s:%d\n", hostname, port);
|
||||
Serial.print(printbuf);
|
||||
int rc = ipstack.connect(hostname, port);
|
||||
if (rc != 1)
|
||||
{
|
||||
sprintf(printbuf, "rc from TCP connect is %d\n", rc);
|
||||
Serial.print(printbuf);
|
||||
}
|
||||
|
||||
Serial.println("MQTT connecting");
|
||||
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
|
||||
data.MQTTVersion = 3;
|
||||
data.clientID.cstring = (char*)"arduino-sample";
|
||||
rc = client.connect(data);
|
||||
if (rc != 0)
|
||||
{
|
||||
sprintf(printbuf, "rc from MQTT connect is %d\n", rc);
|
||||
Serial.print(printbuf);
|
||||
}
|
||||
Serial.println("MQTT connected");
|
||||
|
||||
rc = client.subscribe(topic, MQTT::QOS2, messageArrived);
|
||||
if (rc != 0)
|
||||
{
|
||||
sprintf(printbuf, "rc from MQTT subscribe is %d\n", rc);
|
||||
Serial.print(printbuf);
|
||||
}
|
||||
Serial.println("MQTT subscribed");
|
||||
}
|
||||
|
||||
void setup()
|
||||
{
|
||||
Serial.begin(9600);
|
||||
Ethernet.begin(mac); // replace by Bridge.begin() if running on a Yun
|
||||
Serial.println("MQTT Hello example");
|
||||
connect();
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
if (!client.isConnected())
|
||||
connect();
|
||||
|
||||
MQTT::Message message;
|
||||
|
||||
arrivedcount = 0;
|
||||
|
||||
// Send and receive QoS 0 message
|
||||
char buf[100];
|
||||
sprintf(buf, "Hello World! QoS 0 message");
|
||||
Serial.println(buf);
|
||||
message.qos = MQTT::QOS0;
|
||||
message.retained = false;
|
||||
message.dup = false;
|
||||
message.payload = (void*)buf;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
int rc = client.publish(topic, message);
|
||||
while (arrivedcount == 0)
|
||||
client.yield(1000);
|
||||
|
||||
// Send and receive QoS 1 message
|
||||
sprintf(buf, "Hello World! QoS 1 message");
|
||||
Serial.println(buf);
|
||||
message.qos = MQTT::QOS1;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, message);
|
||||
while (arrivedcount == 1)
|
||||
client.yield(1000);
|
||||
|
||||
// Send and receive QoS 2 message
|
||||
sprintf(buf, "Hello World! QoS 2 message");
|
||||
Serial.println(buf);
|
||||
message.qos = MQTT::QOS2;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, message);
|
||||
while (arrivedcount == 2)
|
||||
client.yield(1000);
|
||||
|
||||
delay(2000);
|
||||
}
|
||||
31
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/CMakeLists.txt
vendored
Normal file
31
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
#*******************************************************************************
|
||||
# Copyright (c) 2017 IBM Corp.
|
||||
#
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are made available under the terms of the Eclipse Public License v1.0
|
||||
# and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
#
|
||||
# The Eclipse Public License is available at
|
||||
# http://www.eclipse.org/legal/epl-v10.html
|
||||
# and the Eclipse Distribution License is available at
|
||||
# http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
#
|
||||
# Contributors:
|
||||
# Ian Craggs - initial version
|
||||
#*******************************************************************************/
|
||||
|
||||
# Samples
|
||||
|
||||
add_executable(
|
||||
hello
|
||||
hello.cpp
|
||||
)
|
||||
target_include_directories(hello PRIVATE "../../src" "../../src/linux")
|
||||
target_link_libraries(hello MQTTPacketClient)
|
||||
|
||||
add_executable(
|
||||
stdoutsub
|
||||
stdoutsub.cpp
|
||||
)
|
||||
target_include_directories(stdoutsub PRIVATE "../../src" "../../src/linux")
|
||||
target_link_libraries(stdoutsub paho-embed-mqtt3c)
|
||||
3
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/build.sh
vendored
Normal file
3
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/build.sh
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
g++ hello.cpp -I ../../src/ -I ../../src/linux -I ../../../MQTTPacket/src ../../../MQTTPacket/src/MQTTPacket.c ../../../MQTTPacket/src/MQTTDeserializePublish.c ../../../MQTTPacket/src/MQTTConnectClient.c ../../../MQTTPacket/src/MQTTSubscribeClient.c ../../../MQTTPacket/src/MQTTSerializePublish.c ../../../MQTTPacket/src/MQTTUnsubscribeClient.c -o hello
|
||||
|
||||
g++ -g stdoutsub.cpp -I ../../src -I ../../src/linux -I ../../../MQTTPacket/src ../../../MQTTPacket/src/MQTTFormat.c ../../../MQTTPacket/src/MQTTPacket.c ../../../MQTTPacket/src/MQTTDeserializePublish.c ../../../MQTTPacket/src/MQTTConnectClient.c ../../../MQTTPacket/src/MQTTSubscribeClient.c ../../../MQTTPacket/src/MQTTSerializePublish.c -o stdoutsub ../../../MQTTPacket/src/MQTTConnectServer.c ../../../MQTTPacket/src/MQTTSubscribeServer.c ../../../MQTTPacket/src/MQTTUnsubscribeServer.c ../../../MQTTPacket/src/MQTTUnsubscribeClient.c
|
||||
104
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/hello.cpp
vendored
Normal file
104
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/hello.cpp
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
#define MQTTCLIENT_QOS2 1
|
||||
|
||||
#include <memory.h>
|
||||
|
||||
#include "MQTTClient.h"
|
||||
|
||||
#define DEFAULT_STACK_SIZE -1
|
||||
|
||||
#include "linux.cpp"
|
||||
|
||||
int arrivedcount = 0;
|
||||
|
||||
void messageArrived(MQTT::MessageData& md)
|
||||
{
|
||||
MQTT::Message &message = md.message;
|
||||
|
||||
printf("Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n",
|
||||
++arrivedcount, message.qos, message.retained, message.dup, message.id);
|
||||
printf("Payload %.*s\n", (int)message.payloadlen, (char*)message.payload);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
IPStack ipstack = IPStack();
|
||||
float version = 0.3;
|
||||
const char* topic = "mbed-sample";
|
||||
|
||||
printf("Version is %f\n", version);
|
||||
|
||||
MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
|
||||
|
||||
const char* hostname = "iot.eclipse.org";
|
||||
int port = 1883;
|
||||
printf("Connecting to %s:%d\n", hostname, port);
|
||||
int rc = ipstack.connect(hostname, port);
|
||||
if (rc != 0)
|
||||
printf("rc from TCP connect is %d\n", rc);
|
||||
|
||||
printf("MQTT connecting\n");
|
||||
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
|
||||
data.MQTTVersion = 3;
|
||||
data.clientID.cstring = (char*)"mbed-icraggs";
|
||||
rc = client.connect(data);
|
||||
if (rc != 0)
|
||||
printf("rc from MQTT connect is %d\n", rc);
|
||||
printf("MQTT connected\n");
|
||||
|
||||
rc = client.subscribe(topic, MQTT::QOS2, messageArrived);
|
||||
if (rc != 0)
|
||||
printf("rc from MQTT subscribe is %d\n", rc);
|
||||
|
||||
MQTT::Message message;
|
||||
|
||||
// QoS 0
|
||||
char buf[100];
|
||||
sprintf(buf, "Hello World! QoS 0 message from app version %f", version);
|
||||
message.qos = MQTT::QOS0;
|
||||
message.retained = false;
|
||||
message.dup = false;
|
||||
message.payload = (void*)buf;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, message);
|
||||
if (rc != 0)
|
||||
printf("Error %d from sending QoS 0 message\n", rc);
|
||||
else while (arrivedcount == 0)
|
||||
client.yield(100);
|
||||
|
||||
// QoS 1
|
||||
printf("Now QoS 1\n");
|
||||
sprintf(buf, "Hello World! QoS 1 message from app version %f", version);
|
||||
message.qos = MQTT::QOS1;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, message);
|
||||
if (rc != 0)
|
||||
printf("Error %d from sending QoS 1 message\n", rc);
|
||||
else while (arrivedcount == 1)
|
||||
client.yield(100);
|
||||
|
||||
// QoS 2
|
||||
sprintf(buf, "Hello World! QoS 2 message from app version %f", version);
|
||||
message.qos = MQTT::QOS2;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, message);
|
||||
if (rc != 0)
|
||||
printf("Error %d from sending QoS 2 message\n", rc);
|
||||
while (arrivedcount == 2)
|
||||
client.yield(100);
|
||||
|
||||
rc = client.unsubscribe(topic);
|
||||
if (rc != 0)
|
||||
printf("rc from unsubscribe was %d\n", rc);
|
||||
|
||||
rc = client.disconnect();
|
||||
if (rc != 0)
|
||||
printf("rc from disconnect was %d\n", rc);
|
||||
|
||||
ipstack.disconnect();
|
||||
|
||||
printf("Finishing with %d messages received\n", arrivedcount);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
291
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/main.cpp
vendored
Normal file
291
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/main.cpp
vendored
Normal file
@@ -0,0 +1,291 @@
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/select.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "MQTTClient.h"
|
||||
//#include "FP.cpp"
|
||||
|
||||
#define DEFAULT_STACK_SIZE -1
|
||||
|
||||
|
||||
class IPStack
|
||||
{
|
||||
public:
|
||||
IPStack()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int Socket_error(const char* aString)
|
||||
{
|
||||
|
||||
if (errno != EINTR && errno != EAGAIN && errno != EINPROGRESS && errno != EWOULDBLOCK)
|
||||
{
|
||||
if (strcmp(aString, "shutdown") != 0 || (errno != ENOTCONN && errno != ECONNRESET))
|
||||
printf("Socket error %s in %s for socket %d\n", strerror(errno), aString, mysock);
|
||||
}
|
||||
return errno;
|
||||
}
|
||||
|
||||
int connect(const char* hostname, 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(hostname, 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)
|
||||
{
|
||||
mysock = socket(family, type, 0);
|
||||
if (mysock != -1)
|
||||
{
|
||||
int opt = 1;
|
||||
|
||||
//if (setsockopt(mysock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0)
|
||||
// printf("Could not set SO_NOSIGPIPE for socket %d", mysock);
|
||||
|
||||
rc = ::connect(mysock, (struct sockaddr*)&address, sizeof(address));
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int read(unsigned char* buffer, int len, int timeout_ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));
|
||||
|
||||
//printf("reading %d bytes\n", len);
|
||||
int rc = ::recv(mysock, buffer, (size_t)len, 0);
|
||||
if (rc == -1)
|
||||
Socket_error("read");
|
||||
//printf("read %d bytes\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int write(unsigned char* buffer, int len, int timeout)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 0; /* 30 Secs Timeout */
|
||||
tv.tv_usec = timeout * 1000; // Not init'ing this can cause strange errors
|
||||
|
||||
setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval));
|
||||
int rc = ::write(mysock, buffer, len);
|
||||
//printf("write rc %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int disconnect()
|
||||
{
|
||||
return ::close(mysock);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int mysock;
|
||||
|
||||
};
|
||||
|
||||
|
||||
class Countdown
|
||||
{
|
||||
public:
|
||||
Countdown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Countdown(int ms)
|
||||
{
|
||||
countdown_ms(ms);
|
||||
}
|
||||
|
||||
|
||||
bool expired()
|
||||
{
|
||||
struct timeval now, res;
|
||||
gettimeofday(&now, NULL);
|
||||
timersub(&end_time, &now, &res);
|
||||
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
|
||||
//if (res.tv_sec > 0 || res.tv_usec > 0)
|
||||
// printf("expired %d %d\n", res.tv_sec, res.tv_usec);
|
||||
return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
|
||||
}
|
||||
|
||||
|
||||
void countdown_ms(int ms)
|
||||
{
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
struct timeval interval = {ms / 1000, (ms % 1000) * 1000};
|
||||
//printf("interval %d %d\n", interval.tv_sec, interval.tv_usec);
|
||||
timeradd(&now, &interval, &end_time);
|
||||
}
|
||||
|
||||
|
||||
void countdown(int seconds)
|
||||
{
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
struct timeval interval = {seconds, 0};
|
||||
timeradd(&now, &interval, &end_time);
|
||||
}
|
||||
|
||||
|
||||
int left_ms()
|
||||
{
|
||||
struct timeval now, res;
|
||||
gettimeofday(&now, NULL);
|
||||
timersub(&end_time, &now, &res);
|
||||
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
|
||||
return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
struct timeval end_time;
|
||||
};
|
||||
|
||||
|
||||
int arrivedcount = 0;
|
||||
|
||||
void messageArrived(MQTT::MessageData& md)
|
||||
{
|
||||
MQTT::Message &message = md.message;
|
||||
|
||||
printf("Message %d arrived: qos %d, retained %d, dup %d, packetid %d\n",
|
||||
++arrivedcount, message.qos, message.retained, message.dup, message.id);
|
||||
printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
IPStack ipstack = IPStack();
|
||||
float version = 0.3;
|
||||
const char* topic = "mbed-sample";
|
||||
|
||||
printf("Version is %f\n", version);
|
||||
|
||||
MQTT::Client<IPStack, Countdown> client = MQTT::Client<IPStack, Countdown>(ipstack);
|
||||
|
||||
const char* hostname = "localhost"; //"m2m.eclipse.org";
|
||||
int port = 1883;
|
||||
printf("Connecting to %s:%d\n", hostname, port);
|
||||
int rc = ipstack.connect(hostname, port);
|
||||
if (rc != 0)
|
||||
printf("rc from TCP connect is %d\n", rc);
|
||||
|
||||
printf("MQTT connecting\n");
|
||||
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
|
||||
data.MQTTVersion = 3;
|
||||
data.clientID.cstring = (char*)"mbed-icraggs";
|
||||
rc = client.connect(&data);
|
||||
if (rc != 0)
|
||||
printf("rc from MQTT connect is %d\n", rc);
|
||||
printf("MQTT connected\n");
|
||||
|
||||
rc = client.subscribe("+", MQTT::QOS2, messageArrived);
|
||||
if (rc != 0)
|
||||
printf("rc from MQTT subscribe is %d\n", rc);
|
||||
|
||||
MQTT::Message message;
|
||||
|
||||
// QoS 0
|
||||
char buf[100];
|
||||
sprintf(buf, "Hello World! QoS 0 message from app version %f", version);
|
||||
message.qos = MQTT::QOS0;
|
||||
message.retained = false;
|
||||
message.dup = false;
|
||||
message.payload = (void*)buf;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, &message);
|
||||
while (arrivedcount == 0)
|
||||
client.yield(100);
|
||||
|
||||
// QoS 1
|
||||
printf("Now QoS 1\n");
|
||||
sprintf(buf, "Hello World! QoS 1 message from app version %f", version);
|
||||
message.qos = MQTT::QOS1;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, &message);
|
||||
while (arrivedcount == 1)
|
||||
client.yield(100);
|
||||
|
||||
// QoS 2
|
||||
sprintf(buf, "Hello World! QoS 2 message from app version %f", version);
|
||||
message.qos = MQTT::QOS2;
|
||||
message.payloadlen = strlen(buf)+1;
|
||||
rc = client.publish(topic, &message);
|
||||
while (arrivedcount == 2)
|
||||
client.yield(100);
|
||||
|
||||
rc = client.unsubscribe(topic);
|
||||
if (rc != 0)
|
||||
printf("rc from unsubscribe was %d\n", rc);
|
||||
|
||||
rc = client.disconnect();
|
||||
if (rc != 0)
|
||||
printf("rc from disconnect was %d\n", rc);
|
||||
|
||||
ipstack.disconnect();
|
||||
|
||||
printf("Finishing with %d messages received\n", arrivedcount);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
265
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/stdoutsub.cpp
vendored
Normal file
265
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/samples/linux/stdoutsub.cpp
vendored
Normal file
@@ -0,0 +1,265 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2012, 2013 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial contribution
|
||||
* Ian Craggs - change delimiter option from char to string
|
||||
*******************************************************************************/
|
||||
|
||||
/*
|
||||
|
||||
stdout subscriber
|
||||
|
||||
compulsory parameters:
|
||||
|
||||
topic to subscribe to
|
||||
|
||||
defaulted parameters:
|
||||
|
||||
--host localhost
|
||||
--port 1883
|
||||
--qos 2
|
||||
--delimiter \n
|
||||
--clientid stdout_subscriber
|
||||
|
||||
--userid none
|
||||
--password none
|
||||
|
||||
*/
|
||||
#include <stdio.h>
|
||||
#include <memory.h>
|
||||
#define MQTT_DEBUG 1
|
||||
#include "MQTTClient.h"
|
||||
|
||||
#define DEFAULT_STACK_SIZE -1
|
||||
|
||||
#include "linux.cpp"
|
||||
|
||||
#include <signal.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
|
||||
volatile int toStop = 0;
|
||||
|
||||
|
||||
void usage()
|
||||
{
|
||||
printf("MQTT stdout subscriber\n");
|
||||
printf("Usage: stdoutsub topicname <options>, where options are:\n");
|
||||
printf(" --host <hostname> (default is localhost)\n");
|
||||
printf(" --port <port> (default is 1883)\n");
|
||||
printf(" --qos <qos> (default is 2)\n");
|
||||
printf(" --delimiter <delim> (default is \\n)\n");
|
||||
printf(" --clientid <clientid> (default is hostname+timestamp)\n");
|
||||
printf(" --username none\n");
|
||||
printf(" --password none\n");
|
||||
printf(" --showtopics <on or off> (default is on if the topic has a wildcard, else off)\n");
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
|
||||
void cfinish(int sig)
|
||||
{
|
||||
signal(SIGINT, NULL);
|
||||
toStop = 1;
|
||||
}
|
||||
|
||||
|
||||
struct opts_struct
|
||||
{
|
||||
char* clientid;
|
||||
int nodelimiter;
|
||||
char* delimiter;
|
||||
MQTT::QoS qos;
|
||||
char* username;
|
||||
char* password;
|
||||
char* host;
|
||||
int port;
|
||||
int showtopics;
|
||||
} opts =
|
||||
{
|
||||
(char*)"stdout-subscriber", 0, (char*)"\n", MQTT::QOS2, NULL, NULL, (char*)"localhost", 1883, 0
|
||||
};
|
||||
|
||||
|
||||
void getopts(int argc, char** argv)
|
||||
{
|
||||
int count = 2;
|
||||
|
||||
while (count < argc)
|
||||
{
|
||||
if (strcmp(argv[count], "--qos") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
{
|
||||
if (strcmp(argv[count], "0") == 0)
|
||||
opts.qos = MQTT::QOS0;
|
||||
else if (strcmp(argv[count], "1") == 0)
|
||||
opts.qos = MQTT::QOS1;
|
||||
else if (strcmp(argv[count], "2") == 0)
|
||||
opts.qos = MQTT::QOS2;
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else if (strcmp(argv[count], "--host") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
opts.host = argv[count];
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else if (strcmp(argv[count], "--port") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
opts.port = atoi(argv[count]);
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else if (strcmp(argv[count], "--clientid") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
opts.clientid = argv[count];
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else if (strcmp(argv[count], "--username") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
opts.username = argv[count];
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else if (strcmp(argv[count], "--password") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
opts.password = argv[count];
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else if (strcmp(argv[count], "--delimiter") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
opts.delimiter = argv[count];
|
||||
else
|
||||
opts.nodelimiter = 1;
|
||||
}
|
||||
else if (strcmp(argv[count], "--showtopics") == 0)
|
||||
{
|
||||
if (++count < argc)
|
||||
{
|
||||
if (strcmp(argv[count], "on") == 0)
|
||||
opts.showtopics = 1;
|
||||
else if (strcmp(argv[count], "off") == 0)
|
||||
opts.showtopics = 0;
|
||||
else
|
||||
usage();
|
||||
}
|
||||
else
|
||||
usage();
|
||||
}
|
||||
count++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
void myconnect(IPStack& ipstack, MQTT::Client<IPStack, Countdown, 1000>& client, MQTTPacket_connectData& data)
|
||||
{
|
||||
printf("Connecting to %s:%d\n", opts.host, opts.port);
|
||||
int rc = ipstack.connect(opts.host, opts.port);
|
||||
if (rc != 0)
|
||||
printf("rc from TCP connect is %d\n", rc);
|
||||
|
||||
rc = client.connect(data);
|
||||
if (rc != 0)
|
||||
{
|
||||
printf("Failed to connect, return code %d\n", rc);
|
||||
exit(-1);
|
||||
}
|
||||
printf("Connected\n");
|
||||
}
|
||||
|
||||
|
||||
void messageArrived(MQTT::MessageData& md)
|
||||
{
|
||||
MQTT::Message &message = md.message;
|
||||
|
||||
if (opts.showtopics)
|
||||
printf("%.*s\t", md.topicName.lenstring.len, md.topicName.lenstring.data);
|
||||
if (opts.nodelimiter)
|
||||
printf("%.*s", (int)message.payloadlen, (char*)message.payload);
|
||||
else
|
||||
printf("%.*s%s", (int)message.payloadlen, (char*)message.payload, opts.delimiter);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
if (argc < 2)
|
||||
usage();
|
||||
|
||||
char* topic = argv[1];
|
||||
|
||||
if (strchr(topic, '#') || strchr(topic, '+'))
|
||||
opts.showtopics = 1;
|
||||
if (opts.showtopics)
|
||||
printf("topic is %s\n", topic);
|
||||
|
||||
getopts(argc, argv);
|
||||
|
||||
IPStack ipstack = IPStack();
|
||||
MQTT::Client<IPStack, Countdown, 1000> client = MQTT::Client<IPStack, Countdown, 1000>(ipstack);
|
||||
|
||||
signal(SIGINT, cfinish);
|
||||
signal(SIGTERM, cfinish);
|
||||
|
||||
MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
|
||||
data.willFlag = 0;
|
||||
data.MQTTVersion = 3;
|
||||
data.clientID.cstring = opts.clientid;
|
||||
data.username.cstring = opts.username;
|
||||
data.password.cstring = opts.password;
|
||||
|
||||
data.keepAliveInterval = 10;
|
||||
data.cleansession = 1;
|
||||
printf("will flag %d\n", data.willFlag);
|
||||
|
||||
myconnect(ipstack, client, data);
|
||||
|
||||
rc = client.subscribe(topic, opts.qos, messageArrived);
|
||||
printf("Subscribed %d\n", rc);
|
||||
|
||||
while (!toStop)
|
||||
{
|
||||
client.yield(1000);
|
||||
|
||||
//if (!client.isconnected)
|
||||
// myconnect(ipstack, client, data);
|
||||
}
|
||||
|
||||
printf("Stopping\n");
|
||||
|
||||
rc = client.disconnect();
|
||||
|
||||
ipstack.disconnect();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
208
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/FP.h
vendored
Normal file
208
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/FP.h
vendored
Normal file
@@ -0,0 +1,208 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2013, 2014
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Sam Grove - initial API and implementation and/or initial documentation
|
||||
* Ian Craggs - added attached and detached member functions
|
||||
* Sam Grove - removed need for FP.cpp
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef FP_H
|
||||
#define FP_H
|
||||
|
||||
/** Example using the FP Class with global functions
|
||||
* @code
|
||||
* #include "mbed.h"
|
||||
* #include "FP.h"
|
||||
*
|
||||
* FP<void,bool>fp;
|
||||
* DigitalOut myled(LED1);
|
||||
*
|
||||
* void handler(bool value)
|
||||
* {
|
||||
* myled = value;
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* int main()
|
||||
* {
|
||||
* fp.attach(&handler);
|
||||
*
|
||||
* while(1)
|
||||
* {
|
||||
* fp(1);
|
||||
* wait(0.2);
|
||||
* fp(0);
|
||||
* wait(0.2);
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
/** Example using the FP Class with different class member functions
|
||||
* @code
|
||||
* #include "mbed.h"
|
||||
* #include "FP.h"
|
||||
*
|
||||
* FP<void,bool>fp;
|
||||
* DigitalOut myled(LED4);
|
||||
*
|
||||
* class Wrapper
|
||||
* {
|
||||
* public:
|
||||
* Wrapper(){}
|
||||
*
|
||||
* void handler(bool value)
|
||||
* {
|
||||
* myled = value;
|
||||
* return;
|
||||
* }
|
||||
* };
|
||||
*
|
||||
* int main()
|
||||
* {
|
||||
* Wrapper wrapped;
|
||||
* fp.attach(&wrapped, &Wrapper::handler);
|
||||
*
|
||||
* while(1)
|
||||
* {
|
||||
* fp(1);
|
||||
* wait(0.2);
|
||||
* fp(0);
|
||||
* wait(0.2);
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
/** Example using the FP Class with member FP and member function
|
||||
* @code
|
||||
* #include "mbed.h"
|
||||
* #include "FP.h"
|
||||
*
|
||||
* DigitalOut myled(LED2);
|
||||
*
|
||||
* class Wrapper
|
||||
* {
|
||||
* public:
|
||||
* Wrapper()
|
||||
* {
|
||||
* fp.attach(this, &Wrapper::handler);
|
||||
* }
|
||||
*
|
||||
* void handler(bool value)
|
||||
* {
|
||||
* myled = value;
|
||||
* return;
|
||||
* }
|
||||
*
|
||||
* FP<void,bool>fp;
|
||||
* };
|
||||
*
|
||||
* int main()
|
||||
* {
|
||||
* Wrapper wrapped;
|
||||
*
|
||||
* while(1)
|
||||
* {
|
||||
* wrapped.fp(1);
|
||||
* wait(0.2);
|
||||
* wrapped.fp(0);
|
||||
* wait(0.2);
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
/**
|
||||
* @class FP
|
||||
* @brief API for managing Function Pointers
|
||||
*/
|
||||
template<class retT, class argT>
|
||||
class FP
|
||||
{
|
||||
public:
|
||||
/** Create the FP object - only one callback can be attached to the object, that is
|
||||
* a member function or a global function, not both at the same time
|
||||
*/
|
||||
FP()
|
||||
{
|
||||
obj_callback = 0;
|
||||
c_callback = 0;
|
||||
}
|
||||
|
||||
/** Add a callback function to the object
|
||||
* @param item - Address of the initialized object
|
||||
* @param member - Address of the member function (dont forget the scope that the function is defined in)
|
||||
*/
|
||||
template<class T>
|
||||
void attach(T *item, retT (T::*method)(argT))
|
||||
{
|
||||
obj_callback = (FPtrDummy *)(item);
|
||||
method_callback = (retT (FPtrDummy::*)(argT))(method);
|
||||
return;
|
||||
}
|
||||
|
||||
/** Add a callback function to the object
|
||||
* @param function - The address of a globally defined function
|
||||
*/
|
||||
void attach(retT (*function)(argT))
|
||||
{
|
||||
c_callback = function;
|
||||
}
|
||||
|
||||
/** Invoke the function attached to the class
|
||||
* @param arg - An argument that is passed into the function handler that is called
|
||||
* @return The return from the function hanlder called by this class
|
||||
*/
|
||||
retT operator()(argT arg) const
|
||||
{
|
||||
if( 0 != c_callback ) {
|
||||
return obj_callback ? (obj_callback->*method_callback)(arg) : (*c_callback)(arg);
|
||||
}
|
||||
return (retT)0;
|
||||
}
|
||||
|
||||
/** Determine if an callback is currently hooked
|
||||
* @return 1 if a method is hooked, 0 otherwise
|
||||
*/
|
||||
bool attached()
|
||||
{
|
||||
return obj_callback || c_callback;
|
||||
}
|
||||
|
||||
/** Release a function from the callback hook
|
||||
*/
|
||||
void detach()
|
||||
{
|
||||
obj_callback = 0;
|
||||
c_callback = 0;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
// empty type used for casting
|
||||
class FPtrDummy;
|
||||
|
||||
FPtrDummy *obj_callback;
|
||||
|
||||
/**
|
||||
* @union Funciton
|
||||
* @brief Member or global callback function
|
||||
*/
|
||||
union {
|
||||
retT (*c_callback)(argT); /*!< Footprint for a global function */
|
||||
retT (FPtrDummy::*method_callback)(argT); /*!< Footprint for a member function */
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
||||
1052
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/MQTTClient.h
vendored
Normal file
1052
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/MQTTClient.h
vendored
Normal file
File diff suppressed because it is too large
Load Diff
55
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/MQTTLogging.h
vendored
Normal file
55
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/MQTTLogging.h
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(MQTT_LOGGING_H)
|
||||
#define MQTT_LOGGING_H
|
||||
|
||||
#define STREAM stdout
|
||||
#if !defined(DEBUG)
|
||||
#define DEBUG(...) \
|
||||
{\
|
||||
fprintf(STREAM, "DEBUG: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
|
||||
fprintf(STREAM, ##__VA_ARGS__); \
|
||||
fflush(STREAM); \
|
||||
}
|
||||
#endif
|
||||
#if !defined(LOG)
|
||||
#define LOG(...) \
|
||||
{\
|
||||
fprintf(STREAM, "LOG: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
|
||||
fprintf(STREAM, ##__VA_ARGS__); \
|
||||
fflush(STREAM); \
|
||||
}
|
||||
#endif
|
||||
#if !defined(WARN)
|
||||
#define WARN(...) \
|
||||
{ \
|
||||
fprintf(STREAM, "WARN: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
|
||||
fprintf(STREAM, ##__VA_ARGS__); \
|
||||
fflush(STREAM); \
|
||||
}
|
||||
#endif
|
||||
#if !defined(ERROR)
|
||||
#define ERROR(...) \
|
||||
{ \
|
||||
fprintf(STREAM, "ERROR: %s L#%d ", __PRETTY_FUNCTION__, __LINE__); \
|
||||
fprintf(STREAM, ##__VA_ARGS__); \
|
||||
fflush(STREAM); \
|
||||
exit(1); \
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
57
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/arduino/Countdown.h
vendored
Normal file
57
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/arduino/Countdown.h
vendored
Normal file
@@ -0,0 +1,57 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(COUNTDOWN_H)
|
||||
#define COUNTDOWN_H
|
||||
|
||||
class Countdown
|
||||
{
|
||||
public:
|
||||
Countdown()
|
||||
{
|
||||
interval_end_ms = 0L;
|
||||
}
|
||||
|
||||
Countdown(int ms)
|
||||
{
|
||||
countdown_ms(ms);
|
||||
}
|
||||
|
||||
bool expired()
|
||||
{
|
||||
return (interval_end_ms > 0L) && (millis() >= interval_end_ms);
|
||||
}
|
||||
|
||||
void countdown_ms(unsigned long ms)
|
||||
{
|
||||
interval_end_ms = millis() + ms;
|
||||
}
|
||||
|
||||
void countdown(int seconds)
|
||||
{
|
||||
countdown_ms((unsigned long)seconds * 1000L);
|
||||
}
|
||||
|
||||
int left_ms()
|
||||
{
|
||||
return interval_end_ms - millis();
|
||||
}
|
||||
|
||||
private:
|
||||
unsigned long interval_end_ms;
|
||||
};
|
||||
|
||||
#endif
|
||||
79
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/arduino/IPStack.h
vendored
Normal file
79
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/arduino/IPStack.h
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014, 2017 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
* Benjamin Cabe - generic IPStack
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(IPSTACK_H)
|
||||
#define IPSTACK_H
|
||||
|
||||
#ifndef WiFi_h
|
||||
#include <SPI.h>
|
||||
#endif
|
||||
|
||||
#include <Client.h>
|
||||
|
||||
class IPStack
|
||||
{
|
||||
public:
|
||||
IPStack(Client& client) : client(&client)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int connect(char* hostname, int port)
|
||||
{
|
||||
return client->connect(hostname, port);
|
||||
}
|
||||
|
||||
int connect(uint32_t hostname, int port)
|
||||
{
|
||||
return client->connect(hostname, port);
|
||||
}
|
||||
|
||||
int read(unsigned char* buffer, int len, int timeout)
|
||||
{
|
||||
int interval = 10; // all times are in milliseconds
|
||||
int total = 0, rc = -1;
|
||||
|
||||
if (timeout < 30)
|
||||
interval = 2;
|
||||
while (client->available() < len && total < timeout)
|
||||
{
|
||||
delay(interval);
|
||||
total += interval;
|
||||
}
|
||||
if (client->available() >= len)
|
||||
rc = client->readBytes((char*)buffer, len);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int write(unsigned char* buffer, int len, int timeout)
|
||||
{
|
||||
client->setTimeout(timeout);
|
||||
return client->write((uint8_t*)buffer, len);
|
||||
}
|
||||
|
||||
int disconnect()
|
||||
{
|
||||
client->stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
Client* client;
|
||||
};
|
||||
|
||||
#endif
|
||||
69
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/arduino/WifiIPStack.h
vendored
Normal file
69
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/arduino/WifiIPStack.h
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef ARDUINOWIFIIPSTACK_H
|
||||
#define ARDUINOWIFIIPSTACK_H
|
||||
|
||||
#include <WiFi.h>
|
||||
|
||||
class WifiIPStack
|
||||
{
|
||||
public:
|
||||
WifiIPStack()
|
||||
{
|
||||
//WiFi.begin(); // Use DHCP
|
||||
iface.setTimeout(1000); // 1 second Timeout
|
||||
}
|
||||
|
||||
int connect(char* hostname, int port)
|
||||
{
|
||||
return iface.connect(hostname, port);
|
||||
}
|
||||
|
||||
int connect(uint32_t hostname, int port)
|
||||
{
|
||||
return iface.connect(hostname, port);
|
||||
}
|
||||
|
||||
int read(char* buffer, int len, int timeout)
|
||||
{
|
||||
iface.setTimeout(timeout);
|
||||
while(!iface.available());
|
||||
return iface.readBytes(buffer, len);
|
||||
}
|
||||
|
||||
int write(char* buffer, int len, int timeout)
|
||||
{
|
||||
iface.setTimeout(timeout);
|
||||
return iface.write((uint8_t*)buffer, len);
|
||||
}
|
||||
|
||||
int disconnect()
|
||||
{
|
||||
iface.stop();
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
WiFiClient iface;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
213
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/linux/linux.cpp
vendored
Normal file
213
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/linux/linux.cpp
vendored
Normal file
@@ -0,0 +1,213 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014, 2017 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
* Ian Craggs - ensure read returns if no bytes read
|
||||
*******************************************************************************/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/select.h>
|
||||
#include <netinet/in.h>
|
||||
#include <netinet/tcp.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <signal.h>
|
||||
|
||||
|
||||
class IPStack
|
||||
{
|
||||
public:
|
||||
IPStack()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int connect(const char* hostname, 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(hostname, 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)
|
||||
{
|
||||
mysock = socket(family, type, 0);
|
||||
if (mysock != -1)
|
||||
{
|
||||
int opt = 1;
|
||||
|
||||
//if (setsockopt(mysock, SOL_SOCKET, SO_NOSIGPIPE, (void*)&opt, sizeof(opt)) != 0)
|
||||
// printf("Could not set SO_NOSIGPIPE for socket %d", mysock);
|
||||
|
||||
rc = ::connect(mysock, (struct sockaddr*)&address, sizeof(address));
|
||||
}
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
// return -1 on error, or the number of bytes read
|
||||
// which could be 0 on a read timeout
|
||||
int read(unsigned char* buffer, int len, int timeout_ms)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
setsockopt(mysock, SOL_SOCKET, SO_RCVTIMEO, (char *)&interval, sizeof(struct timeval));
|
||||
|
||||
int bytes = 0;
|
||||
int i = 0; const int max_tries = 10;
|
||||
while (bytes < len)
|
||||
{
|
||||
int rc = ::recv(mysock, &buffer[bytes], (size_t)(len - bytes), 0);
|
||||
if (rc == -1)
|
||||
{
|
||||
if (errno != EAGAIN && errno != EWOULDBLOCK)
|
||||
bytes = -1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
bytes += rc;
|
||||
if (++i >= max_tries)
|
||||
break;
|
||||
if (rc == 0)
|
||||
break;
|
||||
}
|
||||
return bytes;
|
||||
}
|
||||
|
||||
int write(unsigned char* buffer, int len, int timeout)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 0; /* 30 Secs Timeout */
|
||||
tv.tv_usec = timeout * 1000; // Not init'ing this can cause strange errors
|
||||
|
||||
setsockopt(mysock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv,sizeof(struct timeval));
|
||||
int rc = ::write(mysock, buffer, len);
|
||||
//printf("write rc %d\n", rc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int disconnect()
|
||||
{
|
||||
return ::close(mysock);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
int mysock;
|
||||
};
|
||||
|
||||
|
||||
class Countdown
|
||||
{
|
||||
public:
|
||||
Countdown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Countdown(int ms)
|
||||
{
|
||||
countdown_ms(ms);
|
||||
}
|
||||
|
||||
|
||||
bool expired()
|
||||
{
|
||||
struct timeval now, res;
|
||||
gettimeofday(&now, NULL);
|
||||
timersub(&end_time, &now, &res);
|
||||
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
|
||||
//if (res.tv_sec > 0 || res.tv_usec > 0)
|
||||
// printf("expired %d %d\n", res.tv_sec, res.tv_usec);
|
||||
return res.tv_sec < 0 || (res.tv_sec == 0 && res.tv_usec <= 0);
|
||||
}
|
||||
|
||||
|
||||
void countdown_ms(int ms)
|
||||
{
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
struct timeval interval = {ms / 1000, (ms % 1000) * 1000};
|
||||
//printf("interval %d %d\n", interval.tv_sec, interval.tv_usec);
|
||||
timeradd(&now, &interval, &end_time);
|
||||
}
|
||||
|
||||
|
||||
void countdown(int seconds)
|
||||
{
|
||||
struct timeval now;
|
||||
gettimeofday(&now, NULL);
|
||||
struct timeval interval = {seconds, 0};
|
||||
timeradd(&now, &interval, &end_time);
|
||||
}
|
||||
|
||||
|
||||
int left_ms()
|
||||
{
|
||||
struct timeval now, res;
|
||||
gettimeofday(&now, NULL);
|
||||
timersub(&end_time, &now, &res);
|
||||
//printf("left %d ms\n", (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000);
|
||||
return (res.tv_sec < 0) ? 0 : res.tv_sec * 1000 + res.tv_usec / 1000;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
struct timeval end_time;
|
||||
};
|
||||
29
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/mbed/MQTTEthernet.h
vendored
Normal file
29
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/mbed/MQTTEthernet.h
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
|
||||
#if !defined(MQTTETHERNET_H)
|
||||
#define MQTTETHERNET_H
|
||||
|
||||
#include "MQTTmbed.h"
|
||||
#include "EthernetInterface.h"
|
||||
#include "MQTTSocket.h"
|
||||
|
||||
class MQTTEthernet : public MQTTSocket
|
||||
{
|
||||
public:
|
||||
MQTTEthernet() : MQTTSocket(ð)
|
||||
{
|
||||
eth.connect();
|
||||
}
|
||||
|
||||
EthernetInterface& getEth()
|
||||
{
|
||||
return eth;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
EthernetInterface eth;
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
97
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/mbed/MQTTSocket.h
vendored
Normal file
97
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/mbed/MQTTSocket.h
vendored
Normal file
@@ -0,0 +1,97 @@
|
||||
#if !defined(MQTTSOCKET_H)
|
||||
#define MQTTSOCKET_H
|
||||
|
||||
#include "MQTTmbed.h"
|
||||
#include <EthernetInterface.h>
|
||||
#include <Timer.h>
|
||||
|
||||
class MQTTSocket
|
||||
{
|
||||
public:
|
||||
MQTTSocket(EthernetInterface *anet)
|
||||
{
|
||||
net = anet;
|
||||
open = false;
|
||||
}
|
||||
|
||||
int connect(char* hostname, int port, int timeout=1000)
|
||||
{
|
||||
if (open)
|
||||
disconnect();
|
||||
nsapi_error_t rc = mysock.open(net);
|
||||
open = true;
|
||||
mysock.set_blocking(true);
|
||||
mysock.set_timeout((unsigned int)timeout);
|
||||
rc = mysock.connect(hostname, port);
|
||||
mysock.set_blocking(false); // blocking timeouts seem not to work
|
||||
return rc;
|
||||
}
|
||||
|
||||
// common read/write routine, avoiding blocking timeouts
|
||||
int common(unsigned char* buffer, int len, int timeout, bool read)
|
||||
{
|
||||
timer.start();
|
||||
mysock.set_blocking(false); // blocking timeouts seem not to work
|
||||
int bytes = 0;
|
||||
bool first = true;
|
||||
do
|
||||
{
|
||||
if (first)
|
||||
first = false;
|
||||
else
|
||||
wait_ms(timeout < 100 ? timeout : 100);
|
||||
int rc;
|
||||
if (read)
|
||||
rc = mysock.recv((char*)buffer, len);
|
||||
else
|
||||
rc = mysock.send((char*)buffer, len);
|
||||
if (rc < 0)
|
||||
{
|
||||
if (rc != NSAPI_ERROR_WOULD_BLOCK)
|
||||
{
|
||||
bytes = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
bytes += rc;
|
||||
}
|
||||
while (bytes < len && timer.read_ms() < timeout);
|
||||
timer.stop();
|
||||
return bytes;
|
||||
}
|
||||
|
||||
/* returns the number of bytes read, which could be 0.
|
||||
-1 if there was an error on the socket
|
||||
*/
|
||||
int read(unsigned char* buffer, int len, int timeout)
|
||||
{
|
||||
return common(buffer, len, timeout, true);
|
||||
}
|
||||
|
||||
int write(unsigned char* buffer, int len, int timeout)
|
||||
{
|
||||
return common(buffer, len, timeout, false);
|
||||
}
|
||||
|
||||
int disconnect()
|
||||
{
|
||||
open = false;
|
||||
return mysock.close();
|
||||
}
|
||||
|
||||
/*bool is_connected()
|
||||
{
|
||||
return mysock.is_connected();
|
||||
}*/
|
||||
|
||||
private:
|
||||
|
||||
bool open;
|
||||
TCPSocket mysock;
|
||||
EthernetInterface *net;
|
||||
Timer timer;
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
65
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/mbed/MQTTmbed.h
vendored
Normal file
65
sdk/合宙/air780e/csdk/luatos-soc-2022/thirdparty/mqtt/MQTTClient/src/mbed/MQTTmbed.h
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2014, 2017 IBM Corp.
|
||||
*
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
* and the Eclipse Distribution License is available at
|
||||
* http://www.eclipse.org/org/documents/edl-v10.php.
|
||||
*
|
||||
* Contributors:
|
||||
* Ian Craggs - initial API and implementation and/or initial documentation
|
||||
* Ian Craggs - change Timer member initialization to avoid copy constructor
|
||||
*******************************************************************************/
|
||||
|
||||
#if !defined(MQTT_MBED_H)
|
||||
#define MQTT_MBED_H
|
||||
|
||||
#include "mbed.h"
|
||||
|
||||
class Countdown
|
||||
{
|
||||
public:
|
||||
Countdown() : t()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Countdown(int ms) : t()
|
||||
{
|
||||
countdown_ms(ms);
|
||||
}
|
||||
|
||||
|
||||
bool expired()
|
||||
{
|
||||
return t.read_ms() >= interval_end_ms;
|
||||
}
|
||||
|
||||
void countdown_ms(unsigned long ms)
|
||||
{
|
||||
t.stop();
|
||||
interval_end_ms = ms;
|
||||
t.reset();
|
||||
t.start();
|
||||
}
|
||||
|
||||
void countdown(int seconds)
|
||||
{
|
||||
countdown_ms((unsigned long)seconds * 1000L);
|
||||
}
|
||||
|
||||
int left_ms()
|
||||
{
|
||||
return interval_end_ms - t.read_ms();
|
||||
}
|
||||
|
||||
private:
|
||||
Timer t;
|
||||
unsigned long interval_end_ms;
|
||||
};
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user