Ejemplo n.º 1
0
        private static void starter()
        {
            log.Info("[MQTT]Service Start ...");
            MqttServiceContainer container  = MqttServiceContainer.Instance;
            List <RetDeviceInfo> deviceInfo = new List <RetDeviceInfo>();
            DeviceMonitoringApi  deviceApi  = new DeviceMonitoringApi();
            var retDevice = deviceApi.GetAllDeviceList(new GetDeviceInfoParameter()
            {
                Status = "1"
            });

            if (retDevice.Code == -1)
            {
                log.Error("获取设备信息失败: " + retDevice.Msg);
                return;
            }
            else
            {
                deviceInfo = retDevice.Data;
            }

            foreach (var item in deviceInfo)
            {
                StartUpDeviceService(item);
            }
            log.Info("[MQTT]Service Started Success!");
            return;
        }
Ejemplo n.º 2
0
 /// <summary>
 /// 启动设备的MQTT监听服务
 /// </summary>
 /// <param name="item"></param>
 public static void StartUpDeviceService(RetDeviceInfo item)
 {
     // 物接入
     if (item.ConnectType == "0")
     {
         //判断物接入的方式
         IoTHubConfigurationModel model = new IoTHubConfigurationModel();
         model.ID = long.Parse(item.IoTHubID);
         DeviceMonitoringApi deviceApi = new DeviceMonitoringApi();
         var conf = deviceApi.GetIoTHubConnection(model);
         if (conf.Code == -1)
         {
             //throw new Exception("获取IoTHub连接信息失败" + conf.Msg);
             log.Error("获取IoTHub连接信息失败" + conf.Msg + " ;model ID" + model.ID);
             return;
         }
         RetIoTHubConfiguration connectInfo = (RetIoTHubConfiguration)conf.Data;
         long ioTHubID = long.Parse(item.IoTHubID);
         //====================
         //=====直接接入=======
         //====================
         if (connectInfo.Type == "1")
         {
             try
             {
                 MqttClientService service = MqttServiceContainer.Instance.GetMqttServiceByConnectID(ioTHubID);
                 //订阅该设备下的相关属性TOPIC
                 BatchSubMessage(item, service);
                 log.InfoFormat("[MQTT] Device: {0},Service Enable.", item.Name);
             }
             catch (Exception e)
             {
                 log.Error("获取MQTT Client出错:" + e.Message, e);
             }
         }
         //==========================
         //==研华网关的设备直连方式==
         //==========================
         else if (connectInfo.Type == "3")
         {
             try
             {
                 MqttClientService service = MqttServiceContainer.Instance.GetMqttServiceByConnectID(ioTHubID);
                 //订阅该设备下的相关属性TOPIC
                 //todo: 暂时使用remark字段存储订阅的topic
                 service.SubscribeMessage(item.Remark);
                 log.InfoFormat("[MQTT] Device: {0},Service Enable.", item.Name);
             }
             catch (Exception e)
             {
                 log.Error("获取MQTT Client出错:" + e.Message, e);
             }
         }
     }
 }
        public IHttpActionResult GetHistoryAlertPoliciesDataList(HistoryAlertPoliciesModel parameter)
        {
            UserApi api     = new UserApi();
            var     userApi = api.GetUserInfoByToken();

            parameter.OrgID = userApi.Data.OrgID.ToString();
            DeviceMonitoringApi deviceList = new DeviceMonitoringApi();
            var deviceApi = deviceList.GetDeviceList(new GetDeviceInfoParameter());
            var list      = deviceApi.Data;
            HistoryAlertPoliciesBLL device = new HistoryAlertPoliciesBLL();
            var get = device.GetHistoryAlertPoliciesDataList(parameter, list);

            return(InspurJson <List <RetHistoryAlertPolicies> >(get));
        }
        public IHttpActionResult GetAlarmReportDetailDataList(AlarmReportItemModel parameter)
        {
            UserApi api     = new UserApi();
            var     userApi = api.GetUserInfoByToken();

            parameter.OrgID = userApi.Data.OrgID.ToString();
            DeviceMonitoringApi deviceList = new DeviceMonitoringApi();
            var deviceApi             = deviceList.GetDeviceList(new GetDeviceInfoParameter());
            var list                  = deviceApi.Data;
            AlarmReportInfoBLL device = new AlarmReportInfoBLL();
            var get = device.GetAlarmReportDetailDataList(parameter, list);

            return(InspurJson <RetAlarmReportDetail>(get));
        }
        public IHttpActionResult GetAlertPoliciesList(AlertPoliciesModel parameter)
        {
            UserApi api     = new UserApi();
            var     userApi = api.GetUserInfoByToken();

            parameter.OrgID = userApi.Data.OrgID.ToString();
            DeviceMonitoringApi deviceList = new DeviceMonitoringApi();
            var deviceApi = deviceList.GetDeviceList(new GetDeviceInfoParameter());
            var list      = deviceApi.Data;
            AlertPoliciesInfoBLL device = new AlertPoliciesInfoBLL();
            var get = device.GetAlertPoliciesList(parameter, list);
            List <GetDeviceDataParameter> DataList = new List <GetDeviceDataParameter>();

            try
            {
                foreach (var item in get.Data)
                {
                    var model = new GetDeviceDataParameter();
                    model.ID            = item.ID;
                    model.DeviceID      = item.DeviceID;
                    model.DeviceItemID  = item.DeviceItemId;
                    model.DataConnectID = item.DataConnectID;
                    model.TagMap        = JsonConvert.SerializeObject(item.TagList);
                    DataList.Add(model);
                }
            }
            catch
            {
            }
            var data = deviceList.GetDeviceCurrentData(DataList);

            if (data.Data.Count > 0)
            {
                foreach (var item in get.Data)
                {
                    foreach (var returnitem in data.Data)
                    {
                        if (null == returnitem)
                        {
                            item.CurrentData = "暂无数据";
                        }
                        else if (returnitem.ID == item.ID)
                        {
                            item.CurrentData = returnitem.Value;
                        }
                    }
                }
            }
            return(InspurJson <List <RetAlertPolicies> >(get));
        }
