总结一下,机制就是使用一个代理服务器messagebroker,
客户端client连接上这个服务器,然后告诉服务器说,我可以接收哪些类型的消息,
同时,client也可以发布自己的消息,这些消息根据协议的内容,可以被其他client获取。
只要手机客户端,连上服务器,然后就可以接收和发布消息了,不用自己写socket什么了,
低带宽,低耗电量,代码量也少,很简单吧。
package com.pig.test.mqtt
import com.ibm.mqtt.MqttClient
import
com.ibm.mqtt.MqttException
import com.ibm.mqtt.MqttSimpleCallback
public class SubscribeClient {
private final static String
CONNECTION_STRING = "tcp://192.168.1.60:1883"
private final static boolean
CLEAN_START = true
private final static short KEEP_ALIVE =
30//低耗网络,但是又需要及时获取数据,心跳30s
private final static String CLIENT_ID =
"client1"
private final static String[] TOPICS =
{
"Test/TestTopics/Topic1",
"Test/TestTopics/Topic2",
"Test/TestTopics/Topic3",
"tokudu/client1"
}
private
final static int[] QOS_VALUES = {0, 0, 2,
0}
//////////////////
private MqttClient mqttClient =
null
public SubscribeClient(String i){
try {
mqttClient =
new MqttClient(CONNECTION_STRING)
SimpleCallbackHandler
simpleCallbackHandler = new
SimpleCallbackHandler()
mqttClient.registerSimpleHandler(simpleCallbackHandler)//注册接收消息方法
mqttClient.connect(CLIENT_ID+i,
CLEAN_START, KEEP_ALIVE)
mqttClient.subscribe(TOPICS,
QOS_VALUES)//订阅接主题
/**
*
完成订阅后,可以增加心跳,保持网络通畅,也可以发布自己的消息
*/
mqttClient.publish(PUBLISH_TOPICS, "keepalive".getBytes(), QOS_VALUES[0],
true)
} catch (MqttException e) {
// TODO Auto-generated
catch block
e.printStackTrace()
}
}
/**
* 简单回调函数,处理client接收到的主题消息
* @author pig
*
*/
class SimpleCallbackHandler implements MqttSimpleCallback{
/**
* 当客户机和broker意外断开时触发
* 可以再此处理重新订阅
*/
@Override
public void connectionLost() throws Exception {
//
TODO Auto-generated method
stub
System.out.println("客户机和broker已经断开")
}
/**
* 客户端订阅消息后,该方法负责回调接收处理消息
*/
@Override
public void
publishArrived(String topicName, byte[] payload, int Qos, boolean retained)
throws Exception {
// TODO Auto-generated method
stub
System.out.println("订阅主题: " +
topicName)
System.out.println("消息数据: " + new
String(payload))
System.out.println("消息级别(0,1,2): " +
Qos)
System.out.println("是否是实时发送的消息(false=实时,true=服务器上保留的最后消息): " +
retained)
}
}
/**
* 高级回调
* @author pig
*
*/
class AdvancedCallbackHandler implements MqttSimpleCallback{
@Override
public void connectionLost() throws Exception {
//
TODO Auto-generated method stub
}
@Override
public void publishArrived(String arg0, byte[] arg1, int
arg2,
boolean arg3) throws Exception {
// TODO Auto-generated
method stub
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated
method stub
new SubscribeClient("" + i)
}
}
broker服务器,MQTT的jar包,记得下载啊,没有就消息我咯~
到这里,如果完成IBM的MQTT协议实现push消息的实例的,
都会有个问题,好像没考虑到安全问题,如果客户端连上来作乱怎么办呢?
上面用的broker时rsmb的,mqtt的简单服务器。
IBM已经推出了MQTT V3.1版本,已经加入了安全验证机制,不要怕啦。
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
MQTT协议是广泛应用的物联网协议,使用测试MQTT协议需要MQTT的代理。有两种方法使用MQTT服务,一是租用现成的MQTT服务器,如阿里云,百度云,华为云等公用的云平台提供的MQTT服务,使用公用的MQTT服务器的好处是省事,但如果仅仅用于测试学习还需要注册帐号,灵活性差些,有的平台还需要付费。另一方法是自己使用开源的MQTT组件来搭建。MQTT服务器非常多,如apache的ActiveMQ,emtqqd,HiveMQ,Emitter,Mosquitto,Moquette等等。
这里介绍的是用轻量级的mosquitto开源项目来搭建一个属于自己的MQTT服务器。
第一步:需要安装一台linux主机,这不多介绍,可以使用真机安装也可以使用虚拟机安装。如果仅仅是自己测试使用都可以。
第二步:下载mosquitto需要的依赖
sudo apt-get install libssl-devsudo apt-get install uuid-devsudo apt-get install cmake
第三步:下载mosquitto并解压,现在mosquitto官网最新的版本是1.5.1
tar xzvf mosquitto-1.5.1.tar.gz
第四步:编译
cd mosquitto-1.5.1/
make
make install
第五步:启动mosquitto
./mosquitto -v
1535473957: mosquitto version 1.5.1 starting
1535473957: Using default config.
1535473957: Opening ipv4 listen socket on port 1883.
1535473957: Opening ipv6 listen socket on port 1883.
这时候mosquitto就会以默认的参数启动。如果需要带配置文件可以修改配置文件mosquitto.conf,
启动时候加上参数 -c,
./mosquitto -c mosquitto.conf
可以看到,mosquitto监听的端口为1883.
这时候我们的MQTT服务器就搭建好了。可找一个mqtt客户端来测试一下。
先发布一个主题“home/garden/fountain/2”
内容是“hello world”
这时候在mosquitto会打印出下面的log
535474247: New connection from 192.168.1.105 on port 1883.
1535474247: New client connected from 192.168.1.105 as MQTT_FX_Client (c1, k60).
1535474247: No will message specified.
1535474247: Sending CONNACK to MQTT_FX_Client (0, 0)
1535474307: Received PINGREQ from MQTT_FX_Client
1535474307: Sending PINGRESP to MQTT_FX_Client
1535474339: Received PUBLISH from MQTT_FX_Client (d0, q0, r0, m0, 'home/garden/fountain/2', ... (12 bytes))
1535474367: Received PINGREQ from MQTT_FX_Client
1535474367: Sending PINGRESP to MQTT_FX_Client
订阅主题“home/garden/fountain/2”
可以看到收到了自己发布的消息。
用wireshark抓包
可以看到抓到了一个MQTT的publish的报文。
如果熟悉lua编程,使用lua扩展就可以了。可以参考wireshark网站上的例子。我们很多私有的协议也是用lua写解析器的。当然,如果你想从头编译wireshark也可以,不过我觉得还是lua扩展相对容易写一些,并且wireshark目录下的chm帮助文件有lua编写的API参考。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)