JSON error notification/writeCharacteristic

Ask, and ye shall receive.
tmator
Posts: 1
Joined: 10:25, 19 Mar 2015

JSON error notification/writeCharacteristic

Postby tmator » 10:31, 19 Mar 2015

Hi,

i'm trying to make a simple app to play with my nrf51 dongle but i have a "JSON Error" when i do evothings.ble.enableNotification and evothings.ble.writeCharacteristic

Ty for your help, and nice job with this library :)

Code: Select all


// Application object.
var app = {};

app.led="off";

app.UUID="6E400001-B5A3-F393-E0A9-E50E24DCCA9E"; //nordic uart uuid
app.txCharacteristic="6E400002-B5A3-F393-E0A9-E50E24DCCA9E"; // transmit is from the phone's perspective
app.rxCharacteristic="6E400003-B5A3-F393-E0A9-E50E24DCCA9E";  // receive is from the phone's perspective

app.deviceHandle=null;

// Device list.
app.devices = {};

// UI methods.
app.ui = {};

app.initialize = function()
{
   document.addEventListener('deviceready', this.onDeviceReady, false);
   
   // Important to stop scanning when page reloads/closes!
   window.addEventListener('beforeunload', function(e)
   {
      app.stopScan();
   });

};

//connect to device
app.connectTo = function(address)
{
   function onConnectSuccess(info)
   {
      app.ui.hideDeviceList();
      if (info.state==2)
      {
         app.device = info;
         //TODO
         app.getServices(info);
         //display buttons
         app.ui.displayStatus('Connected');
         app.ui.displayCommands();
         
      }
      else if (info.state == 0)
      {
         app.ui.displayStatus('Disconnected');
      }
   }

   function onConnectFailure(errorCode)
   {
      app.ui.displayStatus('Error connect '+errorCode);
      //TODO
      //app.disconnect('Deconnecté');
   }

   app.stopScan();
   app.ui.displayStatus('Connecting');
   
   evothings.ble.connect(address, onConnectSuccess, onConnectFailure);

   
};

//get services
app.getServices = function(device)
{

   function onReadServicesSuccess(services)
   {


      for (var si in services)
      {
         var service = services[si];

         for (var ci in service.characteristics)
         {
            var characteristic = service.characteristics[ci];

            if (characteristic.uuid == app.rxCharacteristic)
            {
               app.characteristicRead = characteristic.handle;
            }
            else if (characteristic.uuid == app.txCharacteristic)
            {
               app.characteristicWrite = characteristic.handle;
            }
            }*/
         }
      }
      
      function onNotifySuccess(data)
      {
         alert("data : "+data);
      }
      
      function onNotityFailure(errorCode)
      {
         alert("error notify "+errorCode);
      }


      //on s'inscrit pour recevoir les notifications
      app.deviceHandle=device.handle;
      evothings.ble.enableNotification(app.deviceHandle,app.rxCharacteristic,onNotifySuccess,onNotityFailure);

           app.ui.displayStatus('Connected');
                app.ui.displayCommands();
      

   }

   function onReadServicesFailure(errorCode)
   {
      app.ui.displayStatus('Error readService '+errorCode);
      //TODO
   }

   app.ui.displayStatus('Reading services');
   evothings.ble.readAllServiceData(device.deviceHandle,onReadServicesSuccess,onReadServicesFailure);
};

app.onDeviceReady = function()
{
   // Not used.
   // Here you can update the UI to say that
   // the device (the phone/tablet) is ready
   // to use BLE and other Cordova functions.
   alert("ready");
};
   
// Start the scan. Call the callback function when a device is found.
// Format:
//   callbackFun(deviceInfo, errorCode)
//   deviceInfo: address, rssi, name
//   errorCode: String
app.startScan = function(callbackFun)
{
   app.stopScan();

   console.log("starting");
   evothings.ble.startScan(
      function(device)
      {
         // Report success.
         callbackFun(device, null);
      },
      function(errorCode)
      {
         // Report error.
         callbackFun(null, errorCode);
      }
   );
};

// Stop scanning for devices.
app.stopScan = function()
{
   evothings.ble.stopScan();
};

app.changeLed = function(etat)
{
   alert(etat);
   if (etat=="on")
   {
      alert("ledOn");
   }
   else if (etat=="off")
   {   
      alert("ledOff");
   }
};

app.ui.displayCommands = function()
{
   $('#commandes').show();
};

app.ui.checkButtonToggeledLed = function ()
{

   function onWriteSuccess()
   {
      alert("write ok");
   }

   function onWriteFailure(errorCode)
   {
      alert('error write '+errorCode);
   }



   function writeMsg(message)
   {
      alert("write");
      
      var data = new Uint8Array(message.length);

      for (var i = 0, messageLength = message.length;
         i < messageLength;
         i++)
      {
         data[i] = message.charCodeAt(i);
      }
      
      evothings.ble.writeCharacteristic(app.deviceHandle,app.txCharacteristic,data,onWriteSuccess,onWriteFailure);

   }

   if (app.led=="off")
   {
      app.led="on";
      writeMsg('ledOn');
   }
   else if (app.led="on")
   {
      app.led="off";
      writeMsg('ledOff');
   }
   
};

// Called when Start Scan button is selected.
app.ui.onStartScanButton = function()
{
   app.startScan(app.ui.deviceFound);
   app.ui.displayStatus('Scanning...');
};

// Called when Stop Scan button is selected.
app.ui.onStopScanButton = function()
{
   app.stopScan();
   app.devices = {};
   app.ui.displayStatus('Scanning turned off');
   app.ui.displayDeviceList();
};

// Called when a device is found.
app.ui.deviceFound = function(device, errorCode)
{
   if (device)
   {
      // Insert the device into table of found devices.
      app.devices[device.address] = device;

      // Display device in UI.
      app.ui.displayDeviceList();
   }
   else if (errorCode)
   {
      app.ui.displayStatus('Scan Error: ' + errorCode);
   }
};

// Display the device list.
app.ui.hideDeviceList = function()
{
   // Clear device list.
   $('#foundDevices').empty();

}



// Display the device list.
app.ui.displayDeviceList = function()
{
   // Clear device list.
   $('#foundDevices').empty();

   var i = 1;
   $.each(app.devices, function(key, device)
   {
      // Set background color for this item.

      // Create a div tag to display sensor data.
         var element = $(
            '<li class="topcoat-list__item">'
            //+   '<b>' + device.name + '</b><br /><button id=connect>Connect</button><br />'
            +   '<b>' + device.name + '</b><br /><button id=connect onclick="app.connectTo(\''+device.address+'\')">Connect</button><br />'
//            +   device.address + '<br/>'
//            +   device.rssi + '<br/>'
            + '</li>'
         );
      $('#foundDevices').append(element);
   });
};

// Display a status message
app.ui.displayStatus = function(message)
{
   $('#scan-status').html(message);
};

app.initialize();

Fredrik
Site Admin
Posts: 196
Joined: 15:00, 18 Nov 2013

Re: JSON error notification/writeCharacteristic

Postby Fredrik » 10:39, 20 Mar 2015

Could you give us more details? Are you running iOS or Android? At least on Android, a JSON error indicates that an input argument is wrongly formatted.

Looks like you send app.txCharacteristic and app.rxCharacteristic, but you should be sending app.characteristicWrite and app.characteristicRead.

In other words, you send the UUID string, but you should be sending the characteristic handle.


Return to “Questions and answers”

Who is online

Users browsing this forum: No registered users and 51 guests