1 package com.mqtt.util;
  2  
  3 import javax.annotation.PostConstruct;
  4 import javax.annotation.Resource;
  5 
  6 import org.eclipse.paho.client.mqttv3.MqttClient;
  7 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
  8 import org.eclipse.paho.client.mqttv3.MqttException;
  9 import org.eclipse.paho.client.mqttv3.MqttTopic;
 10 import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 11 import org.springframework.beans.BeansException;
 12 import org.springframework.beans.factory.annotation.Autowired;
 13 import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
 14 import org.springframework.context.ApplicationContext;
 15 import org.springframework.context.ApplicationContextAware;
 16 import org.springframework.stereotype.Component;
 17 import org.springframework.stereotype.Service;
 18 
 19 import com.mqtt.service.IMqttTopicService;
 20  
 21 /**
 22  * MQTT工具类操作
 23  *
 24  */
 25 @Component
 26 public class MQTTConnect{
 27         
 28                 //从数据库获取top主题和qos服务质量----可以从数据库存在多个主题
 29         @Resource
 30         private IMqttTopicService imqtttopicservice;
 31         
 32         private static MQTTConnect test;
 33         
 34          @PostConstruct 
 35             public void init() {
 36                 test = this;
 37                 test.imqtttopicservice = this.imqtttopicservice;
 38             }
 39     
 40         //MQTT安装的服务器地址和端口号(本机的ip)
 41         public static final String HOST = "tcp://ip地址:1883";
 42         //定义一个主题
 43 //        public static final String TOPIC = "1102_pub";
 44         public static String TOPIC;
 45         //定义MQTT的ID,可以在MQTT服务配置中指定
 46 //        private static final String clientid = "client-1102";
 47         private static final String clientid = "client-1102";
 48         private MqttClient client;
 49         private MqttConnectOptions options;
 50         private String userName = "zhny";
 51         private String passWord = "zhny2020";
 52         
 53         
 54 //        private ScheduledExecutorService scheduler;
 55         
 56         @PostConstruct
 57         public void start() {
 58             try {
 59                 // host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
 60                 client = new MqttClient(HOST, clientid, new MemoryPersistence());
 61                 // MQTT的连接设置
 62                 options = new MqttConnectOptions();
 63                 // 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接-----false是开启持久化
 64                 options.setCleanSession(false);
 65                 // 设置连接的用户名
 66                 options.setUserName(userName);
 67                 // 设置连接的密码
 68                 options.setPassword(passWord.toCharArray());
 69                 // 设置超时时间 单位为秒
 70                 options.setConnectionTimeout(10);
 71                 // 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
 72                 options.setKeepAliveInterval(30);
 73 
 74                 // 设置回调,client.setCallback就可以调用PushCallback类中的messageArrived()方法
 75                 client.setCallback(new PushCallback());
 76 //                MqttTopic topic3 = client.getTopic(TOPIC);
 77                 
 78                 //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
 79 //                options.setWill(topic3, "This is yizhu...".getBytes(), 2, true);
 80                 
 81                 client.connect(options);
 82                 //订阅消息
 83 //                int qos = 2;
 84 //                int[] Qos  = {qos};
 85 //                String[] topic1 = {TOPIC};
 86                 int[] Qos = test.imqtttopicservice.selectqos();
 87                 
 88                 String[] topic = test.imqtttopicservice.selecttopic();
 89                 client.subscribe(topic, Qos);
 90 
 91             } catch (Exception e) {
 92                 e.printStackTrace();
 93             } 
 94         }
 95 
 96     }
 97 
 98     
 99     
100     
101     
102     
103     
104     
105 
106     
MQTTConnect

