如果不了解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注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。