|
@@ -25,6 +25,8 @@ App({ |
|
|
globalData: { |
|
|
globalData: { |
|
|
// token |
|
|
// token |
|
|
token: null, |
|
|
token: null, |
|
|
|
|
|
// user openId |
|
|
|
|
|
openId: null, |
|
|
// 渠道 |
|
|
// 渠道 |
|
|
sceneAddress: null, |
|
|
sceneAddress: null, |
|
|
// location info |
|
|
// location info |
|
@@ -41,6 +43,144 @@ App({ |
|
|
// 当前商场信息 |
|
|
// 当前商场信息 |
|
|
market: { |
|
|
market: { |
|
|
name: "陕西大悦城" |
|
|
name: "陕西大悦城" |
|
|
|
|
|
}, |
|
|
|
|
|
// websocket |
|
|
|
|
|
socketClient: null, |
|
|
|
|
|
socketReceiver: function (e) { }, //收到消息回调 |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 初始化websocket |
|
|
|
|
|
initSocket: function () { |
|
|
|
|
|
let that = this; |
|
|
|
|
|
// socket是否连接 |
|
|
|
|
|
let socketConnected = false; |
|
|
|
|
|
// 待发送的消息队列 |
|
|
|
|
|
let messageQueue = []; |
|
|
|
|
|
// 是否断线重连 |
|
|
|
|
|
let reconnect = true; |
|
|
|
|
|
|
|
|
|
|
|
// 发送消息 |
|
|
|
|
|
function sendSocketMessage(msg) { |
|
|
|
|
|
// console.log(msg); |
|
|
|
|
|
// 如果socket已连接则发送消息 |
|
|
|
|
|
if (socketConnected) { |
|
|
|
|
|
wx.sendSocketMessage({ |
|
|
|
|
|
data: msg |
|
|
|
|
|
}) |
|
|
|
|
|
} else { |
|
|
|
|
|
// socket没有连接将消息放入队列中 |
|
|
|
|
|
messageQueue.push(msg); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 关闭连接 |
|
|
|
|
|
function close() { |
|
|
|
|
|
if (socketConnected) { |
|
|
|
|
|
wx.closeSocket() |
|
|
|
|
|
socketConnected = false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 符合WebSocket定义的对象 |
|
|
|
|
|
var ws = { |
|
|
|
|
|
send: sendSocketMessage, |
|
|
|
|
|
close: close |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 创建一个 WebSocket 连接 |
|
|
|
|
|
function connect() { |
|
|
|
|
|
wx.connectSocket({ |
|
|
|
|
|
url: config.wsurl, |
|
|
|
|
|
header: { |
|
|
|
|
|
token: that.globalData.token //从服务端获取一个token,服务端验证token是否允许连接,案例中没做限制 |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
} |
|
|
|
|
|
connect(); |
|
|
|
|
|
|
|
|
|
|
|
// 监听 WebSocket 连接打开事件 |
|
|
|
|
|
wx.onSocketOpen(function (res) { |
|
|
|
|
|
console.log("WebSocket 连接成功") |
|
|
|
|
|
socketConnected = true; |
|
|
|
|
|
ws.onopen(); |
|
|
|
|
|
// 连接成功后,将队列中的消息发送出去 |
|
|
|
|
|
let queueLength = messageQueue.length |
|
|
|
|
|
for (let i = 0; i < queueLength; i++) { |
|
|
|
|
|
sendSocketMessage(messageQueue.shift()) |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
// 监听 WebSocket 接受到服务器的消息事件 |
|
|
|
|
|
wx.onSocketMessage(function (res) { |
|
|
|
|
|
ws.onmessage(res); |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
// 监听 WebSocket 错误事件 |
|
|
|
|
|
wx.onSocketError(function (res) { |
|
|
|
|
|
console.log("WebSocket 错误事件") |
|
|
|
|
|
if (!socketConnected) { |
|
|
|
|
|
// 断线重连 |
|
|
|
|
|
if (reconnect) { |
|
|
|
|
|
connect(); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
// 监听 WebSocket 连接关闭事件 |
|
|
|
|
|
wx.onSocketClose(function (res) { |
|
|
|
|
|
console.log("WebSocket 连接关闭") |
|
|
|
|
|
socketConnected = false; |
|
|
|
|
|
// 断线重连 |
|
|
|
|
|
if (reconnect) { |
|
|
|
|
|
connect(); |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
const Stomp = require('/utils/stomp.min.js').Stomp; |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 定期发送心跳或检测服务器心跳 |
|
|
|
|
|
* The heart-beating is using window.setInterval() to regularly send heart-beats and/or check server heart-beats. |
|
|
|
|
|
* 可看stomp.js的源码(195,207,489行),由于小程序没有window对象,所以我们要调用小程序的定时器api实现 |
|
|
|
|
|
*/ |
|
|
|
|
|
Stomp.setInterval = function (interval, f) { |
|
|
|
|
|
return setInterval(f, interval); |
|
|
|
|
|
}; |
|
|
|
|
|
// 结束定时器的循环调用 |
|
|
|
|
|
Stomp.clearInterval = function (id) { |
|
|
|
|
|
return clearInterval(id); |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const stompClient = Stomp.over(ws); |
|
|
|
|
|
|
|
|
|
|
|
that.globalData.socketClient = stompClient; |
|
|
|
|
|
|
|
|
|
|
|
stompClient.connect({}, function (callback) { |
|
|
|
|
|
|
|
|
|
|
|
// 订阅自己的 |
|
|
|
|
|
stompClient.subscribe('/user/'+that.globalData.openId+'/message', function (message, headers) { |
|
|
|
|
|
console.log('收到只发送给我的消息:', message); |
|
|
|
|
|
that.globalData.socketReceiver(JSON.parse(message.body)); |
|
|
|
|
|
// 通知服务端收到消息 |
|
|
|
|
|
message.ack(); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
stompClient.subscribe('/topic/1001A', function (message, headers) { |
|
|
|
|
|
console.log('收到TOPIC的消息:', message); |
|
|
|
|
|
that.globalData.socketReceiver(JSON.parse(message.body)); |
|
|
|
|
|
// 通知服务端收到消息 |
|
|
|
|
|
//message.ack(); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 向服务端发送消息 |
|
|
|
|
|
stompClient.send("/app/message", {}, JSON.stringify({ |
|
|
|
|
|
'msg': 'client: ' + that.globalData.openId |
|
|
|
|
|
})); |
|
|
|
|
|
}) |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
//统一发送消息 |
|
|
|
|
|
sendSocketMessage: function (msg) { |
|
|
|
|
|
this.globalData.socketClient.send("/app/message", {}, JSON.stringify(msg)); |
|
|
} |
|
|
} |
|
|
}); |
|
|
}); |