京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通 ...

2021-8-20 15:47| 发布者: zhaojun917| 查看: 1231| 评论: 0

摘要: 如果不了解MQTT的可以看这篇文章 http://www.cnblogs.com/yangfengwu/p/7764667.htmlhttp://www.cnblogs.com/yangfengwu/p/8026014.html如果看不懂也没关系,跟着做就可以了,做完以后您会发现原来MQTT这么好用,也如此 ...

如果不了解MQTT的可以看这篇文章  http://www.cnblogs.com/yangfengwu/p/7764667.html

http://www.cnblogs.com/yangfengwu/p/8026014.html

如果看不懂也没关系,跟着做就可以了,做完以后您会发现原来MQTT这么好用,也如此简单.

对了我要尽量把程序写的烂一些,界面做的烂一些,因为既然是学习用的应该越直观越好.......说一下,自己的服务器因为公开了稳定性上肯定不好,

数据冲突也是可能的,这是第一篇,下面几篇慢慢的来,咱一块慢慢完善哈

实现的功能--手机和WIFI模块都连接MQTT服务器,手机用按钮实现远程控制一个继电器,然后WIFI模块采集的DHT11的温湿度,远程发给手机

不过自己这批贴片的板子要等到后天才到..........................

  

 

 

 

先看一下Android 程序怎么写,首先就是下载个MQTT的jar包

链接:https://pan.baidu.com/s/1bpjRzyB 密码:90vv

新建一个Android 工程就不说了吧...............

将下载的jar包放在一个地方

 

 

我放在了我的Android的源码的根目录

现在在Android 工程导入下载的那个jar包

 

 

 

 

 

 

 

 

 

现在把可能用到的一些权限加上 

 

复制代码
 <!--     获取手机信息权限 -->  
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" ></uses-permission>"
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>  
    <uses-permission android:name="android.permission.CHANGE_CONFIGURATION" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
     <uses-permission android:name="android.permission.WAKE_LOCK"/>
     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
     <uses-permission android:name="android.permission.VIBRATE" />
     <uses-permission android:name="android.permission.WRITE_SETTINGS" />
     <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"></uses-permission>
复制代码

 

现在呢先写个程序获取手机的IMEI号,因为连接的时候每一个客户端的ClientID要求不能一样,咱就用IMEI号代表ClientID

其实就这两句

TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);  
TelephonyIMEI = mTm.getDeviceId();

 

现在配置咱的MQTT

 

复制代码
public class MainActivity extends Activity {
    
    String TelephonyIMEI="";
    
    private MqttClient client;//client
    private MqttConnectOptions options;//配置
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);  
        TelephonyIMEI = mTm.getDeviceId();
        //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show();
        MyMqttInit();
    }
    
    /*  初始化配置Mqtt  */
    private void MyMqttInit()
    {
        
        try
        {
            //(1)主机地址(2)客户端ID,一般以客户端唯一标识符(不能够和其它客户端重名)(3)最后一个参数是指数据保存在内存(具体保存什么数据,以后再说,其实现在我也不是很确定)
            client = new MqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence());
        } catch (MqttException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        options = new MqttConnectOptions();//MQTT的连接设置
        
        options.setCleanSession(true);//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
        
        options.setUserName("username");//设置连接的用户名(自己的服务器没有设置用户名)
        
        options.setPassword("password".toCharArray());//设置连接的密码(自己的服务器没有设置密码)
        
        options.setConnectionTimeout(10);// 设置连接超时时间 单位为秒
        
        options.setKeepAliveInterval(20);// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
        
        client.setCallback(new MqttCallback() {
            @Override//获取的消息会执行这里--arg0是主题,arg1是消息
            public void messageArrived(String arg0, MqttMessage arg1) throws Exception {
                // TODO Auto-generated method stub
                
            }
            
            @Override//订阅主题后会执行到这里
            public void deliveryComplete(IMqttDeliveryToken arg0) {
                // TODO Auto-generated method stub
                
            }
            
            @Override//连接丢失后,会执行这里
            public void connectionLost(Throwable arg0) {
                // TODO Auto-generated method stub
                
            }
        });
    }
复制代码

 

 现在连接咱的服务器,连接成功后打印一下连接成功,连接是阻塞的,所以放在一个任务里面执行连接

 

