更新硬件SDK

This commit is contained in:
kerwincui
2023-03-04 03:44:56 +08:00
parent dcdf6e1b7c
commit e39d3d2f03
1900 changed files with 663153 additions and 0 deletions

View 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)

View 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);
}

View 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)

View 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

View 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;
}

View 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;
}

View 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;
}