public MqttClientService GetMqttServiceByConnectID(long id)
 {
     /*
      * 查询容器中是否已经有客户端
      * 如果存在,检查该客户端连接是否生效。
      * 1.生效,返回该客户端
      * 2.失效,移除该客户端,获取一个新的客户端,放到容器中,并返回客户端
      */
     if (container.ContainsKey(id))
     {
         MqttClientService service = container[id];
         if (service.mqttClient.IsConnected)
         {
             return(service);
         }
         else
         {
             container.Remove(id);
             return(GetNewMqttServiceByConnectID(id));
         }
     }
     else
     {
         return(GetNewMqttServiceByConnectID(id));
     }
 }
        public void TestMethodRouting()
        {
            var client = new Mock <IMqttClient>();

            client.Setup(client => client.SubscribeAsync(It.IsAny <MqttClientSubscribeOptions>(), It.IsAny <CancellationToken>())).Returns(Task.FromResult(new MqttClientSubscribeResult()
            {
                Items =
                {
                    new MqttClientSubscribeResultItem(new TopicFilter(), MqttClientSubscribeResultCode.GrantedQoS0)
                }
            }));

            var mqtt = new MqttClientService("qwerty", client.Object);

            bool didCall = false;

            mqtt.Subscribe("a/b/c", (MqttClientService.NotificationMessage message) =>
            {
                didCall = true;
                return(null);
            }).Wait();

            var payload = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new[] { "test" }));

            mqtt.HandleApplicationMessageReceivedAsync(new MqttApplicationMessageReceivedEventArgs("qwerty",
                                                                                                   new MqttApplicationMessage()
            {
                Payload = payload, Topic = "a/b/c"
            })).Wait();

            Assert.That(didCall);
        }
Beispiel #3
0
    public ConnectionPageViewModel(MqttClientService mqttClientService)
    {
        _mqttClientService = mqttClientService;

        var timer = new DispatcherTimer(TimeSpan.FromSeconds(0.5), DispatcherPriority.Normal, TimerCallback);

        timer.Start();
    }
Beispiel #4
0
    public PublishPageViewModel(MqttClientService mqttClientService)
    {
        _mqttClientService = mqttClientService ?? throw new ArgumentNullException(nameof(mqttClientService));

        // Make sure that we start with at least one item.
        AddItem();
        SelectedItem = Items.FirstOrDefault();
    }
Beispiel #5
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);
             }
         }
     }
 }
Beispiel #6
0
        /// <summary>
        /// mqtt订阅;
        /// 一般不会使用
        /// </summary>
        /// <param name="Topic"></param>
        /// <param name="ClientId"></param>
        /// <returns></returns>
        public JsonResult Client(string Topic = "", string ClientId = "")
        {
            if (string.IsNullOrEmpty(Topic) || string.IsNullOrEmpty(ClientId))
            {
                return(Json(new { status = StatusCode.FAIL, message = "订阅失败" }, JsonRequestBehavior.AllowGet));
            }
            var  res         = new MqttClientService(Topic, ClientId);
            bool session     = res.SubscribeClient.CleanSession;
            bool Isconnected = res.SubscribeClient.IsConnected;

            return(Json(new { status = Isconnected ? StatusCode.SUCCESS : StatusCode.FAIL, message = Isconnected ? "订阅成功" : "订阅失败" }, JsonRequestBehavior.AllowGet));
        }
Beispiel #7
0
        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureServices(async(hostContext, services) =>
        {
            var mqtt = MqttClientService.Create(deviceId: RadioService.DEVICE_ID);
            mqtt.Connect("localhost").Wait();
            services.AddSingleton(mqtt);

            services.AddSingleton(Pi.Gpio);
            services.AddHostedService <RadioService>();
            services.AddSingleton <CapabilityService>();
            services.AddSingleton <InternalNodeHubApi>();
        });
Beispiel #8
0
        /// <summary>
        /// 批量取消订阅
        /// </summary>
        /// <param name="deviceInfo"></param>
        /// <param name="service"></param>
        private static void BatchUnsubMessage(RetDeviceInfo deviceInfo, MqttClientService service)
        {
            List <string> toSubList = new List <string>();

            if (null != deviceInfo.DeviceItems && deviceInfo.DeviceItems.Count > 0)
            {
                foreach (var deviceItem in deviceInfo.DeviceItems)
                {
                    toSubList.Add(deviceInfo.DeviceLabel + "/" + deviceItem.PropertyLabel);
                }
            }
            service.batchUnsubscribeMaessage(toSubList);
        }
        /// <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);
        }
Beispiel #10
0
        public void TestSubscribe()
        {
            var client = new Mock <IMqttClient>();

            client.Setup(client => client.SubscribeAsync(It.IsAny <MqttClientSubscribeOptions>(), It.IsAny <CancellationToken>())).Returns(Task.FromResult(new MqttClientSubscribeResult()
            {
                Items =
                {
                    new MqttClientSubscribeResultItem(new TopicFilter(), MqttClientSubscribeResultCode.GrantedQoS0)
                }
            }));

            var mqtt = new MqttClientService("qwerty", client.Object);

            mqtt.Subscribe("a/b/c", (MqttClientService.NotificationMessage message) =>
            {
                return(null);
            });

            client.Verify(client => client.SubscribeAsync(It.IsAny <MqttClientSubscribeOptions>(), It.IsAny <CancellationToken>()));
        }
