魅族魅蓝emqtte怎么读

Android开发之学习一(10)
MQTT开发文档
&&&&&&& 首先,我们简单的提一下mqtt是什么;MQTT(Message Queuing TelemetryTransport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
&&&&&&& 上面的这些语言都太官方了,我觉得总结一句话就是:连上mqtt之后,服务器那边就可以在你不断的情况下给你推送数据,并且实时性比较好;
&&&&&&& 现在就让我们来总结一下我们所使用的mqtt到底是怎么工作的,方便以后查阅的时候少走弯路。
一、既然要使用官方提供的mqtt协议,那么就必须导入官方给出的jar包我们使用的是IBM公司提供的jar包。
二、既然要让它一直在后台运行,则必须通过服务来是这个操作符合我们的要求,为啥用服务这个就不需要我多说了啥。
&&&&&& 既然是链接前后台的服务器,那么链接的状态可能要分很多种,例如:
switch (connectionStatus)
case INITIAL:
status = &Please wait&;
case CONNECTING:
status = &Connecting...&;
case CONNECTED:
status = &Connected&;
case NOTCONNECTED_UNKNOWNREASON:
status = &Not connected - waiting for network connection&;
case NOTCONNECTED_USERDISCONNECT:
status = &Disconnected&;
case NOTCONNECTED_DATADISABLED:
status = &Not connected - background data disabled&;
case NOTCONNECTED_WAITINGFORINTERNET:
status = &Unable to connect&;// 无线网断开之后就提示这个信息
&&&&&& 就会有以上的六种状态信息;链接的状态是通过发送广播的形式发送的:
(1)、断开链接的广播:
connectionStatus = MQTTConnectionStatus.NOTCONNECTED_USERDISCONNECT;
// inform the app that the app has successfully disconnected
broadcastServiceStatus(&Disconnected&);
(2)、尝试链接,但未链接上:
connectionStatus = MQTTConnectionStatus.NOTCONNECTED_WAITINGFORINTERNET;
// inform the app that we are not connected any more
broadcastServiceStatus(&Connection lost - no network connection&);
(3)、链接断开,重新链接:
connectionStatus = MQTTConnectionStatus.NOTCONNECTED_UNKNOWNREASON;
// inform the app that we are not connected any more, and are
// attempting to reconnect
broadcastServiceStatus(&Connection lost - reconnecting...&);
(4)、由于其他的原因导致无法链接:
connectionStatus = MQTTConnectionStatus.NOTCONNECTED_UNKNOWNREASON;
// inform the app that we failed to connect so that it can update
// the UI accordingly
broadcastServiceStatus(&Invalid connection parameters&);
(5)、链接成功:
broadcastServiceStatus(&Connected&);// 状态---已连接
// we are connected
connectionStatus = MQTTConnectionStatus.CONNECTED;
(6)、未能链接上:
connectionStatus = MQTTConnectionStatus.NOTCONNECTED_UNKNOWNREASON;
// inform the app that we failed to connect so that it can update
// the UI accordingly
broadcastServiceStatus(&Unable to connect&);
每一种链接的状态都会发送相应的状态信息,在log中打印出来,让我们很直观的看到此时的mqtt处于哪一种状态。
三、我们在链接mqtt的时候需要先定义一个链接的接口:
mqttClient = MqttClient.createMqttClient(mqttConnSpec,
usePersistence);
&pre name=&code& class=&html&&String mqttConnSpec = &tcp://& + brokerHostName + &@&
+ brokerPortN
详细信息是:“tcp://”;
private boolean connectToBroker()
上面的这个方法是判断当前的链接是否存在,存在返回true,不存在返回false,然后在执行后面的操作;
mqttClient.connect(generateClientId(), cleanStart, keepAliveSeconds);
&&&&&&&& 此时才是mqtt建立链接的操作,第一个参数generateClientID()是建立链接的一个关键字,是为了区分不同的主机链接到mqtt,方便服务器那边进行区分。(“fiber1/Android手机自带的序列号,这个码是唯一的,每一部手机都是不一样的,这样才能更好的区分)。第二个参数是false。第三个参数是保持心跳,五秒一次。
上面就已经说过了,当它返回的是true的时候,就说明这个链接已经建立成功了,后续的操作就是订阅我们的主题了;
public void subOldDevices()// 重新订阅已绑定的设备
subscribeToTopics(mBindingDevices);
这个mBindingDevices是一个存放设备ID的数组;private static ArrayList&String& mBindingDevices = new ArrayList&String&();
那么这个数组是什嚒时候传过来的呢?
public static void setConfigDevice(String deviceid)
mConfigDevice =
public static ArrayList&String& getBindingDevices()
return mBindingD
public static void setBindingDevices(ArrayList&String& bindingdevices)
mBindingDevices =
public static void addBindingDevice(String deviceid)
if(deviceid !=null)
mBindingDevices.add(deviceid);
我们就需要查看之前的代码;这两个方法就是获取我们在之前的界面传过来的数据或者说程序启动后,从前后台那边获取的设备的数据;有了这个数组,那么就可以根据数组里面额数据取订阅主题了,我们所用到的QoS是1,目的是为了让我们接收到的消息是一定能够接收的到;
for (int i = 0; i & topicsString.size(); i++)
topics[i] = &$TS/ALARM/& + topicsString.get(i);
parms[i] = 1;
利用循环的方法将数据存到指定的数组中;
mqttClient.subscribe(topics, parms);// 订阅的主题嗯和QoS等级
subscribed =
上面的操作才是真正的订阅的操作;
既然有订阅,那么就必须有取消订阅,因为取消订阅是为了让我们的设备在注销之后,不想再收到任何的消息,或者是删除设备之后不想再收到任何的消息是一样的道理。所以这个操作是必不可少的。
public void unsubOldDevices()// 取消所有告警消息的订阅
unsubscribe(mBindingDevices);
取消订阅和订阅的区别就在于订阅的时候需要发送QoS,而取消订阅的时候是不需要发送QoS的;try
mqttClient.unsubscribe(topics);
四、下面的就是接受广播:
1、&&private class BackgroundDataChangeIntentReceiver extends BroadcastReceiver
我们在做这件事的时候,通过请求一个唤醒锁,我们要求尽可能的唤醒锁-只是足够维持处理器的运行,直到我们完成
2、private class NetworkConnectionIntentReceiver extends BroadcastReceiver
所谓的响应于网络连接的变化-在连接到服务器之后,这让我们等待,直到我们有一个可用的数据连接
3、public class PingSender extends BroadcastReceiver
这个广播用于唤醒手机,使手机可以时刻接收mqtt的推送消息;
4、public class StatusUpdateReceiver extends BroadcastReceiver
当mqtt的客户端连接的状态发生改变的时候,通过StatusUpdateReceiver接收广播;
5、public class MQTTMessageReceiver extends BroadcastReceiver
当收到mqtt的推送的消息时,通过MQTTMessageReceiver接收广播;
五、最后就是,当我们收到推送的消息,怎么处理?
通过异步任务,将获取的json数据进行解析,
public static class AlarmTask extends AsyncTask&Void, Void, String&
private String jsonData =
private Context context =
int count = 0;
AlarmTask(String data, Context context)
this.jsonData =
this.context =
protected String doInBackground(Void... params)
ArrayList&CurrentAlarm& curAlarmList = new ArrayList&CurrentAlarm&();
mAlarmDataHelper = AlarmDataHelper.getInstance(context);
if (jsonData != null)
JSONArray jsonArray =
JSONObject jsonobj =
jsonobj = new JSONObject(jsonData);
catch (JSONException e1)
e1.printStackTrace();
String alarmData =
alarmData = jsonobj.getString(&alarm&);
catch (JSONException e1)
e1.printStackTrace();
jsonArray = new JSONArray(alarmData);
catch (JSONException e)
e.printStackTrace();
if (jsonArray != null && jsonArray.length() & 0)
for (int i = 0; i & 1; i++)
JSONObject json =
long restore_time = 0;
long alarm_time = 0;
json = (JSONObject) jsonArray.get(i);
catch (JSONException e)
e.printStackTrace();
restore_time = json.getLong(&restore_time&);
alarm_time = json.getLong(&alarm_time&);
catch (JSONException e)
e.printStackTrace();
if (json != null)
if (restore_time & 0)
HistoryAlarm entity = AlarmParse
.parseHisAlarm(json);
mAlarmDataHelper.restoreAlarm(entity);
if (alarm_time & 0)
CurrentAlarm entity = AlarmParse
.parseCurAlarm(json);
Boolean result = mAlarmDataHelper
.checkCurrentAlarmID(entity
.getUnique_id());
CLog.e(&------------curAlarmList already exist?: &,
if (!result)
curAlarmList.add(entity);
MainApplication.addToastAlarm(
entity.getAlarm_id(), 1);
if (curAlarmList.size() & 0)
mAlarmDataHelper.insertCurrentAlarm(curAlarmList);
注意:在网络断开之后,我们没有重连的机制,只有在网络重新链接上之后,我们才会去再链接mqtt(重连的机制还是和第一次链接的机制一致),断网时,我们也没有必要去链接,因为这本身就是不通的,一直链接,反而会造成阻塞;
需要源码的请留言,后续补上!!!!
欢迎转载,注明出处,谢谢!!!
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5567次
排名:千里之外
原创:16篇
(1)(2)(1)(2)(2)(1)(1)(1)(4)(7)1521人阅读
消息推送(2)
本文利用开源软件对MQTT协议进行了消息推送进行分析。其中引用了网上的部分内容;
其中的一些图片请参见下面链接中的完整文件:
IBM(R)&WebSphere(R)&MQ&Telemetry&Transport(简称&MQTT)是一种基于&TCP/IP&的轻量级发布&/&预订协议,用于连接大量的远程传感器和控制设备。它可以工作在低带宽,不可靠的通信并且占用较少内存的设备上。
MQTT&产品作为&WebSphere&MQ&产品的扩展,使用了&MQTT&V3.1&版本的协议。它提供了一些小型客户机库,可以将这些客户机库嵌入到运行于不同设备平台上的智能设备中。使用客户机构建的应用程序使用&MQ&Telemetry&Transport(MQTT)&和&WebSphere&MQ&Telemetry&服务并借助&WebSphere&MQ&来可靠地发布和预订消息。一个高级&MQTT&客户机(即设备的&WebSphere&MQ&Telemetry&守护程序)可以运行于多种平台上。它可以充当一个网络集中器,能够将更多的&MQTT&客户机连接至单个队列管理器。对于在网络发生短暂中断期间无法缓存消息的小型设备,它还可以为这些小型设备提供存储转发功能。
l&协议简单,MQTT_V3.1_Protocol_Specific总共只有42页。相比来说XMPP看起来就要复杂很多;
l&基于&TCP/IP&的轻量级发布&/&预订协议,用于连接大量的远程传感器和控制设备。
l&固定头长度仅为2字节,因此传输快速,省流量;可以工作在低带宽,不可靠的通信并且占用较少内存的设备上;
l&网上有大量的源码客户端以及开源lib,方便各种平台的客户端开发。其中有C语言编写的,适合嵌入式系统;同时也有android上的实现。
l&Apache&ActiveMQ,Apache&Apollo这分布式开源服务器均支持MQTT协议,使用JAVA语言实现,支持多平台。Server端搭建起来相对来说比较简单,server支持集群,消息缓存等机制。
1.&推送原理分析
实际上,其他推送系统(包括GCM、XMPP方案)的原理都与此类似。
2.&Mosquitto&、android客户端、PHP客户端交互测试
消息中转服务端准备
开源项目Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy&Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案。
Mosquitto提供了Windows、Linux以及qnx系统的版本,安装文件可从地址中获取(建议使用最新的1.1.x版本)。Windows系统下的安装过程非常简单,我们甚至可以把Mosquitto直接安装成为系统服务;但是,在实际应用中,我们更倾向于使用Linux系统的服务器,接下来我们就将重点介绍Linux版Mosquitto的安装方法。
在Linux系统上安装Mosquitto,本人建议大家使用源码安装模式,最新的源码可从地址中获取。解压之后,我们可以在源码目录里面找到主要的配置文件config.mk,其中包含了所有Mosquitto的安装选项,详细的参数说明如下:
[root@109&mosquitto-1.3.2]#&cat&config.mk&
#&=============================================================================
#&User&configuration&section.
#&Largely,&these&are&options&that&are&designed&to&make&mosquitto&run&more
#&easily&in&restrictive&environments&by&removing&features.
#&Modify&the&variable&below&to&enable/disable&features.
#&Can&also&be&overriden&at&the&command&line,&e.g.:
#&make&WITH_TLS=no
#&=============================================================================
#&Uncomment&to&compile&the&broker&with&tcpd/libwrap&support.
#WITH_WRAP:=yes
#&Comment&out&to&disable&SSL/TLS&support&in&the&broker&and&client.
#&Disabling&this&will&also&mean&that&passwords&must&be&stored&in&plain&text.&It
#&is&strongly&recommended&that&you&only&disable&WITH_TLS&if&you&are&not&using
#&password&authentication&at&all.
#WITH_TLS:=yes
#&Comment&out&to&disable&TLS/PSK&support&in&the&broker&and&client.&Requires
#&WITH_TLS=yes.
#&This&must&be&disabled&if&using&openssl&&&1.0.
#WITH_TLS_PSK:=yes
#&Comment&out&to&disable&client&client&threading&support.
#WITH_THREADING:=yes
#&Uncomment&to&compile&the&broker&with&strict&protocol&support.&This&means&that
#&both&the&client&library&and&the&broker&will&be&very&strict&about&protocol
#&compliance&on&incoming&data.&Neither&of&them&will&return&an&error&on
#&incorrect&&remaining&length&&values&if&this&is&commented&out.&The&old
#&behaviour&(prior&to&0.12)&is&equivalent&to&compiling&with
#&WITH_STRICT_PROTOCOL&defined&and&means&that&clients&will&be&immediately
#&disconnected&from&the&broker&on&non-compliance.
#WITH_STRICT_PROTOCOL:=yes
#&Comment&out&to&remove&bridge&support&from&the&broker.&This&allow&the&broker
#&to&connect&to&other&brokers&and&subscribe/publish&to&topics.&You&probably
#&want&to&leave&this&included&unless&you&want&to&save&a&very&small&amount&of
#&memory&size&and&CPU&time.
#WITH_BRIDGE:=yes
#&Comment&out&to&remove&persistent&database&support&from&the&broker.&This
#&allows&the&broker&to&store&retained&messages&and&durable&subscriptions&to&a
#&file&periodically&and&on&shutdown.&This&is&usually&desirable&(and&is
#&suggested&by&the&MQTT&spec),&but&it&can&be&disabled&if&required.
#WITH_PERSISTENCE:=yes
#&Comment&out&to&remove&memory&tracking&support&from&the&broker.&If&disabled,
#&mosquitto&won't&track&heap&memory&usage&nor&export&'$SYS/broker/heap/current
#&size',&but&will&use&slightly&less&memory&and&CPU&time.
#WITH_MEMORY_TRACKING:=yes
#&Compile&with&database&upgrading&support?&If&disabled,&mosquitto&won't
#&automatically&upgrade&old&database&versions.
#&Not&currently&supported.
#WITH_DB_UPGRADE:=yes
#&Comment&out&to&remove&publishing&of&the&$SYS&topic&hierarchy&containing
#&information&about&the&broker&state.
WITH_SYS_TREE:=yes
#&Build&with&Python&module.&Comment&out&if&Python&is&not&installed,&or&required
#&Python&modules&are&not&available.
WITH_PYTHON:=yes
#&Build&with&SRV&lookup&support.
#WITH_SRV:=yes
#&=============================================================================
#&End&of&user&configuration
#&=============================================================================
#&Also&bump&lib/mosquitto.h,&lib/python/setup.py,&CMakeLists.txt,
#&installer/mosquitto.nsi,&installer/mosquitto-cygwin.nsi
VERSION=1.3.2
TIMESTAMP:=$(shell&date&&+%F&%T%z&)
#&Client&library&SO&version.&Bump&if&incompatible&API/ABI&changes&are&made.
SOVERSION=1
#&Man&page&generation&requires&xsltproc&and&docbook-xsl
XSLTPROC=xsltproc
#&For&html&generation
DB_HTML_XSL=man/html.xsl
#MANCOUNTRIES=en_GB
。。。。。。
#&是否支持tcpd/libwrap功能.
#WITH_WRAP:=yes
#&是否开启SSL/TLS支持
#WITH_TLS:=yes
#&是否开启TLS/PSK支持
#WITH_TLS_PSK:=yes
#&Comment&out&to&disable&client&client&threading&support.
#WITH_THREADING:=yes
#&是否使用严格的协议版本(老版本兼容会有点问题)
#WITH_STRICT_PROTOCOL:=yes
#&是否开启桥接模式
#WITH_BRIDGE:=yes
#&是否开启持久化功能
#WITH_PERSISTENCE:=yes
#&是否监控运行状态
#WITH_MEMORY_TRACKING:=yes
这里需要注意的是,默认情况下Mosquitto的安装需要OpenSSL的支持;如果不需要SSL,则需要关闭config.mk里面的某些与SSL功能有关的选项(WITH_TLS、WITH_TLS_PSK)。接着,就是运行make&install进行安装,完成之后会在系统命令行里发现mosquitto、mosquitto_passwd、mosquitto_pub和mosquitto_sub四个工具(截图如下),分别用于启动代理、管理密码、发布消息和订阅消息。
在有些电脑上运行make&install可能会出现如下错误,
install&-d&/usr/local/sbin
install&-s&--strip-program=&mosquitto&/usr/local/sbin/mosquitto
install:&unrecognized&option&`--strip-program='
Try&`install&--help'&for&more&information.
解决办法是:修改Makefile文件,删除--strip-program=$(STRIP)
install&:&all
&&&&&&&&$(INSTALL)&-d&${DESTDIR}$(prefix)/sbin
&&&&&&&&$(INSTALL)&-s&--strip-program=$(STRIP)&mosquitto&${DESTDIR}${prefix}/sbin/mosquitto
&&&&&&&&$(INSTALL)&mosquitto_plugin.h&${DESTDIR}${prefix}/include/mosquitto_plugin.h
ifeq&($(WITH_TLS),yes)
&&&&&&&&$(INSTALL)&-s&--strip-program=$(STRIP)&mosquitto_passwd&${DESTDIR}${prefix}/bin/mosquitto_passwd
安装完成之后,所有配置文件会被放置于/etc/mosquitto/目录下,其中最重要的就是Mosquitto的配置文件,即mosquitto.conf,以下是详细的配置参数说明。
1.&#&=================================================================&&
2.&#&General&configuration&&
3.&#&=================================================================&&
5.&#&客户端心跳的间隔时间&&
6.&#retry_interval&20&&
8.&#&系统状态的刷新时间&&
9.&#sys_interval&10&&
11.&#&系统资源的回收时间,0表示尽快处理&&
12.&#store_clean_interval&10&&
14.&#&服务进程的PID&&
15.&#pid_file&/var/run/mosquitto.pid&&
17.&#&服务进程的系统用户&&
18.&#user&mosquitto&&
20.&#&客户端心跳消息的最大并发数&&
21.&#max_inflight_messages&10&&
23.&#&客户端心跳消息缓存队列&&
24.&#max_queued_messages&100&&
26.&#&用于设置客户端长连接的过期时间,默认永不过期&&
27.&#persistent_client_expiration&&
29.&#&=================================================================&&
30.&#&Default&listener&&
31.&#&=================================================================&&
33.&#&服务绑定的IP地址&&
34.&#bind_address&&
36.&#&服务绑定的端口号&&
37.&#port&1883&&
39.&#&允许的最大连接数,-1表示没有限制&&
40.&#max_connections&-1&&
42.&#&cafile:CA证书文件&&
43.&#&capath:CA证书目录&&
44.&#&certfile:PEM证书文件&&
45.&#&keyfile:PEM密钥文件&&
46.&#cafile&&
47.&#capath&&
48.&#certfile&&
49.&#keyfile&&
51.&#&必须提供证书以保证数据安全性&&
52.&#require_certificate&false&&
54.&#&若require_certificate值为true,use_identity_as_username也必须为true&&
55.&#use_identity_as_username&false&&
57.&#&启用PSK(Pre-shared-key)支持&&
58.&#psk_hint&&
60.&#&SSL/TSL加密算法,可以使用“openssl&ciphers”命令获取&&
61.&#&as&the&output&of&that&command.&&
62.&#ciphers&&
64.&#&=================================================================&&
65.&#&Persistence&&
66.&#&=================================================================&&
68.&#&消息自动保存的间隔时间&&
69.&#autosave_interval&1800&&
71.&#&消息自动保存功能的开关&&
72.&#autosave_on_changes&false&&
74.&#&持久化功能的开关&&
75.&persistence&true&&
77.&#&持久化DB文件&&
78.&#persistence_file&mosquitto.db&&
80.&#&持久化DB文件目录&&
81.&#persistence_location&/var/lib/mosquitto/&&
83.&#&=================================================================&&
84.&#&Logging&&
85.&#&=================================================================&&
87.&#&4种日志模式:stdout、stderr、syslog、topic&&
88.&#&none&则表示不记日志,此配置可以提升些许性能&&
89.&log_dest&none&&
91.&#&选择日志的级别(可设置多项)&&
92.&#log_type&error&&
93.&#log_type&warning&&
94.&#log_type&notice&&
95.&#log_type&information&&
97.&#&是否记录客户端连接信息&&
98.&#connection_messages&true&&
100.&#&是否记录日志时间&&
101.&#log_timestamp&true&&
103.&#&=================================================================&&
104.&#&Security&&
105.&#&=================================================================&&
107.&#&客户端ID的前缀限制,可用于保证安全性&&
108.&#clientid_prefixes&&
110.&#&允许匿名用户&&
111.&#allow_anonymous&true&&
113.&#&用户/密码文件,默认格式:username:password&&
114.&#password_file&&
116.&#&PSK格式密码文件,默认格式:identity:key&&
117.&#psk_file&&
119.&#&pattern&write&sensor/%u/data&&
120.&#&ACL权限配置,常用语法如下:&&
121.&#&用户限制:user&&username&&&
122.&#&话题限制:topic&[read|write]&&topic&&&
123.&#&正则限制:pattern&write&sensor/%u/data&&
124.&#acl_file&&
126.&#&=================================================================&&
127.&#&Bridges&&
128.&#&=================================================================&&
130.&#&允许服务之间使用“桥接”模式(可用于分布式部署)&&
131.&#connection&&name&&&
132.&#address&&host&[:&port&]&&
133.&#topic&&topic&&[[[out&|&in&|&both]&qos-level]&local-prefix&remote-prefix]&&
135.&#&设置桥接的客户端ID&&
136.&#clientid&&
138.&#&桥接断开时,是否清除远程服务器中的消息&&
139.&#cleansession&false&&
141.&#&是否发布桥接的状态信息&&
142.&#notifications&true&&
144.&#&设置桥接模式下,消息将会发布到的话题地址&&
145.&#&$SYS/broker/connection/&clientid&/state&&
146.&#notification_topic&&
148.&#&设置桥接的keepalive数值&&
149.&#keepalive_interval&60&&
151.&#&桥接模式,目前有三种:automatic、lazy、once&&
152.&#start_type&automatic&&
154.&#&桥接模式automatic的超时时间&&
155.&#restart_timeout&30&&
157.&#&桥接模式lazy的超时时间&&
158.&#idle_timeout&60&&
160.&#&桥接客户端的用户名&&
161.&#username&&
163.&#&桥接客户端的密码&&
164.&#password&&
166.&#&bridge_cafile:桥接客户端的CA证书文件&&
167.&#&bridge_capath:桥接客户端的CA证书目录&&
168.&#&bridge_certfile:桥接客户端的PEM证书文件&&
169.&#&bridge_keyfile:桥接客户端的PEM密钥文件&&
170.&#bridge_cafile&&
171.&#bridge_capath&&
172.&#bridge_certfile&&
173.&#bridge_keyfile&&
175.&#&自己的配置可以放到以下目录中&&
176.&include_dir&/etc/mosquitto/conf.d&&
#&=================================================================
#&General&configuration
#&=================================================================
#&客户端心跳的间隔时间
#retry_interval&20
#&系统状态的刷新时间
#sys_interval&10
#&系统资源的回收时间,0表示尽快处理
#store_clean_interval&10
#&服务进程的PID
#pid_file&/var/run/mosquitto.pid
#&服务进程的系统用户
#user&mosquitto
#&客户端心跳消息的最大并发数
#max_inflight_messages&10
#&客户端心跳消息缓存队列
#max_queued_messages&100
#&用于设置客户端长连接的过期时间,默认永不过期
#persistent_client_expiration
#&=================================================================
#&Default&listener
#&=================================================================
#&服务绑定的IP地址
#bind_address
#&服务绑定的端口号
#port&1883
#&允许的最大连接数,-1表示没有限制
#max_connections&-1
#&cafile:CA证书文件
#&capath:CA证书目录
#&certfile:PEM证书文件
#&keyfile:PEM密钥文件
#&必须提供证书以保证数据安全性
#require_certificate&false
#&若require_certificate值为true,use_identity_as_username也必须为true
#use_identity_as_username&false
#&启用PSK(Pre-shared-key)支持
#&SSL/TSL加密算法,可以使用“openssl&ciphers”命令获取
#&as&the&output&of&that&command.
#&=================================================================
#&Persistence
#&=================================================================
#&消息自动保存的间隔时间
#autosave_interval&1800
#&消息自动保存功能的开关
#autosave_on_changes&false
#&持久化功能的开关
persistence&true
#&持久化DB文件
#persistence_file&mosquitto.db
#&持久化DB文件目录
#persistence_location&/var/lib/mosquitto/
#&=================================================================
#&=================================================================
#&4种日志模式:stdout、stderr、syslog、topic
#&none&则表示不记日志,此配置可以提升些许性能
log_dest&none
#&选择日志的级别(可设置多项)
#log_type&error
#log_type&warning
#log_type&notice
#log_type&information
#&是否记录客户端连接信息
#connection_messages&true
#&是否记录日志时间
#log_timestamp&true
#&=================================================================
#&Security
#&=================================================================
#&客户端ID的前缀限制,可用于保证安全性
#clientid_prefixes
#&允许匿名用户
#allow_anonymous&true
#&用户/密码文件,默认格式:username:password
#password_file
#&PSK格式密码文件,默认格式:identity:key
#&pattern&write&sensor/%u/data
#&ACL权限配置,常用语法如下:
#&用户限制:user&&username&
#&话题限制:topic&[read|write]&&topic&
#&正则限制:pattern&write&sensor/%u/data
#&=================================================================
#&=================================================================
#&允许服务之间使用“桥接”模式(可用于分布式部署)
#connection&&name&
#address&&host&[:&port&]
#topic&&topic&&[[[out&|&in&|&both]&qos-level]&local-prefix&remote-prefix]
#&设置桥接的客户端ID
#&桥接断开时,是否清除远程服务器中的消息
#cleansession&false
#&是否发布桥接的状态信息
#notifications&true
#&设置桥接模式下,消息将会发布到的话题地址
#&$SYS/broker/connection/&clientid&/state
#notification_topic
#&设置桥接的keepalive数值
#keepalive_interval&60
#&桥接模式,目前有三种:automatic、lazy、once
#start_type&automatic
#&桥接模式automatic的超时时间
#restart_timeout&30
#&桥接模式lazy的超时时间
#idle_timeout&60
#&桥接客户端的用户名
#&桥接客户端的密码
#&bridge_cafile:桥接客户端的CA证书文件
#&bridge_capath:桥接客户端的CA证书目录
#&bridge_certfile:桥接客户端的PEM证书文件
#&bridge_keyfile:桥接客户端的PEM密钥文件
#bridge_cafile
#bridge_capath
#bridge_certfile
#bridge_keyfile
#&自己的配置可以放到以下目录中
include_dir&/etc/mosquitto/conf.d
最后,启动Mosquitto服务很简单,直接运行命令行“mosquitto&-c&/etc/mosquitto/mosquitto.conf&-d”即可开启服务。接下来,就让我们尽情体验Mosquitto的强大功能吧!&
另外,Mosquitto是个异步IO框架,经测试可以轻松处理20000个以上的客户端连接。当然,实际的最大承载量还和业务的复杂度还有比较大的关系。下图是本人在一台普通Linux机器上进行的压力测试结果,大家可以参考。
友情提醒:测试的时候不要忘记调整系统的最大连接数和栈大小,比如:Linux上可用ulimit&-n20000&-s512命令设置你需要的系统参数。
消息接收客户端准备
a&&下载&解压AndroidPushNotificationsDemo项目(下载地址:)
b&&将该项目导入Eclipse中(File&-&&Export&-&&Existing&Projects&into&Workspace)
c&&修改PushService.java中的MQTT_HOST常量为推送服务端的IP地址。如果server端口不是默认的1883的话,端口“MQTT_BROKER_PORT_NUM”也记得要一并修改。
d&&启动Android模拟器,并安装该项目。
注意:在新版本的Android&SDK中可能会遇到以下错误。
08-23&02:28:44.184:&W/dalvikvm(282):&VFY:&unable&to&find&class&referenced&in&signature&(Lcom/ibm/mqtt/MqttP)
08-23&02:28:44.194:&I/dalvikvm(282):&Failed&resolving&Lcom/tokudu/demo/PushService$MQTTC&interface&35&'Lcom/ibm/mqtt/MqttSimpleC'
08-23&02:28:44.194:&W/dalvikvm(282):&Link&of&class&'Lcom/tokudu/demo/PushService$MQTTC'&failed
08-23&02:28:44.194:&E/dalvikvm(282):&Could&not&find&class&'com.tokudu.demo.PushService$MQTTConnection',&referenced&from&method&com.tokudu.demo.PushService.connect
08-23&02:28:44.194:&W/dalvikvm(282):&VFY:&unable&to&resolve&new-instance&42&(Lcom/tokudu/demo/PushService$MQTTC)&in&Lcom/tokudu/demo/PushS
08-23&02:28:44.404:&E/AndroidRuntime(282):&java.lang.VerifyError:&com.tokudu.demo.PushService
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&com.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&android.view.View.performClick(View.java:2408)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&android.view.View$PerformClick.run(View.java:8816)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&android.os.Handler.handleCallback(Handler.java:587)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&android.os.Handler.dispatchMessage(Handler.java:92)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&android.os.Looper.loop(Looper.java:123)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&android.app.ActivityThread.main(ActivityThread.java:4627)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&java.lang.reflect.Method.invokeNative(Native&Method)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&java.lang.reflect.Method.invoke(Method.java:521)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-23&02:28:44.404:&E/AndroidRuntime(282):&&&&&at&dalvik.system.NativeStart.main(Native&Method)
原因是发布的时候没有加入wmqtt.jar包,解决办法如下:
1&&在项目根目录下创建libs目录,并把wmqtt.jar包移入该目录。
2&&重新配置项目的Java&Build&Path(右键菜单中的Properties选项中)。
3&&重新打包发布即可。
运行效果如下:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:101551次
积分:1942
积分:1942
排名:第16878名
原创:78篇
转载:12篇
译文:11篇
评论:47条
(21)(2)(1)(2)(5)(1)(1)(2)(17)(9)(1)(1)(1)(1)(1)(2)(4)(2)(1)(2)(11)(14)

我要回帖

更多关于 魅族魅蓝e怎么样 的文章

 

随机推荐