当前位置: 首页 > news >正文

网站建设报表明细/微信小程序怎么做店铺

网站建设报表明细,微信小程序怎么做店铺,内销网站要怎么做,岳阳网站制作公司陈拓 2021/04/16-2021/04/16 1. 概述 在《用C语言实现mosquitto MQTT订阅消息》 https://zhuanlan.zhihu.com/p/365190438 https://blog.csdn.net/chentuo2000/article/details/115747492 一文中我们用C语言实现了mosquitto MQTT同步订阅消息。mosquitto的同步函数是以阻塞…

陈拓 2021/04/16-2021/04/16

 

1. 概述

在《用C语言实现mosquitto MQTT订阅消息》

https://zhuanlan.zhihu.com/p/365190438

https://blog.csdn.net/chentuo2000/article/details/115747492

一文中我们用C语言实现了mosquitto MQTT同步订阅消息。mosquitto的同步函数是以阻塞方式工作的,也就是订阅程序一直等待接收消息,阻塞了其他程序的运行,效率很低。

下面我们用异步mosquitto的函数实现MQTT消息订阅,异步是非阻塞的方式,比同步方式性能更好

2. 修改例子subscribe

2.1 异步与同步程序的差异

  • 异步方式连接服务器的函数mosquitto_connect_async

该函数连接MQTT代理。这是一个非阻塞调用。如果使用mosquitto_connect_async,则客户端必须使用线程接口mosquitto_loop_start。

注意:如果代码中直接使用mosquitto_loop循环,则必须使用同步mosquitto_connect函数连接代理。

例如用下面的循环代替mosquitto_loop_forever函数时

        while(running) {

                mosquitto_loop(mosq, -1, 1);

        }

  • 异步循环函数mosquitto_loop_start

此函数开启一个新线程,在线程里循环调用 mosquitto_loop。

而同步循环函数mosquitto_loop_forever在无限阻塞循环中调用mosquitto_loop。

mosquitto_loop是客户端的主循环函数,必须经常调用它以保持客户机和代理之间的通信正常工作。mosquitto_loop_forever和mosquitto_loop_start都是通过调用mosquitto_loop来实现的。

你也可以直接使用此函数,但不能在回调中调用它。

例如上面用循环mosquitto_loop代替mosquitto_loop_forever函数的例子。

2.2 重写C程序

#include <mosquitto.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>// 定义运行标志决定是否需要结束
static int running = 1;// 当客户端从代理接收到CONNACK消息时调用回调
void on_connect(struct mosquitto *mosq, void *obj, int reason_code)
{int rc;printf("on_connect: %s\n", mosquitto_connack_string(reason_code));if(reason_code != 0){mosquitto_disconnect(mosq);}rc = mosquitto_subscribe(mosq, NULL, "example/temperature", 1);if(rc != MOSQ_ERR_SUCCESS){fprintf(stderr, "Error subscribing: %s\n", mosquitto_strerror(rc));mosquitto_disconnect(mosq);}
}// 当代理在响应订阅发送SUBACK时调用回调
void on_subscribe(struct mosquitto *mosq, void *obj, int mid, int qos_count, const int *granted_qos)
{int i;bool have_subscription = false;for(i=0; i<qos_count; i++){printf("on_subscribe: %d:granted qos = %d\n", i, granted_qos[i]);if(granted_qos[i] <= 2){have_subscription = true;}}if(have_subscription == false){fprintf(stderr, "Error: All subscriptions rejected.\n");mosquitto_disconnect(mosq);}
}// 当客户端收到消息时调用回调该函数
void on_message(struct mosquitto *mosq, void *obj, const struct mosquitto_message *msg)
{// 打印有效载荷printf("%s %d %s\n", msg->topic, msg->qos, (char *)msg->payload);
}// 当断开连接时调用回调该函数
void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
{printf("Call the function: my_disconnect_callback\n");running = 0;
}int main(int argc, char *argv[])
{struct mosquitto *mosq;int rc;// 初始化mosquitto库mosquitto_lib_init();// 创建新的客户端实例。mosq = mosquitto_new(NULL, true, NULL);if(mosq == NULL){fprintf(stderr, "Error: Out of memory.\n");return 1;}// 配置回调函数mosquitto_connect_callback_set(mosq, on_connect);mosquitto_subscribe_callback_set(mosq, on_subscribe);mosquitto_message_callback_set(mosq, on_message);mosquitto_disconnect_callback_set(mosq, on_disconnect);// 连接服务器mosquitto_username_pw_set(mosq, "ct", "1qaz2wsx");rc = mosquitto_connect_async (mosq, "raspberrypi", 1883, 60);if(rc != MOSQ_ERR_SUCCESS){mosquitto_destroy(mosq);fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc));return 1;}// 异步循环rc = mosquitto_loop_start(mosq);if(rc != MOSQ_ERR_SUCCESS){mosquitto_destroy(mosq);fprintf(stderr, "Error: %s\n", mosquitto_strerror(rc));return 1;}// 开始循环printf("Start!\n");while(running){sleep(1);}// 结束后的清理工作mosquitto_destroy(mosq);mosquitto_lib_cleanup();printf("End!\n");return 0;
}

 

