Thursday, 13 April 2017

NodeJs Bluetooth Listeners and Connection Issues

I have been trying to connect my Thunderboards to my raspberry pi. I have successfully done this with a nodejs nodual. However, I keep getting connection fails and then max listeners error.

The final goal is to connect to 3 Thunderboards of known ID sequentially, get the data from them and save it to a text file. (connect to 1 save data, connect to 2 save data, connect to 3 save data and repeat). I know the full GATT database of uuid's for the services and characteristics.

Here is an example of a possible output (console):

pi@raspberrypi:~/code/ThunderBoard $ sudo node  ExampleB.js
File Cleared
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Orientation:
  - alpha :16.6°
  - beta  :-23.72°
  - gamma :-57.2°
- Orientation:
  - alpha :16.76°
  - beta  :-23.7°
  - gamma :-57.23°
- Orientation:
  - alpha :16.91°
  - beta  :-23.68°
  - gamma :-57.25°
- Orientation:
  - alpha :17.06°
  - beta  :-23.66°
  - gamma :-57.26°
- Orientation:
  - alpha :17.22°
  - beta  :-23.65°
  - gamma :-57.29°
- Orientation:
  - alpha :17.38°
  - beta  :-23.63°
  - gamma :-57.31°
- Orientation:
  - alpha :17.54°
  - beta  :-23.62°
  - gamma :-57.33°
- Orientation:
  - alpha :17.7°
  - beta  :-23.6°
  - gamma :-57.36°
- Orientation:
  - alpha :17.86°
  - beta  :-23.58°
  - gamma :-57.38°
- Orientation:
  - alpha :18.02°
  - beta  :-23.56°
  - gamma :-57.4°
- Orientation:
  - alpha :18.18°
  - beta  :-23.54°
  - gamma :-57.42°
- Orientation:
  - alpha :18.34°
  - beta  :-23.52°
  - gamma :-57.43°
- Orientation:
  - alpha :18.5°
  - beta  :-23.51°
  - gamma :-57.45°
- Orientation:
  - alpha :18.66°
  - beta  :-23.49°
  - gamma :-57.48°
- Disconnected Thunder React #15148
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Orientation:
  - alpha :18.97°
  - beta  :-23.45°
  - gamma :-57.49°
- Orientation:
  - alpha :19.12°
  - beta  :-23.44°
  - gamma :-57.52°
- Orientation:
  - alpha :19.28°
  - beta  :-23.42°
  - gamma :-57.54°
- Orientation:
  - alpha :19.44°
  - beta  :-23.4°
  - gamma :-57.56°
- Orientation:
  - alpha :19.6°
  - beta  :-23.38°
  - gamma :-57.59°
- Orientation:
  - alpha :19.76°
  - beta  :-23.36°
  - gamma :-57.61°
- Orientation:
  - alpha :19.91°
  - beta  :-23.34°
  - gamma :-57.63°
- Orientation:
  - alpha :20.07°
  - beta  :-23.33°
  - gamma :-57.66°
- Orientation:
  - alpha :20.23°
  - beta  :-23.32°
  - gamma :-57.68°
- Orientation:
  - alpha :20.39°
  - beta  :-23.3°
  - gamma :-57.71°
- Orientation:
  - alpha :20.55°
  - beta  :-23.28°
  - gamma :-57.73°
- Orientation:
  - alpha :20.71°
  - beta  :-23.27°
  - gamma :-57.76°
- Orientation:
  - alpha :20.86°
  - beta  :-23.26°
  - gamma :-57.78°
- Orientation:
  - alpha :21.02°
  - beta  :-23.24°
  - gamma :-57.8°
- Disconnected Thunder React #15148
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Orientation:
  - alpha :21.33°
  - beta  :-23.19°
  - gamma :-57.8°
- Orientation:
  - alpha :21.48°
  - beta  :-23.17°
  - gamma :-57.82°
- Orientation:
  - alpha :21.63°
  - beta  :-23.16°
  - gamma :-57.84°
- Orientation:
  - alpha :21.78°
  - beta  :-23.14°
  - gamma :-57.85°
- Orientation:
  - alpha :21.93°
  - beta  :-23.12°
  - gamma :-57.87°
- Orientation:
  - alpha :22.08°
  - beta  :-23.11°
  - gamma :-57.89°
- Orientation:
  - alpha :22.23°
  - beta  :-23.09°
  - gamma :-57.9°
- Orientation:
  - alpha :22.38°
  - beta  :-23.07°
  - gamma :-57.91°
- Orientation:
  - alpha :22.54°
  - beta  :-23.05°
  - gamma :-57.92°
- Orientation:
  - alpha :22.68°
  - beta  :-23.04°
  - gamma :-57.94°
