Exemplo n.º 1
0
        public static TPKGHead CreateMessage(AsyncSocketConnection agent, IPacketData data)
        {
            TPKGHead ts = new TPKGHead()
            {
                Data      = data,
                Major_Ver = 1,
                Minor_Ver = 1,
                Term_Code = agent.TerminalId,
            };

            return(ts);
        }
Exemplo n.º 2
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as LoginPacketData;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));//给网关回复,0是正常,非0错误
            }
            var isOk = await db.GetCollection <CloudUser>()
                       .Where(o => o.cloud_code == packet.Cloud_Code && o.username == packet.Username &&
                              o.password == packet.Password).DoQuery().AnyAsync();

            if (isOk)
            {
                agent.SetNewSessionId();
                agent.IsAuthenticated = true;

                await db.GetCollection <Gateway>()
                .Where(o => o.GatewayID == agent.TerminalId)
                .UpdateOneAsync(Builders <Gateway> .Update
                                .Set(o => o.app_user_id, packet.AppUserID)
                                .Set(o => o.last_updated, DateTime.Now)
                                .Set(o => o.ip, agent.RemoteEndPoint.Address.ToString())
                                //.Set(o => o.mac, string.Join(":", msg.MAC_Addr.Select(o => o.ToString("X2"))))
                                .Set(o => o.port, agent.RemoteEndPoint.Port)
                                );
            }
            //else
            //{
            //    var u = new CloudUser()
            //    {
            //        cloud_code = packet.Cloud_Code,
            //        username = packet.Username,
            //        password = packet.Password
            //    };
            //    db.Add(u);
            //}
            log.Info($"网关登录:{ packet.ToJson()} , 结果:{isOk}");
            await SendCommonResponseMessageAsync(agent, msg, isOk? 0 : 2); //回复登录是否正确,0:正确,2:登录验证错误

            var data2 = new SensorNetwork.Protocol.Packet.PQRY.BBasePacketData()
            {
                Param = new SensorNetwork.Protocol.Packet.Params.BaseParam()
                {
                    Addr_Desc = "地址",
                    Term_Code = msg.Term_Code,
                    Term_Desc = "测试设备",
                }
            };
            var ts = CreateResponseMessage(msg, data2);//给网关下发测试包

            return(agent.SendAsync(ts));
        }
Exemplo n.º 3
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as BasePacketData <TParam>;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));
            }

            log.Info($"收到设备参数包:{ packet.ToJson()}");

            db.GetCollection <Terminal>().UpdateOne(Builders <Terminal> .Filter.Where(o => o.deviceid == agent.TerminalId),
                                                    Builders <Terminal> .Update.Set(((ServiceCode)Serv_Code).ToString(), packet.Param), new UpdateOptions()
            {
                IsUpsert = true
            });
            return(await SendCommonResponseMessageAsync(agent, msg, 0));
        }
Exemplo n.º 4
0
        public static bool SendCommonResponseMessage(AsyncSocketConnection agent, TPKGHead msg, int error_code)
        {
            var data = new CommonPacketData()
            {
                ErrorCode      = error_code,
                Serv_Code_Resp = msg.Serv_Code,
                Serv_Type_Resp = msg.Serv_Type
            };

            TPKGHead ts = new TPKGHead()
            {
                Data      = data,
                Major_Ver = 1,
                Minor_Ver = 1,
                Term_Code = agent.TerminalId,
            };

            return(agent.SendAsync(ts));
        }
Exemplo n.º 5
0
        public async Task <bool> SendingData(AsyncSocketConnection agent, TPKGHead msg, string gatewayid, JObject json)
        {
            var query = db.GetCollection <Gateway>().Where(o => o.GatewayID == gatewayid).DoQuery().FirstOrDefault();//根据网关ID查找应用云平台代码

            if (query != null)
            {
                string ApplyCloudPlatformCode = query.ApplyCloudPlatformCode;
                var    query2 = db.GetCollection <ApplyCloudPlatform>().Where(o => o.PlatformCode == ApplyCloudPlatformCode).DoQuery().FirstOrDefault();//根据应用云平台代码查找数据发送地址
                if (query2 != null)
                {
                    string   httpInterface = query2.HTTPInterface;
                    string[] sArray        = httpInterface.Split(';');
                    foreach (string i in sArray)
                    {
                        log.Info($"数据发送地址:{ i.ToString()}");
                        var result = await client.PostAsJsonAsync(i.ToString(), json);//发送数据
                    }
                }
            }
            return(await SendCommonResponseMessageAsync(agent, msg, 0));//给网关回复0,说明正常
        }
