【转载】(一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通信)

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

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

关于钱的问题,其实自己是花钱买的云服务,虽然自己现在能支付的起,但是呢为了尽量减少支出,自已还有好多好多文章要写,好多好多元器件要买,所以哈会在自己的淘宝上卖源码2元价格,一元捐出,一元自己留着当亲们支付云服务的费用了

如果看不懂也没关系,跟着做就可以了,做完以后您会发现原来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(), "连接成功", 500).show();
                    }
                });
            }
            catch (MqttSecurityException e)
            {
                //安全问题连接失败
            }
            catch (MqttException e)
            {
                //连接失败原因
            }
        }
    }

下载到手机

现在配置一下软件,对了有些参数现在不明白没关系,后面会介绍一下相关的知识,

软件的主题名称要和APP中订阅的主题一样 都是 test

现在连接

现在点击发布消息

看手机端

说明已经能通信了

现在说一下关于主题哈,关于/

现在把手机端的订阅的主题改为"/#"

然后下载到手机

你会发现手机也能接收消息

手机都能接收到消息

# 是一个匹配主题中任意层次数的通配符。比如说,如果你订阅了test/device/#,你就可以接收到以下这些主题的消息。

test/device
test/device/后面随便是什么
咱们的设备可以用"/"来进行分类,咱们的APP呢可以指定接收哪一类的产品的数据"XXXX/#"....是不是很方便

对了如果现在接收两个已知主题的设备假如说是

第一种方式

  

第二种方式
 

结果和上面一样

现在呢在界面加一个按钮,按下发送消息"1",松开发送消息"0"

然后设置发布的主题是"/test/button"

public class MainActivity extends Activity {

    String TelephonyIMEI="";

    private MqttClient client;//client
    private MqttConnectOptions options;//配置
    MqttConnectThread mqttConnectThread = new MqttConnectThread();//连接服务器任务

    Button button;//发送消息按钮
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        button = (Button) findViewById(R.id.button1);//获取发送消息按钮
        button.setOnTouchListener(buttonTouch);//设置按钮的触摸事件

        TelephonyManager mTm = (TelephonyManager)this.getSystemService(TELEPHONY_SERVICE);
        TelephonyIMEI = mTm.getDeviceId();
        //Toast.makeText(getApplicationContext(), TelephonyIMEI, 500).show();
        MyMqttInit();//初始化配置MQTT客户端
        mqttConnectThread.start();//执行连接服务器任务
    }

    /*按钮触摸事件*/
    private OnTouchListener buttonTouch = new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            MqttMessage msgMessage = null;//Mqtt消息变量
            if (event.getAction() == MotionEvent.ACTION_DOWN) //按下
            {
                msgMessage = new MqttMessage("1".getBytes());
            }
            else if (event.getAction() == MotionEvent.ACTION_UP) //松开
            {
                msgMessage = new MqttMessage("0".getBytes());
            }

            try
            {
                client.publish("/test/button",msgMessage);//发送主题为"/test/button"的消息
            } catch (MqttPersistenceException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (MqttException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            catch (Exception e) {
                //其余的状态msgMessage = null;所以加了这个catch (Exception e)
            }

            return false;
        }
    };

现在下载到手机,

调试助手订阅一下主题 "/test/button"

动作一下按钮

现在把发过来的数据用文本框显示,不让他提示了

接收显示的换一下

runOnUiThread(new Runnable() {//因为操作的是主界面的控件所以用刷新UI的线程,最好用handle哈,我这里怎么简单怎么写
                    public void run() {
                        //Toast.makeText(getApplicationContext(),"主题:"+topic+"消息:"+msgString, 500).show();
                        textView.setText("主题:"+topic+"\n消息:"+msgString);
                    }
                });

现在试一下

好了,现在咱开始控制咱的WIFI模块了....用咱的手机控制WIFI板子上的继电器,WIFI模块呢采集温湿度,然后显示在手机的文本框中

自己更倾向于用lua开发,所以要刷入lua的固件哈

关于刷固件可以参考

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

自己已经下载好的固件

链接:https://pan.baidu.com/s/1o8pAISy 密码:9zns

如果亲们自己下载的话别忘了,把mqtt和dht选择上哈

程序--init.lua

wifi.setmode(wifi.STATION)

RelayPin = 2;--RelayPin
gpio.mode(RelayPin,gpio.OUTPUT)--RelayPin
gpio.write(RelayPin,0)--RelayPin

LedPin = 4;--LedPin
gpio.mode(LedPin,gpio.OUTPUT)--LedPin
gpio.write(LedPin,0)--LedPin

