HTTP和MQTT协议实践
目录
一. 安装Java开发环境和Java IDE编程工具 Eclipse 或 IDEA,基于HTTP协议(严格地说是 "REST接口规范")读取互联网上web服务网站实现:
1)读取指定城市的天气预报信息
package cn.mqtt;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;
public class orderWeather {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String weather= URLEncoder.encode("重庆天气","UTF-8");
//1. 先准备一个URL类的对象 u
URL url = new URL("https://api.jisuapi.com/iqa/query?appkey=62958a3a6ef3c56d&question="+weather);
//2. 打开服务器连接,得到连接对象 conn
URLConnection conn = url.openConnection();
//3. 获取加载数据的字节输入流 is
InputStream is = conn.getInputStream();
//4. 将is装饰为能一次读取一行的字符输入流 br
BufferedReader br = new BufferedReader(new InputStreamReader(is,"UTF-8"));
//5. 加载一行数据
String text = br.readLine();
//6. 显示
int i=text.indexOf("content");
int j=text.indexOf("relquestion");
String text1=text.substring(i+10, j-3);
int m=text1.indexOf("<5.4m\\/s\\r\\n");
String text2="";
text2=text1.substring(m+12, text1.length());
text1=text1.substring(0, m);
System.out.println(text1);
System.out.println(text2);
//7. 释放资源
br.close();
}
}
效果展示:
2)给指定手机号码发送验证码
1.创建一个网建短信通的账户,每个用户都有五条免费的信息可以发送。
2.记住自己的用户名、接口安全秘钥
3.代码
在网建短信通的接口API中可以找到JAVA的实例可以下载下来
主函数:
public class test {
//用户名
private static String Uid = "wq13752962783";
//接口安全秘钥
private static String Key = "d41d8cd98f00b204e980";
//手机号码,多个号码如13800000000,13800000001,13800000002
private static String smsMob = "15823360554";
//短信内容
private static String smsText = "【重庆交通大学物联网二班】验证码:631707060232 张鑫";
public static void main(String[] args) {
HttpClientUtil client = HttpClientUtil.getInstance();
//UTF发送
int result = client.sendMsgUtf8(Uid, Key, smsText, smsMob);
if(result>0){
System.out.println("UTF8成功发送条数=="+result);
}else{
System.out.println(client.getErrorMsg(result));
}
}
}
展示结果:
二. 学习和熟悉MQTT 协议
1)在本机上安装MQTT服务器和客户端软件,练习消息发布与订阅
1.MQTT服务器:EMQX
把MQTT服务器安装到云主机上的ubuntu系统上
参考步骤:https://blog.csdn.net/sulang521/article/details/106857471
效果展示:
云主机:
emqx启动:
2.客户端:MQTTX、
2)利用网上提供的MQTT服务,编写MQTT客户端程序(python、java或c#、c/c++, 任意一种编程语言),自定义一个天气预报主题,完成订阅与发布。思考MQTT与前面REST协议的区别。
1.在idea中写下客户端代码
package cn.mqtt;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttTopic;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.concurrent.ScheduledExecutorService;
public class ClientMQTT {
public static final String HOST = "tcp:自己的云主机外网地址";
public static final String TOPIC = "1";
private static final String clientid = "Client";
private MqttClient client;
private MqttConnectOptions options;
private String userName = "admin";
private String passWord = "public";
private ScheduledExecutorService scheduler;
private void start() {
try {
// host为主机名,clientid即连接MQTT的客户端ID,一般以唯一标识符表示,MemoryPersistence设置clientid的保存形式,默认为以内存保存
client = new MqttClient(HOST, clientid, new MemoryPersistence());
// MQTT的连接设置
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(true);
// 设置连接的用户名
options.setUserName(userName);
// 设置连接的密码
options.setPassword(passWord.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
// 设置回调
client.setCallback(new PushCallback());
MqttTopic topic = client.getTopic(TOPIC);
//setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
options.setWill(topic, "close".getBytes(), 2, true);
client.connect(options);
//订阅消息
int[] Qos = {1};
String[] topic1 = {TOPIC};
client.subscribe(topic1, Qos);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws MqttException {
ClientMQTT client = new ClientMQTT();
client.start();
}
}
效果展示: