/// <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 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); }