- Orientation:
  - alpha :22.83°
  - beta  :-23.02°
  - gamma :-57.95°
- Orientation:
  - alpha :22.99°
  - beta  :-23°
  - gamma :-57.97°
- Orientation:
  - alpha :23.15°
  - beta  :-22.98°
  - gamma :-57.99°
- Orientation:
  - alpha :23.3°
  - beta  :-22.95°
  - gamma :-58.01°
- Disconnected Thunder React #15148
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Orientation:
  - alpha :23.6°
  - beta  :-22.91°
  - gamma :-58.01°
- Orientation:
  - alpha :23.76°
  - beta  :-22.89°
  - gamma :-58.04°
- Orientation:
  - alpha :23.91°
  - beta  :-22.87°
  - gamma :-58.06°
- Orientation:
  - alpha :24.07°
  - beta  :-22.85°
  - gamma :-58.09°
- Orientation:
  - alpha :24.22°
  - beta  :-22.84°
  - gamma :-58.11°
- Orientation:
  - alpha :24.38°
  - beta  :-22.82°
  - gamma :-58.14°
- Orientation:
  - alpha :24.54°
  - beta  :-22.8°
  - gamma :-58.16°
- Orientation:
  - alpha :24.7°
  - beta  :-22.78°
  - gamma :-58.19°
- Orientation:
  - alpha :24.86°
  - beta  :-22.77°
  - gamma :-58.21°
- Orientation:
  - alpha :25.02°
  - beta  :-22.75°
  - gamma :-58.23°
- Orientation:
  - alpha :25.18°
  - beta  :-22.72°
  - gamma :-58.26°
- Orientation:
  - alpha :25.34°
  - beta  :-22.71°
  - gamma :-58.28°
- Orientation:
  - alpha :25.5°
  - beta  :-22.69°
  - gamma :-58.3°
- Orientation:
  - alpha :25.65°
  - beta  :-22.67°
  - gamma :-58.33°
- Disconnected Thunder React #15148
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Orientation:
  - alpha :25.93°
  - beta  :-22.62°
  - gamma :-58.33°
- Orientation:
  - alpha :26.08°
  - beta  :-22.6°
  - gamma :-58.35°
- Orientation:
  - alpha :26.22°
  - beta  :-22.58°
  - gamma :-58.36°
- Orientation:
  - alpha :26.37°
  - beta  :-22.57°
  - gamma :-58.37°
- Orientation:
  - alpha :26.51°
  - beta  :-22.55°
  - gamma :-58.39°
- Orientation:
  - alpha :26.65°
  - beta  :-22.53°
  - gamma :-58.4°
- Orientation:
  - alpha :26.8°
  - beta  :-22.51°
  - gamma :-58.41°
- Orientation:
  - alpha :26.95°
  - beta  :-22.49°
  - gamma :-58.42°
- Orientation:
  - alpha :27.1°
  - beta  :-22.47°
  - gamma :-58.44°
- Orientation:
  - alpha :27.25°
  - beta  :-22.45°
  - gamma :-58.46°
- Orientation:
  - alpha :27.4°
  - beta  :-22.43°
  - gamma :-58.47°
- Orientation:
  - alpha :27.54°
  - beta  :-22.41°
  - gamma :-58.48°
- Orientation:
  - alpha :27.7°
  - beta  :-22.4°
  - gamma :-58.5°
- Orientation:
  - alpha :27.84°
  - beta  :-22.38°
  - gamma :-58.51°
- Disconnected Thunder React #15148
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Orientation:
  - alpha :28.1°
  - beta  :-22.32°
  - gamma :-58.49°
- Orientation:
  - alpha :28.25°
  - beta  :-22.3°
  - gamma :-58.5°
- Orientation:
  - alpha :28.4°
  - beta  :-22.28°
  - gamma :-58.53°
- Orientation:
  - alpha :28.55°
  - beta  :-22.26°
  - gamma :-58.54°
- Orientation:
  - alpha :28.71°
  - beta  :-22.24°
  - gamma :-58.56°
- Orientation:
  - alpha :28.86°
  - beta  :-22.22°
  - gamma :-58.58°
- Orientation:
  - alpha :29.01°
  - beta  :-22.2°
  - gamma :-58.6°
- Orientation:
  - alpha :29.16°
  - beta  :-22.18°
  - gamma :-58.61°
- Orientation:
  - alpha :29.32°
  - beta  :-22.16°
  - gamma :-58.63°
- Orientation:
  - alpha :29.47°
  - beta  :-22.14°
  - gamma :-58.65°
- Orientation:
  - alpha :29.62°
  - beta  :-22.11°
  - gamma :-58.66°
- Orientation:
  - alpha :29.78°
  - beta  :-22.09°
  - gamma :-58.68°
