精华内容
下载资源
问答
  • 安卓wifi直连app源码

    2018-03-19 15:40:58
    简单的安卓 WiFi连接源码 初学者使用 使用 eclipse导入
  • wifi p2p方法实现两台android手机遥控拍摄的方案。一台作为相机,安装camera app;另一台作为遥控器,安装controller app。可以在遥控器手机上控制相机端手机,实施取景,拍照。欢迎指摘、建议、问题。
  • 智能家居简单实现---使用ESP8266简单实现和APP通讯

    万次阅读 多人点赞 2017-11-14 16:29:56
    从手机 APP 直连这个 ESP8266 进行通讯,再到实现远程控制。中间实现过程磕磕碰碰,虽然这方面已经做得非常成熟,但是网上的资料少之又少。现在把实现方式展示出来,同时也算是做一个笔记。 首先这里要实现的是...

    前段时间,公司利用 ESP8266 这个WiFi模块,做了好多小产品。从手机 APP 直连这个 ESP8266 进行通讯,再到实现远程控制。中间实现过程磕磕碰碰,虽然这方面已经做得非常成熟,但是网上的资料少之又少。现在把实现方式展示出来,同时也算是做一个笔记。

    首先这里要实现的是Android端的APP直连ESP8266进行双向通讯。

    如果想了解Android端的APP远程连接与ESP8266进行双向通信的,实现真正的智能家居,可以参与这场Chat:智能家居远程控制,实现APP与ESP8266远程通信

    首先我们来说一下这个ESP8266,这个在淘宝上非常便宜,10块左右,安信可的产品。这个WiFi模块已经做得非常的成熟,下面介绍一下它的基本使用,首先这个模块有三种模式:
    1:STA 模式:ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制。
    2:AP 模式:ESP8266模块作为热点,实现手机或电脑直接与模块通信,实现局域网无线控制。
    3:STA+AP 模式:两种模式的共存模式,即可以通过互联网控制可实现无缝切换,方便操作。

    今天的实现用AP模式就够了,指令有下面这几个就够了:
    1、设置wifi模式:AT+CWMODE=2
    2、重启生效:AT+RST
    3、启动多连接:AT+CIPMUX=1
    4、建立server:AT+CIPSERVER=1

    另外还有非常多的指令可以修改这个模块的参数,甚至还可以修改里面的程序重新烧录,更多的详情就参考安信可的官网。这个就需要电子比较厉害的人才会适合了,我是Android开发的,所以这方面不太了解,还望海涵。

    这是设备:

     

    接下来通过串口发送指令开启ESP8266的WiFi:


     

    发送完这四个指令之后,打开手机就可以看到相应的WiFi开启了(这个WiFi名给我改过):

     

    好了,硬件准备完毕,接下来我们准备APP软件,针对Android端的。新建一个Android项目,项目结构:

    添加一个异步处理类:

     

    /**
     * Created by Layne_Yao on 2017/5/12.
     * CSDN:http://blog.csdn.net/Jsagacity
     */
    
    public class SendAsyncTask extends AsyncTask<String, Void, Void> {
    	
    	//这里是连接ESP8266的IP和端口号,IP是通过指令在单片机开发板查询到,而端口号可以自行设置,也可以使用默认的,333就是默认的
    	private static final String IP = "192.168.4.1";
    	private static final int PORT = 333;
    
    
    
    	private Socket client = null;
    	private PrintStream out = null;
    
    
    	@Override
    	protected Void doInBackground(String... params) {
    		String str = params[0];
    		try {
    			client = new Socket(IP, PORT);
    			client.setSoTimeout(5000);
    			// 获取Socket的输出流,用来发送数据到服务端
    			out = new PrintStream(client.getOutputStream());
    			out.print(str);
    			out.flush();
    
    			if (client == null) {
    				return null;
    			} else {
    				out.close();
    				client.close();
    			}
    
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    
    		return null;
    	}
    	
    }


    在手机端建立一个作为接受ESP8266发送的消息的服务器:

     

    public class MobileServer implements Runnable {
    	private ServerSocket server;
    	private DataInputStream in;
    	private byte[] receice;
    
    	private Handler handler = new Handler();
    
    	public MobileServer() {
    	}
    
    	public void setHandler(Handler handler) {
    		this.handler = handler;
    	}
    
    	@Override
    	public void run() {
    
    		try {
    			//5000是手机端开启的服务器的端口号,ESP8266进行TCP连接时使用的端口,而IP也是通过指令查询的联入设备的IP
    			server = new ServerSocket(5000);
    			while (true) {
    				Socket client = server.accept();
    				in = new DataInputStream(client.getInputStream());
    				receice = new byte[50];
    				in.read(receice);
    				in.close();
    				
    				Message message = new Message();
    				message.what = 1;
    				message.obj = new String(receice);
    				handler.sendMessage(message);
    			}
    
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		try {
    			server.close();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }


    布局文件:

     

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.itman.connectesp8266.MainActivity" >
    
        <TextView
            android:id="@+id/tv_content"
            android:layout_width="match_parent"
            android:layout_height="25dp"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="10dp"
            android:background="#fe9920"
            android:gravity="center"
            android:text="接收的内容" />
    
        <Button
            android:id="@+id/bt_send"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/tv_content"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="40dp"
            android:text="发送" />
    
        <TextView
            android:id="@+id/tv_send_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/bt_send"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="33dp"
            android:text="发送的内容" />
    
    </RelativeLayout>


    最后是MainActivity:

    public class MainActivity extends ActionBarActivity implements OnClickListener {
    	private TextView tv_content, tv_send_text;
    	private Button bt_send;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		InitView();
    
    		//开启服务器
    		MobileServer mobileServer = new MobileServer();
    		mobileServer.setHandler(handler);
    		new Thread(mobileServer).start();
    
    	}
    
    	private void InitView() {
    		tv_content = (TextView) findViewById(R.id.tv_content);
    		tv_send_text = (TextView) findViewById(R.id.tv_send_text);
    		bt_send = (Button) findViewById(R.id.bt_send);
    
    		bt_send.setOnClickListener(this);
    
    	}
    
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.bt_send:
    			String str = "Sent to the ESP8266";
    			new SendAsyncTask().execute(str);
    			tv_send_text.setText(str);
    			break;
    		}
    
    	}
    
    	Handler handler = new Handler() {
    		@Override
    		public void handleMessage(Message msg) {
    			switch (msg.what) {
    			case 1:
    				tv_content.setText("WiFi模块发送的:" + msg.obj);
    				Toast.makeText(MainActivity.this, "接收到信息", Toast.LENGTH_LONG)
    						.show();
    			}
    		}
    	};
    
    }


    最后不要忘了添加网路权限:

    <uses-permission android:name="android.permission.INTERNET"/>


    运行到真机,确保手机连接上ESP8266的WiFi,就可以进行手机发送信息到ESP8266了。手机APP发送过去的:

     

     

    ESP8266接收到的:

     

     

    接下来是ESP8266发送数据到APP。首先ESP要使用到的指令有:

    1、建立TCP连接:AT+CIPSTART=0,"TCP","192.168.4.2",5000
    2、确定发送数据的长度:AT+CIPSEND=0,19
    3、发送信息:Sent to the Android

    操作指令:

     

    APP端接受到的信息:

     

    以上是简单的实现APP和ESP8266直连通讯的实现。

     

    如果想要实现远程控制,过程是比较繁杂的,但是并不复杂。

    这里只简单的说明一下大致的实现方式:

    1、要实现远程控制就必须得租用一个服务器,当然自己电脑也可以作为服务器,就是需要配置。最简单的方式是租用云服务器,比如阿里云的ECS,如果是学生,还有学生价。

    2、接下来是最麻烦的步骤:

    1)手机发数据到云服务器,这个不用多说了,使用json数据的网络通信;

    2)接着就是云服务器继续把手机发送过来的转发的ESP8266,而云服务器和ESP8266之间的通讯是需要使用TCP长连接的。因为ESP8266这边的IP是会变化的所以只能使用长连接;

    3)ESP8266发数据到云服务器就不用再多说了,就第2点中的长连接。但是云服务器怎么推送数据到APP呢?答案也是长连接的,这里可以使用别人集成好的框架mina。

    以上就是远程控制的大致过程要点,想要实现就各自去完成了。当初我还是在别的平台问人问到的实现方案,网上根本没有相应的资料,或者是方案。以上的实现方案虽然有点繁杂,但是并不复杂,慢慢实现是没有很大难度的。

    如果想直接学习并实现的,可以参与这场Chat:智能家居远程控制,实现APP与ESP8266远程通信

    如果是想学习Android开发基础的,可以看一下这篇文章:简单的入门Android开发基础

                                                                    

    关注个人公众号「技术人的日常」,关注后回复:安卓基础,即可获取Android基础入门学习资料。

    展开全文
  • 种是不用无线路由不用上网也可以实现电脑对打印机的联打印;第二种则可以实现同一个无线路由器下面所有电脑用这台打印机的无线共享。如果你是手机,那需要你手机APP应用,打印机上面有二维码可以扫描应用。用WiFi
  • uni-app使用原生socket

    千次阅读 2019-04-15 16:22:44
    uni-app 调用原生socket实现与WiFi设备的直连通讯。 网上查阅了一下,关于相关方面的案例略少,借鉴了本论坛中一贴中的测试案例,在此表示感谢。CTRL+C +V 实现了demo app的socket的通讯。 也是使用java nio的轮询...

    http://ask.dcloud.net.cn/article/35331

    uni-app 调用原生socket实现与WiFi设备的直连通讯。

    网上查阅了一下,关于相关方面的案例略少,借鉴了本论坛中一贴中的测试案例,在此表示感谢。CTRL+C +V 实现了demo app的socket的通讯。
    也是使用java nio的轮询io非阻塞式来实现io读写。
    本案例是测试demo,有什么不足,请各位指教,谢谢。

    var inetSocketAddress = plus.android.importClass("java.net.InetSocketAddress");  
    var ByteBuffer = plus.android.importClass("java.nio.ByteBuffer");  
    var SelectionKey = plus.android.importClass("java.nio.channels.SelectionKey");  
    var Selector = plus.android.importClass("java.nio.channels.Selector");  
    var SocketChannel = plus.android.importClass("java.nio.channels.SocketChannel");  
    var Iterator = plus.android.importClass("java.util.Iterator");  
    var An_String = plus.android.importClass("java.lang.String");  
    
    var StrictMode = plus.android.importClass("android.os.StrictMode");  
    var Build = plus.android.importClass("android.os.Build");  
    if (Build.VERSION.SDK_INT > 9) {  
        var policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
        StrictMode.setThreadPolicy(policy);  
    }  
    
    var An_Selector = new Selector();  
    var An_SocketChannel = new SocketChannel();  
    var An_SelectionKey = new SelectionKey();  
    
    var selector = null;  
    var channel = null;  
    var stop = false;   //进程控制  
    
    try {  
    
        channel = An_SocketChannel.open();  
        //设置通道为非阻塞  
        channel.configureBlocking(false);  
        selector = An_Selector.open();  
        channel.connect(new inetSocketAddress("192.168.2.245", 6000));  
        channel.register(selector, An_SelectionKey.OP_CONNECT);  
    
        while (!stop) {  
            selector.select(1000);  
    
            var keys = selector.selectedKeys();  
            plus.android.importClass(keys);  
            var ite = keys.iterator();  
            plus.android.importClass(ite);  
    
            while (ite.hasNext()) {  
                An_SelectionKey = ite.next();  
                ite.remove();  
    
                if (An_SelectionKey.isConnectable()) {  
                    if (channel.isConnectionPending()) {  
                        if (channel.finishConnect()) {  
                            if (channel.isConnected()) {  
                                // 设置成非阻塞  
                                channel.configureBlocking(false);  
                                //在和服务端连接成功之后,为了可以接收到服务端的信息,需要给通道设置读的权限。  
                                channel.register(selector, An_SelectionKey.OP_READ);  
                            }  
                        }  
                    }  
                } else if (An_SelectionKey.isReadable()) {  
                    // 检测到服务端的数据  
                    var buffer = ByteBuffer.allocate(100);  
                    var ret = channel.read(buffer);  
                    if (ret == -1) {  
                        stop = true;  
                        console.log("server is unconnected");  
                    } else {  
                        var data = buffer.array();  
                        var msg = new An_String(data).trim();  
                        console.log("client recive msg : " + msg);  
                        // 发送数据给客户端  
                        var data = new An_String("Im app " + msg);  
                        var outBuffer = new ByteBuffer.wrap(data.getBytes());  
                        channel.write(outBuffer);  
                        if ("by" == msg) {  
                            stop = true  
                        }  
                    }  
                }  
            }  
        }  
    } catch (e) {  
        console.log("run error : " + e)  
    } finally {  
        try {  
            channel.close();  
        } catch (e) {  
            console.log("close error " + e);  
        }  
    }  

     

    展开全文
  • Charles配置绝对正确,还是使终抓不到包的可能的一种情况是!!!-----应用使用的网络库不支持代理,所有的网络请求没有走代理,而是走的正常wifi直连

    Charles配置绝对正确,还是使终抓不到包的可能的一种情况是!!!-----应用使用的网络库不支持代理,所有的网络请求没有走代理,而是走的正常wifi直连惊恐


    当时的情况如下:

    当wifi设置了代理(电脑的wifi,Charles设置了proxy),手机上的浏览器,某上应用的http请求都能被Charles抓到包,唯独我们的应用(近期工作的重点,参于客户端XXX业务SDK的开发)使终抓不到网络请求数据包。


    当时的解决跟进思路:

    开始怀疑工作环境,Charles试用版本的问题,花了不少时间重装Charles,另外在其它同学电脑上测试,也还是一样的效果

    后来,对比我们的应用(基于旧的架构),是可以抓到包

    那么此时判定是新的架构(基于新的SDK的应用)对于网络库的使用可能存在使用不当的地方。

    最后咨询网络库的同学,我们的网络库默认不支持代理的工作方式,如需支持需要业务层在网络配置更新时接收网络配置重新的广播(Connectivity_service),然后获取到手机用户设置的wifi代理host与port,然后调用网络库的API,让网络库切换到代理的工作模式


    注:抓包应用一般的工作原理也是在本地开启 HTTP 代理服务,通过让待抓包的应用的流量走这个代理,从而实现显示和修改 HTTP 包的功能

    展开全文
  • Android Q行为变化

    千次阅读 2019-03-29 14:50:49
    App行为变化,影响所有App 以下行为会影响所有运行在Android Q机型上的App,不管你的App...以下两个与WiFi直连有关的广播不再是sticky模式 WIFI_P2P_CONNECTION_CHANGED_ACTION WIFI_P2P_THIS_DEVICE_CHAN...

    App行为变化,影响所有App

    以下行为会影响所有运行在Android Q机型上的App,不管你的App指定的targetSdkVersion是不是Android Q。

    1. 非SDK接口限制。

    2. WiFi直连广播。
      以下两个与WiFi直连有关的广播不再是sticky模式

    1. 系统悬浮窗权限(在Go版本上)

    什么是Go版本,在2017年 5 月的 Google I/O 开发者大会上,Google 宣布了 Android Go 项目,即为入门级智能设备打造的简化版 Android 系统。而随着 Android 8.1 的正式推送,这一系统也揭开了其神秘的面纱)

    运行在Android Q Go Edition的App将不再接受SYSTEM_ALERT_WINDOW权限的申请。这是因为悬浮窗会使用额外的内存,这对于低内存配置的Android设置带来很明显的性能消耗。

    如果你的App目前是运行在Android 9 或 更低版本的Go Edition上,并且你的APP使用了悬浮窗权限,那么当该设备升级到Android Q时,该APP会保留悬浮窗权限的授权信息。但是,在设备升级之后,就无法再对这些APP授权悬浮窗权限。

    在Go设备上,如果APP发送action是ACTION_MANAGE_OVERLAY_PERMISSION的intent,那么系统会自动拒绝该请求,并且跳转到系统设置界面,并在设置界面给用户提示悬浮窗权限不可用,因为这会让你的设备变慢。如果调用Settings.canDrawOverlays()方法,该方法会始终返回false。

    1. 低版本target警告
      在Android Q的设备上运行的APP,如果该APP的targetSdkVersion低于23(Android 6.0),那么在第一次运行该APP时,系统会给用户警告。如果APP需要用户授权,那么用户在首次运行APP之前还有机会调整APP的权限。
      Google Play Store对APK级别的要求.png

    2. SHA-2 CBC 密钥算法套件被删除
      以下SHA-2 CBC 密钥算法套件已被移除:

    • TLS_RSA_WITH_AES_128_CBC_SHA256
    • TLS_RSA_WITH_AES_256_CBC_SHA256
    • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
    • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
    • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
    • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
      以上这些密钥算法套件的安全性没有GCM高。
      可以通过调用getSupportedCipherSuites()方法来获取系统支持的密钥算法套件。
    1. App使用情况
      UsageStats应用使用体验升级。
      Android Q可以设置app为grayscale display mode
      进入Suspended状态的APP不能播放音频
      android.preference库被弃用。使用AndroidX preference库作为替代。

    设置targetSdkVersion为Q的APP

    1. 非SDK接口限制。
    2. Shared memory。
      target Q的APP不能再直接使用ashmem(/dev/ashmem),可通过NDK的AShareMemory类访问shared memory。
      In addition, apps cannot make direct IOCTLs to existing ashmem file descriptors and must instead use either the NDK’s ASharedMemory class or the Android Java APIs for creating shared memory regions. (这里不是很熟悉,没有翻译,sorry)
      这些改变会增加使用shared memory时的安全性和鲁棒性,提升性能和Android系统的安全性。
    3. ART只接受系统生成的OAT文件。
      ART(Android Runtime)不再通过应用进程调用dex2oat。
    4. 强化了ART的AOT检查。
    5. Fullscreen intent的权限变化。
      使用fullscreen intent的app,必须在manifest文件中声明USE_FULL_SCREEN_INTENT权限,该权限是一个普通权限,系统会自动授权。
      如果APP在没有申请USE_FULL_SCREEN_INTENT权限的情况下,通过fullscreen intent创建一个通知,那么系统会忽略该请求,并在控制台输出以下信息:
      Package [pkg]: Use of fullScreenIntent requires the USE_FULL_SCREEN_INTENT permission

    参考链接:https://developer.android.google.cn/preview/behavior-changes-all

    展开全文
  • Android代码-GoBang

    2019-08-06 06:15:37
    GoBang 一款五子棋app,支持双人模式,wifi,蓝牙联机对战模式 主要运用 mvp模式 wifi直连库salut materialdesign eventbus 应用截图 应用大致框架 License MIT
  • 家里新添了一台佳能Canonmg3080打印机,开箱安装后,照着说明书一步步完成了连线的电脑打印,但是...2、按照按照网上详细手册用手机直连打印机,然后APP中设置打印机连接wifi后,卖家给了一个网站让下载pc端驱动,佳...
  • 第一部分 调研,评测 1、K米简介 K米点歌是一款免费的社交K歌手机应用,其手机点歌...由于包厢内移动信号不稳定或者是因为遥控信号只能通过wifi直传,只有连接包厢wifi才能连接包厢。进行完连接包厢的操作之后,app...
  • 该器件内置WiFi模块,可通过智能手机App观看视频预览和回放,实现与智能手机WiFi直连进行通信,并可随时随地分享到各种社交平台。  据悉,为有视讯成立于2013年4月,由原八位资深华为员工所创立,是一家专注于消费...
  • 该器件内置WiFi模块,可通过智能手机App观看视频预览和回放,实现与智能手机WiFi直连进行通信,并可随时随地分享到各种社交平台。  据悉,为有视讯成立于2013年4月,由原八位资深华为员工所创立,是一家专注于消费...
  • Nfc_Assistant.zip

    2021-03-11 21:29:09
    除了这两个方面,我们拓展了app的功能,满足一些用户希望在无网络状态下而又能快速传输一些规模较大、保密性不强的文件,具体工作为增加了Wifi直传的功能,我们在设备自带的wifi直传技术的基础上,增加了选择文件互...
  • 首先根据相关摄像头内附的说明书对摄像头进行安装以及wifi配置或者通过网线直连,配置完成后确保摄像头画面能够在手机APP或者相关应用程序上正常播放。 然后进入海康威视官网下载并安装SADP摄像头IP搜索工具。 打开...
  • 开发者可按连接入(WiFi模组、蓝牙Mesh模组)、云云接入(OAuth2.0)2类方式,接入天猫精灵软硬件生态(天猫精灵音箱、天猫精灵App、AliGenie Inside智能设备)及阿里巴巴集团生态服务,实现语音和触屏交互,为...
  • getAppVersionCode : 获取 App 版本码 getAppSignature : 获取 App 签名 getAppSignatureSHA1 : 获取应用签名的的 SHA1 值 getAppSignatureSHA256 : 获取应用签名的的 SHA256 值 getAppSignatureMD5 : 获取应用签名...
  • 9.1.8 显示系统设置界面(设置主界面、Wifi设置界面) 263 9.1.9 启动处理音频的程序 264 9.2 自定义Activity Action 264 9.3 Activity的高级应用 266 9.3.1 ActivityGroup 266 9.3.2 自定义半透明窗口 ...
  • 9.1.8 显示系统设置界面(设置主界面、Wifi设置界面) 263 9.1.9 启动处理音频的程序 264 9.2 自定义Activity Action 264 9.3 Activity的高级应用 266 9.3.1 ActivityGroup 266 9.3.2 自定义半透明窗口 ...
  • uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android....
  • 新版Android开发教程.rar

    千次下载 热门讨论 2010-12-14 15:49:11
    Android 的 App Market 模式,软件开发者获得 7 成收入, 3 成用于系统维护。难点在于位置营销。 设备商通过卖设备、内置特色应用来获得盈利。也可以兼职专业软件开发者进行赢利。 Google 自身通过基于统一平台为...
  • PT80-NEAT开发指南v1.1

    2014-06-24 18:38:34
    NEAT 开 发 指南 文档 适用于 PT80 系列 移动数据终端 版本记录 版本号 版本描述 发布日期 V 1.0 初始版本。 2012-04-12 V1.1 修改前三章内容 2012-09-25 目录 第一章 关于本手册.....................................

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

wifi直连app