12 Replies Latest reply on Aug 15, 2016 12:59 PM by Intel Corporation

    Mraa & Noble segmentation fault

    Flo1991

      I use noble to read a BLE sensor board with the following code, everything is fine:

       

      var async = require('async');
      var noble = require('noble');
      
      var m = require('mraa'); //require mraa
      console.log('MRAA Version: ' + m.getVersion()); //write the mraa version to the console
      
      //var myDigitalPin = new m.Gpio(0); //setup digital read on pin 5
      //myDigitalPin.dir(m.DIR_OUT); //set the gpio direction to output
      //myDigitalPin.write(1); //set the digital pin to high (1)
      
      var peripheralIdOrAddress = "000780b5b0fb";
      
      noble.on('stateChange', function(state) {
        if (state === 'poweredOn') {
          noble.startScanning();
        } else {
          noble.stopScanning();
        }
      });
      
      noble.on('discover', function(peripheral) {
        if (peripheral.id === peripheralIdOrAddress || peripheral.address === peripheralIdOrAddress) {
          noble.stopScanning();
      
          console.log('peripheral with ID ' + peripheral.id + ' found');
          var advertisement = peripheral.advertisement;
      
          var localName = advertisement.localName;
          var txPowerLevel = advertisement.txPowerLevel;
          var manufacturerData = advertisement.manufacturerData;
          var serviceData = advertisement.serviceData;
          var serviceUuids = advertisement.serviceUuids;
      
          if (localName) {
            console.log('  Local Name        = ' + localName);
          }
      
          if (txPowerLevel) {
            console.log('  TX Power Level    = ' + txPowerLevel);
          }
      
          if (manufacturerData) {
            console.log('  Manufacturer Data = ' + manufacturerData.toString('hex'));
          }
      
          if (serviceData) {
            console.log('  Service Data      = ' + serviceData);
          }
      
          if (serviceUuids) {
            console.log('  Service UUIDs     = ' + serviceUuids);
          }
      
          console.log();
      
          explore(peripheral);
        }
      });
      
      function explore(peripheral) {
        console.log('services and characteristics:');
      
      // peripheral.on('disconnect', function() {
      //   process.exit(0);
      // });
      peripheral.on('disconnect', function() {
      noble.startScanning(); //when disconnect, start scanning again
      });
      
        peripheral.connect(function(error) {
          peripheral.discoverServices([], function(error, services) {
            var serviceIndex = 0;
      
            async.whilst(
              function () {
                return (serviceIndex < services.length);
              },
              function(callback) {
                var service = services[serviceIndex];
                var serviceInfo = service.uuid;
      
                if (service.name) {
                  serviceInfo += ' (' + service.name + ')';
                }
                console.log(serviceInfo);
      
                service.discoverCharacteristics([], function(error, characteristics) {
                  var characteristicIndex = 0;
      
                  async.whilst(
                    function () {
                      return (characteristicIndex < characteristics.length);
                    },
                    function(callback) {
                      var characteristic = characteristics[characteristicIndex];
                      var characteristicInfo = '  ' + characteristic.uuid;
      
                      if (characteristic.name) {
                        characteristicInfo += ' (' + characteristic.name + ')';
                      }
      
                      async.series([
                     // function(callback) {
                     //   characteristic.discoverDescriptors(function(error, descriptors) {
                     //     async.detect(
                     //       descriptors,
                     //       function(descriptor, callback) {
                     //         return callback(descriptor.uuid === '2901');
                     //       },
                     //       function(userDescriptionDescriptor){
                     //         if (userDescriptionDescriptor) {
                     //           userDescriptionDescriptor.readValue(function(error, data) {
                     //             if (data) {
                     //               characteristicInfo += ' (' + data.toString() + ')';
                     //             }
                     //             callback();
                     //           });
                     //         } else {
                     //           callback();
                     //         }
                     //       }
                     //     );
                     //   });
                     // },
                        function(callback) {
                              characteristicInfo += '\n    properties  ' + characteristic.properties.join(', ');
      
                          if (characteristic.properties.indexOf('read') !== -1) {
                            characteristic.read(function(error, data) {
                              if (data) {
                                var string = data.toString('ascii');
      
                                //characteristicInfo += '\n    value       ' + data.toString('hex') + ' | \'' + string + '\'';
                                  if( characteristic.uuid=='2b72')
                                    {
                                       console.log("LUX FOUND <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ;
                                    }
                                  if( characteristic.uuid=='2a76')
                                    {
                                       console.log("UV INDEX FOUND <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ;
                                    }
                                  if( characteristic.uuid=='2a6e')
                                    {
                                       console.log("Temperature FOUND <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ;
                                    }
                                  if( characteristic.uuid=='2a6f')
                                    {
                                       console.log("Humidity FOUND <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ;
                                    }
                                  if( characteristic.uuid=='2a6d')
                                    {
                                       console.log("Pressure FOUND <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<") ;
                                    }
                              }
                              callback();
                            });
                          } else {
                            callback();
                          }
                        },
                        function() {
                          //console.log(characteristicInfo);
                          characteristicIndex++;
                          callback();
                        }
                      ]);
                    },
                    function(error) {
                      serviceIndex++;
                      callback();
                    }
                  );
                });
              },
              function (err) {
                peripheral.disconnect();
              }
            );
          });
        });
      }
      

       

      If uncomment the following lines:

       

      //var myDigitalPin = new m.Gpio(0); //setup digital read on pin 5
      //myDigitalPin.dir(m.DIR_OUT); //set the gpio direction to output
      //myDigitalPin.write(1); //set the digital pin to high (1)
      

       

      the programm crashes after a short while with an segmentation fault....(printed in console)

       

      The Intel XDK is up to date, mraa is version 1.1.1

      The XDK provides the following output (SSH connection, console output in Intel XDK):

      ERROR:

       

      #
      # Fatal error in ../deps/v8/src/api.h, line 297
      # CHECK(allow_empty_handle || that != __null) failed
      #
      

       

      The noble code is based on: noble/peripheral-explorer.js at master · sandeepmistry/noble · GitHub

       

      Hope someone can help

        • 1. Re: Mraa & Noble segmentation fault
          Intel Corporation
          This message was posted on behalf of Intel Corporation

          Hello Flo1991,

          Have you tried to run the script directly on Edison’s Linux? If so, does it behave the same way? In case you haven't tried this, could you please do it and let us know if you notice any different behavior?

          -Peter.

          • 2. Re: Mraa & Noble segmentation fault
            Flo1991

            Running the script directly on the edison linux results in the segmentation fault.

            Using the Intel XDK it results in blocking (doing nothing) or sometimes showing the above error message

             

            Flo1991

            • 3. Re: Mraa & Noble segmentation fault
              Intel Corporation
              This message was posted on behalf of Intel Corporation

              According to https://github.com/sandeepmistry/noble, you require libbluetooth-dev in order to use noble. This library does not come in Edison by default, did you make sure to install it?
               
              Also, could you please post a screenshot of the segmentation fault you receive? It might be of help.
               
              -Peter.

              • 4. Re: Mraa & Noble segmentation fault
                Flo1991

                I followed this guide:

                Configure Intel Edison for Bluetooth LE (Smart) Development - Rex St John | 雷克斯 聖約翰

                and everything is running fine without these lines... (the gpio pin doe not matter)

                the programm is terminated and the console prints "Segmentation fault", there is no more information..

                 

                How can I include the libbluetooth-dev (without rebuilding the image)?

                 

                Flo1991

                • 5. Re: Mraa & Noble segmentation fault
                  Flo1991

                  Update:

                  Updating node.js usign AlexT's repo results in the following:

                  -npm must be updated (done)

                  -packages must be reinstalled (done)

                  -mraa is not working anymore:

                   

                  ERROR: module.js:434

                    return process.dlopen(module, path._makeLong(filename));

                    ^

                  Error: /home/root/.node_app_slot/node_modules/mraa/build/Release/mraa.node: undefined symbol: mraa_init_json_platform

                    at Error (native)

                    at Object.Module._extensions..node (module.js:434:18)

                    at Module.load (module.js:343:32)

                    at Function.Module._load (module.js:300:12)

                    at Module.require (module.js:353:17)

                    at require (internal/module.js:12:17)

                    at Object.<anonymous> (/home/root/.node_app_slot/main.js:1:71)

                    at Module._compile (module.js:409:26)

                    at Object.Module._extensions..js (module.js:416:10)

                    at Module.load (module.js:343:32)

                   

                  How can this be solved?

                   

                  -node problem is now described in detail:

                  (node) warning: possible EventEmitter memory leak detected. 11 disconnect listeners added. Use emitter.setMaxListeners() to increase limit.

                  Trace

                      at Peripheral.addListener (events.js:239:17)

                      at explore (/home/root/.node_app_slot/main.js:71:12)

                      at Noble.<anonymous> (/home/root/.node_app_slot/main.js:60:5)

                      at emitOne (events.js:77:13)

                      at Noble.emit (events.js:169:7)

                      at Noble.onDiscover (/home/root/node_modules/noble/lib/noble.js:135:10)

                      at emitMany (events.js:108:13)

                      at emit (events.js:182:7)

                      at NobleBindings.onDiscover (/home/root/node_modules/noble/lib/hci-socket/bindings.js:169:10)

                      at emitMany (events.js:108:13)

                      at emit (events.js:182:7)

                   

                  Something likes this should help:

                  peripheral.removeListener('disconnect', explore);

                   

                  but I don't know where to put the code...

                   

                  Is there another solution to avoid this memory leak?

                  How can I get mraa to work again?

                   

                  Flo1991

                  • 6. Re: Mraa & Noble segmentation fault
                    Intel Corporation
                    This message was posted on behalf of Intel Corporation

                    If you don't want to build the image to include libbluetooth-dev then you could try building the BlueZ package from source. If you would like to try this, you can find this package in http://www.bluez.org/release-of-bluez-5-41/.

                    Nevertheless, I'll  try to replicate the issue. How long after starting the script does it fail? Is it like that every time?

                    -Peter.

                    • 7. Re: Mraa & Noble segmentation fault
                      Flo1991

                      It fails at around 10 s - 120 s, so it is a short time....(it fails everytime)

                       

                      Edit to my last post:

                      the warning

                      (node) warning: possible EventEmitter memory leak detected.

                      [...]

                      is shown, but it does not terminate the code

                       

                      Flo1991

                      • 8. Re: Mraa & Noble segmentation fault
                        Intel Corporation
                        This message was posted on behalf of Intel Corporation

                        I am not able to replicate the issue. Nevertheless, I'll try to see what might happening. In case I find anything useful I'll post it here.
                         
                        -Peter.

                        • 9. Re: Mraa & Noble segmentation fault
                          Flo1991

                          Update:

                          The segmentation fault (using default node.js, refering to my first post) seems to happen after 13 communication pakets...

                          I tried with two different ble devices (sensortag and custom ble board) and got the error in both cases

                          I tried with another edison and with older firmware (and mraa) -->same error ...

                           

                          I am currently working on a different solution using noble-device, the behaviour seems to be better ... (until now I had not problems using mraa with the ble device in the same programm)

                           

                           

                          Flo1991

                          • 10. Re: Mraa & Noble segmentation fault
                            Intel Corporation
                            This message was posted on behalf of Intel Corporation

                            Thanks for your update. We'll continue to work on this. In case you come up with more updates, please post them here, they'll be of much help for us.

                            -Peter.

                            • 11. Re: Mraa & Noble segmentation fault
                              Flo1991

                              I cannot solve the problem so I decided to use noble-device.

                              With noble-device mraa can be used in parallel, but I don't know why.

                              I think this may be interesting for everyone who wants to read data from an BLE device.

                              My programm is attached, it is just a working prototype

                               

                              But it would be nice if the problem with noble could be solved...

                               

                              Furthermore I solved the problem using mraa with the newer version of node.js:

                              - use a new flashed edison

                              - setup opkg to alexT's repo

                              - update mraa to the newest version

                              - uninstall mraa for node.js (npm uninstall mraa)

                              - update node.js

                              - update npm

                              - reinstall mraa using npm

                               

                              Flo1991

                              • 12. Re: Mraa & Noble segmentation fault
                                Intel Corporation
                                This message was posted on behalf of Intel Corporation

                                Hi Flo1991,

                                We are glad to hear that you found a workaround for this. We will continue checking what might be happening and as I mentioned before, if I found something useful I'll post it here.

                                -Peter.