- Orientation:
  - alpha :29.93°
  - beta  :-22.07°
  - gamma :-58.7°
- Orientation:
  - alpha :30.09°
  - beta  :-22.05°
  - gamma :-58.71°
- Disconnected Thunder React #15148
Looped
- Found Thunder React #15148
Looped
- Found Thunder React #15148
- Connected Thunder React #15148
[]
0
- Connected Thunder React #15148
[]
0
Looped
Looped
Looped
(node:8335) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 discover listeners added. Use emitter.setMaxListeners() to increase limit
Looped

You can see that it connects fine to the thunderboard a lot of the time but when it doesn't it will never connect again it seems to be running two instances of the main function.

Here is the code:

var noble = require('noble');


var ThunderboardReact = require('node-thunderboard-react');
var thunder = new ThunderboardReact({'noble': noble});
var fs = require('fs');
var path = "test.txt";
var target = 1;
var connected = 0;
var toggle = 1;
//Thunder #00015148
//000b570c3b2c

//ThunderSenseVocis
//000b5751af26

//clear file
thunder.init((error) => {
    //Clear File
    fs.writeFile(path, '', (err) => 
    {
        if (err)
        {
            console.log(err);
        }
        console.log('File Cleared');
    });
    var time = setInterval(searchConnect, 10000);
});

function searchConnect()
{
  console.log('Looped');    
  if(toggle)
  {
        //toggle = 0;
        thunder.startDiscovery((device) => 
        {
            console.log('- Found ' + device.localName); 
                if((device.localName == 'Thunder React #15148')/*&&(target = 1)*/)
                {
                    thunder.stopDiscovery();
                    device.connect((error) => 
                    {
                        if(error)
                        {
                            console.log(error);
                        }
                        console.log('- Connected ' + device.localName);
                        connected = 1;
                        fs.appendFile(path, device.localName + '\n', (err) =>
                        {
                            if (err) 
                            {
                                return console.error(err);
                            }

                        });


                        console.log(device.eventNames());
                        console.log(device.listenerCount());
                        device.removeAllListeners();

                        startMonitorOrientation(device);
                    });

                }
                /*else if((device.localName == 'Thunder React #15646')&&(target = 2))
                {


                    startMonitorOrientation(device);
                }*/
                else
                {
                    thunder.stopDiscovery();
                    console.log('Did Not Connect to ' + device.localName);

                }


        });
    }
    else
    {
        toggle = 1;

        if(connected)
        {
            //device.disconnect(() => 
            //{
                //target = 1;
                //console.log('- Disconnected ' + device.localName);
                //connected = 0;
            //});

        }
    }
}



// Monitor the sensored data
function startMonitorOrientation(device) 
{
  // Start to monitor the orientation of the device
  device.startMonitorOrientation((error) => {
    if(error) {
      console.log(error.toString());
      process.exit();
    }
  });

    // Set a listener for orientation events fired on the ThunderboardReactDevice object
    device.on('orientation', (res) => 
    {
        fs.open(path, 'a', function(err, fd) 
        {
            if (err) 
            {
                return console.error(err);
            }
            // Show the event data
            console.log('- Orientation:');
            console.log('  - alpha :' + res.alpha + '°');
            console.log('  - beta  :' + res.beta + '°');
            console.log('  - gamma :' + res.gamma + '°');


            fs.writeSync(fd, 'alpha: ');
            fs.writeSync(fd, (res.alpha).toString()); 
            fs.writeSync(fd, '°  beta: ');
            fs.writeSync(fd, (res.beta).toString()); 
            fs.writeSync(fd, '°  gamma: ');
            fs.writeSync(fd, (res.gamma).toString()); 
            fs.writeSync(fd, '° \n');

            fs.close(fd, function(err)
            {
                if (err)
                {
                    console.log(err);
                }
            }); 
        });
    });
      //Stop to monitor and disconnect the device in 5 seconds
  setTimeout(() => {
    device.stopMonitorOrientation((error) => {

      // Disconnect the device
      device.disconnect(() => {
        target = 1;
        console.log('- Disconnected ' + device.localName);
        connected = 0;

      });
    });
  }, 3000);
 }

The saving to file works as expected.

However when the console outputs "Found" but not "Connect".The device name still gets printed to file! This is strange because the print device name to the file is after the code to connect to the device.

If the device connects in the next iteration (as seen in example output) it connects twice and then nothing ever works again.

Eventually, it will have a max listers warning even though I put a remove all listeners.

I have tried moving the init function inside the iterated function but the same response.

How can I get so it finds, connects to, gets 3 seconds of data, then disconnects everything and starts again from the beginning every time? If it fails connection or anything goes wrong after 10 seconds it just drops the thread and all the listers and starts again.



via Kieron

No comments:

Post a Comment