上面---mqtt订阅端--工具类

  1 package com.mqtt.util;
  2 
  3 
  4 import java.text.SimpleDateFormat;
  5 import java.util.Date;
  6 import java.util.regex.Matcher;
  7 import java.util.regex.Pattern;
  8 
  9 import javax.annotation.PostConstruct;
 10 import javax.annotation.Resource;
 11 
 12 import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
 13 import org.eclipse.paho.client.mqttv3.MqttCallback;
 14 import org.eclipse.paho.client.mqttv3.MqttClient;
 15 import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
 16 import org.eclipse.paho.client.mqttv3.MqttException;
 17 import org.eclipse.paho.client.mqttv3.MqttMessage;
 18 import org.jboss.logging.Logger;
 19 import org.springframework.beans.factory.annotation.Autowired;
 20 import org.springframework.stereotype.Component;
 21 
 22 import com.mqtt.model.GreenhouseAlarm;
 23 import com.mqtt.model.GreenhouseSensor;
 24 import com.mqtt.model.GreenhouseData;
 25 import com.mqtt.model.GreenhouseDevice;
 26 import com.mqtt.service.AlarmService;
 27 import com.mqtt.service.IGreenhouseDataService;
 28 import com.mqtt.service.IMqttTopicService;
 29 import com.mqtt.service.QueryService;
 30 
 31 
 32 
 33 
 34 /**
 35  * 必须实现MqttCallback的接口并实现对应的相关接口方法CallBack 类将实现 MqttCallBack。 
 36  * 每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。 
 37  * 在回调中,将它用来标识已经启动了该回调的哪个实例。 
 38  * 必须在回调类中实现三个方法: 
 39  *  public void messageArrived(MqttTopic topic, MqttMessage message)接收已经预订的发布。 
 40  *  public void connectionLost(Throwable cause)在断开连接时调用。 
 41  *  public void deliveryComplete(MqttDeliveryToken token)) 
 42  *  接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。 
 43  *  由 MqttClient.connect 激活此回调。
 44  */
 45 @Component
 46 public class PushCallback implements MqttCallback{
 47     
 48     @Resource
 49     private IMqttTopicService imqtttopicservice;
 50     
 51     @Resource
 52     public IGreenhouseDataService igreenhousedataservice;
 53     
 54     public final Logger log = Logger.getLogger(this.getClass());
 55     
 56     @Resource
 57     private ServerMQTT servermqtt;
 58     
 59     @Resource
 60     public QueryService queryService;
 61     
 62     @Resource
 63     public AlarmService alarmService;
 64     
 65     private static PushCallback pu;
 66     
 67     
 68      private MqttClient client;
 69      private MqttConnectOptions options;
 70     
 71      @PostConstruct 
 72         public void init() {
 73          pu = this;
 74         }
 75 
 76    public void connectionLost(Throwable cause) {
 77        // 连接丢失后,一般在这里面进行重连
 78        log.info("连接断开……(可以做重连)");
 79        
 80        //失败重连逻辑
 81        while (true){
 82            try {
 83                log.info("连接失败重连");
 84                client.connect(options);
 85                //发布相关的订阅
 86                int[] qos = pu.imqtttopicservice.selectqos();
 87                 
 88                 String[] topic = pu.imqtttopicservice.selecttopic();
 89                client.subscribe(topic, qos);
 90                log.info("连接失败重连成功");
 91                break;
 92            } catch (MqttException e) {
 93                e.printStackTrace();
 94                log.info("连接失败重连失败");
 95                log.info(e);
 96            }
 97        }
 98 
 99        
100        
101    }
102    
103    
104 
105    public void deliveryComplete(IMqttDeliveryToken token) {
106        log.info("deliveryComplete---------" + token.isComplete());
107    }
108    
109    
110         public void messageArrived(String topic, MqttMessage message) {
111             // subscribe后得到的消息会执行到这里面
112             log.info("接收消息主题:" + topic + "  接收消息Qos:" + message.getQos() + "接收消息内容:" + new String(message.getPayload()));
113             try {
114                   String rgex = "网关:(.*?)PM2.5:";
115 
116                     String rgex1 = "PM2.5:(.*?)温度:";
117                     
118                     String rgex2 = "温度:(.*?)湿度:";
119                     
120                     String rgex3 = "湿度:(.*?)CO2:";
121                     
122                     String rgex4 = "CO2:(.*?)甲醛:";
123                     
124                     String rgex5= "甲醛:(.*?)液位:";
125                     
126                     String rgex6= "液位:(.*?)光照:";
127                     
128                     String rgex7 = "光照:(.*)";
129                 
130                     String sb = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex);
131                     
132                     String sb1 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex1);
133                     
134                     String sb2 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex2);
135                     
136                     String sb3 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex3);
137                     
138                     String sb4 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex4);
139                     
140                     String sb5 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex5);
141                     
142                     String sb6 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex6);
143                     
144                     String sb7 = (new PushCallback()).getSubUtilSimple(new String(message.getPayload()), rgex7);
145                     
146                     //插入
147                     GreenhouseData greenhousedata=new GreenhouseData();
148 //                    greenhousedata.setId(0);
149 //                    greenhousedata.setLiquidTemperature(0.0);
150 //                    greenhousedata.setReserve1("0");
151 //                    greenhousedata.setReserve2("0");
152                     
153                     greenhousedata.setTag(sb);
154                     greenhousedata.setPm(Double.parseDouble(sb1));
155                     greenhousedata.setTemperature(Double.parseDouble(sb2));
156                     greenhousedata.setHumidity(Double.parseDouble(sb3));
157                     greenhousedata.setCo2(Double.parseDouble(sb4));
158                     greenhousedata.setFormaldehyde(Double.parseDouble(sb5));
159                     greenhousedata.setIllumination(Double.parseDouble(sb7));
160                     greenhousedata.setLiquidLevel(Double.parseDouble(sb6));
161                     
162                     SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
163                     
164                     greenhousedata.setDataTime(df.format(new Date()));
165                     
166                     pu.igreenhousedataservice.insert(greenhousedata);
167                     
168                     
169                     //查询温度传感器信息
170                     GreenhouseSensor sensor= pu.queryService.querySensorInfoByWgAndModel(sb,"1301");
171                     //得到白天设定值
172                     Double TmSetPoint = sensor.getSetPoint();
173                     //得到晚上设定值
174                     Double TmReserve1 = Double.valueOf(sensor.getReserve1());
175                     
176                     
177                     
178                     
179                     //24小时标准化
180                     SimpleDateFormat ft = new SimpleDateFormat("HH:mm:ss");
181                     //当前时间
182                      Date now = ft.parse(ft.format(new Date()));
183                      long nowTime = now.getTime();
184                     //起始时间
185                      Date start = ft.parse("06:00:00");
186                      long startTime = start.getTime();
187                     //结束时间
188                     Date end = ft.parse("18:00:00");
189                     long endTime = end.getTime();
190                     
191                     
192                     //白天
193                     if (nowTime>=startTime && nowTime<=endTime) {
194                         //查询降温设备
195                         GreenhouseDevice jwDevice = pu.queryService.queryDeviceInfoByWgAndModel(sb,"1208");
196                         //当检测值大于设定值+1并且状态是0未开启状态时进行降温
197                         if (Double.parseDouble(sb2)>TmSetPoint+1 && jwDevice.getDeviceStatus()==0) {
198                             log.info("白天温度异常"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
199                             //异常时报警记录里插入温度报警
200                             GreenhouseAlarm greenhouseAlarm = new GreenhouseAlarm();
201                             greenhouseAlarm.setGatewayId(Integer.valueOf(sb));
202                             greenhouseAlarm.setSensorId(Integer.valueOf("1301"));
203                             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
204                             greenhouseAlarm.setAlarmTime(String.valueOf(simpleDateFormat.format(new Date())));
205                             greenhouseAlarm.setName(sensor.getName());
206                             greenhouseAlarm.setValue(Double.parseDouble(sb2));
207                             pu.alarmService.insertAlarmInfo(greenhouseAlarm);
208                             
209                             log.info("打开降温设备!"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"+"白天");
210                             //发送打开降温设备指令
211                             pu.servermqtt.mqtt("81", sb);
212                             //修改设备状态
213                             GreenhouseDevice greenhouseDevice = new GreenhouseDevice();
214                             greenhouseDevice.setGatewayId(sb);
215                             greenhouseDevice.setModel("1208");
216                             SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
217                             greenhouseDevice.setUpdateTtime(simpleDateFormat1.format(new Date()));
218                             greenhouseDevice.setDeviceStatus(1);
219                             pu.queryService.update(greenhouseDevice);
220                         }    
221                         if (Double.parseDouble(sb2)<TmSetPoint-1 && jwDevice.getDeviceStatus()==1){
222                             log.info("关闭降温设备!"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"+"白天");
223                             pu.servermqtt.mqtt("80", sb);
224                             //修改设备状态
225                             GreenhouseDevice greenhouseDevice = new GreenhouseDevice();
226                             greenhouseDevice.setGatewayId(sb);
227                             greenhouseDevice.setModel("1208");
228                             SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
229                             greenhouseDevice.setUpdateTtime(simpleDateFormat1.format(new Date()));
230                             greenhouseDevice.setDeviceStatus(0);
231                             pu.queryService.update(greenhouseDevice);
232                         }
233                         
234                     }else {
235                         //查询降温设备
236                         GreenhouseDevice jwDevice = pu.queryService.queryDeviceInfoByWgAndModel(sb,"1208");
237                         //当检测值大于设定值+1并且状态是0未开启状态时进行降温
238                         if (Double.parseDouble(sb2)>TmReserve1+1 && jwDevice.getDeviceStatus()==0) {
239                             log.info("晚上温度异常"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
240                             
241                             //异常时报警记录里插入温度报警
242                             GreenhouseAlarm greenhouseAlarm = new GreenhouseAlarm();
243                             greenhouseAlarm.setGatewayId(Integer.valueOf(sb));
244                             greenhouseAlarm.setSensorId(Integer.valueOf("1301"));
245                             SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
246                             greenhouseAlarm.setAlarmTime(String.valueOf(simpleDateFormat.format(new Date())));
247                             greenhouseAlarm.setName(sensor.getName());
248                             greenhouseAlarm.setValue(Double.parseDouble(sb2));
249                             pu.alarmService.insertAlarmInfo(greenhouseAlarm);
250                             
251                             
252                             log.info("打开降温设备!"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"+"晚上");
253                             //发送打开降温设备指令
254                             pu.servermqtt.mqtt("81", sb);
255                             //修改设备状态
256                             GreenhouseDevice greenhouseDevice = new GreenhouseDevice();
257                             greenhouseDevice.setGatewayId(sb);
258                             greenhouseDevice.setModel("1208");
259                             SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
260                             greenhouseDevice.setUpdateTtime(simpleDateFormat1.format(new Date()));
261                             greenhouseDevice.setDeviceStatus(1);
262                             pu.queryService.update(greenhouseDevice);
263                         }    
264                         if (Double.parseDouble(sb2)<TmReserve1-1 && jwDevice.getDeviceStatus()==1){
265                             log.info("关闭降温设备!"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"+"晚上");
266                             pu.servermqtt.mqtt("80", sb);
267                             //修改设备状态
268                             GreenhouseDevice greenhouseDevice = new GreenhouseDevice();
269                             greenhouseDevice.setGatewayId(sb);
270                             greenhouseDevice.setModel("1208");
271                             SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
272                             greenhouseDevice.setUpdateTtime(simpleDateFormat1.format(new Date()));
273                             greenhouseDevice.setDeviceStatus(0);
274                             pu.queryService.update(greenhouseDevice);
275                         }
276                     }
277                     
278                     //报警记录添加液位异常
279                     GreenhouseSensor sensor1= pu.queryService.querySensorInfoByWgAndModel(sb,"1308");    
280                     if (1==Double.valueOf(sb6)) {
281                         log.info("液位异常"+"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
282                         
283                         //异常时报警记录里插入温度报警
284                         GreenhouseAlarm greenhouseAlarm = new GreenhouseAlarm();
285                         greenhouseAlarm.setGatewayId(Integer.valueOf(sb));
286                         greenhouseAlarm.setSensorId(Integer.valueOf("1308"));
287                         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
288                         greenhouseAlarm.setAlarmTime(String.valueOf(simpleDateFormat.format(new Date())));
289                         greenhouseAlarm.setName(sensor1.getName());
290                         greenhouseAlarm.setValue(Double.valueOf(sb6));
291                         pu.alarmService.insertAlarmInfo(greenhouseAlarm);
292                     }
293                     
294                     
295 //                    MySQLDemo mysqldemo=new MySQLDemo();
296 //                    mysqldemo.add(sb, sb2, sb3, sb4, sb1, sb5, sb6 , sb7);
297                     
298             } catch (Exception e) {
299                 e.printStackTrace();
300                 log.info(e);
301             }
302         }
303         
304         
305         
306         
307         /** 
308          * 返回单个字符串,若匹配到多个的话就返回第一个,方法与getSubUtil一样 
309          * @param soap 
310          * @param rgex 
311          * @return 
312          */  
313         
314          public String getSubUtilSimple(String soap,String rgex){  
315                 Pattern pattern = Pattern.compile(rgex);// 匹配的模式  
316                 Matcher m = pattern.matcher(soap);  
317                 while(m.find()){  
318                     return m.group(1);  
319                 }  
320                 return "";  
321             }  
322 }
323 
324     
View Code

上面回调函数

------------------------------

附赠下mqtt服务器端配置文件

  1 # Config file for mosquitto
  2 #
  3 # See mosquitto.conf(5) for more information.
  4 #
  5 # Default values are shown, uncomment to change.
  6 #
  7 # Use the # character to indicate a comment, but only if it is the
  8 # very first character on the line.
  9 
 10 # =================================================================
 11 # General configuration
 12 # =================================================================
 13 
 14 # Use per listener security settings.
 15 #
 16 # It is recommended this option be set before any other options.
 17 #
 18 # If this option is set to true, then all authentication and access control
 19 # options are controlled on a per listener basis. The following options are
 20 # affected:
 21 #
 22 # password_file acl_file psk_file auth_plugin auth_opt_* allow_anonymous
 23 # auto_id_prefix allow_zero_length_clientid
 24 #
 25 # Note that if set to true, then a durable client (i.e. with clean session set
 26 # to false) that has disconnected will use the ACL settings defined for the
 27 # listener that it was most recently connected to.
 28 #
 29 # The default behaviour is for this to be set to false, which maintains the
 30 # setting behaviour from previous versions of mosquitto.
 31 #per_listener_settings false
 32 
 33 
 34 # If a client is subscribed to multiple subscriptions that overlap, e.g. foo/#
 35 # and foo/+/baz , then MQTT expects that when the broker receives a message on
 36 # a topic that matches both subscriptions, such as foo/bar/baz, then the client
 37 # should only receive the message once.
 38 # Mosquitto keeps track of which clients a message has been sent to in order to
 39 # meet this requirement. The allow_duplicate_messages option allows this
 40 # behaviour to be disabled, which may be useful if you have a large number of
 41 # clients subscribed to the same set of topics and are very concerned about
 42 # minimising memory usage.
 43 # It can be safely set to true if you know in advance that your clients will
 44 # never have overlapping subscriptions, otherwise your clients must be able to
 45 # correctly deal with duplicate messages even when then have QoS=2.
 46 #allow_duplicate_messages false
 47 
 48 # This option controls whether a client is allowed to connect with a zero
 49 # length client id or not. This option only affects clients using MQTT v3.1.1
 50 # and later. If set to false, clients connecting with a zero length client id
 51 # are disconnected. If set to true, clients will be allocated a client id by
 52 # the broker. This means it is only useful for clients with clean session set
 53 # to true.
 54 #allow_zero_length_clientid true
 55 
 56 # If allow_zero_length_clientid is true, this option allows you to set a prefix
 57 # to automatically generated client ids to aid visibility in logs.
 58 # Defaults to 'auto-'
 59 #auto_id_prefix auto-
 60 
 61 # This option affects the scenario when a client subscribes to a topic that has
 62 # retained messages. It is possible that the client that published the retained
 63 # message to the topic had access at the time they published, but that access
 64 # has been subsequently removed. If check_retain_source is set to true, the
 65 # default, the source of a retained message will be checked for access rights
 66 # before it is republished. When set to false, no check will be made and the
 67 # retained message will always be published. This affects all listeners.
 68 #check_retain_source true
 69 
 70 # QoS 1 and 2 messages will be allowed inflight per client until this limit
 71 # is exceeded.  Defaults to 0. (No maximum)
 72 # See also max_inflight_messages
 73 #max_inflight_bytes 0
 74 
 75 # The maximum number of QoS 1 and 2 messages currently inflight per
 76 # client.
 77 # This includes messages that are partway through handshakes and
 78 # those that are being retried. Defaults to 20. Set to 0 for no
 79 # maximum. Setting to 1 will guarantee in-order delivery of QoS 1
 80 # and 2 messages.
 81 #max_inflight_messages 20
 82 
 83 # For MQTT v5 clients, it is possible to have the server send a "server
 84 # keepalive" value that will override the keepalive value set by the client.
 85 # This is intended to be used as a mechanism to say that the server will
 86 # disconnect the client earlier than it anticipated, and that the client should
 87 # use the new keepalive value. The max_keepalive option allows you to specify
 88 # that clients may only connect with keepalive less than or equal to this
 89 # value, otherwise they will be sent a server keepalive telling them to use
 90 # max_keepalive. This only applies to MQTT v5 clients. The maximum value
 91 # allowable is 65535. Do not set below 10.
 92 #max_keepalive 65535
 93 
 94 # For MQTT v5 clients, it is possible to have the server send a "maximum packet
 95 # size" value that will instruct the client it will not accept MQTT packets
 96 # with size greater than max_packet_size bytes. This applies to the full MQTT
 97 # packet, not just the payload. Setting this option to a positive value will
 98 # set the maximum packet size to that number of bytes. If a client sends a
 99 # packet which is larger than this value, it will be disconnected. This applies
100 # to all clients regardless of the protocol version they are using, but v3.1.1
101 # and earlier clients will of course not have received the maximum packet size
102 # information. Defaults to no limit. Setting below 20 bytes is forbidden
103 # because it is likely to interfere with ordinary client operation, even with
104 # very small payloads.
105 #max_packet_size 0
106 
107 # QoS 1 and 2 messages above those currently in-flight will be queued per
108 # client until this limit is exceeded.  Defaults to 0. (No maximum)
109 # See also max_queued_messages.
110 # If both max_queued_messages and max_queued_bytes are specified, packets will
111 # be queued until the first limit is reached.
112 #max_queued_bytes 0
113 
114 # The maximum number of QoS 1 and 2 messages to hold in a queue per client
115 # above those that are currently in-flight.  Defaults to 100. Set
116 # to 0 for no maximum (not recommended).
117 # See also queue_qos0_messages.
118 # See also max_queued_bytes.
119 #max_queued_messages 100
120 #
121 # This option sets the maximum number of heap memory bytes that the broker will
122 # allocate, and hence sets a hard limit on memory use by the broker.  Memory
123 # requests that exceed this value will be denied. The effect will vary
124 # depending on what has been denied. If an incoming message is being processed,
125 # then the message will be dropped and the publishing client will be
126 # disconnected. If an outgoing message is being sent, then the individual
127 # message will be dropped and the receiving client will be disconnected.
128 # Defaults to no limit.
129 #memory_limit 0
130 
131 # This option sets the maximum publish payload size that the broker will allow.
132 # Received messages that exceed this size will not be accepted by the broker.
133 # The default value is 0, which means that all valid MQTT messages are
134 # accepted. MQTT imposes a maximum payload size of 268435455 bytes.
135 #message_size_limit 0
136 
137 # This option allows persistent clients (those with clean session set to false)
138 # to be removed if they do not reconnect within a certain time frame.
139 #
140 # This is a non-standard option in MQTT V3.1 but allowed in MQTT v3.1.1.
141 #
142 # Badly designed clients may set clean session to false whilst using a randomly
143 # generated client id. This leads to persistent clients that will never
144 # reconnect. This option allows these clients to be removed.
145 #
146 # The expiration period should be an integer followed by one of h d w m y for
147 # hour, day, week, month and year respectively. For example
148 #
149 # persistent_client_expiration 2m
150 # persistent_client_expiration 14d
151 # persistent_client_expiration 1y
152 #
153 # The default if not set is to never expire persistent clients.
154 #persistent_client_expiration
155 
156 # Write process id to a file. Default is a blank string which means
157 # a pid file shouldn't be written.
158 # This should be set to /var/run/mosquitto.pid if mosquitto is
159 # being run automatically on boot with an init script and
160 # start-stop-daemon or similar.
161 #pid_file
162 
163 # Set to true to queue messages with QoS 0 when a persistent client is
164 # disconnected. These messages are included in the limit imposed by
165 # max_queued_messages and max_queued_bytes
166 # Defaults to false.
167 # This is a non-standard option for the MQTT v3.1 spec but is allowed in
168 # v3.1.1.
169 #queue_qos0_messages false
170 
171 # Set to false to disable retained message support. If a client publishes a
172 # message with the retain bit set, it will be disconnected if this is set to
173 # false.
174 #retain_available true
175 
176 # Disable Nagle's algorithm on client sockets. This has the effect of reducing
177 # latency of individual messages at the potential cost of increasing the number
178 # of packets being sent.
179 #set_tcp_nodelay false
180 
181 # Time in seconds between updates of the $SYS tree.
182 # Set to 0 to disable the publishing of the $SYS tree.
183 #sys_interval 10
184 
185 # The MQTT specification requires that the QoS of a message delivered to a
186 # subscriber is never upgraded to match the QoS of the subscription. Enabling
187 # this option changes this behaviour. If upgrade_outgoing_qos is set true,
188 # messages sent to a subscriber will always match the QoS of its subscription.
189 # This is a non-standard option explicitly disallowed by the spec.
190 #upgrade_outgoing_qos false
191 
192 # When run as root, drop privileges to this user and its primary
193 # group.
194 # Set to root to stay as root, but this is not recommended.
195 # If run as a non-root user, this setting has no effect.
196 # Note that on Windows this has no effect and so mosquitto should
197 # be started by the user you wish it to run as.
198 #user mosquitto
199 
200 # =================================================================
201 # Default listener
202 # =================================================================
203 
204 # IP address/hostname to bind the default listener to. If not
205 # given, the default listener will not be bound to a specific
206 # address and so will be accessible to all network interfaces.
207 # bind_address ip-address/host name
208 #bind_address
209 
210 # Port to use for the default listener.
211 #port 1884
212 
213 # Bind the listener to a specific interface. This is similar to
214 # bind_address above but is useful when an interface has multiple addresses or
215 # the address may change. It is valid to use this with the bind_address option,
216 # but take care that the interface you are binding to contains the address you
217 # are binding to, otherwise you will not be able to connect.
218 # Example: bind_interface eth0
219 #bind_interface
220 
221 # When a listener is using the websockets protocol, it is possible to serve
222 # http data as well. Set http_dir to a directory which contains the files you
223 # wish to serve. If this option is not specified, then no normal http
224 # connections will be possible.
225 #http_dir
226 
227 # 系统资源的回收时间,0表示尽快处理
228 store_clean_interval 0
229 
230 # The maximum number of client connections to allow. This is
231 # a per listener setting.
232 # Default is -1, which means unlimited connections.
233 # Note that other process limits mean that unlimited connections
234 # are not really possible. Typically the default maximum number of
235 # connections possible is around 1024.
236 # 允许的最大连接数,-1表示没有限制
237 max_connections -1
238 
239 # Choose the protocol to use when listening.
240 # This can be either mqtt or websockets.
241 # Websockets support is currently disabled by default at compile time.
242 # Certificate based TLS may be used with websockets, except that
243 # only the cafile, certfile, keyfile and ciphers options are supported.
244 #protocol mqtt
245 
246 # Set use_username_as_clientid to true to replace the clientid that a client
247 # connected with with its username. This allows authentication to be tied to
248 # the clientid, which means that it is possible to prevent one client
249 # disconnecting another by using the same clientid.
250 # If a client connects with no username it will be disconnected as not
251 # authorised when this option is set to true.
252 # Do not use in conjunction with clientid_prefixes.
253 # See also use_identity_as_username.
254 #use_username_as_clientid
255 
256 # -----------------------------------------------------------------
257 # Certificate based SSL/TLS support
258 # -----------------------------------------------------------------
259 # The following options can be used to enable SSL/TLS support for
260 # this listener. Note that the recommended port for MQTT over TLS
261 # is 8883, but this must be set manually.
262 #
263 # See also the mosquitto-tls man page.
264 
265 # At least one of cafile or capath must be defined. They both
266 # define methods of accessing the PEM encoded Certificate
267 # Authority certificates that have signed your server certificate
268 # and that you wish to trust.
269 # cafile defines the path to a file containing the CA certificates.
270 # capath defines a directory that will be searched for files
271 # containing the CA certificates. For capath to work correctly, the
272 # certificate files must have ".crt" as the file ending and you must run
273 # "openssl rehash <path to capath>" each time you add/remove a certificate.
274 #cafile
275 #capath
276 
277 # Path to the PEM encoded server certificate.
278 #certfile
279 
280 # Path to the PEM encoded keyfile.
281 #keyfile
282 
283 
284 # If you have require_certificate set to true, you can create a certificate
285 # revocation list file to revoke access to particular client certificates. If
286 # you have done this, use crlfile to point to the PEM encoded revocation file.
287 #crlfile
288 
289 # If you wish to control which encryption ciphers are used, use the ciphers
290 # option. The list of available ciphers can be obtained using the "openssl
291 # ciphers" command and should be provided in the same format as the output of
292 # that command.
293 # If unset defaults to DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2:@STRENGTH
294 #ciphers DEFAULT:!aNULL:!eNULL:!LOW:!EXPORT:!SSLv2:@STRENGTH
295 
296 # To allow the use of ephemeral DH key exchange, which provides forward
297 # security, the listener must load DH parameters. This can be specified with
298 # the dhparamfile option. The dhparamfile can be generated with the command
299 # e.g. "openssl dhparam -out dhparam.pem 2048"
300 #dhparamfile
301 
302 # By default a TLS enabled listener will operate in a similar fashion to a
303 # https enabled web server, in that the server has a certificate signed by a CA
304 # and the client will verify that it is a trusted certificate. The overall aim
305 # is encryption of the network traffic. By setting require_certificate to true,
306 # the client must provide a valid certificate in order for the network
307 # connection to proceed. This allows access to the broker to be controlled
308 # outside of the mechanisms provided by MQTT.
309 #require_certificate false
310 
311 # This option defines the version of the TLS protocol to use for this listener.
312 # The default value allows all of v1.3, v1.2 and v1.1. The valid values are
313 # tlsv1.3 tlsv1.2 and tlsv1.1.
314 #tls_version
315 
316 # If require_certificate is true, you may set use_identity_as_username to true
317 # to use the CN value from the client certificate as a username. If this is
318 # true, the password_file option will not be used for this listener.
319 # This takes priority over use_subject_as_username.
320 # See also use_subject_as_username.
321 #use_identity_as_username false
322 
323 # If require_certificate is true, you may set use_subject_as_username to true
324 # to use the complete subject value from the client certificate as a username.
325 # If this is true, the password_file option will not be used for this listener.
326 # See also use_identity_as_username
327 #use_subject_as_username false
328 
329 # -----------------------------------------------------------------
330 # Pre-shared-key based SSL/TLS support
331 # -----------------------------------------------------------------
332 # The following options can be used to enable PSK based SSL/TLS support for
333 # this listener. Note that the recommended port for MQTT over TLS is 8883, but
334 # this must be set manually.
335 #
336 # See also the mosquitto-tls man page and the "Certificate based SSL/TLS
337 # support" section. Only one of certificate or PSK encryption support can be
338 # enabled for any listener.
339 
340 # The psk_hint option enables pre-shared-key support for this listener and also
341 # acts as an identifier for this listener. The hint is sent to clients and may
342 # be used locally to aid authentication. The hint is a free form string that
343 # doesn't have much meaning in itself, so feel free to be creative.
344 # If this option is provided, see psk_file to define the pre-shared keys to be
345 # used or create a security plugin to handle them.
346 #psk_hint
347 
348 # When using PSK, the encryption ciphers used will be chosen from the list of
349 # available PSK ciphers. If you want to control which ciphers are available,
350 # use the "ciphers" option.  The list of available ciphers can be obtained
351 # using the "openssl ciphers" command and should be provided in the same format
352 # as the output of that command.
353 #ciphers
354 
355 # Set use_identity_as_username to have the psk identity sent by the client used
356 # as its username. Authentication will be carried out using the PSK rather than
357 # the MQTT username/password and so password_file will not be used for this
358 # listener.
359 #use_identity_as_username false
360 
361 
362 # =================================================================
363 # Extra listeners
364 # =================================================================
365 
366 # Listen on a port/ip address combination. By using this variable
367 # multiple times, mosquitto can listen on more than one port. If
368 # this variable is used and neither bind_address nor port given,
369 # then the default listener will not be started.
370 # The port number to listen on must be given. Optionally, an ip
371 # address or host name may be supplied as a second argument. In
372 # this case, mosquitto will attempt to bind the listener to that
373 # address and so restrict access to the associated network and
374 # interface. By default, mosquitto will listen on all interfaces.
375 # Note that for a websockets listener it is not possible to bind to a host
376 # name.
377 # listener port-number [ip address/host name]
378 #listener
379 
380 # Bind the listener to a specific interface. This is similar to
381 # the [ip address/host name] part of the listener definition, but is useful
382 # when an interface has multiple addresses or the address may change. It is
383 # valid to use this with the [ip address/host name] part of the listener
384 # definition, but take care that the interface you are binding to contains the
385 # address you are binding to, otherwise you will not be able to connect.
386 # Only available on Linux and requires elevated privileges.
387 #
388 # Example: bind_interface eth0
389 #bind_interface
390 
391 # When a listener is using the websockets protocol, it is possible to serve
392 # http data as well. Set http_dir to a directory which contains the files you
393 # wish to serve. If this option is not specified, then no normal http
394 # connections will be possible.
395 #http_dir
396 
397 # The maximum number of client connections to allow. This is
398 # a per listener setting.
399 # Default is -1, which means unlimited connections.
400 # Note that other process limits mean that unlimited connections
401 # are not really possible. Typically the default maximum number of
402 # connections possible is around 1024.
403 #max_connections -1
404 
405 # The listener can be restricted to operating within a topic hierarchy using
406 # the mount_point option. This is achieved be prefixing the mount_point string
407 # to all topics for any clients connected to this listener. This prefixing only
408 # happens internally to the broker; the client will not see the prefix.
409 #mount_point
410 
411 # Choose the protocol to use when listening.
412 # This can be either mqtt or websockets.
413 # Certificate based TLS may be used with websockets, except that only the
414 # cafile, certfile, keyfile and ciphers options are supported.
415 #protocol mqtt
416 
417 # Set use_username_as_clientid to true to replace the clientid that a client
418 # connected with with its username. This allows authentication to be tied to
419 # the clientid, which means that it is possible to prevent one client
420 # disconnecting another by using the same clientid.
421 # If a client connects with no username it will be disconnected as not
422 # authorised when this option is set to true.
423 # Do not use in conjunction with clientid_prefixes.
424 # See also use_identity_as_username.
425 #use_username_as_clientid
426 
427 # Change the websockets headers size. This is a global option, it is not
428 # possible to set per listener. This option sets the size of the buffer used in
429 # the libwebsockets library when reading HTTP headers. If you are passing large
430 # header data such as cookies then you may need to increase this value. If left
431 # unset, or set to 0, then the default of 1024 bytes will be used.
432 #websockets_headers_size
433 
434 # -----------------------------------------------------------------
435 # Certificate based SSL/TLS support
436 # -----------------------------------------------------------------
437 # The following options can be used to enable certificate based SSL/TLS support
438 # for this listener. Note that the recommended port for MQTT over TLS is 8883,
439 # but this must be set manually.
440 #
441 # See also the mosquitto-tls man page and the "Pre-shared-key based SSL/TLS
442 # support" section. Only one of certificate or PSK encryption support can be
443 # enabled for any listener.
444 
445 # At least one of cafile or capath must be defined to enable certificate based
446 # TLS encryption. They both define methods of accessing the PEM encoded
447 # Certificate Authority certificates that have signed your server certificate
448 # and that you wish to trust.
449 # cafile defines the path to a file containing the CA certificates.
450 # capath defines a directory that will be searched for files
451 # containing the CA certificates. For capath to work correctly, the
452 # certificate files must have ".crt" as the file ending and you must run
453 # "openssl rehash <path to capath>" each time you add/remove a certificate.
454 #cafile
455 #capath
456 
457 # Path to the PEM encoded server certificate.
458 #certfile
459 
460 # Path to the PEM encoded keyfile.
461 #keyfile
462 
463 
464 # If you wish to control which encryption ciphers are used, use the ciphers
465 # option. The list of available ciphers can be optained using the "openssl
466 # ciphers" command and should be provided in the same format as the output of
467 # that command.
468 #ciphers
469 
470 # If you have require_certificate set to true, you can create a certificate
471 # revocation list file to revoke access to particular client certificates. If
472 # you have done this, use crlfile to point to the PEM encoded revocation file.
473 #crlfile
474 
475 # To allow the use of ephemeral DH key exchange, which provides forward
476 # security, the listener must load DH parameters. This can be specified with
477 # the dhparamfile option. The dhparamfile can be generated with the command
478 # e.g. "openssl dhparam -out dhparam.pem 2048"
479 #dhparamfile
480 
481 # By default an TLS enabled listener will operate in a similar fashion to a
482 # https enabled web server, in that the server has a certificate signed by a CA
483 # and the client will verify that it is a trusted certificate. The overall aim
484 # is encryption of the network traffic. By setting require_certificate to true,
485 # the client must provide a valid certificate in order for the network
486 # connection to proceed. This allows access to the broker to be controlled
487 # outside of the mechanisms provided by MQTT.
488 #require_certificate false
489 
490 # If require_certificate is true, you may set use_identity_as_username to true
491 # to use the CN value from the client certificate as a username. If this is
492 # true, the password_file option will not be used for this listener.
493 #use_identity_as_username false
494 
495 # -----------------------------------------------------------------
496 # Pre-shared-key based SSL/TLS support
497 # -----------------------------------------------------------------
498 # The following options can be used to enable PSK based SSL/TLS support for
499 # this listener. Note that the recommended port for MQTT over TLS is 8883, but
500 # this must be set manually.
501 #
502 # See also the mosquitto-tls man page and the "Certificate based SSL/TLS
503 # support" section. Only one of certificate or PSK encryption support can be
504 # enabled for any listener.
505 
506 # The psk_hint option enables pre-shared-key support for this listener and also
507 # acts as an identifier for this listener. The hint is sent to clients and may
508 # be used locally to aid authentication. The hint is a free form string that
509 # doesn't have much meaning in itself, so feel free to be creative.
510 # If this option is provided, see psk_file to define the pre-shared keys to be
511 # used or create a security plugin to handle them.
512 #psk_hint
513 
514 # When using PSK, the encryption ciphers used will be chosen from the list of
515 # available PSK ciphers. If you want to control which ciphers are available,
516 # use the "ciphers" option.  The list of available ciphers can be optained
517 # using the "openssl ciphers" command and should be provided in the same format
518 # as the output of that command.
519 #ciphers
520 
521 # Set use_identity_as_username to have the psk identity sent by the client used
522 # as its username. Authentication will be carried out using the PSK rather than
523 # the MQTT username/password and so password_file will not be used for this
524 # listener.
525 #use_identity_as_username false
526 
527 
528 # =================================================================
529 # Persistence
530 # =================================================================
531 
532 # If persistence is enabled, save the in-memory database to disk
533 # every autosave_interval seconds. If set to 0, the persistence
534 # database will only be written when mosquitto exits. See also
535 # autosave_on_changes.
536 # Note that writing of the persistence database can be forced by
537 # sending mosquitto a SIGUSR1 signal.
538 #autosave_interval 1800
539 
540 # If true, mosquitto will count the number of subscription changes, retained
541 # messages received and queued messages and if the total exceeds
542 # autosave_interval then the in-memory database will be saved to disk.
543 # If false, mosquitto will save the in-memory database to disk by treating
544 # autosave_interval as a time in seconds.
545 #autosave_on_changes false
546 
547 # Save persistent message data to disk (true/false).
548 # This saves information about all messages, including
549 # subscriptions, currently in-flight messages and retained
550 # messages.
551 # retained_persistence is a synonym for this option.
552 # 持久化功能的开关
553 persistence true
554 
555 # The filename to use for the persistent database, not including
556 # the path.
557 #persistence_file mosquitto.db
558 
559 # Location for persistent database. Must include trailing /
560 # Default is an empty string (current directory).
561 # Set to e.g. /var/lib/mosquitto/ if running as a proper service on Linux or
562 # similar.
563 #persistence_location
564 
565 
566 # =================================================================
567 # Logging
568 # =================================================================
569 
570 # Places to log to. Use multiple log_dest lines for multiple
571 # logging destinations.
572 # Possible destinations are: stdout stderr syslog topic file
573 #
574 # stdout and stderr log to the console on the named output.
575 #
576 # syslog uses the userspace syslog facility which usually ends up
577 # in /var/log/messages or similar.
578 #
579 # topic logs to the broker topic '$SYS/broker/log/<severity>',
580 # where severity is one of D, E, W, N, I, M which are debug, error,
581 # warning, notice, information and message. Message type severity is used by
582 # the subscribe/unsubscribe log_types and publishes log messages to
583 # $SYS/broker/log/M/susbcribe or $SYS/broker/log/M/unsubscribe.
584 #
585 # The file destination requires an additional parameter which is the file to be
586 # logged to, e.g. "log_dest file /var/log/mosquitto.log". The file will be
587 # closed and reopened when the broker receives a HUP signal. Only a single file
588 # destination may be configured.
589 #
590 # Note that if the broker is running as a Windows service it will default to
591 # "log_dest none" and neither stdout nor stderr logging is available.
592 # Use "log_dest none" if you wish to disable logging.
593 # 4种日志模式:stdout、stderr、syslog、topic
594 # none 则表示不记日志,此配置可以提升些许性能
595 log_dest none
596 
597 # Types of messages to log. Use multiple log_type lines for logging
598 # multiple types of messages.
599 # Possible types are: debug, error, warning, notice, information,
600 # none, subscribe, unsubscribe, websockets, all.
601 # Note that debug type messages are for decoding the incoming/outgoing
602 # network packets. They are not logged in "topics".
603 #log_type error
604 #log_type warning
605 #log_type notice
606 #log_type information
607 
608 
609 # If set to true, client connection and disconnection messages will be included
610 # in the log.
611 #connection_messages true
612 
613 # If using syslog logging (not on Windows), messages will be logged to the
614 # "daemon" facility by default. Use the log_facility option to choose which of
615 # local0 to local7 to log to instead. The option value should be an integer
616 # value, e.g. "log_facility 5" to use local5.
617 #log_facility
618 
619 # If set to true, add a timestamp value to each log message.
620 #log_timestamp true
621 
622 # Set the format of the log timestamp. If left unset, this is the number of
623 # seconds since the Unix epoch.
624 # This is a free text string which will be passed to the strftime function. To
625 # get an ISO 8601 datetime, for example:
626 # log_timestamp_format %Y-%m-%dT%H:%M:%S
627 #log_timestamp_format
628 
629 # Change the websockets logging level. This is a global option, it is not
630 # possible to set per listener. This is an integer that is interpreted by
631 # libwebsockets as a bit mask for its lws_log_levels enum. See the
632 # libwebsockets documentation for more details. "log_type websockets" must also
633 # be enabled.
634 #websockets_log_level 0
635 
636 
637 # =================================================================
638 # Security
639 # =================================================================
640 
641 # If set, only clients that have a matching prefix on their
642 # clientid will be allowed to connect to the broker. By default,
643 # all clients may connect.
644 # For example, setting "secure-" here would mean a client "secure-
645 # client" could connect but another with clientid "mqtt" couldn't.
646 #clientid_prefixes
647 
648 # Boolean value that determines whether clients that connect
649 # without providing a username are allowed to connect. If set to
650 # false then a password file should be created (see the
651 # password_file option) to control authenticated client access.
652 #
653 # Defaults to true if no other security options are set. If `password_file` or
654 # `psk_file` is set, or if an authentication plugin is loaded which implements
655 # username/password or TLS-PSK checks, then `allow_anonymous` defaults to
656 # false.
657 #
658 #allow_anonymous true
659 
660 # -----------------------------------------------------------------
661 # Default authentication and topic access control
662 # -----------------------------------------------------------------
663 
664 # Control access to the broker using a password file. This file can be
665 # generated using the mosquitto_passwd utility. If TLS support is not compiled
666 # into mosquitto (it is recommended that TLS support should be included) then
667 # plain text passwords are used, in which case the file should be a text file
668 # with lines in the format:
669 # username:password
670 # The password (and colon) may be omitted if desired, although this
671 # offers very little in the way of security.
672 #
673 # See the TLS client require_certificate and use_identity_as_username options
674 # for alternative authentication options. If an auth_plugin is used as well as
675 # password_file, the auth_plugin check will be made first.
676 password_file  /etc/mosquitto/pwfile.example
677 
678 # Access may also be controlled using a pre-shared-key file. This requires
679 # TLS-PSK support and a listener configured to use it. The file should be text
680 # lines in the format:
681 # identity:key
682 # The key should be in hexadecimal format without a leading "0x".
683 # If an auth_plugin is used as well, the auth_plugin check will be made first.
684 #psk_file
685 
686 # Control access to topics on the broker using an access control list
687 # file. If this parameter is defined then only the topics listed will
688 # have access.
689 # If the first character of a line of the ACL file is a # it is treated as a
690 # comment.
691 # Topic access is added with lines of the format:
692 #
693 # topic [read|write|readwrite] <topic>
694 #
695 # The access type is controlled using "read", "write" or "readwrite". This
696 # parameter is optional (unless <topic> contains a space character) - if not
697 # given then the access is read/write.  <topic> can contain the + or #
698 # wildcards as in subscriptions.
699 #
700 # The first set of topics are applied to anonymous clients, assuming
701 # allow_anonymous is true. User specific topic ACLs are added after a
702 # user line as follows:
703 #
704 # user <username>
705 #
706 # The username referred to here is the same as in password_file. It is
707 # not the clientid.
708 #
709 #
710 # If is also possible to define ACLs based on pattern substitution within the
711 # topic. The patterns available for substition are:
712 #
713 # %c to match the client id of the client
714 # %u to match the username of the client
715 #
716 # The substitution pattern must be the only text for that level of hierarchy.
717 #
718 # The form is the same as for the topic keyword, but using pattern as the
719 # keyword.
720 # Pattern ACLs apply to all users even if the "user" keyword has previously
721 # been given.
722 #
723 # If using bridges with usernames and ACLs, connection messages can be allowed
724 # with the following pattern:
725 # pattern write $SYS/broker/connection/%c/state
726 #
727 # pattern [read|write|readwrite] <topic>
728 #
729 # Example:
730 #
731 # pattern write sensor/%u/data
732 #
733 # If an auth_plugin is used as well as acl_file, the auth_plugin check will be
734 # made first.
735 acl_file /etc/mosquitto/aclfile.example
736 
737 # -----------------------------------------------------------------
738 # External authentication and topic access plugin options
739 # -----------------------------------------------------------------
740 
741 # External authentication and access control can be supported with the
742 # auth_plugin option. This is a path to a loadable plugin. See also the
743 # auth_opt_* options described below.
744 #
745 # The auth_plugin option can be specified multiple times to load multiple
746 # plugins. The plugins will be processed in the order that they are specified
747 # here. If the auth_plugin option is specified alongside either of
748 # password_file or acl_file then the plugin checks will be made first.
749 #
750 #auth_plugin
751 
752 # If the auth_plugin option above is used, define options to pass to the
753 # plugin here as described by the plugin instructions. All options named
754 # using the format auth_opt_* will be passed to the plugin, for example:
755 #
756 # auth_opt_db_host
757 # auth_opt_db_port
758 # auth_opt_db_username
759 # auth_opt_db_password
760 
761 
762 # =================================================================
763 # Bridges
764 # =================================================================
765 
766 # A bridge is a way of connecting multiple MQTT brokers together.
767 # Create a new bridge using the "connection" option as described below. Set
768 # options for the bridges using the remaining parameters. You must specify the
769 # address and at least one topic to subscribe to.
770 #
771 # Each connection must have a unique name.
772 #
773 # The address line may have multiple host address and ports specified. See
774 # below in the round_robin description for more details on bridge behaviour if
775 # multiple addresses are used. Note that if you use an IPv6 address, then you
776 # are required to specify a port.
777 #
778 # The direction that the topic will be shared can be chosen by
779 # specifying out, in or both, where the default value is out.
780 # The QoS level of the bridged communication can be specified with the next
781 # topic option. The default QoS level is 0, to change the QoS the topic
782 # direction must also be given.
783 #
784 # The local and remote prefix options allow a topic to be remapped when it is
785 # bridged to/from the remote broker. This provides the ability to place a topic
786 # tree in an appropriate location.
787 #
788 # For more details see the mosquitto.conf man page.
789 #
790 # Multiple topics can be specified per connection, but be careful
791 # not to create any loops.
792 #
793 # If you are using bridges with cleansession set to false (the default), then
794 # you may get unexpected behaviour from incoming topics if you change what
795 # topics you are subscribing to. This is because the remote broker keeps the
796 # subscription for the old topic. If you have this problem, connect your bridge
797 # with cleansession set to true, then reconnect with cleansession set to false
798 # as normal.
799 #connection <name>
800 #address <host>[:<port>] [<host>[:<port>]]
801 #topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix]
802 
803 
804 # If a bridge has topics that have "out" direction, the default behaviour is to
805 # send an unsubscribe request to the remote broker on that topic. This means
806 # that changing a topic direction from "in" to "out" will not keep receiving
807 # incoming messages. Sending these unsubscribe requests is not always
808 # desirable, setting bridge_attempt_unsubscribe to false will disable sending
809 # the unsubscribe request.
810 #bridge_attempt_unsubscribe true
811 
812 # Set the version of the MQTT protocol to use with for this bridge. Can be one
813 # of mqttv311 or mqttv11. Defaults to mqttv311.
814 #bridge_protocol_version mqttv311
815 
816 # Set the clean session variable for this bridge.
817 # When set to true, when the bridge disconnects for any reason, all
818 # messages and subscriptions will be cleaned up on the remote
819 # broker. Note that with cleansession set to true, there may be a
820 # significant amount of retained messages sent when the bridge
821 # reconnects after losing its connection.
822 # When set to false, the subscriptions and messages are kept on the
823 # remote broker, and delivered when the bridge reconnects.
824 #cleansession false
825 
826 # Set the amount of time a bridge using the lazy start type must be idle before
827 # it will be stopped. Defaults to 60 seconds.
828 #idle_timeout 60
829 
830 # Set the keepalive interval for this bridge connection, in
831 # seconds.
832 #keepalive_interval 60
833 
834 # Set the clientid to use on the local broker. If not defined, this defaults to
835 # 'local.<clientid>'. If you are bridging a broker to itself, it is important
836 # that local_clientid and clientid do not match.
837 #local_clientid
838 
839 # If set to true, publish notification messages to the local and remote brokers
840 # giving information about the state of the bridge connection. Retained
841 # messages are published to the topic $SYS/broker/connection/<clientid>/state
842 # unless the notification_topic option is used.
843 # If the message is 1 then the connection is active, or 0 if the connection has
844 # failed.
845 # This uses the last will and testament feature.
846 #notifications true
847 
848 # Choose the topic on which notification messages for this bridge are
849 # published. If not set, messages are published on the topic
850 # $SYS/broker/connection/<clientid>/state
851 #notification_topic
852 
853 # Set the client id to use on the remote end of this bridge connection. If not
854 # defined, this defaults to 'name.hostname' where name is the connection name
855 # and hostname is the hostname of this computer.
856 # This replaces the old "clientid" option to avoid confusion. "clientid"
857 # remains valid for the time being.
858 #remote_clientid
859 
860 # Set the password to use when connecting to a broker that requires
861 # authentication. This option is only used if remote_username is also set.
862 # This replaces the old "password" option to avoid confusion. "password"
863 # remains valid for the time being.
864 #remote_password
865 
866 # Set the username to use when connecting to a broker that requires
867 # authentication.
868 # This replaces the old "username" option to avoid confusion. "username"
869 # remains valid for the time being.
870 #remote_username
871 
872 # Set the amount of time a bridge using the automatic start type will wait
873 # until attempting to reconnect.
874 # This option can be configured to use a constant delay time in seconds, or to
875 # use a backoff mechanism based on "Decorrelated Jitter", which adds a degree
876 # of randomness to when the restart occurs.
877 #
878 # Set a constant timeout of 20 seconds:
879 # restart_timeout 20
880 #
881 # Set backoff with a base (start value) of 10 seconds and a cap (upper limit) of
882 # 60 seconds:
883 # restart_timeout 10 30
884 #
885 # Defaults to jitter with a base of 5 and cap of 30
886 #restart_timeout 5 30
887 
888 # If the bridge has more than one address given in the address/addresses
889 # configuration, the round_robin option defines the behaviour of the bridge on
890 # a failure of the bridge connection. If round_robin is false, the default
891 # value, then the first address is treated as the main bridge connection. If
892 # the connection fails, the other secondary addresses will be attempted in
893 # turn. Whilst connected to a secondary bridge, the bridge will periodically
894 # attempt to reconnect to the main bridge until successful.
895 # If round_robin is true, then all addresses are treated as equals. If a
896 # connection fails, the next address will be tried and if successful will
897 # remain connected until it fails
898 #round_robin false
899 
900 # Set the start type of the bridge. This controls how the bridge starts and
901 # can be one of three types: automatic, lazy and once. Note that RSMB provides
902 # a fourth start type "manual" which isn't currently supported by mosquitto.
903 #
904 # "automatic" is the default start type and means that the bridge connection
905 # will be started automatically when the broker starts and also restarted
906 # after a short delay (30 seconds) if the connection fails.
907 #
908 # Bridges using the "lazy" start type will be started automatically when the
909 # number of queued messages exceeds the number set with the "threshold"
910 # parameter. It will be stopped automatically after the time set by the
911 # "idle_timeout" parameter. Use this start type if you wish the connection to
912 # only be active when it is needed.
913 #
914 # A bridge using the "once" start type will be started automatically when the
915 # broker starts but will not be restarted if the connection fails.
916 #start_type automatic
917 
918 # Set the number of messages that need to be queued for a bridge with lazy
919 # start type to be restarted. Defaults to 10 messages.
920 # Must be less than max_queued_messages.
921 #threshold 10
922 
923 # If try_private is set to true, the bridge will attempt to indicate to the
924 # remote broker that it is a bridge not an ordinary client. If successful, this
925 # means that loop detection will be more effective and that retained messages
926 # will be propagated correctly. Not all brokers support this feature so it may
927 # be necessary to set try_private to false if your bridge does not connect
928 # properly.
929 #try_private true
930 
931 # -----------------------------------------------------------------
932 # Certificate based SSL/TLS support
933 # -----------------------------------------------------------------
934 # Either bridge_cafile or bridge_capath must be defined to enable TLS support
935 # for this bridge.
936 # bridge_cafile defines the path to a file containing the
937 # Certificate Authority certificates that have signed the remote broker
938 # certificate.
939 # bridge_capath defines a directory that will be searched for files containing
940 # the CA certificates. For bridge_capath to work correctly, the certificate
941 # files must have ".crt" as the file ending and you must run "openssl rehash
942 # <path to capath>" each time you add/remove a certificate.
943 #bridge_cafile
944 #bridge_capath
945 
946 
947 # If the remote broker has more than one protocol available on its port, e.g.
948 # MQTT and WebSockets, then use bridge_alpn to configure which protocol is
949 # requested. Note that WebSockets support for bridges is not yet available.
950 #bridge_alpn
951 
952 # When using certificate based encryption, bridge_insecure disables
953 # verification of the server hostname in the server certificate. This can be
954 # useful when testing initial server configurations, but makes it possible for
955 # a malicious third party to impersonate your server through DNS spoofing, for
956 # example. Use this option in testing only. If you need to resort to using this
957 # option in a production environment, your setup is at fault and there is no
958 # point using encryption.
959 #bridge_insecure false
960 
961 # Path to the PEM encoded client certificate, if required by the remote broker.
962 #bridge_certfile
963 
964 # Path to the PEM encoded client private key, if required by the remote broker.
965 #bridge_keyfile
966 
967 # -----------------------------------------------------------------
968 # PSK based SSL/TLS support
969 # -----------------------------------------------------------------
970 # Pre-shared-key encryption provides an alternative to certificate based
971 # encryption. A bridge can be configured to use PSK with the bridge_identity
972 # and bridge_psk options. These are the client PSK identity, and pre-shared-key
973 # in hexadecimal format with no "0x". Only one of certificate and PSK based
974 # encryption can be used on one
975 # bridge at once.
976 #bridge_identity
977 #bridge_psk
978 
979 allow_anonymous false
980 
981 # =================================================================
982 # External config files
983 # =================================================================
984 
985 # External configuration files may be included by using the
986 # include_dir option. This defines a directory that will be searched
987 # for config files. All files that end in '.conf' will be loaded as
988 # a configuration file. It is best to have this as the last option
989 # in the main file. This option will only be processed from the main
990 # configuration file. The directory specified must not contain the
991 # main configuration file.
992 # Files within include_dir will be loaded sorted in case-sensitive
993 # alphabetical order, with capital letters ordered first. If this option is
994 # given multiple times, all of the files from the first instance will be
995 # processed before the next instance. See the man page for examples.
996 #include_dir
mosquitto.conf

ok,基本没问题了,测试一段时间了