储物柜soket通信协议和中间件实现技术细节

一、中间件程序的职责:

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是柜机客户端回应的时间

时间: 2024-10-21 23:36:11

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

什么是中间件

1. 由来 因为工作的原因,我从金蝶集团调入金蝶中间件公司工作以来,经常遇到一个问题就是中间件公司是个什么公司,中间件是什么?,金蝶不是做ERP的吗?怎么也做中间件?.这是我以前在金蝶集团时无法想象的问题.因为金蝶,金蝶ERP的品牌以及大众对ERP的了解,是无需我解析什么是ERP,什么是财务软件一类的问题的. 毕竟,中间件在实际的应用过程中,是对应用软件起到支撑作用,最终用户并不直接使用中间件,中间件不是大众消费类软件产品.因此,除非是一个行业专业人士,一般不大可能与中间件打交道,不太了解什么是

浅谈中间件

浅谈中间件 1. 由来 因为工作的原因,我从金蝶集团调入金蝶中间件公司工作以来,经常遇到一个问题就是中间件公司是个什么公司,中间件是什么?,金蝶不是做ERP的吗?怎么也做中间件?.这是我以前在金蝶集团时无法想象的问题.因为金蝶,金蝶ERP的品牌以及大众对ERP的了解,是无需我解析什么是ERP,什么是财务软件一类的问题的. 毕竟,中间件在实际的应用过程中,是对应用软件起到支撑作用,最终用户并不直接使用中间件,中间件不是大众消费类软件产品.因此,除非是一个行业专业人士,一般不大可能与中间件打交道,不

ICE中间件说明文档

1       ICE中间件简介 2       平台核心功能 2.1        接口描述语言(Slice) 2.2        ICE运行时 2.2.1         通信器 2.2.2         对象适配器 2.2.3         位置透明性 2.3        异步编程模型 2.3.1         异步方法调用 2.3.2         异步方法分派 2.4        订阅/发布编程模型 2.5        动态服务管理(IceBox) 2.6       

JMS-消息中间件的应用01-基本概念-来自慕课学习-新手学习

什么是JMS? Java消息服务(Java Message Service),即JMS,是一个java平台中关于面向消息中间件的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信. 定义:JavaAPI 评价:JMS定义了JavaAPI 层面的标准:在Java体系中,多个client均可以通过JMS进行交互,不需要应用修改代码,但是其对跨平台的支持较差 什么是AMQP? AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层

数据库相关中间件介绍

数据库相关中间件介绍 详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt412 这里主要介绍互联网行业内有关数据库的相关中间件.数据库相关平台主要解决以下三个方面的问题: 为海量前台数据提供高性能.大容量.高可用性的访问 为数据变更的消费提供准实时的保障 高效的异地数据同步 应用层通过分表分库中间件访问数据库,包括读操作(Select)和写操作(update, insert和delete等,DDL, DCL).写操作会在数据

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

ASP.NET Core中间件(Middleware)进阶学习实现SOAP 解析. 本篇将介绍实现ASP.NET Core SOAP服务端解析,而不是ASP.NET Core整个WCF host. 因为WCF中不仅仅只是有SOAP, 它还包含很多如消息安全性,生成WSDL,双工信道,非HTTP传输等. ASP.NET Core 官方推荐大家使用RESTful Web API的解决方案提供网络服务. SOAP 即 Simple Object AccessProtocol 也就是简单对象访问协议.

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

mysql中间件研究(Atlas,cobar,TDDL) mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas,cobar,tddl,让我们看看它们各自有些什么优点和新特性吧. Atlas Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目.它是在mysql-proxy 0.8.2版本的基础

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

大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著   ISBN 978-7-121-22761-5 2014年4月出版 定价:65.00元 340页 16开 编辑推荐 到底是本什么书,拥有这样一份作序推荐人列表:阿里集团章文嵩博士|新浪TimYang|去哪网吴永强|丁香园冯大辉|蘑菇街岳旭强|途牛汤峥嵘|豆瓣洪强宁|淘宝陈皓/林昊-- 这本书出自淘宝技术部总监之手,他也是淘宝近10年来历次技术飞跃的参与者.贡

数据库(分库分表)中间件对比

转自:http://www.cnblogs.com/cangqiongbingchen/p/7094822.html 分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表呢,还是一张表.分区可以把表分到不同的硬盘上,但不能分配到不同服务器上. 优点:数据不存在多个副本,不必进行数据复制,性能更高. 缺点:分区策略必须经过充分考虑,避免多个分区之间的数