Exemplo n.º 6
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as QRYONLINEBTPacketData;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));
            }

            log.Info($"(QRYONLINEBT)5.4.8 已连接的蓝牙设备列表数据包:{ packet.ToJson()}");
            //to do 需要根据gatewayid去数据库里查找其对应的应用云平台接口地址
            //WaitCallback ac = async (xx) =>
            //{
            //    //1.通过http POST给应用云平台
            //    var json = JsonConvert.SerializeObject(packet);
            //    var result = await client.PostAsJsonAsync("http://120.25.159.86/api/Sensor/PostGatewaySensorPacket", packet);
            //    //if (result.IsSuccessStatusCode && (await result.Content.ReadAsStringAsync()).Contains("'status':false,"))
            //    //{
            //    //    //2.通过ZMQ 发送给应用云平台 -
            //    //    SensorNetwork.Common.ZeroMQ.ZMQRequest("tcp://120.25.159.86:6789", JsonConvert.SerializeObject(packet));
            //    //}

            //    log.Info(packet.ToJson());
            //};
            //System.Threading.ThreadPool.QueueUserWorkItem(ac, null);



            //var d = new SensorStateLog()
            //{
            //    equipid = packet.Equip_Id,
            //    gatewayid = agent.TerminalId,
            //    data = packet.Data / 10.0,
            //    type = packet.Type,
            //    created = DateTime.Now,
            //};
            //await db.AddAsync(d);
            return(await SendCommonResponseMessageAsync(agent, msg, 0));
        }
Exemplo n.º 7
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as REGBTPacketData;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));
            }

            log.Info($"收到蓝牙设备(主动上报)注册包:{ packet.ToJson()}");

            var d = new SensorStateLog()
            {
                equipid     = packet.Equip_Id,
                gatewayid   = agent.TerminalId,
                humidity    = packet.Humidity / 10.0,
                temperature = packet.Temperature / 10.0,
                created     = DateTime.Now,
            };
            await db.AddAsync(d);

            return(await SendCommonResponseMessageAsync(agent, msg, 0));
        }
Exemplo n.º 8
0
        public static async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead message)
        {
            if (message == null)
            {
                return(false);
            }
            int count = 0;
            //if (message.Data is ITerminalResponse)
            //{
            //    var data = message.Data as ITerminalResponse;
            //    Framework.Instance.TerminalCommandLogger.AddRepliedMessage(message, data.ResponsePacketIndex, (int)TerminalResponseResult.Success);
            //    count++;
            //    Framework.Instance.FireWaitHandle(message.SimId, data.ResponsePacketIndex, message.Data);
            //}
            //else if (message.Data is JT_8003)
            //{
            //    var data = message.Data as JT_8003;
            //    var r = Framework.Instance.FireWaitHandle(message.SimId, data.OriginalPacketIndex, data);
            //    if (r) //已被处理
            //        return true;
            //}

            var q = processors.Where(o => o.Serv_Code == message.Serv_Code && o.Serv_Type == message.Serv_Type).FirstOrDefault();

            if (q == null)
            {
                log.WarnFormat("Unhandled packet type: {0:X4}, {1:X4}", (int)message.Serv_Type, message.Serv_Code);
                return(false);
            }

            foreach (var v in q.Processors)
            {
                count += await v.DoProcess(agent, message) ? 1 : 0;
            }
            return(count > 0);
        }
