You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
5.5 KiB
JavaScript

2 months ago
/// <reference path="../Scripts/MicrosoftAjax.js" />
/// <reference path="reconnecting-websocket.min.js" />
/// <reference path="../Scripts/jquery.min.js" />
AndroidClient = function () {
var ServerUrl = "";
var websocket = null; //创建WebSocket对象
var SequenceID = 1;
var ListMessage = new Array();
var PrevTime = new Date();
var OutTime = 60; //心跳时间秒
var TimeHappenNumer = 3; //心跳可失败次数
var DeviceNo = "";
var EventHandler = new Sys.EventHandlerList();
//#region 启动监听
this.Start = function (Port, DevNo) {
DeviceNo = DevNo;
//ServerUrl = "ws://" + $.url.attr("host") + ":" + Port;
ServerUrl = "ws://192.168.1.157:" + Port;
SocketAccept();
OnStart();
}
//#endregion
//#region 连接
function SocketAccept() {
if (window.WebSocket) {
} else {
//$("#txtInput").val("不支持websocket");
try {
Android.StartWebSocket(ServerUrl, DeviceNo);
} catch (e) { }
return;
}
websocket = new ReconnectingWebSocket(ServerUrl, null, { debug: true, reconnectInterval: 5000 });; //创建WebSocket对象
websocket.debug = true;
websocket.timeoutInterval = 5400;
websocket.onopen = function (evt) {
//连接完成,发送登录消息
//$("#txtInput").val("连接成功");
//alert("连接成功");
SequenceID++;
if (SequenceID >= 9500) SequenceID = 1;
var SequenceID2 = PadLeft(SequenceID, 4);
var data = "FunNo=0001^DeviceNo=" + DeviceNo + "^SequenceID=" + SequenceID2;
websocket.send(data);
};
websocket.onclose = function () {
//$("#txtInput").val("连接失败");
//alert("连接关闭");
}
websocket.onmessage = function (evt) {
//收到服务器消息使用evt.data提取
//alert(evt.data);
this.PrevTime = new Date();
TreatMessage(evt.data);
};
}
//#ednregion
//#region 发送心跳
function OutTimeHappen() {
//var model = new Object();
//model.SequenceID = this.SequenceID;
//model.Data = "FunNo=0004^SequenceID=" + this.SequenceID;
//model.SendTime = new Date().addHours(-1);
//ListMessage.push(model);
//if (TimeHappenNumer <= 0)
//{
// TimeHappenNumer = 3;
// websocket.clone();
// //连接关闭30秒后重连
// window.setTimeout(SocketAccept, 30000);
// return;
//}
PrevTime = new Date();
SequenceID++;
if (SequenceID >= 9500) SequenceID = 1;
var SequenceID2 = PadLeft(SequenceID, 4);
var data = "FunNo=0004^SequenceID=" + SequenceID2;
websocket.send(data);
TimeHappenNumer--;
}
//#endregion
//#region 循环发送信息
function OnStart() {
if (websocket == null) return;
if (websocket.readyState != 1) {
window.setTimeout(OnStart, 2000);
return;
}
var cDate = new Date();
if (addSeconds(PrevTime, OutTime) < cDate) {
//如果超时未收发消息,那么发送必跳
OutTimeHappen();
window.setTimeout(OnStart, 1000);
return;
}
if (ListMessage.length == 0) {
window.setTimeout(OnStart, 1000);
return;
}
var model = ListMessage[0];
if (model.SendTime.addSeconds(5) > cDate) {
window.setTimeout(OnStart, 1000);
return;
}
model.SendTime = cDate;
websocket.send(model.Data);
window.setTimeout(OnStart, 1000);
}
//#endregion
//#region 复制日期
function cloneDate(cDate) {
var dt = new Date();
dt.setFullYear(cDate.getFullYear());
dt.setMonth(cDate.getMonth());
dt.setDate(cDate.getDate());
dt.setHours(cDate.getHours());
dt.setMinutes(cDate.getMinutes());
dt.setSeconds(cDate.getSeconds());
dt.setMilliseconds(cDate.getMilliseconds());
return dt;
}
//#endregion
//#region 增加秒
function addSeconds(dt, s) {
var dt2 = cloneDate(dt);
dt2.setSeconds(dt2.getSeconds() + s);
return dt2;
}
//#endregion
//#region 补位0
function PadLeft(num, n) {
return (Array(n).join(0) + num).slice(-n);
}
//#endregion
//#region 回复消息
function SendByte(FunNo, SequenceID2, Data) {
var data = "FunNo=" + FunNo + "^SequenceID=" + SequenceID2 + Data;
websocket.send(data);
}
//#endregion
//#region 处理消息
function TreatMessage(msg) {
var model = ParseData(msg); //从Global.js处得到的共享方法
switch (model.FunNo) {
case "0004": //心跳请求回复
TimeHappenNumer++;
break;
default:
SendByte(model.FunNo, model.SequenceID, "");
OnChangeState(model);
break;
}
}
//#endregion
//#region 状态改变时触发
this.ChangeState = function (handler) {
EventHandler.addHandler('ChangeState', handler);
}
//#endregion
//#region 点击状态改变时触发
function OnChangeState(model) {
var h = EventHandler.getHandler('ChangeState');
if (h) h(model);
}
//#endregion
}