本文使用的是巴法雲 你也可以使用其他的物聯網平臺 並且 也不一定是小愛 比如小度啊 等等其他的一下應該也是可以實現的 調到java裡面之後 剩下的事情大家就可以想幹嘛就幹嘛了 ...
本文通過巴發雲註冊mqtt服務併在小愛同學註冊實現
為什麼要用巴法雲的 自然是因為他免費啦
1. 準備
1.1註冊巴法雲
https://cloud.bemfa.com/
1.2 在巴法雲上創建mqtt設備雲
註意
- 主題名稱 一開始最好是006結尾 不是數字小愛是不會識別的
- 點擊昵稱就可以直接修改並且昵稱和你呼叫小愛是有關係的
比如我的是電腦百度 我就告訴小愛 "打開電腦百度" 這時我寫的jar就會獲得一條消息 消息內容是"on"
相反"關閉電腦百度" 消息內容就是是"off"
1.3 在小米手機上關聯巴法雲
- 打開米家app -> 我的 -> 連接其他平臺 -> 添加自己的巴法雲
1.4 驗證
- 呼叫小愛同學 "打開"+你的昵稱 我的就是"打開電腦百度"
2 構建springboot項目
主要是監聽和發送巴法雲的mqtt消息並分析所攜帶的值做對應的操作
同理使用mqtt的測試工具 或者 其他語言實現也可以 在此只演示Java
2.1 pom文件
<!-- MQTT -->
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
<version>5.3.1.RELEASE</version>
</dependency>
2.2 增加一個文件就行
下麵這一段只是監聽用的也是我從網上摘下來的一段 鏈接的話.... 忘了
package com.c.bafa.config;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.core.MessageProducer;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.integration.mqtt.core.MqttPahoClientFactory;
import org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter;
import org.springframework.integration.mqtt.outbound.MqttPahoMessageHandler;
import org.springframework.integration.mqtt.support.DefaultPahoMessageConverter;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import java.io.IOException;
@Configuration
public class MqttConfig {
// 消費消息
/**
* 創建MqttPahoClientFactory,設置MQTT Broker連接屬性,如果使用SSL驗證,也在這裡設置。
* @return factory
*/
@Bean
public MqttPahoClientFactory mqttClientFactory() {
DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
MqttConnectOptions options = new MqttConnectOptions();
// 設置代理端的URL地址,可以是多個
options.setServerURIs(new String[]{"tcp://bemfa.com:9501"});
factory.setConnectionOptions(options);
return factory;
}
/**
* 入站通道
*/
@Bean
public MessageChannel mqttInputChannel() {
return new DirectChannel();
}
/**
* 入站
*/
@Bean
public MessageProducer inbound() {
// Paho客戶端消息驅動通道適配器,主要用來訂閱主題
MqttPahoMessageDrivenChannelAdapter adapter = new MqttPahoMessageDrivenChannelAdapter(巴法雲控制台左上角 私鑰,
mqttClientFactory(), 你的主題名稱 我的是"xiaoc006");
adapter.setCompletionTimeout(5000);
// Paho消息轉換器
DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();
// 按位元組接收消息
// defaultPahoMessageConverter.setPayloadAsBytes(true);
adapter.setConverter(defaultPahoMessageConverter);
adapter.setQos(1); // 設置QoS
adapter.setOutputChannel(mqttInputChannel());
return adapter;
}
@Bean
// ServiceActivator註解表明:當前方法用於處理MQTT消息,inputChannel參數指定了用於消費消息的channel。
@ServiceActivator(inputChannel = "mqttInputChannel")
public MessageHandler handler() {
return message -> {
String payload = message.getPayload().toString();
// byte[] bytes = (byte[]) message.getPayload(); // 收到的消息是位元組格式
String topic = message.getHeaders().get("mqtt_receivedTopic").toString();
// 根據主題分別進行消息處理。
if (topic.matches(".+/sensor")) { // 匹配:1/sensor
String sensorSn = topic.split("/")[0];
System.out.println("感測器" + sensorSn + ": 的消息: " + payload);
} else if (topic.equals("collector")) {
System.out.println("採集器的消息:" + payload);
} else if (topic.equals("xiaoc006")) {
System.out.println("通知我的消息:主題[" + topic + "],負載:" + payload);
} else {
System.out.println("丟棄消息:主題[" + topic + "],負載:" + payload);
}
Runtime rt = Runtime.getRuntime();
String url = "https://www.baidu.com/";
try {
rt.exec("rundll32 url.dll,FileProtocolHandler " + url);
} catch (IOException e) {
e.printStackTrace();
}
};
}
// 發送消息
/**
* 出站通道
*/
@Bean
public MessageChannel mqttOutboundChannel() {
return new DirectChannel();
}
/**
* 出站
*/
@Bean
@ServiceActivator(inputChannel = "mqttOutboundChannel")
public MessageHandler outbound() {
// 發送消息和消費消息Channel可以使用相同MqttPahoClientFactory
MqttPahoMessageHandler messageHandler = new MqttPahoMessageHandler("publishClient", mqttClientFactory());
messageHandler.setAsync(true); // 如果設置成true,即非同步,發送消息時將不會阻塞。
messageHandler.setDefaultTopic("command");
messageHandler.setDefaultQos(1); // 設置預設QoS
// Paho消息轉換器
DefaultPahoMessageConverter defaultPahoMessageConverter = new DefaultPahoMessageConverter();
// defaultPahoMessageConverter.setPayloadAsBytes(true); // 發送預設按位元組類型發送消息
messageHandler.setConverter(defaultPahoMessageConverter);
return messageHandler;
}
}