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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/// <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
}