0

I'm trying to create a plugin that allows a NativeScript application to connect to an MQTT server. When I try to run the application I get the following error in my application:

java.lang.RuntimeException: Unable to start activity ComponentInfo{org.nativescript.testMQTT/com.tns.NativeScriptActivity}: com.tns.NativeScriptException: Calling js method onCreate failed

TypeError: Cannot read property 'paho' of undefined File: ", line: 1, column: 265

StackTrace: Frame: function:'NativeScriptMQTTClient', file:'/data/data/org.nativescript.testMQTT/files/app/tns_modules/nativescript-mqtt/mqtt.js', line: 8, column: 44 Frame: function:'', file:'/data/data/org.nativescript.testMQTT/files/app/main-page.js', line: 4, column: 14 Frame: function:'require', file:'', line: 1, column: 266 Frame: function:'global.loadModule', file:'/data/data/org.nativescript.testMQTT/files/app/tns_modules/globals/globals.js', line: 19, column: 16 Frame: function:'resolvePageFromEntry', file:'/data/data/org.nativescript.testMQTT/files/app/tns_modules/ui/frame/frame-common.js', line: 72, column: 40 Frame: function:'Frame.navigate', file:'/data/data/org.nativescript.testMQTT/files/app/tns_modules/ui/fr

I'm using the following code with the Paho Java library in my mqtt.android.ts file:

export class NativeScriptMQTTClient { 
    private _topic: String; 
    private _content: String; 
    private _qos: number; 
    private _broker: String; 
    private _clientId: String; 
    private _persistance: org.eclipse.paho.client.mqttv3.persist.MemoryPersistance; 
    private _client: org.eclipse.paho.client.mqttv3.MqttClient; 
    private _connectOptions: org.eclipse.paho.client.mqttv3.MqttConnectOptions; 

    constructor(topic: String, qos: number, broker: string, clientId: String) { 
        this._topic = topic; 
        this._qos = qos; 
        this._broker = broker; 
        this._clientId = clientId; 
        this._persistance = new org.eclipse.paho.client.mqttv3.persist.MemoryPersistance(); 
    } 

    connect() { 
        this._client = new org.eclipse.paho.client.mqttv3.MqttClient(this._broker, this._clientId, this._persistance); 
        this._connectOptions = new org.eclipse.paho.client.mqttv3.MqttConnectOptions(); 
        this._connectOptions.setCleanSession(true); 
        console.log("Connecting to the broker: " + this._broker); 
        this._client.connect(this._connectOptions); 
        console.log("Connected to the broker: " + this._broker); 
        console.log("Publishing message: Hello from NativeScript (Morné)"); 
        this._client.publish(this._topic, "Hello from NativeScript (Morné)"); 
        console.log("Published message: Hello from NativeScript (Morné)"); 
        console.log("Disconnecting from the broker: " + this._broker); 
        this._client.disconnect(); 
        console.log("Disconnected from the broker: " + this._broker); 
    } 
} 

And I have the following code in my main-page.ts file:

import {NativeScriptMQTTClient} from "nativescript-mqtt"; 

let client: NativeScriptMQTTClient = new NativeScriptMQTTClient("MQTT Examples", 2, "tcp://iot.eclipse.org:1883", "NativeScriptClient"); 
client.connect(); 

Any help would be greatly appreciated.

  • Have you included the library jar file (org.eclipse.paho.client.mqttv3-1.0.2.jar) in platforms/Android/libs in your plugin – Nick Iliev Apr 21 '16 at 11:52

1 Answers1

1

Based on MQTT api reference I have noticed the following

its MemoryPersistence and in your code is MemoryPersistance

this._persistance = new org.eclipse.paho.client.mqttv3.persist.MemoryPersistence();

Make sure you have included your .jar file in platforms/Android/libs (link to MQTT jar file v1.0.2)

Your package.json should look something like this (make sure you have mqtt.android.js file in the plugin transpiled if you code in TypeScript)

{
  "name": "nativescript-mqtt",
  "version": "0.0.3",
  "main": "mqtt.js",
  "nativescript": {
    "platforms": {
      "tns-android": {
        "version": "1.7.1"
      },
      "tns-ios": {
        "version": "1.7.0"
      }
    }
  }
}

also you should reffer to your plugin like

var mqttModule = require("nativescript-mqtt");

let client = new mqttModule.NativeScriptMQTTClient("MQTT Examples", 2, "tcp://test.mosquitto.org:1883", "NativeScriptClient");

At this point I am receiveing

JS: Connecting to the broker: tcp://test.mosquitto.org:1883

From that point on you should export your connect method with the proper d.ts file and logic. Hope that info will help you with you project!

Nick Iliev
  • 9,610
  • 3
  • 35
  • 89