DHT11pin = 5--DHT11 GPIO

Temperature = "0";--Storage temperature
Humidity = "0";--Store humidity

apcfg={}
apcfg.ssid="qqqqq"
apcfg.pwd="11223344"
wifi.sta.config(apcfg)
--wifi.sta.connect()
wifi.sta.autoconnect(1)

clientid = wifi.sta.getmac()
mqttClient=nil
mqttConnectedFlage = 0;

Mymqtt = mqtt.Client(clientid, 120,"user", "password");

--[[The connection serve]]
tmr.alarm(0, 1000, 1, function()
    Mymqtt:connect("47.93.19.134", 1883, 0,ConnectSuccess,ConnectFailed)
end)

--[[The connection Success]]
function ConnectSuccess(client)
     client:subscribe("/test/button", 0, subscribeSuccess)

     print("connected")
     mqttClient = client;
     tmr.stop(0);
     mqttConnectedFlage = 1;
end

--[[The connection fails]]
function mqttConnectFailed(client,reason)
   mqttConnectedFlage = 0;
   print("failed reason: " .. reason)
   tmr.start(0);
end

--[[The subscribe Success]]
function subscribeSuccess(client)
    print("subscribe success")
end

--[[The Receive Msg]]
Mymqtt:on("message", function(client, topic, data)
    if  string.find(data,"1") ~= nil then
        gpio.write(RelayPin,1)
    end

    if  string.find(data,"0") ~= nil then
        gpio.write(RelayPin,0)
    end

end)

--[[The Send Msg]]
tmr.alarm(1, 1000, 1, function()

    if mqttClient ~= nil and mqttConnectedFlage == 1 then
        mqttClient:publish("/test/yang","Temperature="..Temperature..";".."Humidity="..Humidity, 0, 0,
          function(client)
            gpio.write(4,1-gpio.read(4))
          end)
    end
end)

--[[The gather humiture data]]
tmr.alarm(5, 2000, 1, function()--Every other 1S
    local status, temp, humi, temp_dec, humi_dec = dht.read11(DHT11pin)--Gathering temperature and humidity
    if status == dht.OK or status == dht.ERROR_CHECKSUM then
        Temperature = temp;
        Humidity = humi;
        --print("DHT Temperature:"..temp..";".."Humidity:"..humi)
    end
end)

printip = 0
wifi.eventmon.register(wifi.eventmon.STA_DISCONNECTED, function(T)
    printip = 0
end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)
   if printip == 0 then
      ip,netmask,gateway = wifi.sta.getip()
      print(gateway)
   end
   printip = 1
end)

现在说一下个个部分的功能,对了关于语法问题和其余的问题就请大家参考我的,其实上面的代码就是参考的官方给的API函数,

我希望亲们最重要的是有自学的能力,而不是需要别人灌输东西的机器.

好了亲们可以自己去测试了

源码链接

https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.7a8f8764Ey3xGc&id=563674399702

wifi的就是上面的,直接复制粘贴过去就好啦

APP源码链接:https://pan.baidu.com/s/1pLKGLrt

自己淘宝店的链接呢在最上面

原文地址:https://www.cnblogs.com/pilink/p/8434302.html

时间: 2024-10-09 12:17:23

【转载】(一)基于阿里云的MQTT远程控制(Android 连接MQTT服务器,ESP8266连接MQTT服务器实现远程通信控制----简单的连接通信)的相关文章

Webrtc入门——基于阿里云ubuntu 最新webrtc Android平台编译详细说明

折腾了好多天,终于将webrtc Android平台的demo编译出来了,发现即使完全按照webrtc官网的编译指南,还是会碰到各种问题.而网上又没有更全面的说明,最后是通过查看webrtc 批处理脚本才最终一步步解决问题.写下这篇文章,希望对大家有帮助. 在编译的过程中,感觉webrtc编译实在是太难了, 但是完成了编译之后,感觉webrtc编译其实是很简单的,造成这个强烈反差的主要原因是,google工程师将几乎所有编译过程中需要使用的软件.依赖配置.环境变量,都已经写成了脚本,你只要运行就

(二)基于阿里云的MQTT远程控制(购买阿里云,在云端安装MQTT,测试MQTT远程通信)

QQ名称为Friday~的网友把他自己买MQTT的过程截图发给了我,今天就说一下如何购买阿里云,安装MQTT可以参考 http://www.cnblogs.com/yangfengwu/p/7764667.html https://blog.csdn.net/frankcheng5143/article/details/52045501 如果有什么问题可以在上面的群里面向他请教 基于阿里云的远程控制,其实就是在云端安装服务器,然后我们的WiFi设备和手机都去连接云端服务器(云端服务器就相当于云端

