关于Android热点模式下的UDP广播

最近尝试让easylink3在热点模式下连接,发现用普通的广播地址会报错,Network unreachable

尝试按照stackoverflow上的方法:

    public static int getCodecIpAddress(WifiManager wm, NetworkInfo wifi){
        WifiInfo wi = wm.getConnectionInfo();
        if(wifi.isConnected())
            return wi.getIpAddress(); //normal wifi
        Method method = null;
        try {
            method = wm.getClass().getDeclaredMethod("getWifiApState");
        } catch (NoSuchMethodException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(method != null)
            method.setAccessible(true);
        int actualState = -1;
        try {
            if(method!=null)
                actualState = (Integer) method.invoke(wm, (Object[]) null);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        if(actualState==13){  //if wifiAP is enabled
            return convertIP2Int("192.168.43.1".getBytes()); //hardcoded WifiAP ip
        }
        return 0;
    }
    public static int convertIP2Int(byte[] ipAddress){
        return (int) (Math.pow(256, 3)*Integer.valueOf(ipAddress[3] & 0xFF)+Math.pow(256, 2)*Integer.valueOf(ipAddress[2] & 0xFF)+256*Integer.valueOf(ipAddress[1] & 0xFF)+Integer.valueOf(ipAddress[0] & 0xFF));
    }

    private InetAddress getBroadcastAddress(WifiManager wm, int ipAddress) throws IOException {
        DhcpInfo dhcp = wm.getDhcpInfo();
        if(dhcp == null)
            return InetAddress.getByName("255.255.255.255");
        int broadcast = (ipAddress & dhcp.netmask) | ~dhcp.netmask;
        byte[] quads = new byte[4];
        for (int k = 0; k < 4; k++)
            quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
        return InetAddress.getByAddress(quads);
    }

但是发现wm.getDhcpInfo得到的mask不对,是0

这样最终广播地址会是255.255.255.255

再次修正,将mask强行变为0.0.0.255之后,可以成功进行广播

但是多播还是不行,需要继续研究

时间: 2024-10-24 12:17:44

关于Android热点模式下的UDP广播的相关文章

Android Run模式下提示"Waiting For Debugger"

问:Android Run模式下提示"Waiting For Debugger", 拔掉数据线就一直停在Waiting页面! 试过重启机器, 也是个在manifest里面设置android:debuggable="false", 都不行! 解决:在设置->开发者选项中关闭"调试某个app"

Android:MVC模式(下)

在上一篇文章中,我们将 View 类单独出来并完成了设计和编写.这次我们将完成 Model 类,并通过 Controller 将两者连接起来,完成这个计算器程序. 模型(Model)就是程序中封装了数据,并定义了操作和处理这些数据的逻辑的对象.在计算器的例子中,就是处理输入的操作数和运算符,并计算返回结果.Let's Go (注意:示例中直接使用 double 类型来处理数据,但严格来说很多语言的浮点数计算都是不精确的) 一,设计模型的接口 在程序构建之初,我们首先考虑的应该是各模块间的封装和扩

Android退出程序(下)——利用广播机制

概述: 基于上一篇博客<Android退出程序(上)--单例模式>的学习,我们知道了如何利用单例和循环遍历的方式来退出我们的应用程序.这篇博客则要从另一个角度来解决问题--广播.即是,接收到一个关闭Activity的广播时,就去关闭当前Activity. 类图展示及说明: 从上面的类图中可以看到这里做了一个处理,而这个处理是学习面向对象的Coder要必须掌握的.这里就是对Activity进行了一个扩展--BaseActivity.如果我们要对每个Activity进行添加内部ExitappRec

Android MVP模式下的登录实现

项目结构: package com.example.mvpdemo.view; /** * 基本的页面操作 * */ public interface IBaseView { //Toast形式提示 public void showMsg(String msg); //加载提示框 public void showLoading(); //隐藏加载提示框 public void hiddenLoading(); //页面跳转 public void jumpActivity(); //返回 pub

Unity3D在Android编辑模式下使用lightmap出现高亮解决方案

在Unity开发中会遇到一个问题就是在Anroid下使用Lightmap会出现场景高亮,曝光效果,这个问题折腾了一段时间,后来找到问题解决方案.需要我们设置如下: 以较低的预览参数设置,bake全体Lightmap.然后检查有无灯光过亮灯问题. 选中灯光,可在Lightmapping窗口中单独设置灯光参数.根据需要跟改Bounce Intensity值,调整光源. 把SunLight的Bounce Intensity: 2 (正式) Ambient Occlusion:1 Max Distanc

android 无线模式下使用ADB调试

修改系统root权限 1. cp sud /system/xbin/sud chmod 755 /system/xbin/sud // note: su chmod 成755 2. cp su /system/xbin/su chmod 6755 /system/xbin/su //note: su chmod 成6755 3.cp install-recovery.sh /system/etc/install-recovery.sh chmod 755 /system/etc/install-

C#中Udp广播的发送与接收(UdpClient)

简介: Udp广播消息用在局域网的消息传递很方便.本文使用UdpClient类在WPF下实现Udp广播收发 发送: 1 void MainWindow_Loaded(object sender, RoutedEventArgs e) 2 { 3 Loaded -= MainWindow_Loaded; 4 UdpClient client = new UdpClient(new IPEndPoint(IPAddress.Any, 0)); 5 IPEndPoint endpoint = new

Android 通过局域网udp广播自动建立socket连接

Android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知道服务端的IP地址,我使用的是通过udp局网广播来实现局网内服务端的搜寻建立连接.以下是代码实现. 首先是客户端: pub

android 发送UDP广播,搜寻服务器建立socket链接

应用场景:客户端(手机,pc)需要搜寻所在局域网内的服务器并获得服务器地址. 方法简介:客户端发送UDP广播,服务收到广播后得到客户端ip地址,然后向客户端发送一次socket链接,客户端收到socket链接,获得服务器地址. 相关知识: UPD.TCP.TCP是面向链接的,可靠的通信方式.UDP是面向非链接的通讯方式.TCP的建立比较麻烦,要经过"三次握手".而UDP的建立比较简单,发送方只管把内容发送出去,不管接收方是否收到.UDP的传输分为:单播,多播,广播.其中,多播和广播是通