小工具      在线工具  汉语词典  css  js  c++  java

MAC下搭建MQTT客户端,测试发布和订阅主题

MQTT 额外说明

收录于:45天前

1、下载MQTTKIT开源库,编译出你需要的libMQTTKit.a和头文件。

MQTTKIT开源库github下载地址:点击这里

下载MQTTKIT开源库后,编译(如果想在模拟器上运行客户端,可以直接编译一个模拟器版本的libMQTTKit.a和头文件,否则编译一个手机客户端版本)

编译后的文件截图:

2. MQTT客户端设计(连接服务器、发布主题、订阅主题)

新建一个关于mqtt的xcode项目,然后将上面编译好的libMQTTKit.a和头文件拖到项目中

然后创建一个新类用于连接测试。具体代码如下:

(也可以参考这个github大神写的demo:地址

@implementation LJMQTTViewController

- (void)dealloc
{
    // disconnect the MQTT client
    [self.client disconnectWithCompletionHandler:^(NSUInteger code) {
        // The client is disconnected when this completion handler is called
        NSLog(@"MQTT is disconnected");
    }];
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self initMqttSerive];
    [self createBulletButton];
}

- (void)createBulletButton
{
    UIButton *_ljBtn = [[UIButton alloc]init];
    [_ljBtn setFrame:CGRectMake((screenFrame.size.width - 150)/2.0, (screenFrame.size.height - 50)/2.0 + 120, 150, 50)];
    _ljBtn.backgroundColor = [UIColor grayColor];
    [_ljBtn setTitle:@"Bullet test" forState:UIControlStateNormal];
    [_ljBtn addTarget:self action:@selector(ljBulletBtnClicked) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_ljBtn];
}

- (void)initMqttSerive
{
    // create the MQTT client with an unique identifier
    NSString *clientID = [UIDevice currentDevice].identifierForVendor.UUIDString;
    self.client = [[MQTTClient alloc] initWithClientId:clientID];
    
    // keep a reference on the switch to avoid having a reference to self in the
    // block below (retain/release cycle, blah blah blah)
   // UISwitch *subSwitch = self.subscribedSwitch;
    
    // define the handler that will be called when MQTT messages are received by the client
    [self.client setMessageHandler:^(MQTTMessage *message) {
        // extract the switch status from the message payload
        BOOL on = [message.payloadString boolValue];
        
        // the MQTTClientDelegate methods are called from a GCD queue.
        // Any update to the UI must be done on the main queue
        dispatch_async(dispatch_get_main_queue(), ^{
            //[subSwitch setOn:on animated:YES];
        });
    }];
    
    // connect the MQTT client
    [self.client connectToHost:kMQTTServerHost completionHandler:^(MQTTConnectionReturnCode code) {
        if (code == ConnectionAccepted) {
            // The client is connected when this completion handler is called
            NSLog(@"client is connected with id %@", clientID);
            [self subscribeTop:kTopic];
        }
    }];
    
    //获取话题消息回调
    //[self handleMqttMessage];
}

- (void)ljBulletBtnClicked
{
    [self publishString:@"test"];
}

#pragma mark -- 订阅话题
- (void)subscribeTop:(NSString*)topicStr
{
    // Subscribe to the topic
    [self.client subscribe:topicStr withCompletionHandler:^(NSArray *grantedQos) {
        // The client is effectively subscribed to the topic when this completion handler is called
        NSLog(@"subscribed to topic %@", kTopic);
    }];
}

#pragma mark -- 发布
- (void)publishString:(NSString*)payload
{
    // use the MQTT client to send a message with the switch status to the topic
    [self.client publishString:payload
                       toTopic:kTopic
                       withQos:AtMostOnce
                        retain:YES
             completionHandler:nil];
    // we passed nil to the completionHandler as we are not interested to know
    // when the message was effectively sent
}

#pragma mark -- received message
- (void)handleMqttMessage
{
    // define the handler that will be called when MQTT messages are received by the client
    [self.client setMessageHandler:^(MQTTMessage *message)
     {
        NSLog(@"received message %@", message.payloadString);
    }];
}


