一、中间件程序的职责:

1)对柜机提供soket长连接的服务器端,就是soket server。可提供上万的客户端同时连接。用来实时响应控制请求,中间件必须随时知道某个柜机的在线状态,外部请求时才能判断是否能够转发消息。

中间件监听的端口是5880,socket连接的协议是tcp/ip。目前没有加密,明文传输。

流程说明:

签到

柜机socket client发起连接请求,中间件socket接受连接之后,

柜机socket client先对中间件socket server发送消息(格式:“ bufferbox_sign_in”+“:”+设备号,如   bufferbox_sign_in:KDL36000001)

中间件程序把柜机KDL36000001显示为在线状态。

长连接中断后重连

柜机socket client和中间件socket server建立连接后是有定时发送心跳包的,

柜机socket client每过30秒检查和中间件socket serverd的连接状态,发起0字节的发包请求,如果发生异常则实际连接情况发生变化,

柜机socket client断开连接,重新尝试建立连接重新发起签到。

2)对外部暴露RESTful风格的api,供外部各种应用和程序调用,响应外部的http get/post请求。

api原型,.net webapi:

 [HttpGet]
/// <summary>
/// 储物柜取物开箱接口(取件)
/// </summary>
/// <param name="StationNo">设备唯一编号 设备不存在或者设备编号有误!</param>
/// <param name="CellNo">箱格编号</param>
/// <returns></returns>
public ApiActionResult BufferBox_Collect(string StationNo, string CellNo)
{
var result = new ApiActionResult()
{
Success = false,
Result = null,
Message = "操作失败。"
};
string msg = string.Empty;
using (var db = new BufferBoxDBEntities())
{
var stationEntity = db.station_signin_session.Where(st => st.SessionDict == StationNo).FirstOrDefault();
if (stationEntity == null)
{
result.Message = "设备不存在或者设备编号有误!";
result.Result = "";
return result;
}
#region API_Request_session
var requestEntity = new API_Request_session
{
API_Request_IP = Request.GetClientIpAddress(),
RequestID = Guid.NewGuid(),
RequestData = CellNo + "|Collect",
RequestDataTime = DateTime.Now,
ResultData = JsonConvert.SerializeObject(new CommandResultDTO { CellNo = CellNo, Action = "取件", ResultMessage = "中间件已转发,设备还未回复。" }),
ExecuteFlag = false,
StationNo = StationNo
};
db.API_Request_session.AddObject(requestEntity);
#endregion
db.SaveChanges();
//Com.DataCool.DotNetExpand.LogHelper.Info(JsonConvert.SerializeObject(requestEntity));
msg = "api_request:" + JsonConvert.SerializeObject(requestEntity);
result.Success = true;
result.Message = "设备已经受理请求。";
result.Result = requestEntity.RequestID.ToString();
}
if (!string.IsNullOrEmpty(msg))
{
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(conf.AppSettings.Settings["Middleware_IP"].Value), Convert.ToInt32(conf.AppSettings.Settings["Middleware_PORT"].Value)));
clientSocket.Send(Encoding.UTF8.GetBytes(msg));
}
catch { }
}
return result;
}

流程说明:

webapi响应外部的http get请求后,根据api的参数StationNo,CellNo获取到本次请求的设备和对应箱格。然后向中间件socket server发起一个socket client连接,建立连接后发送消息“api_request”+“:”+请求内容(后面附格式),中间件在内存上下文找到柜机socket client连接对象转发刚才的webapi发出的消息。柜机socket client收到中间件socket server的api_request消息 马上执行对控制板发送开锁指令。然后立即回复中间件socket server消息格式是“command_result”+“:”+处理过的请求内容(后面附格式) 中间件socket server收到消息将本次请求的结果修改为执行成功,这样完成了一次完整的操作

附请求内容json格式:

api_request:{"$id":"1","RequestID":"066a395a-486f-4e93-b782-fbf889e1d52f","Token":null,"RequestData":"11|Deposit","ResultData":"{\"CellNo\":\"\",\"ResultMessage\":\"中间件已转发,设备还未回复。\",\"Action\":\"存件\"}","RequestDataTime":"2016-07-16T12:00:53.9329622+08:00","ResultDataTime":null,"ExecuteFlag":false,"API_Request_IP":"183.70.83.165","StationNo":"SHYH24000001","EntityKey":{"$id":"2","EntitySetName":"API_Request_session","EntityContainerName":"BufferBoxDBEntities","EntityKeyValues":[{"Key":"RequestID","Type":"System.Guid","Value":"066a395a-486f-4e93-b782-fbf889e1d52f"}]}}

RequestID是每次外部请求的guid,代表每次请求的唯一请求编号,

