MQTT再学习 -- 搭建MQTT服务器及测试
最近在搞 PM2.5 采集,需要用到 MQTT 传输协议。协议部分看了几天的,讲的七七八八。本身在 intel 上有 写好的MQTT 的源码,现在的工作其实也就是移植到单片机上或者DM368板卡上。不过,对于之前没有接触过的我来说,还是从头开始,搭建服务器及测试一下为好。
MQTT服务器安装有两种,一种是 Mosquitto、另一种是 Apollo,以及它们在 linux 下和 Windows 下的安装。
我们本篇都会来一一做讲解。
一、Ubuntu 下 MQTT 服务器搭建之Apollo
(1) 首先要搞清楚什么是 Apollo
参看:ActiveMQ's next generation of messaging
ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.
翻译一下:
ActiveMQ Apollo是从原始ActiveMQ的基础构建的更快,更可靠,更易于维护的消息代理。 它使用完全不同的线程和消息调度架构来实现。 像ActiveMQ一样,Apollo是一个多协议代理,支持STOMP,AMQP,MQTT,Openwire,SSL和WebSockets。
看到没,有支持 MQTT
(2)安装
先解压
# sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz
查看 bin/apollp.cmd
# cat apollo.cmd @REM @REM Licensed to the Apache Software Foundation (ASF) under one or more @REM contributor license agreements. See the NOTICE file distributed with @REM this work for additional information regarding copyright ownership. @REM The ASF licenses this file to You under the Apache License, Version 2.0 @REM (the "License"); you may not use this file except in compliance with @REM the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, software @REM distributed under the License is distributed on an "AS IS" BASIS, @REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @REM See the License for the specific language governing permissions and @REM limitations under the License. @REM @echo off setlocal if NOT "%APOLLO_HOME%"=="" goto CHECK_APOLLO_HOME PUSHD . CD %~dp0.. set APOLLO_HOME=%CD% POPD :CHECK_APOLLO_HOME if exist "%APOLLO_HOME%\bin\apollo.cmd" goto CHECK_JAVA :NO_HOME echo APOLLO_HOME environment variable is set incorrectly. Please set APOLLO_HOME. goto END :CHECK_JAVA set _JAVACMD=%JAVACMD% if "%JAVA_HOME%" == "" goto NO_JAVA_HOME if not exist "%JAVA_HOME%\bin\java.exe" goto NO_JAVA_HOME if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe goto RUN_JAVA :NO_JAVA_HOME if "%_JAVACMD%" == "" set _JAVACMD=java.exe echo. echo Warning: JAVA_HOME environment variable is not set. echo. :RUN_JAVA set CLASSPATH=%APOLLO_HOME%\lib\apollo-boot.jar set BOOTDIRS=%APOLLO_HOME%\lib if NOT "x%APOLLO_BASE%" == "x" set BOOTDIRS=%APOLLO_BASE%\lib;%BOOTDIRS% if "%JVM_FLAGS%" == "" set JVM_FLAGS=-server -Xmx1G -XX:-UseBiasedLocking if "%APOLLO_ASSERTIONS%"=="false" goto noAPOLLO_ASSERTIONS set JVM_FLAGS=-ea %JVM_FLAGS% :noAPOLLO_ASSERTIONS if "x%APOLLO_OPTS%" == "x" goto noAPOLLO_OPTS set JVM_FLAGS=%JVM_FLAGS% %APOLLO_OPTS% :noAPOLLO_OPTS if "x%APOLLO_DEBUG%" == "x" goto noDEBUG set JVM_FLAGS=%JVM_FLAGS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 :noDEBUG if "x%APOLLO_PROFILE%" == "x" goto noPROFILE set JVM_FLAGS=-agentlib:yjpagent %JVM_FLAGS% :noPROFILE if "%JMX_OPTS%" == "" set JMX_OPTS=-Dcom.sun.management.jmxremote rem set JMX_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false set JVM_FLAGS=%JVM_FLAGS% %JMX_OPTS% set JVM_FLAGS=%JVM_FLAGS% -Dapollo.home="%APOLLO_HOME%" if NOT "x%APOLLO_BASE%" == "x" set JVM_FLAGS=%JVM_FLAGS% -Dapollo.base="%APOLLO_BASE%" set JVM_FLAGS=%JVM_FLAGS% -classpath "%CLASSPATH%" "%_JAVACMD%" %JVM_FLAGS% org.apache.activemq.apollo.boot.Apollo "%BOOTDIRS%" org.apache.activemq.apollo.cli.Apollo %* :END endlocal GOTO :EOF :EOF
由于搭建 Apollo 环境变量需要有 JAVA_HOME,这个时候需要安装 JDK
安装 JDK
在linux终端输入 getconf LONG_BIT 命令
如果是32位机器,则结果为32
[root@localhost ~]# getconf LONG_BIT 32
如果是64位机器,则结果为64
[root@localhost ~]# getconf LONG_BIT 64
方法二:uname -a
如果是64位机器,会输出x86_64
[chenzhou@testweb01 ~]$ uname -a Linux testweb01 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:00 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
可以看到,uname-a执行后的结果中输出了x86_64,说明该机器是64位的,否则代表该机器是32位的
[root@localhost ~]# uname -a Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux
方法三:file /sbin/init 或者 file /bin/ls
示例:32位机器
file /sbin/init
[root@localhost ~]# file /sbin/init /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
file /bin/ls
[root@localhost ~]# file /bin/ls /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
示例:64位机器
file /sbin/init
[chenzhou@testweb01 ~]$ file /sbin/init /sbin/init: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
file /bin/ls
[chenzhou@testweb01 ~]$ file /bin/ls /bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped
可以通过命令结果中的64-bit或者32-bit来判断该机器是64位还是32位
# uname -a Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux #getconf LONG_BIT 32
通过终端在/usr/local目录下新建java文件夹,命令行:
sudo mkdir /usr/local/java
然后进入java目录,命令行:
cd /usr/local/java
sudo tar xvf jdk-8u25-linux-x64.tar.gz
设置jdk环境变量:
# gedit /etc/profile 在最后添加下面代码: export JAVA_HOME=/usr/local/java/jdk1.8.0_144 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 使用 source /etc/profile 使它立即生效
检验是否安装成功:
# java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)
配置 Apollo
cd apache-apollo-1.7.1/bin/
输入 ./apollo 可以查看帮助
# ./apollo usage: apollo [--log <log_level>] <command> [<args>] The most commonly used apollo commands are: create creates a new broker instance disk-benchmark Benchmarks your disk's speed help Display help information version Displays the broker version See 'apollo help <command>' for more information on a specific command.
创建一个Broker示例:/apollo create mybroker,MQTT服务器都是叫Broker。
# ./apollo create mybroker Creating apollo instance at: mybroker Generating ssl keystore... You can now start the broker by executing: "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker" run Or you can setup the broker as system service and run it in the background: sudo ln -s "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service" /etc/init.d/ /etc/init.d/apollo-broker-service start
后面会有提示怎么启动服务器,以及创建一个service。
启动Apollo :
# ./mybroker/bin/apollo-broker run _____ .__ .__ / _ \ ______ ____ | | | | ____ / /_\ \\____ \ / _ \| | | | / _ \ / | \ |_> > <_> ) |_| |_( <_> ) \____|__ / __/ \____/|____/____/\____/ \/|__| Apache Apollo (1.7.1) Loading configuration file '/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml'. INFO | OS : Linux 3.2.0-23-generic-pae (Ubuntu 12.04 LTS) INFO | JVM : Java HotSpot(TM) Server VM 1.8.0_144 (Oracle Corporation) INFO | Apollo : 1.7.1 (at: /home/tarena/project/MQTT/apache-apollo-1.7.1) INFO | OS is restricting the open file limit to: 100000 INFO | Accepting connections at: tcp://0.0.0.0:61613 INFO | Accepting connections at: tls://0.0.0.0:61614 INFO | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data INFO | Accepting connections at: ws://0.0.0.0:61623/ INFO | Accepting connections at: wss://0.0.0.0:61624/ INFO | Administration interface available at: https://127.0.0.1:61681/ INFO | Administration interface available at: http://127.0.0.1:61680/
之后查看打印信息即可知道MQTT要连接的端口和管理页面端口。
二、Windows 下 MQTT 服务器搭建之Apollo
(1)下载 Apollo
(2)安装
(3)安装 JDK
再次在 cmd 窗口执行 apollo.cmd,可以看到如下的信息,这就和 Ubuntu 下安装对上了。
(4)创建服务器实例
etc:保存实例配置文件
data:保存用于存储持久消息的数据文件
日志:保存旋转日志文件
tmp:保存在代理运行之间安全删除的临时文件
三、Ubuntu 下 MQTT 服务器搭建之Mosquitto
(1)下载相关文件
(2)安装编译
《1》安装 libwebsockets-2.0.2.tar.gz
《2》安装
WITH_WEBSOCKETS:=no
为
WITH_WEBSOCKETS:=yes
至此程序已经安装完毕!
程序文件将默认安装到以下位置
路径 | 程序文件 |
/usr/local/sbin | mosquiotto server |
/etc/mosquitto | configuration |
/usr/local/bin | utility command |
由于操作系统版本及架构原因,很容易出现安装之后的链接库无法被找到,如启动mosquitto客户端可能出现找不到
libmosquitto.so.1文件,因此需要添加链接库路径
修正链接库 vim /etc/ld.so.conf.d/liblocal.conf /usr/local/lib64 /usr/local/lib
修改mosquitto.conf文件
在 /etc/mosquitto/mosquitto.conf 的 Default Listener 一节添加如下几行:
# ================================================================= # Default listener # ================================================================= # IP address/hostname to bind the default listener to. If not # given, the default listener will not be bound to a specific # address and so will be accessible to all network interfaces. # bind_address ip-address/host name #bind_address # Port to use for the default listener. pid_file /var/run/mosquitto.pid user tarena port 1883 max_connections -1 allow_anonymous true listener 8080 protocol websockets
(3)测试
《1》打开mosquitto
# mosquitto -c /etc/mosquitto/mosquitto.conf 1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting 1502159482: Config loaded from /etc/mosquitto/mosquitto.conf. 1502159482: Opening websockets listen socket on port 8080. 1502159482: Opening ipv4 listen socket on port 1883. 1502159482: Opening ipv6 listen socket on port 1883.
mosquitto 选项介绍:
-c,--config文件 从文件加载配置。 如果没有给出,则使用mosquitto.conf(5)中描述的默认值。 -d,--daemon 在后台运行蚊子作为守护进程。 所有其他行为保持不变。 -p,--port 在指定的端口上监听,而不是默认的1883.除了配置文件中的端口设置外,还会起作用。 可以指定多次以打开在不同端口上侦听的多个套接字。 该套接字将绑定到所有网络接口。 -v,--verbose 使用详细日志记录。 这相当于在配置文件中将log_type设置为全部。 这种覆盖和记录选项在配置文件中给出。
《2》订阅主题
此时第一个终端多了一行信息 # mosquitto -c /etc/mosquitto/mosquitto.conf 1502159482: mosquitto version 1.4.14 (build date 2017-08-07 15:54:10+0800) starting 1502159482: Config loaded from /etc/mosquitto/mosquitto.conf. 1502159482: Opening websockets listen socket on port 8080. 1502159482: Opening ipv4 listen socket on port 1883. 1502159482: Opening ipv6 listen socket on port 1883. 1502159601: New connection from 127.0.0.1 on port 1883. 1502159601: New client connected from 127.0.0.1 as mosqsub|2431-ubuntu (c1, k60)
下面的选项可以在命令行中给出,但也可以放置在位于$ XDG_CONFIG_HOME / mosquitto_sub或$ HOME / .config / mosquitto_sub的配置文件中,每行一对 - 吸附值。配置文件中的值将被用作默认值,并且可以通过使用命令行来覆盖。这个例外是-t和-T,如果在配置文件中给出,将不会被覆盖。还要注意,目前一些选项不能被否定,例如-S。具有#作为第一个字符的配置文件行将被视为注释,不会进一步处理。 -a 将输出连接绑定到本地IP地址/主机名。如果需要将网络通信限制在特定接口上,请使用此参数。 -c,--disable-clean-session 禁用“'clean session”标志。这意味着客户端的所有订阅将在断开连接后维护,以及到达的后续QoS 1和QoS 2消息。当客户端重新连接时,它将接收所有排队的消息。如果使用此选项,建议使用 -id 手动设置客户机ID --cafile 定义包含受信任的PEM编码的CA证书的文件的路径。用于启用SSL通信。另请参见--capath --capath 定义包含受信任的PEM编码的CA证书的目录的路径。用于启用SSL通信。 为了--capath正常工作,证书文件必须具有“.crt”作为文件结束,您必须在每次添加/删除证书时运行“c_rehash <path to capath>”。另请参见--cafile --cert 如果服务器需要,定义包含此客户端的PEM编码证书的文件的路径。另请参阅--key。 --ciphers 在客户端支持的TLS密码的openssl兼容列表。有关详细信息,请参阅密码(1)。 -C 在接收到给定的消息数后立即断开并退出程序。例如,在需要单个状态值的shell脚本中这可能很有用。 结合-R来仅打印第一组新消息(即,没有设置保留标志),或者使用 -T 来过滤哪些主题被处理。 -d,--debug 启用调试消息。 - help 显示使用信息。 -h,--host 指定要连接的主机。默认为localhost。 -i,--id 该客户端使用的id。如果没有给出,默认为mosquitto_sub_附加客户端的进程ID。不能与-id-prefix参数同时使用。 -I,-id-prefix 通过追加客户端的进程标识来提供客户端ID的前缀。这在代理使用clientid_prefixes选项时很有用。不能与-id参数同时使用。 --insecure 使用基于证书的加密时,此选项将禁用对服务器证书中服务器主机名的验证。这在测试初始服务器配置时可能很有用,但是通过DNS欺骗可以让恶意第三方冒充您的服务器。仅在测试中使用此选项。如果您需要在生产环境中使用此选项,则您的设置会出现故障,并且无需使用加密。 -k,--keepalive 发送PING命令到经纪人以通知它之前的秒数仍然是连接和运行的。默认为60秒。 - key 如果服务器需要,定义包含此客户端的PEM编码私钥的文件的路径。另请参见--cert。 -N 打印时,不要在有效负载上附加行尾符号。这允许将来自多个消息的有效载荷数据直接传输到另一个应用程序。只有在不使用-v的时候才真正有意义。 -p,--port 连接到指定的端口而不是默认端口1883。 -P, - pw 提供用于与经纪人进行认证的密码。在不指定用户名的情况下使用此参数是无效的。这需要一个支持MQTT v3.1的代理。另请参阅--username选项。 - proxy 指定要连接的SOCKS5代理。支持“无”和“用户名”身份验证类型。 socks-url必须是形式socks5h:// [username [:password] @] host [:port]。协议前缀socks5h表示主机名由代理解析。符号%25,%3A和%40分别被URL解码为%,...和@,如果存在于用户名或密码中。 如果没有给出用户名,则不会尝试认证。如果没有给出端口,则使用默认值为1080。 根据需求,将来可能会有更多SOCKS版本,并且将使用不同的协议前缀,如卷曲(1)所述。 --psk 提供与代理使用的十六进制(无前导0x)预共享密钥,以使用TLS-PSK加密支持。还必须提供--psk身份以启用TLS-PSK。 --psk身份 使用TLS-PSK支持的客户端身份。这可以用来代替用户名
《3》发布内容
此时第二个终端多了一行信息 # mosquitto_sub -v -t test hello world
下面的选项可以在命令行中给出,但是也可以放置在位于$ XDG_CONFIG_HOME / mosquitto_pub或$ HOME / .config / mosquitto_sub的配置文件中,每行一对 - 吸附值。配置文件中的值将被用作默认值,并且可以通过使用命令行来覆盖。这个例外是消息类型选项,其中只能指定一个。还要注意,目前一些选项不能被否定,例如-S。具有#作为第一个字符的配置文件行将被视为注释,不会进一步处理。 -a 将输出连接绑定到本地IP地址/主机名。如果需要将网络通信限制在特定接口上,请使用此参数。 --cafile 定义包含受信任的PEM编码的CA证书的文件的路径。用于启用SSL通信。另请参见--capath --capath 定义包含受信任的PEM编码的CA证书的目录的路径。用于启用SSL通信。 为了--capath正常工作,证书文件必须具有“.crt”作为文件结束,您必须在每次添加/删除证书时运行“c_rehash <path to capath>”。另请参见--cafile --cert 如果服务器需要,定义包含此客户端的PEM编码证书的文件的路径。另请参阅--key。 --ciphers 在客户端支持的TLS密码的openssl兼容列表。有关详细信息,请参阅密码(1)。 -d,--debug 启用调试消息。 -f,--file 发送文件的内容作为消息。 - help 显示使用信息。 -h,--host 指定要连接的主机。默认为localhost。 -i,--id 该客户端使用的id。如果没有给出,默认为mosquitto_pub_附加客户端的进程ID。不能与-id-prefix参数同时使用。 -I,-id-prefix 通过追加客户端的进程标识来提供客户端ID的前缀。这在代理使用clientid_prefixes选项时很有用。不能与-id参数同时使用。 --insecure 使用基于证书的加密时,此选项将禁用对服务器证书中服务器主机名的验证。这在测试初始服务器配置时可能很有用,但是通过DNS欺骗可以让恶意第三方冒充您的服务器。仅在测试中使用此选项。如果您需要在生产环境中使用此选项,则您的设置会出现故障,并且无需使用加密。 -k,--keepalive 发送PING命令到经纪人以通知它之前的秒数仍然是连接和运行的。默认为60秒。 -key 如果服务器需要,定义包含此客户端的PEM编码私钥的文件的路径。另请参见--cert。 -l,--stdin-line 发送从stdin读取的消息,将单独的行分成单独的消息。请注意,空行不会被发送。 -m, - 消息 从命令行发送一条消息。 -n, - 消息 发送null(零长度)消息。 -p,--port 连接到指定的端口而不是默认端口1883。 -P, - pw 提供用于与经纪人进行认证的密码。在不指定用户名的情况下使用此参数是无效的。这需要一个支持MQTT v3.1的代理。另请参阅--username选项。 -proxy 指定要连接的SOCKS5代理。支持“无”和“用户名”身份验证类型。 socks-url必须是形式socks5h:// [username [:password] @] host [:port]。协议前缀socks5h表示主机名由代理解析。符号%25,%3A和%40分别被URL解码为%,...和@,如果存在于用户名或密码中。 如果没有给出用户名,则不会尝试认证。如果没有给出端口,则使用默认值为1080。 根据需求,将来可能会有更多SOCKS版本,并且将使用不同的协议前缀,如卷曲(1)所述。 --psk 提供与代理使用的十六进制(无前导0x)预共享密钥,以使用TLS-PSK加密支持。还必须提供--psk身份以启用TLS-PSK。 --psk身份 使用TLS-PSK支持的客户端身份。如果代理配置为这样做,则可以使用这可以替代用户名。 -q,--qos 指定消息的使用质量,从0,1和2.默认为0。 - quiet 如果给出此参数,则不会打印运行时错误。这排除了在无效用户输入的情况下给出的任何错误消息(例如使用 - 没有端口的端口)。 -r, - 保存 如果保留被赋予,则该消息将被保留为经纪人的“最后已知的良好”值。有关更多信息,请参阅mqtt(7)。 -s,--stdin-file 发送从stdin读取的消息,将整个内容作为单个消息发送。 -S 使用SRV查找来确定要连接的主机。当我们执行查询_mqtt._tcp
不过如果直接将第一个终端关闭再打开 mosquitto 会出现一个问题
(4)取消匿名登录
MQTT再学习 -- 搭建MQTT服务器及测试的更多相关文章
- MQTT再学习 -- 漫谈MQTT协议
先占楼,稍后再讲.先搭建好MQTT服务器和客户端
- MQTT再学习 -- MQTT 客户端源码分析
MQTT 源码分析,搜索了一下发现网络上讲的很少,多是逍遥子的那几篇. 参看:逍遥子_mosquitto源码分析系列 参看:MQTT libmosquitto源码分析 参看:Mosquitto学习笔记 ...
- Git学习 -- 搭建Git服务器
搭建环境 服务器端:CentOS 6.5 IP:192.168.101.129 客户端:CentOS 6.5 . Windows 服务器端: 创建repository版本库,例如/srv/test ...
- 【转载】MQTT的学习之Mosquitto集群搭建
本文出自:http://www.cnblogs.com/yinyi521/p/6087215.html 文章钢要: 1.进行双服务器搭建 2.进行多服务器搭建 一.Mosquitto的分布式集群部署 ...
- Centos7.2 MQTT的学习之Mosquitto搭建&集群搭建&使用
下载安装包http://mosquitto.org/files/source/ 安装依赖yum install -y gcc gcc-c++ libstdc++-develyum install -y ...
- 搭建MQTT服务器
MQTT协议简介 MQTT 是一个基于发布/订阅模式的消息传输协议.它具有轻量级.开放.简单,易于实现,通信带宽要求低等特点.这些特点使得它对机器与机器的通信(M2M)以及物联网应用(IoT)来说是很 ...
- 搭建mqtt服务器apollo
使用的apollo,官网太慢,附上百度云下载地址: 链接:https://pan.baidu.com/s/1NIq6R71hlyPuaUBwPoMPNg 提取码:36vw 原文链接:https://b ...
- 使用EMQ搭建MQTT服务器
前言寒假的时候开始搭建mqtt服务器,一开始使用的是RabbitMQ,基于Erlang语言.但是RabbitMQ的本职工作是AMQP,MQTT只是他的一个插件功能,似乎有些大材小用,很多MQTT的功能 ...
- 快速搭建MQTT服务器(MQTTnet和Apache Apollo)
前言 MQTT协议是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分,http://mqtt.org/. MQTT is a machine-to-machine (M2M)/" ...
随机推荐
- [RGEOS]空间拓扑关系
-1.判断两个线段是否平行 inline bool parallel_seg_seg(Segment_2 S1, Segment_2 S2) { Vector_2 u(S1); Vector_2 v( ...
- loadrunner11的移动端性能测试之场景设计
测试步骤之场景设计(Controller) 进入手工场景 准备好脚本后就可以进行场景设计和执行场景了,从VuGen中进入,见下图: 进入后第一个为目标场景,选择第二个更灵活的手工场景,我的目标人数20 ...
- 利用 TestNG 并行执行用例
原文地址https://testerhome.com/topics/1639 一.测试类*注1 package com.testerhome; import io.appium.java_client ...
- sublime text 2windows下常用快捷键
Ctrl + X 删除行 Ctrl + L 选取行 Ctrl + Shift + M 选取括号内的所有东西 Ctrl + Shift + D 复制行 Ctrl + Enter 插入下一行 Ctrl + ...
- 系统管理命令之tty
在Linux操作系统中,所有外围设备都有其名称与代号,这些名称代号以特殊文件的类型存放于/dev目录下.你可以执行tty指令查询目前使用的终端机的文件名称. 1.命令帮助: # tty -- help ...
- esLint参数设置
package.json { "name": "testEsLint", "version": "1.0.0", &qu ...
- Core Java 6
p277~p279: 1.使用解耦合的 try/catch 和 try/finally 语句块可以提高代码的清晰度,并且会报告 finally 子句中出现的错误. 2.假设利用 return 语句从 ...
- 20145201李子璇《网络对抗》PC平台逆向破解
20145201<网络对抗>PC平台逆向破解 准备阶段 下载安装execstack. 获取shellcode的c语言代码 设置堆栈可执行 将环境设置为:堆栈可执行.地址随机化关闭(2开启, ...
- maven3常用命令、java项目搭建、web项目搭建
------------------------------maven3常用命令--------------------------- 1.常用命令 1)创建一个Project mvn archety ...
- 查找一个Class到底在那一个jar文件里
整理自己的一些笔记,发觉这个命令 ,看起来是用来找一个Class到底在那一个jar文件里的. 虽然没有再测一下,估计是好使的. 先在博客园里记下来,防止自己忘掉. findstr /S /M org. ...