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();
    }

}

效果展示:

posted @ 2021-01-04 22:38  一蓑烟雨任平生噶  阅读(975)  评论(0编辑  收藏  举报