将经过broker的所有消息入库
mosquitto的配置
1、用户密码的创建 (可参看http://blog.csdn.net/smellmine/article/details/51216450)
①、创建用户名和密码,在doc下用命令mosquitto_passwd -c pwfile.example userName,其中userName就是要创建的用户名,之后输入两边密码
②、在目录下的pwfile.example里面就有用户名和密码,密码是加密过的。
③、在发布/订阅之前的连接需要携带用户名和密码才可以让broker起到转发作用。
2、修改mosquitto端口
①、默认情况下,mosquitto使用的是1883端口
②、在.conf文件找到port,改成自己需要的端口号。我改成了1884,不能使用已占用的端口。
3、在Windows下还需要将添加的用户名和密码(还有权限)告诉broker
①、pwfile.example 是配置用户名和密码的文件
alfile.example 是配置用户控制权限的文件
②、知道了这些文件的用途之后,我们就可以开始在.conf中进行配置:
allow_anonymous (true|false) —看需求 根据参数组合表改动
password_file 路径/pwfile.example
acl_file 路径/aclfile.example
③、在doc下通过mosquitto -c mosquitto.conf 配置并启动mosquitto
代码实现接收经过broker的消息
*使用通配符(#/+)去订阅所有的主题
private static String URL = "192.168.1.166";
private static String port = "1884";
private static String userName="";
private static String pwd = "";
//public static final String BROKER_URL = "tcp://q.emqtt.com:1883";
public static final String BROKER_URL = "tcp://"+URL+":"+port;
public static final String TOPIC = "#";
private MqttClient serverClient;
private String clientITd;
private MqttClient mqttClient;
private void subscribe() {
try {
//mqttClient = new MqttClient(BROKER_URL, clientITd, new MemoryPersistence());
mqttClient = new MqttClient(BROKER_URL, "LD-client", new MemoryPersistence());
MqttConnectOptions conOptions = new MqttConnectOptions();
conOptions.setCleanSession(false); //清除的标志
conOptions.setUserName(userName); //用户名,密码
conOptions.setPassword(pwd.toCharArray());
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
String message = new String(mqttMessage.getPayload(), "GBK");
MyLog.showLog("收到的字节:" + Arrays.toString(mqttMessage.getPayload()) + "s:" + s);
MyLog.showLog("客户端id::" + mqttMessage.getId());
MyLog.showLog("收到消息内容::" + message);
MyLog.showLog("收到消息级别::" + mqttMessage.getQos());
MyLog.showLog("收到消息是否重复::" + mqttMessage.isDuplicate());
Message msg = handler.obtainMessage();
msg.obj = message;
handler.sendMessage(msg);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
MyLog.showLog("发送完成");
}
});
mqttClient.connect(conOptions);
mqttClient.subscribe(TOPIC, 2);
MyLog.showLog("订阅成功");
} catch (MqttException e) {
e.printStackTrace();
}
}
将数据写入数据库
1.需要导入一个mongo-java-driver-xxx.jar 的包//xxx是版本
Mongo m = new Mongo(URL, 27017); //27017是mongoDB的端口号
// 选择数据库,如果没有这个数据库的话,会自动建立
DB db = m.getDB("broker");
// 建立一个集合,和数据库一样,如果没有,会自动建立
DBCollection collection = db.getCollection("myCollectionTest");
BasicDBObject doc = new BasicDBObject();
doc.put("topic", s); //s是主题
doc.put("message", message);//message是传过来的消息
doc.put("count", 1);
collection.insert(doc);
System.out.println("信息已入库");
//BasicDBObject info = new BasicDBObject();
//info.put("x", 203);
//info.put("y", 102);
//doc.put("info", info);
// 插入一条数据,数据如下
// {
// "name" : "MongoDB",
// "type" : "database",
// "count" : 1,
// "info" : {
// x : 203,
// y : 102
// }
// }
// 可以循环插入多条数据