Android webview mqtt,ionic如何使用client MQTT – docoder

ionic中使用client mqtt及在使用中的遇到的问题

1.mqtt介绍

1.1.MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。通过MQTT协议,目前已经扩展出了数十个MQTT服务器端程序,可以通过PHP,JAVA,Python,C,C#等系统语言来向MQTT发送相关消息。

1.2.特点:MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

1.2.1使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;

1.2.2.对负载内容屏蔽的消息传输;

1.2.3.使用 TCP/IP 提供网络连接;

1.2.4.有三种消息发布服务质量:

(1).“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。

(2).“至少一次”,确保消息到达,但消息重复可能会发生。

(3).“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

1.2.5.小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

1.2.6.使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制;

1.3.官网:https://www.npmjs.com/package/mqtt

1.4.mqtt.js库:https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js

1.5.封装调用的anguler-mqtt.js库:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130(function execute() {

'use strict';

angular.module('angular.mqtt', [])

.provider('MQTT',function() {

//mqtt是全局变量

//monit分为三种状态

// connected

// disConnected

// connecting

var instance, scope = {};

var inited;

function initSth() {

if (inited)return;

inited =true;

instance.subscribe(scope.TOPIC_MONIT);

instance.on('error',function(err) {

console.error(err);

// instance.end();

});

instance.on('message',function(topic, payload) {

var data = JSON.parse(payload);

console.log("接收到消息----", data);

// var dataType = Object.prototype.toString.call(data);

// var isArray = dataType === '[object Array]';

// var isObject = dataType === '[object Object]';

if (topic === scope.TOPIC_MONIT) {

for (var indexin data) {

var currentStatus = data[index];

(scope.monitHandler || defaultMonitHandler)(index, currentStatus);

}

console.log("currentStatusOne--", JSON.stringify(currentStatus));

}

if (topic === scope.TOPIC_STATUS) {

for (var indexin data) {

var currentStatus = data[index];

(scope.statusHandler || defaultStatusHandler)(index, currentStatus);

}

console.log("currentStatusTwo--", JSON.stringify(data));

}

});

instance.on('connect',function() {

console.log('connected');

});

instance.on('reconnect',function() {

console.log('reconnected');

initSth();

});

instance.on('close',function() {

console.log('closed');

});

}

//

function defaultMonitHandler(robotIdentifer, toStatus) {

console.log('robot', robotIdentifer,'is', toStatus);

}

//

function defaultStatusHandler(address, value) {

console.log('the value on ', address,'is change to', value);

}

var holder = {

//先选择机器人

selectRobot:function(identifier) {

console.log("选中机器人---", identifier);

var OLD_TOPIC_STATUS = scope.TOPIC_STATUS;

var NEW_TOPIC_STATUS ='status/' + identifier;

scope.statusHandler =null;

scope.identifier = identifier;

scope.TOPIC_SET ='set/' + identifier;

scope.TOPIC_STATUS = NEW_TOPIC_STATUS;

if (OLD_TOPIC_STATUS && instance) {

console.log("unsubscribe----");

instance.unsubscribe(OLD_TOPIC_STATUS);

}

if (NEW_TOPIC_STATUS && instance) {

console.log("subscribe-----", NEW_TOPIC_STATUS);

instance.subscribe(NEW_TOPIC_STATUS);

}

},

//设置具体参数

setValue:function(address, value) {

var TOPIC_SET = scope.TOPIC_SET;

if (address && value) {

var payload = {

[address]: value

};

instance.publish(TOPIC_SET, JSON.stringify(payload));

}

},

//在rootscope或者其他位置调用

onMonitPop:function(handler) {

scope.monitHandler = handler;

},

onStatusPop:function(handler) {

scope.statusHandler = handler;

// console.log("接收到消息---", scope.statusHandler);

},

removeMonitPop:function() {

scope.monitHandler =null;

},

removeStatusPop:function() {

scope.statusHandler =null;

},

//登陆先注册

registClient:function(user, address) {

console.log("user--", JSON.stringify(user), address);

if (instance)return instance;

var defaultOptions = {

keepalive: 60,

reconnectPeriod: 1000,

clientId:'operator_' + user.id,

username: user.username,

password: user.password,

connectTimeout: 30 * 1000,

};

scope.TOPIC_MONIT ='monit/' + user.id;

instance = mqtt.connect(address, defaultOptions);

initSth();

return instance;

}

};

this.$get =function() {

return holder;

};

})

})();

1.6.在ionic 中mqtt.js 与封装的anguler-mqtt.js 引用:

(1).放到lib下:

159785950_1_20190426021331769.png

(2).在index.js文件中引用:

159785950_2_20190426021331879.png

(3).在controllers.js引用:

159785950_3_201904260213324.png

159785950_4_20190426021333660.png

2.mqtt具体使用:

2.1.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44(function execute() {

'use strict';

angular

.module('myApp', ['angular.mqtt'])

.controller('ctrl', ['$scope','MQTT',function($scope, MQTT) {

console.log(MQTT);

// 在登录成功以后,通过 用户名,密码,用户id来注册mqtt,

MQTT.registClient({

username:'ming',

password:'mima',

id: ABC//用户id

/**

* onMonitPop: 用于在【报警界面】注册监控事件

* @param robotId

* @param connectStatus:会有下列四种情况

*          connected: 刚刚连入

*          disConnected: 刚刚断开

*          connecting: 正处于连接状态

*          notConnecting: 尚未连接

*/

MQTT.onMonitPop(function(robotId, connectStatus) {

console.log('robot', robotId,'is', connectStatus);

});

// 在点击机器人的时候,选中查看实时信息的机器人  在选择机器人的前一个界面调用这句话

MQTT.selectRobot('AB01');

/* 下面两个方法,一定要在明确的选中的robot以后才可以调用 */

// 在列表设置界面,注册实时状态发生改变的监听

MQTT.onStatusPop(function(address, value) {

console.log('address:', address,'is change to', value);

});

//设置地址TD01的值为12.5

MQTT.setValue('TD01', 12.5);

//移除监控的事件

// MQTT.removeMonitPop();

//移除机器人状态事件

// MQTT.removeStatusPop();

}])

})();

$ cordova plugin add cordova-plugin-crosswalk-webview

(2).安装完成build

$ $ cordova build android

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值