Im trying to get my WiDo (Leonardo with built in cc3000) to publish and subscribe via mqtt from a mosquitto broker running on my desktop with ip: 192.168.0.130 and port: 1883
Used mqtt-spy and an app on my phone to test connectivity, all fine.
power up arduino and connects to network, gets ip address via DHCP then in console displays:
"Trying to connect to mqtt"
and then never connects. I threw in the serialprint to debug where it was stopping.
mosquitto is running in verbose mode and never gets any connection request or signs of life from the arduino. Have i done something silly with the server ip address? I honestly have no idea what is going on with the ArrayToIp and union stuff.
Code below is just my attempt to get a connection to the broker and then i'll go on from there.
Thanks.
Jackson.
/***************************************************
This is an MQTT publish example for the Adafruit CC3000 Wifi Breakout & Shield (https://www.adafruit.com/products/1469).
This script uses some of the methods from the buildtest example for CC3000 that Limor Fried, Kevin Townsend and Phil Burgess
wrote for Adafruit Industries to make debugging easier.
****************************************************/
#include <Adafruit_CC3000.h>
#include <ccspi.h>
#include <SPI.h>
#include <cc3000_PubSubClient.h>
// These are the interrupt and control pins
#define ADAFRUIT_CC3000_IRQ 7 // MUST be an interrupt pin!
// These can be any two pins
#define ADAFRUIT_CC3000_VBAT 5
#define ADAFRUIT_CC3000_CS 10
// Use hardware SPI for the remaining pins
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, SPI_CLOCK_DIVIDER);
#define WLAN_SSID "SSID"
#define WLAN_PASS "Password"
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
#define WLAN_SECURITY WLAN_SEC_WPA2
Adafruit_CC3000_Client client;
// We're going to set our broker IP and union it to something we can use
union ArrayToIp { byte array[4]; uint32_t ip; };
ArrayToIp server = { 192, 168, 0, 130 };
void callback (char* topic, byte* payload, unsigned int length) {
Serial.print("Payload:");
Serial.write(payload, length);
Serial.println("");
}
cc3000_PubSubClient mqttclient(server.ip, 1883, callback, client, cc3000);
void setup(void)
{
delay(3000);
Serial.begin(115200);
Serial.println(F("Hello, CC3000!\n"));
displayDriverMode();
Serial.println(F("\nInitialising the CC3000 ..."));
if (!cc3000.begin()) {
Serial.println(F("Unable to initialise the CC3000! Check your wiring?"));
for(;;);
}
displayMACAddress();
Serial.println(F("\nDeleting old connection profiles"));
if (!cc3000.deleteProfiles()) {
Serial.println(F("Failed!"));
while(1);
}
/* Attempt to connect to an access point */
char *ssid = WLAN_SSID; /* Max 32 chars */
Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
/* NOTE: Secure connections are not available in 'Tiny' mode! */
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) {
Serial.println(F("Failed!"));
while(1);
}
Serial.println(F("Connected!"));
/* Wait for DHCP to complete */
Serial.println(F("Request DHCP"));
while (!cc3000.checkDHCP()) {
delay(100); // ToDo: Insert a DHCP timeout!
}
/* Display the IP address DNS, Gateway, etc. */
while (!displayConnectionDetails()) {
delay(1000);
}
// connect to the broker
if (!client.connected()) {
Serial.println(F("Trying to connect to mqtt"));
client = cc3000.connectTCP(server.ip, 1883);
}
// did that last thing work? sweet, let's do something
if(client.connected()) {
Serial.println(F("Apparently Connected"));
if (mqttclient.connect("Arduino123456789")) {
mqttclient.publish("test","A4 is now online");
mqttclient.subscribe("test");
}
}
}
void loop(void) {
mqttclient.loop();
}
/**************************************************************************/
/*!
@brief Displays the driver mode (tiny of normal), and the buffer
size if tiny mode is not being used
@note The buffer size and driver mode are defined in cc3000_common.h
*/
/**************************************************************************/
void displayDriverMode(void)
{
#ifdef CC3000_TINY_DRIVER
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
#else
Serial.print(F("RX Buffer : "));
Serial.print(CC3000_RX_BUFFER_SIZE);
Serial.println(F(" bytes"));
Serial.print(F("TX Buffer : "));
Serial.print(CC3000_TX_BUFFER_SIZE);
Serial.println(F(" bytes"));
#endif
}
/**************************************************************************/
/*!
@brief Tries to read the 6-byte MAC address of the CC3000 module
*/
/**************************************************************************/
void displayMACAddress(void)
{
uint8_t macAddress[6];
if(!cc3000.getMacAddress(macAddress))
{
Serial.println(F("Unable to retrieve MAC Address!\r\n"));
}
else
{
Serial.print(F("MAC Address : "));
cc3000.printHex((byte*)&macAddress, 6);
}
}
/**************************************************************************/
/*!
@brief Tries to read the IP address and other connection details
*/
/**************************************************************************/
bool displayConnectionDetails(void)
{
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv;
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv))
{
Serial.println(F("Unable to retrieve the IP Address!\r\n"));
return false;
}
else
{
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress);
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask);
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway);
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv);
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv);
Serial.println();
return true;
}
}
EDIT - SOLVED
Ip address has to be entered in reverse order ( 130, 0, 168, 192 )