• 借助近距离通信,实现手机作为游戏控制器掌控大屏游戏


    一、前言

    随着移动互联网时代的深入发展,人们对电子产品的体验效果要求越来越高,各种游戏体验和效果都得到很大的提升。本文主要介绍使用手机或者平板作为游戏控制器,借助近距离通信(Nearby Service),通过蓝牙和WIFI技术,实现控制大屏游戏的效果。

    二、场景描述

    在实际使用过程中,可以通过大屏游戏主页提供的二维码链接去下载控制器程序,游戏的所需操作都可以进行数据传输,本文主要演示如何将手机陀螺仪数据进行传输。

    通过该方案,可以解决普通游戏控制器功能单一,使用成本高等问题。同时,由于无需Internet连接,不会造成额外流量消耗或者传输效果受到Internet网络质量的影响。此外,允许手机控制器程序轻松地与附近的设备(大屏游戏)进行发现、连接及数据交换,灵活支持多人同时参与同一游戏。

    三、整体流程

    使用手机或者平板电脑作为游戏控制器,通过集成近距离通信能力,将手机或者平板电脑中的传感器的实时数据,无线传输到显示游戏的大屏设备上,实现对游戏角色的控制。
    下图中的发现端对应手机游戏控制器,广播端对应大屏游戏。双方对应的流程总体一致,都要经过:

    广播扫描 -> 建立连接 -> 传输数据 -> 断开连接。

    下图中广播扫描阶段,进行设备发现,需要基于BLE(低功耗蓝牙)双向广播技术。传输数据阶段,设备之间的高速传输,直接基于传统的P2P协议实现。

    在这里插入图片描述

    四、集成关键步骤说明和代码

    您需要按照流程来完成应用的开发工作,完整的开发流程可以参考链接。开发准备完成后,就可以进行编码了,关键步骤及代码如下:

    步骤一、开始广播

    public void doStartBroadcast(View view) {
         Context context = getApplicationContext();
         mDiscoveryEngine = Nearby.getDiscoveryEngine(context);
         BroadcastOption.Builder advBuilder = new BroadcastOption.Builder();
         advBuilder.setPolicy(Policy.POLICY_STAR);
         mDiscoveryEngine.startBroadcasting(myNameStr, myServiceId, mConnCb, advBuilder.build());
     }
    

    步骤二、开始扫描

    public void doStartScan(View view) {
         ScanOption.Builder discBuilder = new ScanOption.Builder();
         discBuilder.setPolicy(Policy.POLICY_STAR);
         mDiscoveryEngine.startScan(myServiceId, mDiscCb, discBuilder.build());
    

    步骤三、请求连接

    private void connect(View view) {  
         mDiscoveryEngine.requestConnect(myNameStr, mEndpointId, mConnCb)
         .addOnSuccessListener(new OnSuccessListener<Void>() {
             @Override
             public void onSuccess(Void aVoid) {
                 Toast.makeText(SensorActivity.this,"connect Success",Toast.LENGTH_SHORT).show();
                 Log.d(TAG, "connect Success:");
             }
         }).addOnFailureListener(new OnFailureListener() {
             @Override
             public void onFailure(Exception e) {
                 Toast.makeText(SensorActivity.this,"connect Failure",Toast.LENGTH_SHORT).show();
                 Log.d(TAG, "connect Failure");
             }
    

    步骤四、发送数据

    控制器:发送陀螺仪获取的实时数据

    private void sendData(Data bytesData){    Nearby.getTransferEngine(getApplicationContext()).sendData(mEndpointId, bytesData);}
    

    游戏大屏:接收数据

    private DataCallback mDataCb =
         new DataCallback() {
             @Override
             public void onReceived(String string, Data data) {
                 Log.d(TAG, "onReceived, Data.Type = " + data.getType());
                 Log.d(TAG, "onReceived, string ======== " + string);
                 switch (data.getType()) {
                     case Data.Type.BYTES:
                         String str = new String(data.asBytes(), UTF_8);
                         receiveMessage(data);
                         break;
                     default:
                         Log.i(TAG, "the other Unknown data type, please check the uploaded file.");
                         return;
                 }
             }
     
             @Override
             public void onTransferUpdate(String string, TransferStateUpdate update) {
                                     Log.d(TAG, "onTransferUpdate.Status=======" + update.getStatus());
                         return;
                 }
             }
         };
    
    private void receiveMessage(Data data) {
         msgStr = new String(data.asBytes(), UTF_8);
     
         SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
         String dateStr = dateFormat.format(new Date());
         tvData.append("
    " + dateStr + msgStr);
     }
    

    步骤五、断开连接

    private void disconnect(){
         mDiscoveryEngine.disconnect(mEndpointId);
     }
    

    五、效果展示

    由于硬件条件限制,使用两台手机进行效果测试,一台手机用作控制器发送手机陀螺仪的实时数据,另一台设备作为游戏大屏进行数据的接收,在接收数据后,可以根据数据计算得出控制器的姿态等数据,实现对游戏的控制功能。

    在两台设备距离三米左右时,发送和接收数据的对比如下:

    在这里插入图片描述

    在这里插入图片描述

    在设备间距离差距不大时(例如相距3米或4米),数据传输的时延变化不是很大,基本都在1s以内,数据传输依旧具有实时性;即使两台手机都处在移动中,也能够为用户提供良好的使用体验。

    注意,当前大部分手机蓝牙在两台设备间无大的障碍物的情况下,距离7米远时也能保证很好的传输质量,超过8米将会出现断点,超过10米会断开连接。

    六、注意事项

    1、此示例需要填写接收双方的设备名称,进行连接。可以根据您的需要,扫描过程中,您可以向用户展示发现的设备列表,并允许他们选择连接哪些设备。

    2、此示例显示了一种扫描和连接方式(1-N或者星型连接拓扑的点到点策略)。根据您的需要,您可以使用其他两种连接方式:M-N或者网状连接拓扑的点到点连接策略,和1-1连接拓扑的点到点连接策略。三种策略适用的场景,可以参考该链接。

    3、此示例传输的数据格式是字节序列(BYTES),该类型数据的长度大小不能超过32KB。可以根据您的需要,选择其他另外两种数据类型:文件(FILE)和流(STREAM)。

    4、此示例手机控制器应用发送的数据是手机陀螺仪数据,未进行任何处理。可以根据您的需要,计算得出手机姿态等数据,实现对游戏角色的控制。

    5、此示例中,接收双方接收数据会存在时延,该时延仅供参考,不作为近距离通信的性能的标准。


    原文链接:https://developer.huawei.com/consumer/cn/forum/topic/0204428876579660015?fid=18

    原作者:胡椒

  • 相关阅读:
    JavaScript内置函数
    JavaScript内置函数
    javascript入门之算术乘法表
    第三章 3 python运算符的优先级
    第三章 2 pyhon中的运算符
    第三章 1 input输入函数
    第二章 5 python中的注释
    第二章 4 数据类型的转换
    第二章 3 数据类型
    第二章 2 python中的标识符和保留字
  • 原文地址:https://www.cnblogs.com/developer-huawei/p/14484274.html
Copyright © 2020-2023  润新知