Exemplo n.º 9
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as SensPacketData;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));
            }

            log.Info($"(Sens)收到设备状态包:{ packet.ToJson()}");
            //to do 需要根据gatewayid去数据库里查找其对应的应用云平台接口地址
            WaitCallback ac = async(xx) =>
            {
                //1.通过http POST给应用云平台
                //var json = JsonConvert.SerializeObject(packet);
                //var result = await client.PostAsJsonAsync("http://120.25.159.86/api/Sensor/PostGatewaySensorPacket", packet);
                //构造Json数据包
                JObject json = new JObject();
                json.Add(new JProperty("Success", true));
                json.Add(new JProperty("Code", 1));
                json.Add(new JProperty("Type", "02"));//网关内部传感器数据
                json.Add(new JProperty("GatewayID", packet.Equip_Id));
                json.Add(new JProperty("UID", packet.Equip_Id));

                JArray  array = new JArray();
                JObject jo    = new JObject();
                jo.Add(new JProperty("TestResult", packet.Data));
                jo.Add(new JProperty("TestResultDesc", packet.Type)); //
                array.Add(jo);
                json.Add("Result", array);
                json.Add(new JProperty("TestTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));

                //发送数据
                DataSending send = new DataSending();
                await send.SendingData(agent, msg, packet.Equip_Id, json);

                /*              var query = db.GetCollection<Gateway>().Where(o => o.GatewayID == packet.Equip_Id).DoQuery().FirstOrDefault();//根据网关ID查找应用云平台代码
                 *            if (query != null)
                 *            {
                 *                string ApplyCloudPlatformCode = query.ApplyCloudPlatformCode;
                 *                var query2 = db.GetCollection<ApplyCloudPlatform>().Where(o => o.PlatformCode == ApplyCloudPlatformCode).DoQuery().FirstOrDefault();//根据应用云平台代码查找数据发送地址
                 *                if (query2 != null)
                 *                {
                 *                    string httpInterface = query2.HTTPInterface;
                 *                    string[] sArray = httpInterface.Split(';');
                 *                    foreach (string i in sArray)
                 *                    {
                 *                        log.Info($"数据发送地址:{ i.ToString()}");
                 *                        var result = await client.PostAsJsonAsync(i.ToString(), packet);//发送数据
                 *
                 *                    }
                 *                }
                 *
                 *            }*/



                //if (result.IsSuccessStatusCode && (await result.Content.ReadAsStringAsync()).Contains("'status':false,"))
                //{
                //    //2.通过ZMQ 发送给应用云平台 -
                //    SensorNetwork.Common.ZeroMQ.ZMQRequest("tcp://120.25.159.86:6789", JsonConvert.SerializeObject(packet));
                //}

                log.Info(packet.ToJson());
            };

            System.Threading.ThreadPool.QueueUserWorkItem(ac, null);



            var d = new SensorStateLog()
            {
                equipid   = packet.Equip_Id,
                gatewayid = agent.TerminalId,
                data      = packet.Data / 10.0,
                type      = packet.Type,
                created   = DateTime.Now,
            };
            await db.AddAsync(d);

            return(await SendCommonResponseMessageAsync(agent, msg, 0));
        }
Exemplo n.º 10
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as EXTSENSPacketData;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));//给网关回复1,说明不正常
            }
            log.Info($"(EXTSENS)收到设备状态包(16进制):{ packet.ToBytes().ToHexString()}");
            log.Info($"(EXTSENS)收到设备状态包:{ packet.ToJson()}");
            Console.WriteLine($"(EXTSENS)收到设备状态包:{ packet.ToJson()}");
            //TODO:
            var gatewayid = agent.TerminalId;

            string strUID         = packet.Equip_UID; ////外接蓝牙设备UID
            string strUIDPrefix16 = "";               //UID前16位,一共24位,去掉后面的8位是序号,前16号相同的协议也相同

            if (strUID.Length > 15)
            {
                strUIDPrefix16 = strUID.Substring(0, 16); //根据此16位去库中查去获取数据位置
            }
            int    iLenData    = packet.DataLength;       //外接蓝牙设备协议总字节数量
            string strProtocol = packet.Data.ToUpper();   //外接蓝牙设备协议

            if (!string.IsNullOrEmpty(strProtocol))
            {
                #region 将蓝牙设备数据传递给应用云平台
                //var gatewayid = msg.Term_Code; //两种方式
                // to do 需要根据gatewayid去数据库里查找其对应的应用云平台接口地址
                WaitCallback ac = async(xx) =>
                {
                    BluetoothDeviceData obj = null;
                    #region   诺血糖仪数据包
                    //三诺蓝牙设备数据包:{ "UID" : "AATJ00017000310000000002", "TestResult1" : 5.9, "TestResult1Desc" : "BloodSugar", "TestResult2" : 20.2, "TestResult2Desc" : "Temperature", "TestResult3" : -1.0, "TestResult3Desc" : "", "TestResult4" : -1.0, "TestResult4Desc" : "", "TestResult5" : -1.0, "TestResult5Desc" : "", "TestTime" : "2016-10-25 09:45:49" }
                    // 53 4E 10 00 04 04 0E 04 16 10 37 01 01 0C 00 00 E1 00 76
                    // 53 4E 0E 00 04 04 0F 06 11 13 28 00 2E 00 01 41 E7  缺少了秒和校正码
                    if (strProtocol.Length == 34 && strProtocol.Substring(0, 4) == "534E")
                    {
                        //                    测试结果为26.8mmol / L,时间为14年4月22日16点55分;则发送的数据为:53 4E    10    00 04   04 0E 04 16 10 37  01 01 0C 00 00 E1 00 76
                        //其中“0X53  4E ”数据包头;“0X10” 数据长度,从本字节后开始计算;“0X00  04”     机器代码;  “0X04”         结果命令;   “0x0E”         14年;
                        //“0X04”         4月;“0X16”         22日;“0X10”         16点;“0X37”         55分;“0X01”         01秒;“0X01 0C”      表示234,此数据除以10即为23.4mmol / L;
                        //“0x00”          样本类型;“00 E1”        表示225,此数据除以10即为22.5℃;“0x00”          校正码;“0X76”         为校验码,和校验,包含长度,高字节丢掉;
                        if (strProtocol.Substring(10, 2) == "04")    //命令字:ox04  读取当前结果
                        {
                            string strV1Hex = strProtocol.Substring(22, 4);
                            string strV2Hex = strProtocol.Substring(28, 4);
                            obj                 = new BluetoothDeviceData();
                            obj.UID             = strUID;
                            obj.TestResult1     = SensorNetwork.Common.RadixConverter.HexStrToInt32(strV1Hex) / 10.0;
                            obj.TestResult1Desc = "BloodSugar";
                            obj.TestResult2     = SensorNetwork.Common.RadixConverter.HexStrToInt32(strV2Hex) / 10.0;
                            obj.TestResult2Desc = "Temperature";
                            obj.TestResult3     = obj.TestResult4 = obj.TestResult5 = -1;
                            obj.TestResult3Desc = obj.TestResult4Desc = obj.TestResult5Desc = "";
                            obj.TestTime        = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            log.Info($"三诺蓝牙设备数据包:{ obj.ToJson()}");
                        }
                    }
                    #endregion
                    #region   开血压仪数据包
                    //  三开血压仪数据包:{ "UID" : "ABTJ00017000110000000001", "TestResult1" : 122.0, "TestResult1Desc" : "BloodPressureSystolic", "TestResult2" : 75.0, "TestResult2Desc" : "BloodPressureDiastolic", "TestResult3" : 95.0, "TestResult3Desc" : "Pulse", "TestResult4" : -1.0, "TestResult4Desc" : "", "TestResult5" : -1.0, "TestResult5Desc" : "", "TestTime" : "2016-10-26 10:19:55" }
                    if (strProtocol.Length == 40 && strProtocol.Substring(0, 4) == "AA80")
                    {
                        //AA 80 02 08 01 05 00 00 00 00 37 00 39  //中间结果,实时数据
                        //最终结果AA 80 02 0f 01 06 01 12 09 13 12 01 20 00 76 00 45 00 3f 3c  ,00 76 00 45 00 3f中00 76、00 45、00 03f分别对应收缩压、舒张压、脉搏
                        //        AA 80 02 0F 01 06 01 12 09 18 17 2C 18 00 7A 00 4B 00 5F 45
                        if (strProtocol.Substring(6, 6) == "0F0106")
                        {
                            string strV1Hex = strProtocol.Substring(26, 4);
                            string strV2Hex = strProtocol.Substring(30, 4);
                            string strV3Hex = strProtocol.Substring(34, 4);
                            obj                 = new BluetoothDeviceData();
                            obj.UID             = strUID;
                            obj.TestResult1     = SensorNetwork.Common.RadixConverter.HexStrToInt32(strV1Hex) / 1.0;
                            obj.TestResult1Desc = "BloodPressureSystolic";  //收缩压
                            obj.TestResult2     = SensorNetwork.Common.RadixConverter.HexStrToInt32(strV2Hex) / 1.0;
                            obj.TestResult2Desc = "BloodPressureDiastolic"; //舒张压
                            obj.TestResult3     = SensorNetwork.Common.RadixConverter.HexStrToInt32(strV3Hex) / 1.0;
                            obj.TestResult3Desc = "Pulse";                  //脉搏
                            obj.TestResult4     = obj.TestResult5 = -1;
                            obj.TestResult4Desc = obj.TestResult5Desc = "";
                            obj.TestTime        = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                            log.Info($"三开血压仪数据包:{ obj.ToJson()}");
                        }
                    }
                    #endregion

                    if (obj != null)
                    {
                        //1.通过http POST给应用云平台
                        var json   = JsonConvert.SerializeObject(obj);
                        var result = await client.PostAsJsonAsync("http://120.25.159.86/api/Sensor/PostBluetoothPacket", obj);

                        //if (result.IsSuccessStatusCode && (await result.Content.ReadAsStringAsync()).Contains("'status':false,"))
                        //{
                        //    //2.通过ZMQ 发送给应用云平台 -
                        //    SensorNetwork.Common.ZeroMQ.ZMQRequest("tcp://120.25.159.86:6789", JsonConvert.SerializeObject(packet));
                        //}

                        log.Info($"发送到应用云平台的蓝牙设备JSON数据:{ obj.ToJson()}");

                        var d = new BluetoothSensorLog()
                        {
                            GatewayID       = agent.TerminalId,
                            UID             = obj.UID,
                            TestResult1     = obj.TestResult1,
                            TestResult1Desc = obj.TestResult1Desc,
                            TestResult2     = obj.TestResult2,
                            TestResult2Desc = obj.TestResult2Desc,
                            TestResult3     = obj.TestResult3,
                            TestResult3Desc = obj.TestResult3Desc,
                            TestResult4     = obj.TestResult4,
                            TestResult4Desc = obj.TestResult4Desc,
                            TestResult5     = obj.TestResult5,
                            TestResult5Desc = obj.TestResult5Desc,
                            Created         = DateTime.Now,
                        };
                        await db.AddAsync(d);
                    }
                };    //end    WaitCallback ac = async (xx) =>
                System.Threading.ThreadPool.QueueUserWorkItem(ac, null);

                #endregion
            } //end   if (!string.IsNullOrEmpty(strProtocol))

            return(await SendCommonResponseMessageAsync(agent, msg, 0));//给网关回复0,说明正常
        }