此时可以看到控制台的打印信息,表示连接服务器成功,此时就可以发布消息和订阅消息了

从上面的日志中可以看到,当你成功连接到服务器时,服务器会返回一个唯一的ID给你。当服务器想要给你推送消息时,它可以根据你的唯一ID推送给你。

我这里订阅的主题是“#”,代表服务器上的所有主题消息,我​​都能收到。

3.通过PHP网页将主题发送到客户端(这里的服务器是上一篇文章中搭建的mosquitto)

PHP发送的消息截图(http://localhost/PhpM/index.php):

PHP的MQTT环境搭建见我的这篇文章:地址

IOS MQTT客户端收到的消息截图:

. . .

相关推荐

额外说明

springboot静态资源访问及图片回显问题

文章目录 回显问题主要是静态资源上传到src里面导致的,src会编译部署,不会热更新,所以不会重新编译回显 想要在项目中实时热更新,那么我们可以将静态资源放在项目的根目录下,然后配置静态资源放行路径.可以在yaml中配置,也可以在配置类中配置. 如下:

额外说明

前端深拷贝与浅拷贝的实现

1、浅拷贝和深拷贝的定义 1.1、浅拷贝 有两种方式,一种是把一个对象里面的所有的属性值和方法都复制给另一个对象,另一种是直接把一个对象赋给另一个对象,使得两个都指向同一个对象。浅拷贝对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。 1.2、

额外说明

Ubuntu18.04系统中python3.7安装MultiNEAT库

Ubuntu18.04系统中python3.7安装MultiNEAT库 前言 MultiNEAT介绍 安装问题 boost安装 MultiNEAT安装 安装过程遇到问题及解决方法 前言 MultiNEAT介绍 MultiNEAT支持标准的NEAT算法和两

额外说明

VC++修改系统服务的启动类型并启动服务(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新.

额外说明

[数据库原理与应用]educoder-MySQL 单表查询(一)

目录 第1关:用like匹配字符串 第2关:用BETWEEN AND表达查询范围 第3关:空值的判断  第4关:集合运算符IN的应用  第5关:消除重复结果  第6关:聚合函数应用 第7关:分组查询 第8关:对分组结果进行筛选  相关数据库介绍 图书借阅

额外说明

知识蒸馏DEiT算法实战:使用RegNet蒸馏DEiT模型

文章目录 摘要 最终结论 项目结构 模型和loss model.py代码 losses.py代码 训练Teacher模型 步骤 导入需要的库 定义训练和验证函数 定义全局参数 图像预处理与增强 读取数据 设置模型和Loss 学生网络 步骤 导入需要的库

额外说明

Java学习笔记3.7.3 抽象类、接口与多态 - 多态

文章目录 零、本讲学习目标 一、了解多态 (一)定义 (二)作用 (三)说明 二、案例演示多态 (一)创建动物类 (二)创建鸟类,继承动物类 (三)创建猫类,继承动物类 (四)创建狗类,继承动物类 (五)创建学生类 (六)创建测试类 三、对象的类型转换

额外说明

4. LockSupport与线程中断

4.1 线程中断机制 4.1.1 从阿里蚂蚁金服面试题讲起 Java.lang.Thread下的三个方法: ● 如何中断一个运行中的线程? ● 如何停止一个运行中的线程? 4.1.2 什么是中断机制 ● 首先,一个线程不应该由其他线程来强制中断或停止,而

额外说明

网络基础学习:osi网络七层模型

osi网络七层模型 什么是OSI,什么是ISO? 为什么ISO要提出OSI网络七层模型? OSI七层的划分以及具体内容 第七层 应用层 第六层 表示层 第五层 会话层 第四层 传输层 第三层 网络层 第二层 数据链路层 第一层 物理层 每一层与设备的对应

额外说明

wordpress 重定向_当WordPress搜索查询仅返回一个匹配项时自动重定向

WordPress 重定向 有时,在搜索 WordPress 博客时,您只能在结果中找到一项。根据您网站的组织方式,这应该是用户正在寻找的项目。我们的一位用户询问,如果搜索查询结果只有一个匹配项,是否有一种方法可以重定向到该帖子。在本文中,我们将向您展示

ads via 小工具