(一)基于阿里云的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包







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


          "                                           


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

其实就这两句

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

TelephonyIMEI = mTm.getDeviceId();


现在配置咱的MQTT


publicclass MainActivity extends Activity {


    String TelephonyIMEI="";


    privateMqttClient client;//clientprivateMqttConnectOptions options;//配置   

    @Override

    protectedvoid 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  */privatevoid MyMqttInit()

    {


        try        {

            //(1)主机地址(2)客户端ID,一般以客户端唯一标识符(不能够和其它客户端重名)(3)最后一个参数是指数据保存在内存(具体保存什么数据,以后再说,其实现在我也不是很确定)client =newMqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence());

        } catch (MqttException e) {

            // TODO Auto-generated catch block            e.printStackTrace();

        }


        options =newMqttConnectOptions();//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是消息publicvoid messageArrived(String arg0, MqttMessage arg1) throws Exception {

                // TODO Auto-generated method stub               

            }


            @Override//订阅主题后会执行到这里publicvoid deliveryComplete(IMqttDeliveryToken arg0) {

                // TODO Auto-generated method stub               

            }


            @Override//连接丢失后,会执行这里publicvoid connectionLost(Throwable arg0) {

                // TODO Auto-generated method stub               

            }

        });

    }


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


publicclass MainActivity extends Activity {


    String TelephonyIMEI="";


    privateMqttClient client;//clientprivateMqttConnectOptions options;//配置MqttConnectThread mqttConnectThread =newMqttConnectThread();//连接服务器任务    @Override

    protectedvoid 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  */privatevoid MyMqttInit()

    {

        .........    }



    /*连接服务器任务*/class MqttConnectThread extends Thread

    {

        publicvoid run()

        {

            try

            {

                client.connect(options);//连接服务器,连接不上会阻塞在这runOnUiThread(newRunnable() {//publicvoid run() {

                        Toast.makeText(getApplicationContext(), "连接成功",500).show();

                    }

                });

            }

            catch (MqttSecurityException e)

            {

                //安全问题连接失败            }

            catch (MqttException e)

            {

                //连接失败原因            }

        }

    }


 现在下载到手机试一试


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

 调试助手链接

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


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


publicclass MainActivity extends Activity {


    String TelephonyIMEI="";


    privateMqttClient client;//clientprivateMqttConnectOptions options;//配置MqttConnectThread mqttConnectThread =newMqttConnectThread();//连接服务器任务    @Override

    protectedvoid 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  */privatevoid MyMqttInit()

    {


        try        {

            //(1)主机地址(2)客户端ID,一般以客户端唯一标识符(不能够和其它客户端重名)(3)最后一个参数是指数据保存在内存(具体保存什么数据,以后再说,其实现在我也不是很确定)client =newMqttClient("tcp://47.93.19.134:1883",TelephonyIMEI,new MemoryPersistence());

        } catch (MqttException e) {

            // TODO Auto-generated catch block            e.printStackTrace();

        }


        options =newMqttConnectOptions();//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是消息publicvoid messageArrived(String arg0, MqttMessage arg1) throws Exception {

                // TODO Auto-generated method stubfinal String topic = arg0;//主题final String msgString = arg1.toString();//消息               

                runOnUiThread(newRunnable() {//publicvoid run() {

                        Toast.makeText(getApplicationContext(),"主题:"+topic+"消息:"+msgString,500).show();

                    }

                });

            }


            @Override//订阅主题后会执行到这里publicvoid deliveryComplete(IMqttDeliveryToken arg0) {

                // TODO Auto-generated method stub               

            }


            @Override//连接丢失后,会执行这里publicvoid connectionLost(Throwable arg0) {

                // TODO Auto-generated method stub               

            }

        });

    }



    /*连接服务器任务*/class MqttConnectThread extends Thread

    {

        publicvoid run()

        {

            try

            {

                client.connect(options);//连接服务器,连接不上会阻塞在这               

                client.subscribe("test",0);//设置(订阅)接收的主题,主题的级别是0               

                runOnUiThread(newRunnable() {//publicvoid 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"




publicclass MainActivity extends Activity {


    String TelephonyIMEI="";


    privateMqttClient client;//clientprivateMqttConnectOptions options;//配置MqttConnectThread mqttConnectThread =newMqttConnectThread();//连接服务器任务   

    Button button;//发送消息按钮    @Override

    protectedvoid 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();//执行连接服务器任务    }


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


        @Override

        publicboolean onTouch(View v, MotionEventevent)

        {

            MqttMessage msgMessage =null;//Mqtt消息变量if(event.getAction() == MotionEvent.ACTION_DOWN)//按下            {

                msgMessage =newMqttMessage("1".getBytes());

            }

            elseif(event.getAction() == MotionEvent.ACTION_UP)//松开            {

                msgMessage =newMqttMessage("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)            }



            returnfalse;

        }

    };


现在下载到手机,

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


 动作一下按钮



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

     接收显示的换一下



runOnUiThread(newRunnable() {//因为操作的是主界面的控件所以用刷新UI的线程,最好用handle哈,我这里怎么简单怎么写publicvoid 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)

    ifstring.find(data,"1") ~= nil then

        gpio.write(RelayPin,1)

    end

    ifstring.find(data,"0") ~= nil then

        gpio.write(RelayPin,0)

    end


end)--[[The Send Msg]]

tmr.alarm(1,1000,1, function()

    ifmqttClient ~= 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               

    ifstatus == dht.OK or status == dht.ERROR_CHECKSUM then

        Temperature = temp;

        Humidity = humi;

        --print("DHT Temperature:"..temp..";".."Humidity:"..humi)

    end

end)

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

    printip =0end)

wifi.eventmon.register(wifi.eventmon.STA_GOT_IP, function(T)

  ifprintip ==0 then

      ip,netmask,gateway = wifi.sta.getip()

      print(gateway)

  end

  printip =1end)


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

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




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

源码链接

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

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容