android上搭建mina服务器锁屏后无法接受数据包

发布于 2022-09-01 07:35:42 字数 3240 浏览 23 评论 0

在做一个项目, 有一台android需要实时接受其它客户端的udp数据包(包括在锁屏的状态下), 我使用了mina框架, 在未锁屏的时候, 是能够正常的接受到数据包的, 但是一旦锁屏了就再也无法接受到数据包了, 直到唤醒屏幕。
以下是我service中的代码:

public class ListenerService extends Service {
    private PowerManager.WakeLock mWakeLock;
    private MINAServer server;

    public static long lastMsgReceived = System.currentTimeMillis();

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("log_info", "ListenerService onCreate");
        try {
            server = new MINAServer();

        } catch (IOException e) {
            e.printStackTrace();
        }

        acquireWakeLock();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("log_info", "ListenerService onStartCommand");

//      启动一个定时器, 每隔32秒检测一次: lastMsgReceived 减去 当前时间。
        Timer timer = new Timer();
        timer.schedule(new RecordConnTimes(), 0, 32 * 1000);

        return super.onStartCommand(intent, flags, startId);
    }

    private void acquireWakeLock()
    {
        if (null == mWakeLock)
        {
            PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
            mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK| PowerManager.ON_AFTER_RELEASE,"");
            if (null != mWakeLock)
            {
                mWakeLock.acquire();
            }
        }
    }

    @Override
    public void onDestroy() {
        if (null != mWakeLock)
        {
            mWakeLock.release();
            mWakeLock = null;
        }
        super.onDestroy();
    }

    private class RecordConnTimes extends TimerTask {

        @Override
        public void run() {
            Log.i("log_info", "RecordConnTimes run");
            long currentTime = System.currentTimeMillis();


//          如果连续3次都没有接收到其它android端的广播, 则输出没有广播。
            if (96 * 1000 <= currentTime - lastMsgReceived) {
                Log.i("log_info", "大于等于3次没有接收到广播");
            } else {
                Message msg = new Message();
                Bundle bundle = new Bundle();

                Log.i("log_info", "小于3次没有接收到广播!!!");

            }
        }
    }
}

下面是mina handler的messageReceived方法:

public void messageReceived(IoSession session, Object message)
throws Exception {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd   HH:mm:ss     ");
    Date curDate = new Date(System.currentTimeMillis()); //获取当前时间
    if (message instanceof IoBuffer) {
        IoBuffer buffer = (IoBuffer) message;

        byte[] bb = buffer.array();
        for (int i = 0; i < bb.length; i++) {
            System.out.print((char) bb[i]);
        }

        System.out.println("");
        System.out.println("");
        IoBuffer buffer1 = IoBuffer.wrap("11".getBytes("UTF-8")); //返回信息给Clinet端
        session.write(buffer1);
        Log.i("log_info", "messageReceived, " + formatter.format(curDate));
    }

    //      一旦接受到广播就更新lastMsgReceived为当前时间
    ListenerService.lastMsgReceived = System.currentTimeMillis();
}

请问我该怎么做才能让mina在锁屏的状态下也能接收到数据包呢? 还是说mina在android上达不到这样的要求呢。。?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

缱倦旧时光 2022-09-08 07:35:42

似乎是行不通的, android的机制是允许在锁屏状态下tcp唤醒AP, 但是udp不会, 也就代表着在锁屏状态下接受udp数据包无法实现。。??? 目前找到的资料大多都是指向这一方面, 解决办法可以是: 获得屏幕锁保证屏幕不熄屏来保持接受广播, 不过这样的话耗电量无疑是剧增。。。

以上结论是找了几个小时得出的结果, 并不保证绝对的正确性, 如果有发现有错的地方, 请指出来。。
顺便还是想问问。。 有没有其他的解决办法呢? 有的话望告知。。。

遗弃M 2022-09-08 07:35:42

不要玩这个东西,还是快点玩bmob吧.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文