2.3 修改例子

  • 进入例子目录

cd mosquitto-2.0.9/examples/subscribe/

  • 备份一下原来的代码

cp basic-1.c basic-1.c-bak

  • 编辑basic-1.c

nano basic-1.c

用重写的C程序替换原来的程序。

3.3 编译

  • 编译

gcc -o basic-1 basic-1.c -lmosquitto

3.4 测试

  • 运行basic-1

./basic-1

从rc = mosquitto_subscribe(mosq, NULL, "example/temperature", 1);可知,订阅的消息主题为example/temperature。

  • 再开一个窗口发布消息

mosquitto_pub -p 1883 -u ct -P xxxxxxxx -t example/temperature -m "26.6"

  • 订阅测试窗口收到消息

  • 用MQTT.fx远程测试

详细说明见《树莓派MQTT服务远程测试MQTT.fx

https://zhuanlan.zhihu.com/p/363373024

https://blog.csdn.net/chentuo2000/article/details/115539377

点击Publish:

订阅测试窗口收到消息

 

参考文档

  1. MQTT通信协议(mosquitto)发布订阅例子C语言实现
    https://blog.csdn.net/qq_33406883/article/details/107466430

 

 

 

 

http://www.jmfq.cn/news/5070691.html

相关文章:

  • 如何做网站手机/成都网络推广运营公司
  • 做按摩网站多少钱/seo是什么及作用
  • 视频网站建设费用明细/淘宝seo关键词的获取方法有哪些
  • 网站服务器如何做端口映射/策划网络营销活动
  • 网页微信版传输助手/南宁百度seo优化
  • 专门做日租房的网站/濮阳市网站建设
  • 做化工的外贸网站都有什么地方/上海百度推广方案
  • wordpress顶部修改/沈阳百度推广排名优化
  • 河东区腾讯网站建设/企业如何做网站
  • 西安到成都/点击精灵seo
  • 京东企业官网/网站优化服务
  • 自建站服务/指数函数求导
  • 厚街找人做网站/锦州网站seo
  • 法人变更在哪个网站做公示/怎么开网站平台
  • 眉山手机网站建设/网站优化是做什么的
  • 网站设计模板素材/如何在百度上做免费推广
  • 网站模板 简洁/微博推广方式有哪些
  • wap网站模式/网站优化外包找谁
  • 可以自己做网站经营吗/关键词优化排名哪家好
  • 在什么网站可以接设计做/厦门seo顾问屈兴东
  • 淄博张店做网站的公司/公司网站注册流程和费用
  • 实时网站制作/湖北搜索引擎优化
  • 网站建设开发价格高吗/免费seo教程资源
  • java源码网站/谷歌网页版入口
  • 有域名有空间如何做网站/软文世界平台
  • seo搜索引擎优化总结报告/广州营销seo
  • 网站备案失效/查排名网站
  • 新手怎么做企业网站/长沙seo服务哪个公司好
  • 开发网站商城/网站源码交易平台
  • 义乌制作网站要多少钱/代做seo排名