潍坊吕剧小武 發表於 2020-6-15 18:05:00

linux下搭建mqtt服务器(mosquitto)

<svg xmlns="http://www.w3.org/2000/svg" style="display: none">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
                  </svg>
                  <p>一、mosquitto源码下载<br> 下载地址:https://mosquitto.org/download/<br> 或者不下载,直接在linux命令行下载:后面的版本可以根据自己的需要去更换。</p>
<pre><code class="prism language-bash">$ <span class="token function">wget</span> https://mosquitto.org/files/source/mosquitto-1.6.10.tar.gz
</code></pre>
<pre><code class="prism language-bash">执行第二步(安装依赖库)再来执行以下安装部分
//解压--<span class="token operator">&gt;</span> 进入目录 --<span class="token operator">&gt;</span> <span class="token function">make</span> 编译 --<span class="token operator">&gt;</span> 安装
$ <span class="token function">sudo</span> apt <span class="token function">install</span> g++
$ <span class="token function">tar</span> zxvf mosquitto-1.6.10.ar.gz
$ <span class="token function">cd</span> mosquitto-1.6.10
$ <span class="token function">sudo</span> <span class="token function">make</span> <span class="token operator">&amp;&amp;</span><span class="token function">make</span> install<span class="token punctuation">(</span>没有make命令的就sudo apt <span class="token function">install</span> make<span class="token punctuation">)</span>
</code></pre>
<p><strong>二、安装依赖库</strong></p>
<pre><code class="prism language-bash">$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> libssl-dev
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> libc-ares-dev
$ <span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> uuid-dev
</code></pre>
<p>检测是否安装成功:<br> 在安装mosquitto成功后,可以在/usr/local/lib文件夹中有libmosquitto.so.1等文件<br> 如果实现源码安装不了的话,建议使用apt直接安装把。</p>
<pre><code class="prism language-bash"><span class="token function">sudo</span> <span class="token function">apt-get</span> <span class="token function">install</span> mosquitto mosquitto-clients
</code></pre>
<pre><code class="prism language-bash">$ <span class="token function">cd</span> /usr/local/lib
$ <span class="token function">ls</span>
</code></pre>
<p><strong>三、链接动态库</strong></p>
<pre><code class="prism language-bash">//创建链接
$ <span class="token function">sudo</span> <span class="token function">ln</span> -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
//更新链接
$ <span class="token function">sudo</span> ldconfig
</code></pre>
<p><strong>四、测试使用</strong><br> 启动服务:</p>
<pre><code class="prism language-bash">mosquitto -v
</code></pre>
<p>订阅主题</p>
<pre><code class="prism language-bash">mosquitto_sub -h localhost -t <span class="token function">test</span> -v
</code></pre>
<p>发布主题和消息:</p>
<pre><code class="prism language-bash">mosquitto_pub -t topic -m hello
</code></pre>
<p>我们就可以看到消息的通信了,只不过你没有购买云服务器,所以你只能在本地端进行消息通信。三个终端实现<br> <img src="https://img-blog.csdnimg.cn/20200615175255655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY3MzYwMw==,size_16,color_FFFFFF,t_70" alt=""><br> <strong>五、设置用户名和密码,建立安全连接</strong><br> 先按照下面操作:</p>
<pre><code class="prism language-bash"><span class="token function">cd</span> /etc/mosquitto/conf.d
<span class="token function">sudo</span> <span class="token function">vi</span> my.conf
输入文件内容:
allow_anonymous <span class="token boolean">false</span>
password_file /etc/mosquitto/pwfile
输完之后保存即可
新建新的用户名和密码:
在/etc/mosquitto目录下执行命令:
<span class="token function">sudo</span>   mosquitto_passwd   -c   pwfile   用户名
回车输入两次密码即可
后台模式启动mosquitto
<span class="token function">sudo</span> mosquitto-d-c   /etc/mosquitto/mosquitto.conf
此时就启动服务了,这时就要你输入正确的用户名和密码才可以进行连接服务了。
</code></pre>
<p>测试工具:mqttbox<br> <img src="https://img-blog.csdnimg.cn/20200615174959155.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY3MzYwMw==,size_16,color_FFFFFF,t_70" alt=""><br> 像上面一样,输入你自己的信息,点击save即可连接到你的mqtt服务。<br> 我来试试消息的通信。</p>
<p><img src="https://img-blog.csdnimg.cn/20200615180040558.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzY3MzYwMw==,size_16,color_FFFFFF,t_70" alt=""><br> 如图所示,消息通信成功。<br> 自此完成了mosquitto的搭建工作了。<br> 附赠mosquitto的选项知识</p>
<pre><code class="prism language-bash">-c 是指定配置文件的路径,默认不需要配置文件。
-d 表示作为守护进程运行在后台。
-p 用来指定监听的端口,默认是 1883 ,使用 TCP 连接,如果要使用 UDP 连接,需要设为 1884。
-v 表示生成详细的运行日志,等价于配置文件中将 log_type 设为 all 。
</code></pre>
<p>客户端接代码:</p>
<pre><code class="prism language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h&gt;</span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdlib.h&gt;</span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;mosquitto.h&gt;</span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;string.h&gt;</span></span>