Ejemplo n.º 6
0
        public RetIoTHubConfiguration GetConnectInfoById(string ioTHubID)
        {
            IoTHubConfigurationModel model = new IoTHubConfigurationModel();

            model.ID = long.Parse(ioTHubID);
            DeviceMonitoringApi deviceApi = new DeviceMonitoringApi();
            var conf = deviceApi.GetIoTHubConnection(model);

            if (conf.Code == -1)
            {
                //throw new Exception("获取IoTHub连接信息失败" + conf.Msg);
                log.Error("获取IoTHub连接信息失败" + conf.Msg + " ;model ID" + model.ID);
                return(null);
            }
            RetIoTHubConfiguration connectInfo = (RetIoTHubConfiguration)conf.Data;

            return(connectInfo);
        }
        /// <summary>
        /// 根据物接入ID获取一个新的client serivce
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        private MqttClientService GetNewMqttServiceByConnectID(long id)
        {
            DeviceMonitoringApi      deviceApi = new DeviceMonitoringApi();
            IoTHubConfigurationModel model     = new IoTHubConfigurationModel();

            model.ID = id;
            var conf = deviceApi.GetIoTHubConnection(model);

            if (conf.Code == -1)
            {
                throw new Exception("获取IoTHub连接信息失败" + conf.Msg);
            }
            RetIoTHubConfiguration connectInfo = (RetIoTHubConfiguration)conf.Data;

            string[] ipPort = connectInfo.Url.Replace("http://", "").Replace("HTTP://", "").Split(':');
            string   ip     = ipPort[0];
            int      port;

            try
            {
                port = ipPort.Count() > 1 ? Int32.Parse(ipPort[1].Replace("/", "")) : 1883; //1883是MQTT Server默认端口
            }
            catch (Exception)
            {
                log.Error("[MQTT]获取mqtt server端口号失败: " + connectInfo.Url);
                throw new Exception("[MQTT]获取mqtt server端口号失败");
            }
            MqttClientService mqttService = new MqttClientService(ip, port, connectInfo.UserName, connectInfo.Password);

            mqttService.OnMqttConnectNotify += MqttService_OnMqttConnectNotify;
            if (connectInfo.Type == "1")//直连
            {
                mqttService.OnMqttMessageNotify += MqttService_OnMqttMessageNotify;
            }
            else if (connectInfo.Type == "3")
            {
                // 研华网关的接入方式
                mqttService.OnMqttMessageNotify += MqttService_OnYanhuaMessageNotify;
            }
            mqttService.Connect();
            container.Add(id, mqttService);
            return(mqttService);
        }
        /// <summary>
        /// 将实时数据记录到TSDB
        /// </summary>
        /// <param name="deviceInfo"></param>
        /// <param name="itemInfo"></param>
        private void RecordToTsdb(RetDeviceInfo deviceInfo, RetDeviceItemInfo itemInfo, string curValue, DateTime now)
        {
            decimal value;

            try
            {
                value = Convert.ToDecimal(curValue);
                // 如果不能转成数字,则不存储到TSDB中。
            }
            catch (Exception e)
            {
                log.ErrorFormat("内部错误:{0},{1}", e.Message, e.StackTrace);
                return;
            }
            DeviceMonitoringApi      deviceApi = new DeviceMonitoringApi();
            IoTHubConfigurationModel parameter = new IoTHubConfigurationModel();

            parameter.ID = long.Parse(deviceInfo.DataConnectID);
            var retDataConnect = deviceApi.GetDataConnect(parameter);

            if (retDataConnect.Code == -1)
            {
                log.Error("获取数据连接数据出错,ID:" + deviceInfo.DataConnectID);
                return;
            }
            RetDataConnectConfiguration dataConnect = retDataConnect.Data;
            Dictionary <string, string> tagMap      = new Dictionary <string, string>();

            foreach (var tag in deviceInfo.TagList)
            {
                tagMap.Add(tag.Key, tag.Value);
            }
            try
            {
                OpentsdbClient client = new OpentsdbClient("http://" + dataConnect.ServerAddress + ":" + dataConnect.ServerPort);
                client.putData(itemInfo.PropertyLabel, now, value, tagMap);
            }
            catch (Exception)
            {
                return;
            }
        }
        /// <summary>
        /// 通用的监听方法
        /// 工作内容:
        /// 1.根据Topic获取设备及属性实例。Topic规则:DeviceLabel/PropertyLabel
        /// 2.查询是否命中报警策略,如果有则记录报警信息
        /// 3.将实时数据保存到默认的TSDB数据库中
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MqttService_OnMqttMessageNotify(object sender, MqttMessageNotifyEventArgs e)
        {
            log.InfoFormat("[MQTT]收到消息:客户端:{0},主题:{1},消息:{2},Qos:{3},保留:{4}",
                           e.ClientId, e.MqttApplicationMessage.Topic, Encoding.UTF8.GetString(e.MqttApplicationMessage.Payload), e.MqttApplicationMessage.QualityOfServiceLevel, e.MqttApplicationMessage.Retain);
            string[] topicArry = e.MqttApplicationMessage.Topic.Split('/');
            if (topicArry.Length == 2)
            {
                string   deviceLabel   = topicArry[0];
                string   propertyLabel = topicArry[1];
                DateTime now           = DateTime.Now;

                DeviceMonitoringApi    deviceMonitoringApi = new DeviceMonitoringApi();
                GetDeviceInfoParameter par        = new GetDeviceInfoParameter();
                RetDeviceInfo          deviceInfo = null;
                RetDeviceItemInfo      itemInfo   = null;
                par.DeviceLabel = deviceLabel;
                var resDeviceInfo = deviceMonitoringApi.GetDeviceInfo(par);
                if (resDeviceInfo.Code != -1)
                {
                    deviceInfo = resDeviceInfo.Data;
                    itemInfo   = deviceInfo.DeviceItems.Find(s => s.PropertyLabel == propertyLabel);
                    if (null == itemInfo)
                    {
                        log.ErrorFormat("根据Topic获取设备属性信息出错,无法匹配报警策略,deviceLabel{0},propertyLabel{1}", deviceLabel, propertyLabel);
                        return;
                    }
                }
                else
                {
                    log.Error("根据deviceLabel获取设备信息失败" + resDeviceInfo.Msg);
                    return;
                }
                //异步处理报警逻辑
                AsyncHandleAlarmPolicies(deviceInfo, itemInfo, Encoding.UTF8.GetString(e.MqttApplicationMessage.Payload), now);
                //保存到TSDB
                RecordToTsdb(deviceInfo, itemInfo, Encoding.UTF8.GetString(e.MqttApplicationMessage.Payload), now);
            }
            else
            {
                log.ErrorFormat("解析TOPIC:{0} 失败,不符合规则", e.MqttApplicationMessage.Topic);
            }
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 启用设备
        /// </summary>
        /// <param name="deviceId"></param>
        public void EnableDevice(long deviceId)
        {
            DeviceMonitoringApi    deviceMonitoringApi = new DeviceMonitoringApi();
            GetDeviceInfoParameter par = new GetDeviceInfoParameter();

            par.ID = deviceId.ToString();
            RetDeviceInfo deviceInfo    = null;
            var           resDeviceInfo = deviceMonitoringApi.GetDeviceInfo(par);

            if (resDeviceInfo.Code != -1)
            {
                deviceInfo = resDeviceInfo.Data;
                StartUpDeviceService(deviceInfo);
            }
            else
            {
                log.Error("获取设备信息出错:" + resDeviceInfo.Msg);
                return;
            }
        }
Ejemplo n.º 11
0
        /// <summary>
        /// 禁用设备的处理
        /// </summary>
        /// <param name="id"></param>
        public void DisableDeivce(long deviceId)
        {
            DeviceMonitoringApi    deviceMonitoringApi = new DeviceMonitoringApi();
            GetDeviceInfoParameter par = new GetDeviceInfoParameter();

            par.ID = deviceId.ToString();
            RetDeviceInfo deviceInfo    = null;
            var           resDeviceInfo = deviceMonitoringApi.GetDeviceInfo(par);

            if (resDeviceInfo.Code != -1)
            {
                deviceInfo = resDeviceInfo.Data;
                if (MqttServiceContainer.Instance.IsClientExist(long.Parse(deviceInfo.IoTHubID)))
                {
                    RetIoTHubConfiguration connectInfo = GetConnectInfoById(deviceInfo.IoTHubID);
                    if (null != connectInfo)
                    {
                        if (connectInfo.Type == "1")
                        {
                            //设备直连,删除Topics
                            BatchUnsubMessage(deviceInfo, MqttServiceContainer.Instance.GetMqttServiceByConnectID(long.Parse(deviceInfo.IoTHubID)));
                        }
                        else if (connectInfo.Type == "3")
                        {
                            //研华网关,删除remark中的topic
                            MqttServiceContainer.Instance.GetMqttServiceByConnectID(long.Parse(deviceInfo.IoTHubID)).UnsubscribeMessage(deviceInfo.Remark);
                        }
                    }

                    log.InfoFormat("[MQTT] Device {0},Service Disable.", deviceInfo.Name);
                }
            }
            else
            {
                log.Error("获取设备信息出错:" + resDeviceInfo.Msg);
                return;
            }
        }
Ejemplo n.º 12
0
        public IHttpActionResult GetRealTimeMonitorList(RealTimeMonitorModel model)
        {
            List <GetDeviceDataParameter> list    = new List <GetDeviceDataParameter>();
            List <RetRelTime>             listRel = new List <RetRelTime>();
            DeviceMonitoringApi           device  = new DeviceMonitoringApi();
            var deviceList = device.GetDeviceList(new GetDeviceInfoParameter());
            var devicelist = deviceList.Data;

            if (devicelist != null)
            {
                foreach (var i in devicelist)
                {
                    var deviceParam = new RetRelTime();
                    deviceParam.ID   = i.ID;
                    deviceParam.Name = i.Name;
                    if (i.TagList.Count != 0)
                    {
                        var tag = new RetRelTimeTag();
                        tag.Key   = i.TagList[0].Key;
                        tag.Value = i.TagList[0].Value;
                        List <RetRelTimeTag> listtag = new List <RetRelTimeTag>();
                        listtag.Add(tag);
                        deviceParam.TagList = listtag;
                    }
                    List <RetDeviceItems> deviceItems = new List <RetDeviceItems>();
                    foreach (var iteminfo in i.DeviceItems)
                    {
                        RetDeviceItems items = new RetDeviceItems();
                        items.DeviceItemID   = iteminfo.ID;
                        items.DeviceItemName = iteminfo.Name;
                        deviceItems.Add(items);
                    }
                    deviceParam.DeviceItems   = deviceItems;
                    deviceParam.DataConnectID = i.DataConnectID;
                    listRel.Add(deviceParam);
                }
            }

            UserApi api     = new UserApi();
            var     userApi = api.GetUserInfoByToken();

            model.OrgID = userApi.Data.OrgID.ToString();
            HomeConfigurationBLL config = new HomeConfigurationBLL();
            var get = config.GetRealTimeMonitorList(model, listRel);

            if (get.Data != null)
            {
                foreach (var item in get.Data)
                {
                    if (item.ChartType == "2")
                    {
                        var param = new GetDeviceDataParameter();
                        param.DeviceID      = item.DeviceID;
                        param.DeviceItemID  = item.DeviceItemID;
                        param.DataConnectID = item.DataConnectID;
                        param.TagMap        = JsonConvert.SerializeObject(item.TagList);
                        list.Add(param);
                    }
                }
            }
            var deviceApi = device.GetDeviceCurrentData(list);


            if (deviceApi.Data != null && deviceApi.Data.Count > 0)
            {
                foreach (var item in get.Data)
                {
                    foreach (var returnitem in deviceApi.Data)
                    {
                        if (item != null && returnitem != null)
                        {
                            if (item.DeviceItemID.Equals(returnitem.DeviceItemId))
                            {
                                if (returnitem.Value != null && !"".Equals(returnitem.Value))
                                {
                                    item.Value = returnitem.Value;
                                }
                                else
                                {
                                    item.Value = "暂无数据";
                                }
                            }
                        }
                    }
                }
            }
            return(InspurJson <List <RetRealTimeMonitor> >(get));
        }
        /// <summary>
        /// 物接入(研华网关方式)
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void MqttService_OnYanhuaMessageNotify(object sender, MqttMessageNotifyEventArgs e)
        {
            try
            {
                log.InfoFormat("[MQTT]收到消息:客户端:{0},主题:{1},消息:{2},Qos:{3},保留:{4}",
                               e.ClientId, e.MqttApplicationMessage.Topic, Encoding.UTF8.GetString(e.MqttApplicationMessage.Payload), e.MqttApplicationMessage.QualityOfServiceLevel, e.MqttApplicationMessage.Retain);
                string[] topicArry = e.MqttApplicationMessage.Topic.Split('/');
                string   orgId     = topicArry[0]; //组织ID

                //报文转换为对象
                YanHuaPayload yanhuaPayload;
                try
                {
                    yanhuaPayload = JsonHelper.JsonToEntity <YanHuaPayload>(Encoding.UTF8.GetString(e.MqttApplicationMessage.Payload));
                }
                catch (Exception ex)
                {
                    // 转换对象失败,报文格式不对,直接放弃
                    log.ErrorFormat("[MQTT]解析报文格式失败:{0},{1}", ex.Message, ex.StackTrace);
                    return;
                }
                foreach (var payVal in yanhuaPayload.values)
                {
                    try
                    {
                        DateTime               uploadtime          = DateTime.ParseExact(payVal.time, "yyyyMMdd-HH:mm:ss", CultureInfo.InvariantCulture);
                        DeviceMonitoringApi    deviceMonitoringApi = new DeviceMonitoringApi();
                        GetDeviceInfoParameter par        = new GetDeviceInfoParameter();
                        RetDeviceInfo          deviceInfo = null;
                        RetDeviceItemInfo      itemInfo   = null;
                        par.OrgID = orgId;
                        par.Phone = payVal.device_ip;
                        var resDeviceInfo = deviceMonitoringApi.GetDeviceInfo(par);
                        if (resDeviceInfo.Code != -1)
                        {
                            deviceInfo = resDeviceInfo.Data;
                            itemInfo   = deviceInfo.DeviceItems.Find(s => s.Name == payVal.operationValue);
                            if (null == itemInfo)
                            {
                                log.ErrorFormat("根据Topic获取设备属性信息出错,device_ip{0},name{1}", payVal.device_ip, payVal.name);
                                continue;
                            }
                        }
                        else
                        {
                            log.Error("根据deviceLabel获取设备信息失败" + resDeviceInfo.Msg);
                            continue;
                        }
                        //处理报警逻辑
                        AsyncHandleAlarmPolicies(deviceInfo, itemInfo, payVal.data, uploadtime);
                        //保存到TSDB
                        RecordToTsdb(deviceInfo, itemInfo, payVal.data, uploadtime);
                    }
                    catch (Exception ex)
                    {
                        log.ErrorFormat("内部错误:{0},{1}", ex.Message, ex.StackTrace);
                        continue;
                    }
                }
            }
            catch (Exception ex)
            {
                log.ErrorFormat("内部错误:{0},{1}", ex.Message, ex.StackTrace);
                return;
            }
        }