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

RTMP协议蓝牙传输数据

RTMP传统定义

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

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

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

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

接受到数据后,需要把长度小于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

小结

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

最后

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

你可能感兴趣的:(RTMP协议在蓝牙连接中传输数据的运用)