Closed
Description
Hi, I am using autoconnect library to connect esp32 to wifi. When it is connected, I start the midi session connection. It appears in rtpmidi software as green and on the network as well. But when I connect it, I receive an error that 192.168.8.108:5004 has not answered the connection request. The code is attached as follows:
#include <WiFi.h>
#include <WebServer.h>
#include <time.h>
#include <AutoConnect.h>
#include <ESPmDNS.h>
#define APPLEMIDI_INITIATOR
#include <AppleMIDI.h>
USING_NAMESPACE_APPLEMIDI
bool wifiConnected = false;
APPLEMIDI_CREATE_DEFAULTSESSION_ESP32_INSTANCE();
int sensorPin = 34; // select the input pin for the potentiometer
int initialVal = 0; //Our initial potentiometer values. We need one for the first value and a second to test if there has been a change made.
int lastVal = 0;
int midiVal = 0;
static const char AUX_TIMEZONE[] PROGMEM = R"(
{
"title": "TimeZone",
"uri": "/timezone",
"menu": true,
"element": [
{
"name": "caption",
"type": "ACText",
"value": "Sets the time zone to get the current local time.",
"style": "font-family:Arial;font-weight:bold;text-align:center;margin-bottom:10px;color:DarkSlateBlue"
},
{
"name": "timezone",
"type": "ACSelect",
"label": "Select TZ name",
"option": [],
"selected": 10
},
{
"name": "newline",
"type": "ACElement",
"value": "<br>"
},
{
"name": "start",
"type": "ACSubmit",
"value": "OK",
"uri": "/start"
}
]
}
)";
typedef struct {
const char* zone;
const char* ntpServer;
int8_t tzoff;
} Timezone_t;
static const Timezone_t TZ[] = {
{ "Europe/London", "europe.pool.ntp.org", 0 }
};
WebServer Server;
AutoConnect Portal(Server);
AutoConnectConfig Config;
AutoConnectAux Timezone;
void rootPage() {
String content =
"<html>"
"<head>"
"<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
"<script type=\"text/javascript\">"
"setTimeout(\"location.reload()\", 1000);"
"</script>"
"</head>"
"<body>"
"<h2 align=\"center\" style=\"color:blue;margin:20px;\">Hello, world</h2>"
"<h3 align=\"center\" style=\"color:gray;margin:10px;\">{{DateTime}}</h3>"
"<p style=\"text-align:center;\">Reload the page to update the time.</p>"
"<p></p><p style=\"padding-top:15px;text-align:center\">" AUTOCONNECT_LINK(COG_24) "</p>"
"</body>"
"</html>";
static const char *wd[7] = { "Sun","Mon","Tue","Wed","Thr","Fri","Sat" };
struct tm *tm;
time_t t;
char dateTime[26];
t = time(NULL);
tm = localtime(&t);
sprintf(dateTime, "%04d/%02d/%02d(%s) %02d:%02d:%02d.",
tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
wd[tm->tm_wday],
tm->tm_hour, tm->tm_min, tm->tm_sec);
content.replace("{{DateTime}}", String(dateTime));
Server.send(200, "text/html", content);
}
void startPage() {
// Retrieve the value of AutoConnectElement with arg function of WebServer class.
// Values are accessible with the element name.
String tz = Server.arg("timezone");
for (uint8_t n = 0; n < sizeof(TZ) / sizeof(Timezone_t); n++) {
String tzName = String(TZ[n].zone);
if (tz.equalsIgnoreCase(tzName)) {
configTime(TZ[n].tzoff * 3600, 0, TZ[n].ntpServer);
Serial.println("Time zone: " + tz);
Serial.println("ntp server: " + String(TZ[n].ntpServer));
break;
}
}
// The /start page just constitutes timezone,
// it redirects to the root page without the content response.
Server.sendHeader("Location", String("http://") + Server.client().localIP().toString() + String("/"));
Server.send(302, "text/plain", "");
Server.client().flush();
Server.client().stop();
}
// -----------------------------------------------------------------------------
// Configuration of Midi connectivity with rtpMidi protocol software
// -----------------------------------------------------------------------------
void midiConfiguration(){
MDNS.begin(AppleMIDI.getName());
Serial.println(AppleMIDI.getName());
Serial.println(F("OK, now make sure you have a rtpMIDI session that is Enabled"));
Serial.print(F("Add device named Arduino with Host/Port "));
Serial.print(WiFi.localIP().toString());
Serial.println(F(":5004"));
Serial.println(F("Then press the Connect button"));
Serial.println(F("Then open a MIDI listener (eg MIDI-OX) and monitor incoming notes"));
// Create a session and wait for a remote host to connect to us
MIDI.begin(1); // listen on channel 1
AppleMIDI.setHandleConnected(OnAppleMidiConnected);
AppleMIDI.setHandleDisconnected(OnAppleMidiDisconnected);
AppleMIDI.setHandleError(OnAppleMidiError);
MIDI.setHandleNoteOn(OnAppleMidiNoteOn);
MIDI.setHandleNoteOff(OnAppleMidiNoteOff);
MDNS.addService("apple-midi", "udp", AppleMIDI.getPort());
MDNS.addService("http", "tcp", 80);
Serial.println(F("Every second send a random NoteOn/Off"));
// Initiate the session
IPAddress remote(192, 168, 8, 100);
AppleMIDI.sendInvite(remote); // port is 5004 by default
}
// -----------------------------------------------------------------------------
// Doing Autoconnect and Midi configurations
// -----------------------------------------------------------------------------
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
// Enable saved past credential by autoReconnect option,
// even once it is disconnected.
Config.autoReconnect = true;
Config.hostName = "esp32-01";
Portal.config(Config);
// Load aux. page
Timezone.load(AUX_TIMEZONE);
// Retrieve the select element that holds the time zone code and
// register the zone mnemonic in advance.
AutoConnectSelect& tz = Timezone["timezone"].as<AutoConnectSelect>();
for (uint8_t n = 0; n < sizeof(TZ) / sizeof(Timezone_t); n++) {
tz.add(String(TZ[n].zone));
}
Portal.join({ Timezone }); // Register aux. page
// Behavior a root path of ESP8266WebServer.
Server.on("/", rootPage);
Server.on("/start", startPage); // Set NTP server trigger handler
Serial.println("Creating portal and trying to connect...");
// Establish a connection with an autoReconnect option.
if (Portal.begin()) {
Serial.println("WiFi connected: " + WiFi.localIP().toString());
Serial.println(WiFi.getHostname());
midiConfiguration();
}
}
void loop() {
Portal.handleClient();
// read the input on A0 at default resolution (10 bits)
analogReadResolution(10);
initialVal = analogRead(sensorPin);
// convert to a midi range from 0 to 127:
midiVal = initialVal/8;
// check if analog input has changed
if (lastVal != midiVal) {
// Listen to incoming notes
MIDI.read();
// Send MIDI note 40 on, velocity 55 on channel 1
MIDI.sendNoteOn(midiVal, 55, 1);
delay(500);
//Serial.println(midiVal);
}
}
// ====================================================================================
// Event handlers for MIDI connectivity
// ====================================================================================
// -----------------------------------------------------------------------------
// rtpMIDI session. Device connected
// -----------------------------------------------------------------------------
void OnAppleMidiConnected(const ssrc_t & ssrc, const char* name) {
wifiConnected = true;
Serial.print(F("Connected to session "));
Serial.println(name);
}
// -----------------------------------------------------------------------------
// rtpMIDI session. Device disconnected
// -----------------------------------------------------------------------------
void OnAppleMidiDisconnected(const ssrc_t & ssrc) {
wifiConnected = false;
Serial.println(F("Disconnected"));
}
// -----------------------------------------------------------------------------
// rtpMIDI session. Device disconnected
// -----------------------------------------------------------------------------
void OnAppleMidiError(const ssrc_t& ssrc, int32_t err) {
Serial.print (F("Exception "));
Serial.print (err);
Serial.print (F(" from ssrc 0x"));
Serial.println(ssrc, HEX);
switch (err)
{
case Exception::NoResponseFromConnectionRequestException:
Serial.println(F("xxx:yyy did't respond to the connection request. Check the address and port, and any firewall or router settings. (time)"));
break;
}
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
static void OnAppleMidiNoteOn(byte channel, byte note, byte velocity) {
Serial.print(F("Incoming NoteOn from channel: "));
Serial.print(channel);
Serial.print(F(", note: "));
Serial.print(note);
Serial.print(F(", velocity: "));
Serial.println(velocity);
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
static void OnAppleMidiNoteOff(byte channel, byte note, byte velocity) {
Serial.print(F("Incoming NoteOff from channel: "));
Serial.print(channel);
Serial.print(F(", note: "));
Serial.print(note);
Serial.print(F(", velocity: "));
Serial.println(velocity);
}