RequestData是请求的实际内容

ResultData是另一个api要回复外部请求的内容

RequestDataTime是发起请求的时间

ResultDataTime是柜机客户端回应的时间

储物柜soket通信协议和中间件实现技术细节的更多相关文章

  1. SQLCONNECTION使用HTTP通信协议和中间件连接

    SQLCONNECTION支持TCP/IP和HTTP两种通信协议和中间件连接.一般地,默认情况下使用TCP/IP协议. HTTP 协议的一个非常重要的优势在于穿越防火墙. SQLCONNECTION使 ...

  2. service oriented architecture 构造分布式计算的应用程序的方法 面向服务的架构 分解技术

    zh.wikipedia.org/wiki/面向服务的架构 [程序功能做为服务] 面向服务的体系结构(英语:service-oriented architecture)是构造分布式計算的应用程序的方法 ...

  3. ASP.NET Core中间件(Middleware)实现WCF SOAP服务端解析

    ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因 ...

  4. 《大型网站系统与Java中间件实践》读书笔记

    分布式系统的基础知识 阿姆达尔定律 多线程交互模式 互不通信,没有交集,各自执行各自的任务和逻辑 基于共享容器(如队列)协同的多线程模式->生产者-消费者->队列 通过事件协同的多线程模式 ...

  5. 大型网站系统与Java中间件实践

    大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4 ...

  6. 简述移动端IM开发的那些坑:架构设计、通信协议和客户端

    1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...

  7. 中间件、MetaQ入门学习

    目录 . 中间件技术 . MetaQ中间件 . MetaQ编程实践 1. 中间件技术 0x1: 中间件简介 中间件(Middleware)是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的 ...

  8. ICE中间件说明文档

    ICE中间件说明文档 1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         ...

  9. mysql中间件研究(Atlas,cobar,TDDL)

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

随机推荐

  1. 最新 Windows 10 应用项目模板发布

    以下是最新的Visual Studio 2015 Windows 10 应用程序模板. Windows 10中几乎所有的官方应用都遵循这样一个设计模板:在左上方有一个所谓的导航栏.点击该导航按钮,左侧 ...

  2. duilib进阶教程 -- 改进窗口拖动 (12)

    现在大家应该都知道caption="0,0,0,32",是指示标题栏区了吧,如果想要整个窗口都能拖动呢? 那直接把高度改成和窗口一样不就得了~O(∩_∩)O~ 嗯,这样是可以,比如 ...

  3. 理解Certificate、App Id、Identifiers 和 Provisioning Profile

    做真机测试的时候,按照网上的流程,走通了,当时没有注意各种证书等的意思.现在做消息推送,需要各种证书.APP ID信息,为了更好的理解这个过程,所以整理了网上关于证书等的相关资料.方便自己和有需要的朋 ...

  4. MySql的基本操作以及以后开发经常使用的常用指令

    第一章:数据类型和操作数据表MySQL语句的规范(1):关键字与函数名称全部大写(2):数据库名称,表名称,字段名称全部小写(3):SQL语句必须以分号结尾 1:命令行模式启动mysql服务net s ...

  5. Leetcode 219 Contains Duplicate II STL

    找出是否存在nums[i]==nums[j],使得 j - i <=k 这是map的一个应用 class Solution { public: bool containsNearbyDuplic ...

  6. 题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)?

    题目一:一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米)? //一张纸的厚度大约是0.08mm,对折多少次之后能达到珠穆朗玛峰的高度(8848.13米 doub ...

  7. WebView上实现Java与JavaScript交互

    在安卓开发上,考虑到开发效率和界面更新,有时使用WebView结合web页面技术,可以快速迭代地开发移动应用.WebView加载资源的速度并不慢,但是如果资源多了,就很慢.图片.css.js.html ...

  8. Unity3D编程学习分享

    学习地址:http://www.ixueyun.com/lessons/detail-lessonId-692.html 一.课程概述: 以前大部分3D游戏出现在pc和ps.XBox等专业游戏主机上, ...

  9. NoteExpress 自定义参考文献输出样式

    最近在写硕士论文,样式中没有符合要求的,于是就自己来编辑下样式文件,下文是网上搜集的关于自定义参考文献的一篇教程,可以参考. 一.分隔符|和连接符*的使用 (1)连接符 * 主要作用是“建立依赖关系” ...

  10. chrome诡异的Provisional headers are shown

    昨天吐槽了cocos2d-js的问题,所以就准备调研几个其它HTML5引擎,发现PIXI性能极高,但是没有音频.而Phaser.js是在PIXI.js的基础之上进行的封装.而国内有一家公司,开发一个叫 ...