Beispiel #11
0
        public void TestParameterSpreadTooManyArguments()
        {
            var client = new Mock <IMqttClient>();

            client.Setup(client => client.SubscribeAsync(It.IsAny <MqttClientSubscribeOptions>(), It.IsAny <CancellationToken>())).Returns(Task.FromResult(new MqttClientSubscribeResult()
            {
                Items =
                {
                    new MqttClientSubscribeResultItem(new TopicFilter(), MqttClientSubscribeResultCode.GrantedQoS0)
                }
            }));

            var mqtt = new MqttClientService("qwerty", client.Object);

            var mock = new Mock <IMockCapability>();

            mock.Setup(cap =>
                       cap.MethodB(It.IsAny <string>(),
                                   It.IsAny <string>(),
                                   It.IsAny <int>()));

            var methodInfo = typeof(IMockCapability).GetMethod(nameof(IMockCapability.MethodB));

            Assume.That(methodInfo, Is.Not.Null);

            mqtt.Subscribe("a/b/c", methodInfo, mock.Object).Wait();

            var payload = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new object[] { "test", "test", "42", "testytest" }));

            mqtt.HandleApplicationMessageReceivedAsync(new MqttApplicationMessageReceivedEventArgs("qwerty",
                                                                                                   new MqttApplicationMessage()
            {
                Payload = payload, Topic = "a/b/c"
            })).Wait();

            mock.Verify(cap =>
                        cap.MethodB(It.Is <string>(s => s == "test"),
                                    It.Is <string>(s => s == "test"),
                                    It.Is <int>(s => s == 42)));
        }
Beispiel #12
0
        /// <summary>
        /// mqtt发布消息;
        /// 连接-订阅-发布
        /// </summary>
        /// <param name="Topic"></param>
        /// <param name="message"></param>
        /// <param name="ClientId"></param>
        /// <returns></returns>
        public JsonResult Publish(string Topic = "", string message = "", string ClientId = "")
        {
            if (string.IsNullOrEmpty(Topic) || string.IsNullOrEmpty(message) || string.IsNullOrEmpty(ClientId))
            {
                return(Json(new { status = StatusCode.FAIL, message = "发布失败" }, JsonRequestBehavior.AllowGet));
            }
            else
            {
                try
                {
                    var res = new MqttClientService(Topic, ClientId);
                    res.Client_MqttMsgPublish(Topic, message);
                    return(Json(new { status = StatusCode.SUCCESS, message = "发布成功" }, JsonRequestBehavior.AllowGet));
                }
                catch (Exception)
                {
                    return(Json(new { status = StatusCode.FAIL, message = "发布失败" }, JsonRequestBehavior.AllowGet));

                    throw;
                }
            }
        }
 public UserController(UserService userService, ClientUserRepository clientUserRepository, MqttClientService clientService)
 {
     this.userService          = userService;
     this.clientUserRepository = clientUserRepository;
     this.clientService        = clientService;
 }
 public ClientController(ClientUserRepository clientUser, MqttClientService service)
 {
     this.clientUser = clientUser;
     this.service    = service;
 }
Beispiel #15
0
 public ClientServiceProvider(MqttClientService mqttClientService)
 {
     MqttClientService = mqttClientService;
 }
Beispiel #16
0
 public PacketInspectorPageViewModel(MqttClientService mqttClientService)
 {
     mqttClientService.RegisterMessageInspectorHandler(ProcessPacket);
 }
 public DeviceController(DeviceRepository deviceRepository, ClientUserRepository clientUserRepository, MqttClientService clientService)
 {
     this.deviceRepository     = deviceRepository;
     this.clientUserRepository = clientUserRepository;
     this.clientService        = clientService;
 }
    public SubscriptionsPageViewModel(MqttClientService mqttClientService)
    {
        _mqttClientService = mqttClientService ?? throw new ArgumentNullException(nameof(mqttClientService));

        mqttClientService.ApplicationMessageReceived += HandleApplicationMessageReceivedAsync;
    }
Beispiel #19
0
    public SubscriptionEditorViewModel(MqttClientService mqttClientService)
    {
        _mqttClientService = mqttClientService ?? throw new ArgumentNullException(nameof(mqttClientService));

        ActivePage = ConfigurationPage;
    }
Beispiel #20
0
 public ToiletHub(MqttClientService provider)
 {
     _mqttClient = provider.mqttClient;
 }
 public AwakeUpDeviceJob(MqttClientService mqttClientService, IPointRepository pointRepository)
 {
     _mqttClientService = mqttClientService;
     _pointRepository   = pointRepository;
 }