<span class="token macro property">#<span class="token directive keyword">define</span> HOST "localhost"</span><span class="token comment">//可以改为自己MQTT的服务器地址 如:#define HOST "106.xxx.xxx.xxx"</span>
<span class="token macro property">#<span class="token directive keyword">define</span> PORT1883      </span><span class="token comment">//端口号</span>
<span class="token macro property">#<span class="token directive keyword">define</span> KEEP_ALIVE 60</span>

bool session <span class="token operator">=</span> true<span class="token punctuation">;</span>

<span class="token keyword">void</span> <span class="token function">my_message_callback</span><span class="token punctuation">(</span><span class="token keyword">struct</span> mosquitto <span class="token operator">*</span>mosq<span class="token punctuation">,</span> <span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">struct</span> mosquitto_message <span class="token operator">*</span>message<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>message<span class="token operator">-&gt;</span>payloadlen<span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%s %s"</span><span class="token punctuation">,</span> message<span class="token operator">-&gt;</span>topic<span class="token punctuation">,</span> message<span class="token operator">-&gt;</span>payload<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span>
      <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%s (null)\n"</span><span class="token punctuation">,</span> message<span class="token operator">-&gt;</span>topic<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token function">fflush</span><span class="token punctuation">(</span><span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">my_connect_callback</span><span class="token punctuation">(</span><span class="token keyword">struct</span> mosquitto <span class="token operator">*</span>mosq<span class="token punctuation">,</span> <span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> <span class="token keyword">int</span> result<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i<span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>result<span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token comment">/* Subscribe to broker information topics on successful connect. */</span>
      <span class="token function">mosquitto_subscribe</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token string">"pu"</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//topic 主题:"pu"</span>
    <span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span>
      <span class="token function">fprintf</span><span class="token punctuation">(</span><span class="token constant">stderr</span><span class="token punctuation">,</span> <span class="token string">"Connect failed\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">my_subscribe_callback</span><span class="token punctuation">(</span><span class="token keyword">struct</span> mosquitto <span class="token operator">*</span>mosq<span class="token punctuation">,</span> <span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> <span class="token keyword">int</span> mid<span class="token punctuation">,</span> <span class="token keyword">int</span> qos_count<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">int</span> <span class="token operator">*</span>granted_qos<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> i<span class="token punctuation">;</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"Subscribed (mid: %d): %d"</span><span class="token punctuation">,</span> mid<span class="token punctuation">,</span> granted_qos<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">for</span><span class="token punctuation">(</span>i<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> i<span class="token operator">&lt;</span>qos_count<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">", %d"</span><span class="token punctuation">,</span> granted_qos<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">void</span> <span class="token function">my_log_callback</span><span class="token punctuation">(</span><span class="token keyword">struct</span> mosquitto <span class="token operator">*</span>mosq<span class="token punctuation">,</span> <span class="token keyword">void</span> <span class="token operator">*</span>userdata<span class="token punctuation">,</span> <span class="token keyword">int</span> level<span class="token punctuation">,</span> <span class="token keyword">const</span> <span class="token keyword">char</span> <span class="token operator">*</span>str<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token comment">/* Pring all log messages regardless of level. */</span>
    <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%s\n"</span><span class="token punctuation">,</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">struct</span> mosquitto <span class="token operator">*</span>mosq <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    <span class="token comment">//libmosquitto 库初始化</span>
    <span class="token function">mosquitto_lib_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//创建mosquitto客户端</span>
    mosq <span class="token operator">=</span> <span class="token function">mosquitto_new</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">,</span>session<span class="token punctuation">,</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>mosq<span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"create client failed..\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">mosquitto_lib_cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//设置回调函数,需要时可使用</span>
    <span class="token comment">//mosquitto_log_callback_set(mosq, my_log_callback);</span>
    <span class="token function">mosquitto_connect_callback_set</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span> my_connect_callback<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">mosquitto_message_callback_set</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span> my_message_callback<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);</span>
    <span class="token comment">//客户端连接服务器</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">mosquitto_connect</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span> HOST<span class="token punctuation">,</span> PORT<span class="token punctuation">,</span> KEEP_ALIVE<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token function">fprintf</span><span class="token punctuation">(</span><span class="token constant">stderr</span><span class="token punctuation">,</span> <span class="token string">"Unable to connect.\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//循环处理网络消息</span>
    <span class="token function">mosquitto_loop_forever</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token function">mosquitto_destroy</span><span class="token punctuation">(</span>mosq<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">mosquitto_lib_cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>客户端发代码:</p>
<pre><code class="prism language-c"><span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdio.h&gt;</span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;stdlib.h&gt;</span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;mosquitto.h&gt;</span></span>
<span class="token macro property">#<span class="token directive keyword">include</span> <span class="token string">&lt;string.h&gt;</span></span>

<span class="token macro property">#<span class="token directive keyword">define</span> HOST "localhost"</span><span class="token comment">//可以改为自己MQTT的服务器地址 如:#define HOST "l06.xxx.xxx.xxx" </span>
<span class="token macro property">#<span class="token directive keyword">define</span> PORT1883      </span><span class="token comment">//端口号</span>
<span class="token macro property">#<span class="token directive keyword">define</span> KEEP_ALIVE 60</span>
<span class="token macro property">#<span class="token directive keyword">define</span> MSG_MAX_SIZE512</span>

bool session <span class="token operator">=</span> true<span class="token punctuation">;</span>

<span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">char</span> buff<span class="token punctuation">[</span>MSG_MAX_SIZE<span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">struct</span> mosquitto <span class="token operator">*</span>mosq <span class="token operator">=</span> <span class="token constant">NULL</span><span class="token punctuation">;</span>
    <span class="token comment">//libmosquitto 库初始化</span>
    <span class="token function">mosquitto_lib_init</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token comment">//创建mosquitto客户端</span>
    mosq <span class="token operator">=</span> <span class="token function">mosquitto_new</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">,</span>session<span class="token punctuation">,</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token operator">!</span>mosq<span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"create client failed..\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token function">mosquitto_lib_cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//连接服务器</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">mosquitto_connect</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span> HOST<span class="token punctuation">,</span> PORT<span class="token punctuation">,</span> KEEP_ALIVE<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
      <span class="token function">fprintf</span><span class="token punctuation">(</span><span class="token constant">stderr</span><span class="token punctuation">,</span> <span class="token string">"Unable to connect.\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token comment">//开启一个线程,在线程里不停的调用 mosquitto_loop() 来处理网络信息</span>
    <span class="token keyword">int</span> loop <span class="token operator">=</span> <span class="token function">mosquitto_loop_start</span><span class="token punctuation">(</span>mosq<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">if</span><span class="token punctuation">(</span>loop <span class="token operator">!=</span> MOSQ_ERR_SUCCESS<span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
      <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"mosquitto loop error\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> <span class="token number">1</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">while</span><span class="token punctuation">(</span><span class="token function">fgets</span><span class="token punctuation">(</span>buff<span class="token punctuation">,</span> MSG_MAX_SIZE<span class="token punctuation">,</span> <span class="token constant">stdin</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token constant">NULL</span><span class="token punctuation">)</span>
    <span class="token punctuation">{</span>
                <span class="token comment">/*发布消息*/</span>
                <span class="token function">mosquitto_publish</span><span class="token punctuation">(</span>mosq<span class="token punctuation">,</span><span class="token constant">NULL</span><span class="token punctuation">,</span><span class="token string">"pu"</span><span class="token punctuation">,</span><span class="token function">strlen</span><span class="token punctuation">(</span>buff<span class="token punctuation">)</span><span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">,</span>buff<span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                                        <span class="token comment">//topic 主题:"pu"</span>
                <span class="token function">memset</span><span class="token punctuation">(</span>buff<span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token keyword">sizeof</span><span class="token punctuation">(</span>buff<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
    <span class="token function">mosquitto_destroy</span><span class="token punctuation">(</span>mosq<span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token function">mosquitto_lib_cleanup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre>
<p>编译:</p>
<pre><code class="prism language-c">gcc <span class="token operator">-</span>o mosquitto_client_sub mosquitto_client_sub<span class="token punctuation">.</span>c <span class="token operator">-</span>lmosquitto
</code></pre>
               

</div>
<div id="MySignature" role="contentinfo">
    一键三连呀!<br><br>
来源:https://www.cnblogs.com/jee-cai/p/14095358.html
頁: [1]
查看完整版本: linux下搭建mqtt服务器(mosquitto)