上一章已經部署了mosquito服務器。這裏實現一個簡單的推送服務功能。主要包括兩個部分。一個上傳推送消息的API接口。連接mosquito並推送消息的服務。
簡單的例子可以使用springboot快速開發,使用默認配置即可。
新建maven項目mqtt-server,pom.xml配置文件如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mob</groupId>
<artifactId>mqtt-server</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>mqtt-server Maven Webapp</name>
<url>http://maven.apache.org</url>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>mqtt-server</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
新建springboot啓動類Application.java
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String greeting() {
return "welcome, mqtt server!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
新建mqtt推送服務代碼MqttServer.java
@Component
@ConfigurationProperties(prefix = "my") // 配置文件中的前綴
public class MqttServer {
private String hostName; //地址
private String clientId; //clientId
private String topicName; //主題
private MqttClient client ;
public MqttServer(){
try {
//獲取客戶端連接
client=new MqttClient(hostName,clientId);
//設置參數
MqttConnectOptions options = new MqttConnectOptions();
options.setCleanSession(false);
// options.setUserName(userName);
// options.setPassword(passWord.toCharArray());
// 設置超時時間
//options.setConnectionTimeout(10);
// 設置會話心跳時間
options.setAutomaticReconnect(true);
options.setKeepAliveInterval(20);
client.setCallback(new PushCallback());
client.connect(options);
} catch (MqttException e) {
e.printStackTrace();
}
}
/***
* 發送消息
* @param sendMsg 消息內容
*/
public void publish(String sendMsg){
try {
MqttTopic topic = client.getTopic(topicName);
System.out.println("發送的消息內容爲:"+sendMsg);
MqttMessage message = new MqttMessage(sendMsg.getBytes("utf-8"));
message.setQos(1);
topic.publish(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public String getHostName() {
return hostName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public String getTopicName() {
return topicName;
}
public void setTopicName(String topicName) {
this.topicName = topicName;
}
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public MqttClient getClient() {
return client;
}
public void setClient(MqttClient client) {
this.client = client;
}
}
/***
* 回調函數
* @author ouyjm
*
*/
class PushCallback implements MqttCallback {
@Override
public void connectionLost(Throwable cause) {
// 連接丟失後,一般在這裏面進行重連
System.out.println("連接斷開,可以做重連");
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// publish後會執行到這裏
System.out.println("deliveryComplete---------"+ token.isComplete());
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
// subscribe後得到的消息會執行到這裏面
System.out.println("接收消息主題:"+topic);
System.out.println("接收消息Qos:"+message.getQos());
System.out.println("接收消息內容:"+new String(message.getPayload()));
}
}
新建接收推送消息的API接口MqttApi.java。
@RestController
@RequestMapping("/mqttServer")
public class MqttApi {
@Autowired
private MqttServer mqttServer;
@RequestMapping(value = "/send", method = RequestMethod.GET)
public String sendMessage(String message){
mqttServer.publish(message);
return "send \""+message+"\" to client success!";
}
}
配置文件application.yml中修改了默認端口,以及mqtt服務器相關配置。如下:
server:
port: 9090
my:
hostName: tcp://localhost:1883
clientId: "ibm-mqisdp"
topicName: mqtt
以上爲maven工程的代碼。
使用方式1:
不考慮客戶端實現調試。
- 啓動mqtt服務,見上一章。
- 服務器上啓動一個對mqtt topic的訂閱,見上一章。
- 訪問http://location:9090/mqttServer/send?message=8945782
即可在訂閱的控制檯看到8945782的輸出。
使用方式2:
Android機器聯調。
可以到IBM網站上下載Android的demo。
填入ClientID(通過查看端口占用狀態可以知道lsof -i tcp:1883)、
Host(需要加上tcp://)、
Port(默認1883)後連接。
然後填入Topic訂閱。
這時通過訪問API接口,就能在手機上收到提醒了。