Worklight-Paho MQTT Javascript:在Android设备上始终超时,并在模拟器中工作



我有一个Worklight项目,该项目使用Paho MQTT Javascript'mqttws31.js'。

在模拟器中,一切都很好,但当从设备连接时,它总是给我一个超时。

当我通过设备上名为"MyMQTT"的应用程序连接到代理时,它连接良好。我无法使用Javascript。

我测试了这个代码是否支持websocket-链接应用程序中的webview支持websocket,所以这不可能是问题所在。

我尝试了几个连接选项,但总是超时。

我需要添加一些Android权限吗?

我在下面添加了一个我尝试过的例子。

我使用的代理是HiveMQ,并且我在端口8000上启用了websocket支持。

我还试着连接到一个公共经纪人test.mosquitto.org",80但这给了我相同的结果(在模拟器中工作,而不是在设备上)。

请帮帮我!

我知道Cordova插件会比Javascript版本更好,但我找不到Cordova 3.1的Cordove MQTT插件。这可以帮助我。


var client = new Messaging.Client("192.168.137.2", 8000, "prototype2");
$(function() {
$("#publishBtn").click(function() {
publish("test", "prototype2/testpublish", 1);
});
var options = {
// connection attempt timeout in seconds
timeout : 5,
// Gets Called if the connection has successfully been established
onSuccess : function() {
$("#console").append(
'<br/>' + "Connected to MQTT Broker over Websockets.");
// client.subscribe("testtopic", {qos: 2});
client.subscribe("prototype3/testpublish");
},
// Gets Called if the connection could not be established
onFailure : function(message) {
$("#console").append(
'<br/>' + "Connection failed: " + message.errorMessage);
}
};
// Gets called whenever you receive a message for your subscriptions
client.onMessageArrived = function(message) {
var topic = message.destinationName;
var message = message.payloadString;
$("#console").append(
'<br/>' + 'Message arrived: Topic: ' + topic + ', Message: '
+ message);
};
// Attempt to connect
client.connect(options);

});

对于Android 4.3及更低版本,您需要一个cordova插件来提供WebSockets。有很多这样的功能,但大多数都没有实现MQTT(支持子协议和二进制消息)所需的功能

这样做的一个是:https://github.com/mkuklis/phonegap-websocket.有了这个插件,mqttws31.js在Android 4.3上运行良好。

目前在Worklight 6.1中安装标准Cordova 3插件存在问题,这意味着当您将插件添加到项目中时,您将不得不编辑Github上提供的JavaScript。编辑很简单,只需将:require()更改为:cordova.request()

我建议您使用Paho JS客户端的develop分支。

下面的代码是我为Eclipse IoT网站演示开发的;它在我的安卓手机上运行得很好(不过是4.4)

var client = new Messaging.Client("ws://iot.eclipse.org/ws", "clientId");
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;
client.connect({
onSuccess: onConnect
});
function onConnect() {
// Once a connection has been made, make a subscription and send a message.
console.log("onConnect");
client.subscribe("/fosdem/#");
};
function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0)
console.log("onConnectionLost:" + responseObject.errorMessage);
};
function onMessageArrived(message) {
console.log("onMessageArrived: "+message.destinationName +": " +message.payloadString);
// my stuff ...
};

最新更新