Exemplo n.º 11
0
 public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
 {
     return(SendCommonResponseMessage(agent, msg, 0));
 }
Exemplo n.º 12
0
 public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
 {
     //网关离线时候操作,写入日志,短信报警
     return(true);
 }
        /// <summary>
        /// 开始接收网关上传的数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void socketServer_OnDataReceived(object sender, ReceivedEventArgs <byte[]> e)
        {
            AsyncSocketConnection conn = (AsyncSocketConnection)sender;
            TPKGHead packet            = new TPKGHead();
            bool     isOk = false;

            try
            {
                isOk = packet.Parse(e.Data);//解析收到的数据包
                log.Info($"SensorNetwork.Server.Management.Framework中接收的包,Serv_Type:" + packet.Serv_Type + ",Serv_Code:" + packet.Serv_Code + "包数据域Data:\r\n{" + packet.Data.ToBytes().ToHexString() + "}");
                if (isOk == false)
                {
                    log.Error($"包解析错误:\r\n{BitConverter.ToString(e.Data).Replace("-", " ")}");
                }
                else
                {
                    log.Info($"包解析成功(16进制):\r\n{BitConverter.ToString(e.Data).Replace("-", " ")}");
                    log.Info($"包数据域:\r\n{packet.Data.ToString()}");
                }

                bool isNew = isOk && string.IsNullOrWhiteSpace(conn.TerminalId) && string.IsNullOrWhiteSpace(packet.Term_Code) == false;
                if (isNew)
                {
                    AddLog(packet.Term_Code, "设备已连接。");
                }
                if (string.IsNullOrWhiteSpace(packet.Term_Code) == false)
                {
                    conn.TerminalId             = packet.Term_Code;
                    lastAlive[packet.Term_Code] = Tuple.Create(conn.Token, DateTime.Now);
                    //if (conn.Protocol == null)
                    //    conn.Protocol = ProtocolManager.Find(packet.Term_Code);
                    var s = Newtonsoft.Json.JsonConvert.SerializeObject(packet.Data);
                    AddLog(packet.Term_Code, packet.Data, "收到数据包:Data:{0}", packet.Data.ToString());
                }
                Interlocked.Increment(ref receivedMessageCount);
                conn.LastAlive = DateTime.Now;//更新连接的最后活动时间
                //else
                //{
                //    var json = Newtonsoft.Json.JsonConvert.SerializeObject(packet.Data, Newtonsoft.Json.Formatting.Indented);
                //    log.DebugFormat("{0}\nMACID: {1}\n{2}", packet., packet.Id, json);
                //}


                if (isOk)                                         //如果解析成功
                {
                    ackQueue.Enqueue(Tuple.Create(conn, packet)); //将接收到的数据包放到队列中
                    if (isNew)                                    //如果是一条新的连接,则创建一条新的连接写入DB中
                    {
                        newConnections.Enqueue(new TerminalConnectionLog()
                        {
                            id           = conn.Token,//guid
                            connected    = conn.Created,
                            ipaddress    = conn.RemoteEndPoint.ToString(),
                            server_id    = ServerId,
                            terminal_id  = conn.TerminalId,
                            disconnected = conn.Created,
                        });
                        conn.Closed += AsyncSocketConnection_Closed;
                        log.DebugFormat("new client: {0}", conn.TerminalId);
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error($"包解析/处理异常:\r\n{BitConverter.ToString(e.Data).Replace("-", " ")}");
                log.Error(ex);
            }
        }
Exemplo n.º 14
0
 public static async Task <bool> SendCommonResponseMessageAsync(AsyncSocketConnection agent, TPKGHead msg, int error_code)
 {
     return(await Task.FromResult(SendCommonResponseMessage(agent, msg, error_code)));
 }
Exemplo n.º 15
0
        public async Task <bool> DoProcess(AsyncSocketConnection agent, TPKGHead msg)
        {
            var packet = msg.Data as EXTSENSPacketData;

            if (packet == null)
            {
                return(await SendCommonResponseMessageAsync(agent, msg, 1));//给网关回复1,说明不正常
            }
            log.Info($"(EXTSENS)收到设备状态包(16进制):{ packet.ToBytes().ToHexString()}");
            log.Info($"(EXTSENS)收到设备状态包:{ packet.ToJson()}");
            Console.WriteLine($"(EXTSENS)收到设备状态包:{ packet.ToJson()}");
            //TODO:
            var gatewayid = agent.TerminalId;

            string strUID = packet.Equip_UID;////外接蓝牙设备UID

            log.Info($"外接蓝牙设备数据包UID={ strUID}");
            string strUIDPrefix16 = "";//UID前16位,一共24位,去掉后面的8位是序号,前16号相同的协议也相同

            if (strUID.Length > 15)
            {
                strUIDPrefix16 = strUID.Substring(0, 16); //根据此16位去库中查去获取数据位置.SortByDescending(o => o.Created)
                //var query = db.GetCollection<ProtocolResolveRule>().Where(o => o.UIDPrefix == strUIDPrefix16).DoQuery().FirstOrDefault();
                //var query = db.GetCollection<SendStructure>().Where(o => o.UID_16 == strUIDPrefix16 && o.IsDataArea == "1").DoQuery().ToList();//查询出数据部分协议

                int    iLenData    = packet.DataLength;     //外接蓝牙设备协议总字节数量
                string strProtocol = packet.Data.ToUpper(); //外接蓝牙设备协议 (蓝牙设备数据)
                                                            //if (query != null && !string.IsNullOrEmpty(strProtocol))

                #region 查询协议长度是否相等,若有多条长度相同,则判断命令字
                var query0 = db.GetCollection <SendStructure2>().Where(o => o.UID_16 == strUIDPrefix16).DoQuery().ToList(); //查询出数据部分协议
                if (query0.Count() > 0 && !string.IsNullOrEmpty(strProtocol))                                               //有协议
                {
                    List <String> listItem = new List <string>();
                    foreach (var item in query0)
                    {
                        string StructName = item.StructName;
                        if (!listItem.Contains(StructName))
                        {
                            listItem.Add(StructName);
                        }
                    }
                    if (listItem.Count == 1)//只有一条协议
                    {
                        //取协议解析数据
                        DecodeData(strUIDPrefix16, listItem[0], gatewayid, strUID, strProtocol, agent, msg);
                    }
                    else
                    {
                        for (int i = 0; i < listItem.Count; i++)
                        {
                            var query1 = db.GetCollection <SendStructure2>().Where(o => o.UID_16 == strUIDPrefix16 && o.StructName == listItem[i]).DoQuery().FirstOrDefault();                     //查询出数据部分协议
                            if (query1 != null && Convert.ToInt32(query1.Length) == iLenData)                                                                                                      //长度相等,则取命令字
                            {
                                var query2 = db.GetCollection <SendStructure2>().Where(o => o.UID_16 == strUIDPrefix16 && o.StructName == listItem[i] && o.DataAreaDec == "2").DoQuery().ToList(); //查询出数据部分协议
                                if (query2 != null && query2.Count() > 0)
                                {
                                    int count = 0;
                                    foreach (var q in query2)//一条协议中会出现多个命令字的情况
                                    {
                                        //判断命令字
                                        int    OderiPos1 = Convert.ToInt32(q.LocationBegin + "");
                                        int    OderiPos2 = Convert.ToInt32(q.LocationEnd + "");
                                        string Oder;
                                        if (q.LocationEnd == -1)
                                        {
                                            Oder = strProtocol.Substring((OderiPos1 - 1) * 2, 2);//得到16进制值,数据段的值
                                        }
                                        else
                                        {
                                            Oder = strProtocol.Substring((OderiPos1 - 1) * 2, 2 * (OderiPos2 - OderiPos1) + 2);//得到16进制值,数据段的值
                                        }
                                        string OrderCode = q.OrderCode;
                                        OrderCode = OrderCode.Replace(" ", ""); //去掉空格
                                        if (Oder == OrderCode)                  //命令字相同
                                        {
                                            count++;
                                        }
                                    }
                                    if (query2.Count() == count)//所有命令字相同
                                    {
                                        DecodeData(strUIDPrefix16, listItem[i], gatewayid, strUID, strProtocol, agent, msg);
                                        break;
                                    }
                                }
                                else//无命令字,长度相同(只允许一个相等,需要做判断)
                                {
                                    DecodeData(strUIDPrefix16, listItem[i], gatewayid, strUID, strProtocol, agent, msg);
                                    break;
                                }
                            }
                        }
                    }
                }    //end   if (!string.IsNullOrEmpty(strProtocol))
                else //无协议
                {
                    //未找到解析规则,直接将数据包转发
                    JObject json = new JObject(
                        new JProperty("Success", true),
                        new JProperty("Type", "02"),
                        new JProperty("GatewayID", gatewayid),
                        new JProperty("UID", strUID),
                        new JProperty("Result", strProtocol),
                        new JProperty("TestTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
                        );
                    //第二种构造Json方法
                    dynamic json2 = new System.Dynamic.ExpandoObject();
                    json2.Success   = true;
                    json2.Type      = "02";
                    json2.GatewayID = gatewayid;
                    json2.UID       = strUID;
                    json2.Result    = strProtocol;
                    json2.TestTime  = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    string s2 = Newtonsoft.Json.JsonConvert.SerializeObject(json2);//使用第二种Json构造方式,存入数据库
                    //此处要加发送和保存到数据库的代码
                    WaitCallback ac = async(xx) =>
                    {
                        //发送数据
                        DataSending send = new DataSending();
                        await send.SendingData(agent, msg, gatewayid, json);

                        //var result = await client.PostAsJsonAsync("http://120.25.159.86/api/Sensor/PostBluetoothPacket", json);
                        //log.Info($"发送到应用云平台的蓝牙设备JSON数据:{ json}");

                        //以下部分要重新写代码入数据库
                        var d = new BluetoothSensorLog()
                        {
                            GatewayID = agent.TerminalId,
                            UID       = strUID,
                            Json      = s2,
                            Created   = DateTime.Now,
                        };
                        await db.AddAsync(d);
                    };//end    WaitCallback ac = async (xx) =>
                    System.Threading.ThreadPool.QueueUserWorkItem(ac, null);


                    log.Info($"根据UID前16位从tProtocolResolveRule中没有查询到解析规则或者外接蓝牙设备协议为空。UID={ strUID},JSON={json}");
                }

                #endregion
            }
            else
            {
                log.Info($"外接蓝牙设备数据包UID长度不足16位。UID={ strUID}");
                //设备UID错误
                JObject json = new JObject(
                    new JProperty("Success", false),
                    new JProperty("Result", "错误"),
                    new JProperty("TestTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
                    );
                //第二种构造Json方法
                dynamic json2 = new System.Dynamic.ExpandoObject();
                json2.Success  = false;
                json2.Result   = "错误";
                json2.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                string s2 = Newtonsoft.Json.JsonConvert.SerializeObject(json2);//使用第二种Json构造方式,存入数据库
                //此处要加发送
                WaitCallback ac = async(xx) =>
                {
                    //发送数据
                    DataSending send = new DataSending();
                    await send.SendingData(agent, msg, gatewayid, json);

                    //var result = await client.PostAsJsonAsync("http://120.25.159.86/api/Sensor/PostBluetoothPacket", json);
                    //var result = await client.PostAsJsonAsync("http://120.25.159.86/api/Sensor/PostBluetoothPacket", json);//联桥网云应用云平台
                    //var result1 = await client.PostAsJsonAsync("http://202.91.226.221:8088/api/Sensor/PostSenorData", json);//杭州大数据平台
                    //var result2 = await client.PostAsJsonAsync("http://202.91.226.221/api/Sensor/PostSenorData", json);//杭州大数据平台
                    //log.Info($"发送到应用云平台的蓝牙设备JSON数据:{ json}");
                    //以下部分要重新写代码入数据库
                    var d = new BluetoothSensorLog()
                    {
                        GatewayID = agent.TerminalId,
                        UID       = strUID,
                        Json      = s2,
                        Created   = DateTime.Now,
                    };
                    await db.AddAsync(d);
                };//end    WaitCallback ac = async (xx) =>
                System.Threading.ThreadPool.QueueUserWorkItem(ac, null);
            }
            return(await SendCommonResponseMessageAsync(agent, msg, 0));//给网关回复0,说明正常
        }
Exemplo n.º 16
0
        public void DecodeData(string UID_16, string StructName, string GatewayID, string UID, string strProtocol, AsyncSocketConnection agent, TPKGHead msg)
        {
            //取协议解析数据
            #region
            var query2 = db.GetCollection <SendStructure2>().Where(o => o.UID_16 == UID_16 && o.StructName == StructName && o.DataAreaDec == "1").DoQuery().ToList();//查询出数据部分协议
            // to do 需要根据gatewayid去数据库里查找其对应的应用云平台接口地址
            WaitCallback ac = async(xx) =>
            {
                //BluetoothDeviceData obj = null;
                JObject json  = new JObject();
                dynamic json2 = new System.Dynamic.ExpandoObject();//动态构建Json数据包,该方法暂定为不可用。
                try
                {
                    json.Add(new JProperty("Success", true));
                    json.Add(new JProperty("Code", 1));
                    json.Add(new JProperty("Type", "01"));
                    json.Add(new JProperty("GatewayID", GatewayID));
                    json.Add(new JProperty("UID", UID));

                    //第二种方法,动态构建Json数据包,暂时未将其发到应用云平台,只用于存储到数据库中
                    json2.Success   = true;
                    json2.Code      = 1;
                    json2.Type      = "01";
                    json2.GatewayID = GatewayID;
                    json2.UID       = UID;
                    //var s = Newtonsoft.Json.JsonConvert.SerializeObject(json2);


                    JArray array = new JArray();
                    foreach (var q in query2)
                    {
                        //取出所有的数据域部分,进行数据处理,等到testresult,testresultdesc
                        string strDataDesc = q.DataDesc;
                        string strFormula  = q.Formula;

                        int iPos1 = Convert.ToInt32(q.LocationBegin + "");
                        int iPos2 = Convert.ToInt32(q.LocationEnd + "");
                        //log.Info($"获取位置:iPos1={ iPos1},iPos2={ iPos2}");

                        double data;
                        string strVHex;
                        if (q.LocationEnd == -1)
                        {
                            strVHex = strProtocol.Substring((iPos1 - 1) * 2, 2);//得到16进制值,数据段的值
                        }
                        else
                        {
                            strVHex = strProtocol.Substring((iPos1 - 1) * 2, 2 * (iPos2 - iPos1) + 2); //得到16进制值,数据段的值
                        }
                        if (!string.IsNullOrEmpty(q.Formula))                                          //存在需要进一步计算转换的公式
                        {
                            int    iTestResult1 = SensorNetwork.Common.RadixConverter.HexStrToInt32(strVHex);
                            string strTemp1     = q.Formula.Replace("D", iTestResult1.ToString());
                            Microsoft.JScript.Vsa.VsaEngine ve = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();//公式计算
                            var Result1 = Microsoft.JScript.Eval.JScriptEvaluate(strTemp1, ve);
                            data = Convert.ToDouble(Result1);
                            //log.Info($"取数:data={ data}");
                        }
                        else
                        {
                            data = SensorNetwork.Common.RadixConverter.HexStrToInt32(strVHex) / 1.0;
                            //log.Info($"取数:data={ data}");
                        }
                        //log.Info($"数组中加入数据:TestResult={ data},TestResultDesc={q.DataDesc}");
                        JObject jo = new JObject();
                        jo.Add(new JProperty("TestResult", data));
                        jo.Add(new JProperty("TestResultDesc", q.DataDesc)); //
                        array.Add(jo);
                    }
                    //array.Add( DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
                    json.Add("Result", array);
                    json.Add(new JProperty("TestTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));

                    json2.Result   = array;
                    json2.TestTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    string s = Newtonsoft.Json.JsonConvert.SerializeObject(json2);

                    //发送数据
                    DataSending send = new DataSending();
                    await send.SendingData(agent, msg, GatewayID, json);
                }
                catch (Exception ex)
                {
                    log.Info($"处理蓝牙设备数据包发生异常:{ ex.Message}");
                    //设备UID错误
                    JObject jsonError = new JObject(
                        new JProperty("Success", false),
                        new JProperty("Result", "错误"),
                        new JProperty("TestTime", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
                        );
                    //此处要加发送
                    //发送数据
                    DataSending send = new DataSending();
                    await send.SendingData(agent, msg, GatewayID, jsonError);
                }
                //log.Info($"蓝牙设备数据包:{ obj.ToJson()}");


                //                        log.Info($"发送到应用云平台的蓝牙设备JSON数据:{ json}");
                //log.Info($"json.tostring:{ json.ToString()}");
                //以下部分要重新写代码入数据库
                string js = json.ToString();                                    // json.ToString().Substring(0, 1002),//保存长度有问题,需要更改.Substring(0, 1002)
                string s2 = Newtonsoft.Json.JsonConvert.SerializeObject(json2); //使用第二种Json构造方式,存入数据库
                log.Info($"js:{ js.Length}");
                var d = new BluetoothSensorLog()
                {
                    GatewayID = agent.TerminalId,
                    UID       = UID,
                    Json      = s2,
                    Created   = DateTime.Now,
                };
                await db.AddAsync(d);

                // }
            };//end    WaitCallback ac = async (xx) =>
            System.Threading.ThreadPool.QueueUserWorkItem(ac, null);

            #endregion
        }