修改Android AP的SSID和SharedKey

WifiManager中含有可以修改AP模式下SSID和SharedKey的方法,在源码中可以看到这部分方法被@hide了,也就是被隐藏了,不过只要利用反射即可调用这些方法。

咱在设置SSID和SharedKey时,发现几个需要注意的点:

  1. 写入系统设置的权限,可以通过Intent的方式提示用户给予权限
  2. <uses -permission android:name="android.permission.ACCESS_WIFI_STATE"></uses>
    <uses -permission android:name="android.permission.CHANGE_WIFI_STATE"></uses>
    <uses -permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses>
    <uses -permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses>
    <uses -permission android:name="android.permission.WRITE_SETTINGS"></uses>
  3. 设置AP模式的参数,会同时自动打开AP(无法在关闭AP的情况下,写入设置,这一点,可以从下面的代码看到,当setWifiApEnable的第三个参数为false时,随便填个null,因为设置是不会更新的,所以为了设置AP的各种参数,必须先关闭AP,然后填充WifiConfiguration结构,最后把setWifiApEnable设置为true,设置完成并打开AP。),并且需要提前关闭WIFI,两者不能共存
  4. 有些手机只支持WPA2_PSK加密方式,看了下源码,貌似这种加密方式在WifiConfiguration结构里面并没有看到,然后看到有些人的说法是被隐藏了,具体情况,咱不太清楚,反正源码确实没有看到对应的字段,所以自己一直卡在这里,没法更新AP的密码,后面看到网上有的设置为4,之后便可以使用WPA2_PSK加密方式了。。。。

下面是部分代码片段 Continue reading “修改Android AP的SSID和SharedKey”

获取Android Phone的各种IP

因为要知道AP模式下的Android Phone的IP啊,好让其他连接上的手机可以直接访问这手机上的服务,不过好像AP模式下默认都是192.168.43.1这个IP

所以要想办法拿到各种IP,比如说外网IP(这个是移动网络动态分配的,在这个项目里,完全没看到什么卯月)、还有内网IP(供其它局域网内的手机访问其服务)。

官方提供的接口,好像都是获取自身在GPRS/3G/4G/WIFI下的IP,好像也可以获取AP模式下的IP?

咱这里通过使用shell里的程序来获取我们需要的信息,比如说ifconfig(权限不够,用系统级程序的UID+签名可以破,发布不出去,需要root的话,就没什么卯月了,不过ifconfig里面可以提供的信息真是好丰富啊,还能用它配置网络。)、ip addr(这个没什么权限要求,就是你了!基于AOSP的原生系统来做,不知道会不会有厂商改动这一块的东西,啧啧)这里只提取了局域网IP、局域网广播IP、和移动网络的IP,其他的信息需求,可以自己调用ip addr看下。 Continue reading “获取Android Phone的各种IP”

Android FileObserver里的一些坑

最近在做的东西,也就是在android上搭建一个PHP服务器,然后通过Browser端对手机进行一些简单(复杂)控制。

这个数据/控制流程就是Browser< =>Android Http Server< =>Android App

初步的构想就是使用网上的开源服务器方案,由lighttpd+php+sqlite来搭建一个完整的服务器环境。

因为打算先写个Demo进行尝试,所以没有将服务器直接编译并嵌到Android系统之中,而是直接安装了一个名为KSWEB的App,进行搭建(无需root权限。。

WEB前端跟后端,就是正常的HTML、JS、JQuery、CSS、PHP什么的,跟正常的WEB开发没什么区别。

由于,需求是把Android手机变成一台无线路由器+服务器(硬件设计跟咱没有半毛钱关系),所以一开始WEB端就是把这东西,当作路由器WEB控制面板来设计就对了。 Continue reading “Android FileObserver里的一些坑”

N久没更新东西啦

最近想折腾个RESTful API的东西。

服务器用Node.js实现,移动端就做个Android App吧,用来监控自己的服务器。

var express = require('express');
var app = express();
var fs = require('fs');
var child_process = require('child_process');
 
app.get('/status',function(req,res){
	fs.readFile(__dirname+'/'+'status.json','utf8',function(err,data){
		var worker = child_process.exec('ver',function(err,stdout,stderr){
			if(err){
				console.log(err.stack);
				console.log('Error code: '+err.code);
				console.log('Signal received: '+err.signal);
			}
			data = JSON.parse(data);
			var reg=/[\r\n]/g;
			stdout=stdout.replace(reg,'');
			data['OS']=stdout;
			data = JSON.stringify(data);
			res.end(data);
			console.log(data);
			console.log('stderr: '+stderr);
			fs.writeFile(__dirname+'/'+'status.json',data,function(err){
			if(err){
				return console.error(err);
				}
	});
		});
		worker.on('exit',function(code){
			console.log('Get System version successfully!');
		});
	});
 
});
 
var server = app.listen(8080,function(){
	var port = server.address().port;
	console.log('Server is running on port: %s',port);
})

基础代码,就跟上面的差不多,读取的是Windows系统的版本信息,然后响应请求并写入JSON,嘛,慢慢完善就是了。

服务器端基于Node.js,用的express框架,其实读取服务器信息什么的,很简单,就是简单的开进程用shell指令读数据、读配置文件,然后处理一下,写入JSON。

客户端打算在Android上写个APP,不过现在有选择困难,不知道该用那个版本的SDK。。。

这个简单的,后面会弄些复杂点的东西 🙂