复制代码
public class MainActivity extends Activity {
    
    String TelephonyIMEI="";
    
    private MqttClient client;//client
    private MqttConnectOptions options;//配置
    MqttConnectThread mqttConnectThread = new MqttConnectThread();//连接服务器任务
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);  
        TelephonyIMEI = mTm.getDeviceId();
        //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show();
        MyMqttInit();//初始化配置MQTT客户端
        mqttConnectThread.start();//执行连接服务器任务
    }
    
    /*  初始化配置Mqtt  */
    private void MyMqttInit()
    {
        .........
    }
    
    
    /*连接服务器任务*/
    class MqttConnectThread extends Thread
    {
        public void run()
        {
            try 
            {
                client.connect(options);//连接服务器,连接不上会阻塞在这
                runOnUiThread(new Runnable() {//
                    public void run() {
                        Toast.makeText(getApplicationContext(), "连接成功", 500).show();
                    }
                });
            } 
            catch (MqttSecurityException e) 
            {
                //安全问题连接失败
            } 
            catch (MqttException e) 
            {
                //连接失败原因
            }
        }
    }
复制代码

 

 现在下载到手机试一试

 

 现在呢测试一下通信,测试接收消息,用调试助手发信息,然后手机端接收,然后显示出来

 调试助手链接

链接:https://pan.baidu.com/s/1qYxEeLI 密码:exfj

 

 现在先设置一下APP的订阅的主题,和接收到消息之后就显示出来

 

 

复制代码
public class MainActivity extends Activity {
    
    String TelephonyIMEI="";
    
    private MqttClient client;//client
    private MqttConnectOptions options;//配置
    MqttConnectThread mqttConnectThread = new MqttConnectThread();//连接服务器任务
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);  
        TelephonyIMEI = mTm.getDeviceId();
        //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show();
        MyMqttInit();//初始化配置MQTT客户端
        mqttConnectThread.start();//执行连接服务器任务
    }
    
    /*  初始化配置Mqtt  */
    private void MyMqttInit()
    {
        
        try
        {
            //(1)主机地址(2)客户端ID,一般以客户端唯一标识符(不能够和其它客户端重名)(3)最后一个参数是指数据保存在内存(具体保存什么数据,以后再说,其实现在我也不是很确定)
            client = new MqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence());
        } catch (MqttException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        options = new MqttConnectOptions();//MQTT的连接设置
        
        options.setCleanSession(true);//设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录,这里设置为true表示每次连接到服务器都以新的身份连接
        
        options.setUserName("username");//设置连接的用户名(自己的服务器没有设置用户名)
        
        options.setPassword("password".toCharArray());//设置连接的密码(自己的服务器没有设置密码)
        
        options.setConnectionTimeout(10);// 设置连接超时时间 单位为秒
        
        options.setKeepAliveInterval(20);// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线,但这个方法并没有重连的机制
        
        client.setCallback(new MqttCallback() {
            @Override//获取消息会执行这里--arg0是主题,arg1是消息
            public void messageArrived(String arg0, MqttMessage arg1) throws Exception {
                // TODO Auto-generated method stub
                final String topic = arg0;//主题
                final String msgString = arg1.toString();//消息
                
                runOnUiThread(new Runnable() {//
                    public void run() {
                        Toast.makeText(getApplicationContext(),"主题:"+topic+"消息:"+msgString, 500).show();
                    }
                });
            }
            
            @Override//订阅主题后会执行到这里
            public void deliveryComplete(IMqttDeliveryToken arg0) {
                // TODO Auto-generated method stub
                
            }
            
            @Override//连接丢失后,会执行这里
            public void connectionLost(Throwable arg0) {
                // TODO Auto-generated method stub
                
            }
        });
    }
    
    
    /*连接服务器任务*/
    class MqttConnectThread extends Thread
    {
        public void run()
        {
            try 
            {
                client.connect(options);//连接服务器,连接不上会阻塞在这
                
                client.subscribe("test",0);//设置(订阅)接收的主题,主题的级别是0
                
                runOnUiThread(new Runnable() {//
                    public void run() {
                        Toast.makeText(getApplicationContext(), 
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-1 17:53 , Processed in 0.036096 second(s), 19 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.