/// <summary> /// 发送消息到远程端并等待返回 /// </summary> /// <param name="topic">主题</param> /// <param name="api">api</param> /// <param name="body">内容</param> /// <exception cref="TimeoutException"></exception> /// <returns></returns> public static async Task <Message> SendAsync(SingleTopic topic, Api api, ITimeoutRequest body) { var message = EmqttdClient.GenerateMessage(api, body, Mode.Send); var key = message.GetUniqueKey(topic.UniqueId); var timeout = TimeSpan.FromSeconds(body.Timeout); var taskSetter = taskTable.Create <Message>(key, timeout); await EmqttdClient.PublishAsync(topic, message); return(await taskSetter.GetTask()); }
/// <summary> /// 初始化mqtt客户端 /// </summary> /// <returns></returns> private async static Task InitMqttClientAsync() { using (await asyncRoot.LockAsync()) { if (_mqttClientInstance != null) { return; } var userName = EmqttdClient.GetSubAccout(); var password = config.Subscribe.Password; await MqttAcl.AuthAclAsync(userName, password); await MqttAcl.AuthAclAsync(config.Publish.Account, config.Publish.Password); _mqttClientInstance = new MqttClient(config.Subscribe.Address, userName); _mqttClientInstance.OnMessageArrived += EmqttdClient.OnMqttClientReturn; _mqttClientInstance.OnConnectionLost += mqttClient_OnConnectionLost; var option = new ConnectOption { Username = userName, Password = password, }; try { Logger.Info("IIS_MQTT", "Connect " + option.ToDebugString()); await _mqttClientInstance.ConnectAsync(option); Logger.Info("IIS_MQTT", "Connect OK ..."); await _mqttClientInstance.SubscribeAsync(mqTopic, MqttQoS.ExactlyOnce); } catch (Exception ex) { Logger.Error("IIS_MQTT", ex.ToString()); Logger.Exception(ex); throw ex; } } }
/// <summary> /// 回复消息到远程端 /// </summary> /// <param name="topic">主题</param> /// <param name="api">api</param> /// <param name="body">内容</param> /// <returns></returns> public static async Task ReturnAsync(SingleTopic topic, Api api, object body) { var message = GenerateMessage(api, body, Mode.Return); await EmqttdClient.PublishAsync(topic, message); }
/// <summary> /// 投递消息到远程端 /// </summary> /// <param name="topic">主题</param> /// <param name="api">api</param> /// <param name="body">内容</param> /// <returns></returns> public static async Task PostAsync(Topic topic, Api api, object body) { var message = EmqttdClient.GenerateMessage(api, body, Mode.Post); await EmqttdClient.PublishAsync(topic, message); }