基于阿里云Ubuntu14.04 64bit部署WordPress博客系统

环境:基于阿里云Ubuntu14.04  64bit服务器系统 1, 安装apache2+mysql5+php5+php5-mysql sudo apt-get install apache2 sudo apt-get install php5 sudo apt-get install mysql-server sudo apt-get install php5-mysql sudo /etc/init.d/apache2 restart 至此重启了apache后应该就已经配置好服务器了,对此先

基于阿里云ECS的phpwind网站备案前如何远程访问调试?

基于阿里云ECS的phpwind网站部署非常方便,但云主机的外网IP绑定域名却比较复杂.先要申请域名,成功后还需要备案.尤其是企业网站备案,需要提交的资料较多,准备资料以及审批的时间较长.这段时间在外网采用IP访问是不行的,显示的是主机宝服务器默认页. 即使域名已经绑定成功,但若未备案的话,采用域名访问也会出现以下“温馨提示”: 那么有没有办法在网站备案批准之前就能远程访问,以便尽早调试?经过摸索,基于阿里云ECS的phpwind网站可以采用以下步骤,在网站域名备案前修改默认的80端口以便使用I

在基于阿里云服务器CentOS6.5下安装Subversion 1.6.5服务

最近阿里云搞了个1元免费提供云服务器的活动,偶心痒痒就申请了一个. 正好可以作为团队的SVN服务器了,下面就来部署SVN服务吧. 一.安装基础环境 apr-1.5.0.tar.gz apr-util-1.5.3.tar.gz pcre-8.35.tar.gz zlib-1.2.8.tar.gz subversion-1.5.6.tar.gz tar -xzvf apr-1.5.0.tar.gz cd apr-1.5.0 ./configure --prefix=/usr/local/apr ma

基于阿里云数加MaxCompute的企业大数据仓库架构建设思路

摘要: 数加大数据直播系列课程主要以基于阿里云数加MaxCompute的企业大数据仓库架构建设思路为主题分享阿里巴巴的大数据是怎么演变以及怎样利用大数据技术构建企业级大数据平台. 本次分享嘉宾是来自阿里云大数据的技术专家祎休 背景与总体思路 数据仓库是一个面向主题的.集成的.非易失的.反映历史变化的数据集合用于支持管理决策. 原文链接:http://click.aliyun.com/m/43803/ 数加大数据直播系列课程,主要以基于阿里云数加MaxCompute的企业大数据仓库架构建设思路为主

云上拍客梨视频 基于阿里云的技术实践分享

摘要: 梨视频大部分的业务都选择了阿里云,其中一个主要原因是阿里云提供基于钉钉群构建的24贴身技术支持,刘隽表示,这种服务模式可以更充分.高效的对接需求,快速得到反馈,这也让梨视频的同学有信心去尝试一些新的方案. 在上海云栖大会视频专场中,梨视频CTO刘隽先生分享了梨视频拍客生产全流程及其背后的技术,同时作为业务使用方,向现场嘉宾阿里云产品的使用实践. 云上拍客梨视频 梨视频是全球第一资讯短视频内容生产和消费平台,拥有5万名全球核心拍客,遍布全球七大洲,覆盖525个国际主要城市和2000多个国内

如何基于阿里云搭建适合初创企业的轻量级架构?

摘要: 在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变.快速部署.持续集成并可以适应多种情况的架构便显得尤为重要.本文主要介绍基于阿里云搭建适合项目初期的后端架构 ----基于阿里云搭建的适合初创企业的轻量级架构 前言在项目的初期往往存在很多变数,业务逻辑时刻在变,而且还要保证快速及时,所以,一个灵活多变.快速部署.持续集成并可以适应多种情况的架构便显得尤为重要.本文主要介绍基于阿里云搭建适合项目初期的后端架构,至于细节操作不作描述,比如nginx配置优

阿里云短信验证_基于阿里云OpenAPI实现

阿里云短信服务 背景简介: 短信验证以及短信通知,目前已经应用的非常广泛,最近因项目需要,需要将原来的短信接口换成阿里云的的短信服务,原项目集成的短信服务能够实现短信的发送以及短信的验证整个过程,简单的来说,原来的短息服务,只需应用申请获取短信,短息服务器会发送短信到指定的手机,用户将验证码发送到短信服务商的服务器,服务器做出验证返回是否通过,而阿里云仅提供短信发送服务,需要自己开发短信的验证.下面简单的介绍一下: 1.获取阿里云AccessKey 用户->Accesskeys:需要自己创建一个