美文网首页
RTMP协议在蓝牙连接中传输数据的运用

RTMP协议在蓝牙连接中传输数据的运用

作者: 天机否 | 来源:发表于2017-07-31 15:40 被阅读122次

    RTMP协议蓝牙传输数据

    RTMP传统定义

    rtmp协议中基本的数据单元被称为消息(message)结构一般为:

    • 时戳:4 byte,单位毫秒。超过最大值后会翻转。
    • 长度:消息负载的长度。
    • 类型ID:Type Id 一部分ID范围用于rtmp的控制信令。还有一部分可以供上层使用,rtmp只是透 传。这样可以方便的在rtmp上进行扩展。
    • 消息流ID:Message Stream ID,用于区分不同流的消息。
    消息结构

    消息在网络中传输时,会被分割成很多小的消息块,进行传输,增加传输的效率,而这些消息块是由消息头+消息体组成,消息头就是制定的标识消息的协议,消息体就是所传输的消息内容。

    RTMP在蓝牙中的定义

    手机蓝牙传输数据,无法保证双方手机时间同步,因此刨除时间戳定义改为固定字符串,因此messageHeader定义为:

    struct message_header
    {
       uint32_t magic;//magic number, 0x98765432
       uint32_t total;//包长度,从这一字段头算起
       uint32_t msgid;//消息ID
       uint32_t seqnum;//客户端使用,自增量
       uint32_t version;//协议版本,目前为1
       
    };
    
    

    将需要传输的数据添加message_header

      //GPBMEssage为protobuf库里的类,请参考上篇文章
      -(NSMutableData*)returnData:(GPBMessage*)req messageId:(int)messageId {
        NSString *header=[NSString stringWithFormat:@"98765432%08lx%08x%08lx00000001",(unsigned long)req.data.length+20,messageId,(unsigned long)++self.header_count];
        Byte bytes[40];
        int j=0;
        for(int i=0;i*2+1<header.length;i++)
        {
            int int_ch;  /// 两位16进制数转化后的10进制数
            const char* hex_char=[[header substringWithRange:NSMakeRange(i*2, 2)] UTF8String];
            int_ch = (int)strtoul(hex_char, 0, 16);
            //        DLog(@"int_ch=%d",int_ch);
            bytes[j] = int_ch;  ///将转化后的数放入Byte数组里
            j++;
        }
        NSMutableData *data = [[NSMutableData alloc] init];
        [data appendBytes:bytes length:j];
        [data appendData:req.data];
        return data;
    }
    

    接受到数据后,需要把长度小于message_header长度的数据进行拼包,并解析message_header结构

      //解析数据message_header结构
       -(void)parseSocketReceiveData:(NSData*)data result:(void (^)(NSData*result ,int messageId,int hearderId))resultBlock finish:(void(^)())finishBlockMessage{
        
        if (_halfData.length>0) {
            [_halfData appendData:data];
            data=[_halfData copy];
            _halfData =[[NSMutableData alloc]init];
        }else{
            data=[data copy];
        }
        
        if (data.length<20) {
            [_halfData appendData:data];
            if (finishBlockMessage) {
                finishBlockMessage();
            }
            return;
        }
        Byte *testByte = (Byte*)[data bytes];
        
        int length=(int) ((testByte[4] & 0xFF<<24)
                          | ((testByte[5] & 0xFF)<<16)
                          | ((testByte[6] & 0xFF)<<8)
                          | ((testByte[7] & 0xFF)));
        
        int messageId=(int) ((testByte[8] & 0xFF<<24)
                             | ((testByte[9] & 0xFF)<<16)
                             | ((testByte[10] & 0xFF)<<8)
                             | ((testByte[11] & 0xFF)));
        int headerId=(int)((testByte[12] & 0xFF<<24)
                           | ((testByte[13] & 0xFF)<<16)
                           | ((testByte[14] & 0xFF)<<8)
                           | ((testByte[15] & 0xFF)));
        if(length==data.length){
            if (resultBlock) {
                resultBlock([data subdataWithRange:NSMakeRange(20, length-20)],messageId,headerId);
            }
            if (finishBlockMessage) {
                finishBlockMessage();
            }
        }else if(length<data.length){
            if (resultBlock) {
                resultBlock([data subdataWithRange:NSMakeRange(20, length-20)],messageId,headerId);
            }
            [self parseSocketReceiveData:[data subdataWithRange:NSMakeRange(length, data.length-length)] result:resultBlock finish:            finishBlockMessage];
        }else{
            
            [_halfData appendData:data];
            if (finishBlockMessage) {
                finishBlockMessage();
            }
        }
    }
    

    小结

    rtmp协议虽然加快了数据传输的效率,一定程度上的安全,但是并不是特别的安全,为避免攻击者攻击,一些安全措施还是有必要的,在这里不过多介绍,有兴趣自己调研。

    最后

    代码具体实现地址
    代码中具体实现了两个棋类游戏,包括在线对战,人机对战(算法不错哦),蓝牙对战。
    代码编写不易,喜欢的请点赞,谢谢!

    相关文章

      网友评论

          本文标题:RTMP协议在蓝牙连接中传输数据的运用

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