美文网首页iOS杂记
iOS mqtt & protobuf(二) protobuf配

iOS mqtt & protobuf(二) protobuf配

作者: Avalanching | 来源:发表于2019-03-29 16:45 被阅读0次

    protobuf 协议的安装

    作为iOS的开发者应该都安装了homebrew了吧

    homebrew安装:

    这里不再赘述,没有安装的自行百度

    安装依赖库/依赖工具

    1.安装automake
    $brew install automake
    
    image.png
    安装成功
    image.png
    2.安装libtool
    $brew install libtool
    
    image.png
    安装成功

    以上两个,我都安装过了,所以这里会报警告

    3.安装protobuf
    $brew install protobuf
    
    image.png image.png image.png
    4.到protobuf的官网下载h:ttps://github.com/google/protobuf/releases

    下载文件是第一个的压缩包

    解压后的文件为protobuf-版本号的文件夹,在终端CD到该文件路径下面,执行安装指令

    // 第一步
    $./autogen.sh
    
    image.png
    // 第二步
    $./configure
    # 建议不要使用这个语句, 建议指定一下文件路径
    $./configure --prefix=/usr/local/你的文件名字/
    # 注意,是usr不是user,我这目录的文件不能直接创建文件夹,需要手动创建一个文件,之后采用的语句是:$./configure --prefix=/usr/local/protobuf-3.7.0
    
    image.png
    // 第三步
    $make
    
    // 第四步
    $make check
    
    image.png
    // 第五步
    $make install
    
    image.png

    执行完了上述步骤protobuf的指令集已经安装完毕

    image.png
    配置全局变量
    $open ~/.bash_profile
    

    配置全局变量,配置/usr/local/protobuf-3.7.0/bin/protoc

    image.png
    # 启动配置文件,让bash_profile生效
    $source ~/.bash_profile
    
    # 查看一下编号是否安装成功
    $ $pbf --version
    
    image.png

    protobuf 创建.h和.m文件

    这里实际上就是创建传输的消息结构,简单来说就用于存放消息内容的对象。在用过过程中,现将消息组成对象,通过对象转Data,再传输出去。
    通过.proto文件生成.h和.m文件

    首先创建一下.proto的文件,编写如下代码

    /**
     * 这里创建一个消息的传输体,注意每一个属性最要附上初始值,同一个大括号内的数字不可以重复,但是不同括号可以重复,数字必须从1开始,它要求是一个正整数
     */
    syntax = "proto3";
    message MqttMessageBody{ // 消息体
        int32 num=1;
        string content=2;
        string fromid=3;
        string toid=4;
        message UserInfoBody{
            int32 num=1;
            string username=2;
            string userid=3;
            string avatar=4;
            string mobile=5;
        }
        message Attachment{
            string content=1;
            bool isPush=2;
        }
        enum ChatType{
            SINGL=0;
            MANY=1;
        }
        FromBody from = 5;// 发信者
        ToBody to = 6; // 收信者
        Attachment att = 7;// 附件
        ChatType chattype = 8;
    }
    
    
    
    image.png

    将.proto文件拷贝到/usr/local/protobuf-3.7.0/bin中,这里就是上文提到的文件路径,内有一个protoc的执行文件。

    $mkdir Message 
    # 创建一个文件夹存放一下将要生成的文件
    

    通过.proto文件成功.h和.m文件

    # 成功 这里要用相对路径
    $./protoc MqttMessageBody.proto --objc_out=Message
    

    注意:如遇到这样的报错(定义的属性没有附上数字,请参考上述文件代码和注意事项)


    image.png

    生成代码:


    image.png

    将生成的.h和.m拖到进工程里面了,对.m文件进行ARC适配,操作如下: -fno-objc-arc


    image.png

    protobuf的使用

    对象转Data(封装)

    - (NSData *)data;
    

    data转对象(解析)

    - (instancetype)initWithData:(NSData *)data error:(NSError **)errorPtr
    

    例子:

    #import "ViewController.h"
    #import "MqttMessageBody.pbobjc.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        MqttMessageBody *message = [[MqttMessageBody alloc] init];
        message.num = 100;
        message.content = @"我在测试一下呀";
        message.fromid = @"123456";
        message.toid = @"654321";
    
        // 发信者
        MqttMessageBody_UserInfoBody *from = [[MqttMessageBody_UserInfoBody alloc] init];
        from.userid = @"111111";
        from.username = @"猪猪侠";
        from.avatar = @"http://avalanching.cn/skjkgljadkjlgajskdja.png";
        from.mobile = @"18269285645";
        from.num = 12;
        
        
        // 收信者
        MqttMessageBody_UserInfoBody *to = [[MqttMessageBody_UserInfoBody alloc] init];
        to.userid = @"222222";
        to.username = @"不二狗子";
        to.avatar = @"http://avalanching.cn/skjkgkjkjsfj2222dkjlgajskdja.png";
        to.mobile = @"18565493720";
        to.num = 13;
        
        MqttMessageBody_Attachment *att = [[MqttMessageBody_Attachment alloc] init];
        att.isPush = YES;
        att.content = @"我就是内容呀";
        
        message.to = to;
        message.from = from;
        message.att = att;
        NSLog(@"创建完成的对象:%@", message);
        
        NSData *data = [self creactProtobufData:message];
        
        message = [self getMessageBodyWithData:data];
    }
    
    - (NSData *)creactProtobufData:(MqttMessageBody *)body {
        NSData *data = [body data];
        return data;
    }
    
    - (MqttMessageBody *)getMessageBodyWithData:(NSData *)data {
        NSError *error = nil;
        MqttMessageBody *body = [[MqttMessageBody alloc] initWithData:data error:&error];
        if (!error) {
            NSLog(@"解析出来的对象: %@", body);
        } else {
            NSLog(@"解析失败了:%@", error);
        }
        return  body;
    }
    
    @end
    
    

    打印结果:


    image.png

    相关文章

      网友评论

        本文标题:iOS mqtt & protobuf(二) protobuf配

        本文链接:https://www.haomeiwen.com/subject/ebfrbqtx.html