按计划每周更新一篇技术博文,上周因工作忙而中断,第三篇:《Android基于Socket无线遥控(1)--Socket基本模型搭建》
本例子内容比较多,初步构思分三篇完成,Android系统基于Socket实现无线遥控,可控制另一台Android设备音量增减、亮度调节、方向控制、确认、退出等,本篇主要介绍Socket基本模型搭建,以及无线控制Android系统音量增加,亮度增减。
一、技术介绍
1、Socket介绍
Socket技术实现,软件实现部分有客户端(遥控器)和服务器(显示器),服务器与客户端定制一致的收发消息信息,以致达到需求功能,主要使用步骤如下:
a.服务器通过创建ServerSocket指定一个固定的端口号,以致客户端能够向该端口号发送连接请求;
b.服务器通过accept()方法为下一个传入的连接请求创建Socket实例,如果没有新的连接请求,accept()方法将处于阻塞等待;
c.客户端创建Socket,指定远程地址和端口号,向服务端发送请求;
d.客户端与服务器连接成功后通过InputStream和OutputStream进行数据信息交互以达到无线遥控功能。
通常情况下,服务器端可能会接收多个客户端的请求,此时需要使用循环来接收来自不同客户端的连接请求,主要使用如下代码:
- // 创建一个ServerSocket,Ports为端口号
- ServerSocket ss = new ServerSocket(Ports);
- // 采用循环不断接收来自客户端的请求
- while(!quit)
- {
- //此行代码会阻塞,将一直等待别人的连接
- Socket s = ss.accept();
- socketList.add(s);
- //每当客户端连接后启动一条ServerThread线程为该客户端服务
- new Thread(new ServerThread(s)).start();
- ……
- }
客户端创建Socket,指定服务端IP地址和端口号,当Socket创建成功后,服务端的ServerSocket的accept()方法会向下执行,此时服务器端和客户端产生一对相互连接的Socket,创建Socket代码如下:
- // 创建Socket连接服务器,IP 为IP地址,Ports为端口号
- Socket s = new Socket( IP, Ports );
- // 客户端启动ClientThread线程不断读取来自服务器的数据
- new Thread(new ClientThread(s , handler )).start();
- ……
当客户端与服务端产生对应的Socket之后,程序无需再区分服务端与客户端,而是通过各自的Socket进行通讯,主要采用Java IO流来进行数据信息传输,输入输出流方法乳如下:
a.InputStream getInputStream() 返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据,主要使用之一:
- ……
- BufferedReader br = new BufferedReader( new InputStreamReader(socket.getInputStream()));
- ……
- String content = null;
- //不断读取Socket输入流中的内容。
- while ((content = br .readLine()) != null)
- {
- // 对接收到的信息进行对应操作
- }
b.OutputStream getOutputStream() 返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据,主要使用之一:
- ……
- OutputStream os = socket.getOutputStream();
- String OutputStr = "";
- ……
- os.write(OutputStr + "\r\n").getBytes("utf-8"));
- ……
二、编码前预定准则
1、客户端(遥控器)、服务器(显示器)
2、端口:58888 (有效范围0~65535)
3、消息规则
a.客户端 --请求连接--> 服务器
消息:"CN" // CN为connect标志
b.客户端 --方向请求--> 服务器
消息:
"DT" // 向上(
direction
Top)
"DB" // 向下(
bottom
)
"DL" // 向左(Left)
"DR" // 向右(Right)
C.客户端 --音量增加、减少-->服务器
消息:
"VO +" // 音量增加(v
olume)
"VO -" // 音量减少
D.客户端 --亮度增加、减少-->服务器
消息:
"BR +" // 亮度增加(
brightness)
"BR -" // 亮度减少
E.客户端 --单击确认-->服务器
消息:
"CL" // 单击确认(Click)
F.客户端 --菜单-->服务器
消息:
"ME" // 取消(Menu
l)
G.客户端 --返回--> 服务器
消息:
"BA" //退出(Back)
H.客户端 --电源--> 服务器
消息:
"PO" // 电源(Power)
I.客户端 --Home--> 服务器
消息:
"HO" //退出(Home)
三、编码实现
1.页面截图
a.遥控器简单界面
b.服务器端显示界面一
c.服务器端显示界面二
2.客户端(遥控器)主要代码
a.
RemoteControlClient.java 遥控器客户端
- /**
- * 遥控器客户端
- *
- */
- public class RemoteControlClient extends Activity
- {
- ……
- private OutputStream os ;
- private String IP = "192.168.2.10" ; // 此IP地址根据实际项目修改
- private int Ports = 58888; // 端口
- ……
- private Handler handler = new Handler()
- {
- @Override
- public void handleMessage(Message msg)
- {
- // 如果消息来自于子线程
- if (msg.what == 0x123)
- {
- // 将读取的内容追加显示在文本框中
- show .append(msg.obj .toString());
- }
- }
- };
- OnClickListener mOnClickListener = new OnClickListener()
- {
- @Override
- public void onClick(View v)
- {
- switch (v.getId()) {
- case R.id. send:
- try
- {
- Log. v( "", "Socket ---> input : " + input.getText().toString());
- // 将用户在文本框内输入的内容写入网络
- os .write((input .getText().toString() + "\r\n").getBytes( "utf-8" ));
- // 清空input文本框
- input .setText("" );
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- break ;
- case R.id. volume_add_btn:
- input .setText("VO +" );
- break ;
- case R.id. volume_reduced_btn:
- input .setText("VO -" );
- break ;
- case R.id. brightness_add_btn:
- input .setText("BR +" );
- break ;
- case R.id. brightness_reduced_btn:
- input .setText("BR -" );
- break ;
- case R.id. direction_top_btn:
- input .setText("DT" );
- break ;
- case R.id. direction_bottom_btn:
- input .setText("DB" );
- break ;
- case R.id. direction_left_btn:
- input .setText("DL" );
- break ;
- case R.id. direction_right_btn:
- input .setText("DR" );
- break ;
- case R.id. click_btn:
- input .setText("CL" );
- break ;
- case R.id. back_btn:
- input .setText("BA" );
- break ;
- case R.id. menu_btn:
- input .setText("ME" );
- break ;
- case R.id. power_btn:
- input .setText("PO" );
- break ;
- case R.id. home_btn:
- input .setText("HO" );
- break ;
- case R.id. connect_btn:
- try
- {
- IP = ipInput .getText().toString();
- Log. v( "", " --> IP : " + IP );
- // 创建Socket连接服务器
- Socket s = new Socket(IP , Ports);
- // 客户端启动ClientThread线程不断读取来自服务器的数据
- new Thread( new ClientThread(s, handler)).start(); os = s.getOutputStream();
- Toast. makeText( context, getString(R.string. con_success ), Toast. LENGTH_LONG).show();
- reContentView();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- Toast. makeText( context, getString(R.string. con_failed ), Toast. LENGTH_LONG).show();
- }
- break ;
- }
- }
- };
- }
b. ClientThread.java 不断读取来自服务端的数据信息
- public class ClientThread implements Runnable
- {
- //该线程负责处理的Socket
- private Socket s;
- private Handler handler;
- //该线程所处理的Socket所对应的输入流
- BufferedReader br = null;
- public ClientThread(Socket s , Handler handler)
- throws IOException
- {
- this.s = s;
- this.handler = handler;
- br = new BufferedReader(new InputStreamReader(s.getInputStream()));
- }
- public void run()
- {
- try
- {
- String content = null;
- //不断读取Socket输入流中的内容。
- while ((content = br.readLine()) != null)
- {
- // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
- Message msg = new Message();
- msg.what = 0x123;
- msg.obj = content;
- handler.sendMessage(msg);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- }
c.Manifest.xml(配置文件)需要添加权限
- <uses-permission android:name="android.permission.INTERNET"/>
3.服务端(显示器)主要代码(ps. 部分功能未完成,下篇更新)
a.MainActivity.java 服务端(显示器)
- public class MainActivity extends Activity {
- private Button getIpBtn;
- private static TextView showTips;
- private TextView showIp;
- private WifiAdmin wifi;
- public static MainActivity mActivity;
- private ToggleButton startTB;
- private Intent mIntent;
- private int ip;
- public static SystemManager systemManager = null;
- public static final int CONN_SUCCESS = 1;
- public static final int CONN_ERROR = 2;
- public static final int SET_BRIGHTNESS = 3;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- mActivity = this;
- wifi = new WifiAdmin(getApplicationContext());
- ip = wifi.GetIPAddress();
- systemManager = new SystemManager();
- mIntent = new Intent();
- mIntent.setAction("com.example.socket.SERVICE");
- getIpBtn = (Button)findViewById(R.id.get_ip_btn);
- showTips = (TextView)findViewById(R.id.tips_tv);
- showIp = (TextView)findViewById(R.id.ip_tv);
- startTB = (ToggleButton)findViewById(R.id.socketStart);
- getIpBtn.setOnClickListener(mOnClickListener);
- startTB.setOnCheckedChangeListener(mOnCheckedChangeListener);
- }
- private OnClickListener mOnClickListener = new OnClickListener() {
- @Override
- public void onClick(View v) {
- if(v == getIpBtn){
- ip = wifi.GetIPAddress();
- String IP = WifiAdmin.longToIP(ip);
- showIp.setText("IP : " + IP);
- }
- }
- };
- // 连接 & 断开 Socket服务
- private OnCheckedChangeListener mOnCheckedChangeListener = new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
- if(buttonView == startTB){
- if(isChecked){
- startService(mIntent);
- }else{
- stopService(mIntent);
- mHandler.sendEmptyMessage(CONN_ERROR);
- }
- }
- }
- };
- public static Handler mHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case CONN_SUCCESS:
- String socketListStr="";
- int num = 1;
- for(Socket socket : SocketService.socketList)
- {
- socketListStr += "\n------------------\n客户端 " + num++ + " : " +socket;
- }
- showTips.setText( mActivity.getString(R.string.tips_conn_success) + socketListStr);
- break;
- case CONN_ERROR:
- showTips.setText(R.string.tips_conn_wifi);
- break;
- case SET_BRIGHTNESS:
- float brightness = (Float) msg.obj;
- SystemManager.setBrightness(MainActivity.mActivity,brightness);
- SystemManager.saveBrightness(MainActivity.mActivity.getContentResolver(),brightness);
- break;
- }
- }
- };
- }
b.SocketService.java 服务端创建SocketService不断接收客户端连接请求
- /**
- * 负责接收新的连接
- * 以及控制系统的功能
- * @author zzp
- *
- */
- public class SocketService extends Service {
- //定义保存所有Socket的ArrayList
- public static ArrayList<Socket> socketList = new ArrayList<Socket>();
- private boolean quit = false;
- private ServerSocket ss;
- private int Ports = 58888; // 端口
- private static SocketService mService;
- @Override
- public IBinder onBind(Intent intent) {
- // TODO Auto-generated method stub
- return null;
- }
- @Override
- public void onCreate() {
- super.onCreate();
- Log.v("", "SocketService onCreate");
- mService = this;
- new Thread(mSocketRunnable).start();
- }
- /**
- * 此线程等待新的客户端加入
- */
- Runnable mSocketRunnable = new Runnable() {
- @Override
- public void run() {
- try {
- ss = new ServerSocket(Ports);
- while(!quit)
- {
- //此行代码会阻塞,将一直等待别人的连接
- Socket s = ss.accept();
- Log.v("", "Socket ---> s : " + s.toString());
- socketList.add(s);
- //每当客户端连接后启动一条ServerThread线程为该客户端服务
- new Thread(new ServerThread(s)).start();
- MainActivity.mHandler.sendEmptyMessage(MainActivity.CONN_SUCCESS);
- }
- } catch (IOException e) {
- e.printStackTrace();
- } catch (Exception e){
- e.printStackTrace();
- }
- }
- };
- @Override
- public void onDestroy() {
- super.onDestroy();
- quit = true;
- SocketService.socketList.clear();
- try {
- ss.close();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- Log.v("", "SocketService onDestroy");
- }
- public static final int SET_BRIGHTNESS = 1;
- public static Handler mHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- super.handleMessage(msg);
- switch (msg.what) {
- case SET_BRIGHTNESS:
- // 取得当前运行的Activity名字
- ActivityManager am = (ActivityManager)mService.getSystemService(ACTIVITY_SERVICE);
- ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
- Log.d("", "pkg:"+cn.getPackageName());
- Log.d("", "cls:"+cn.getClassName());
- Log.d("", "MainActivity.class.getName():"+MainActivity.class.getName());
- if(!(cn.getClassName()).endsWith(MainActivity.class.getName())){
- Intent i = new Intent();
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- i.setClass(mService, MainActivity.class);
- mService.startActivity(i);
- }
- float brightness = (Float) msg.obj;
- SystemManager.setBrightness(MainActivity.mActivity,brightness);
- SystemManager.saveBrightness(MainActivity.mActivity.getContentResolver(),brightness);
- break;
- }
- }
- };
- }
d.ServerThread.java 主要负责服务端接收客户端的信息,并分配相应操作(未完成)
- /**
- * 负责处理每个线程通信的线程类
- *
- */
- public class ServerThread implements Runnable
- {
- //定义当前线程所处理的Socket
- Socket s = null;
- //该线程所处理的Socket所对应的输入流
- BufferedReader br = null;
- /**
- * 连接请求
- */
- public static final String OPERATION_CONNECT = "CN";
- /**
- * 方向
- */
- public static final String OPERATION_DIRECTION_TOP = "DT";
- public static final String OPERATION_DIRECTION_BOTTOM = "DB";
- public static final String OPERATION_DIRECTION_LEFT = "DL";
- public static final String OPERATION_DIRECTION_RIGHT = "DR";
- /**
- * 音量
- */
- public static final String OPERATION_VOLUME = "VO";
- /**
- * 亮度
- */
- public static final String OPERATION_BRIGHTNESS = "BR";
- /**
- * 单击&确认
- */
- public static final String OPERATION_CLICK = "CL";
- /**
- * 菜单
- */
- public static final String OPERATION_MENU = "ME";
- /**
- * 返回
- */
- public static final String OPERATION_BACK = "BA";
- /**
- * 电源
- */
- public static final String OPERATION_POWER = "PO";
- /**
- * Home
- */
- public static final String OPERATION_HOME = "HO";
- public ServerThread(Socket s)
- throws IOException
- {
- this.s = s;
- //初始化该Socket对应的输入流
- br = new BufferedReader(new InputStreamReader(s.getInputStream() , "utf-8")); //②
- }
- /**
- * 向所有接入客户端发信息 sendMessageToClient
- */
- public synchronized static void sendMessageToClient(String msg){
- Log.v("", "sendMessageToClient --> : " + msg);
- //遍历socketList中的每个Socket,
- //将读到的内容向每个Socket发送一次
- for (Socket s : SocketService.socketList)
- {
- try {
- OutputStream os = s.getOutputStream();
- os.write((msg + "\n").getBytes("utf-8"));
- } catch (IOException e) {
- e.printStackTrace();
- Log.e("", " --> sendMessageToClient error <-- 删除该Socket : " + s);
- //删除该Socket。
- SocketService.socketList.remove(s); //①
- }
- }
- }
- /**
- * 此线程不断接收客户端发过来的请求信息
- */
- public void run()
- {
- try
- {
- String content = null;
- //采用循环不断从Socket中读取客户端发送过来的数据
- while ((content = readFromClient()) != null)
- {
- if(content.length() < 2) continue; // 避免发送空指令 或错误指令导致异常
- String requestStr = content.substring(0, 2);
- Log.v("", "SocketServer ---> content : " + content + " , requestStr : " + requestStr );
- if(requestStr.endsWith(OPERATION_VOLUME)){
- MainActivity.systemManager.CtrlVolume(content);
- }else if(requestStr.endsWith(OPERATION_BRIGHTNESS)){
- MainActivity.systemManager.CtrlBrightness(content);
- }
- // TODO 未完成,下篇完成
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- }
- }
- /**
- * 定义读取客户端数据的方法
- * @return 接收到的请求信息
- */
- private String readFromClient()
- {
- try
- {
- return br.readLine();
- }
- //如果捕捉到异常,表明该Socket对应的客户端已经关闭
- catch (IOException e)
- {
- //删除该Socket。
- SocketService.socketList.remove(s);
- MainActivity.mHandler.sendEmptyMessage(MainActivity.CONN_ERROR);
- }
- return null;
- }
- }
e.SystemManager.java 操作功能实现类,控制系统音量、系统亮度等(未完成)
- /**
- * 控制系统的逻辑类
- * @author zzp
- *
- */
- public class SystemManager {
- private AudioManager audioManager;
- private Activity mActivity;
- private static int brightnessNum = 2;
- public SystemManager(){
- mActivity = MainActivity.mActivity;
- audioManager = (AudioManager)mActivity.getSystemService(Context.AUDIO_SERVICE);
- getScreenBrightness(mActivity);
- brightnessNum = (int)((getScreenBrightness(mActivity)*1.0/255) * 5) ;
- Log.v("", "---> getScreenBrightness(mActivity) : " + getScreenBrightness(mActivity));
- Log.v("", "---> brightnessNum : " + brightnessNum);
- }
- /**
- * 媒体音量增减
- */
- public void CtrlVolume(String ctrlCode){
- if(ctrlCode.contains("-")){
- //第一个参数:声音类型
- //第二个参数:调整音量的方向
- //第三个参数:可选的标志位
- audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
- AudioManager.ADJUST_LOWER,
- AudioManager.FLAG_SHOW_UI);
- }else{
- audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
- AudioManager.ADJUST_RAISE,
- AudioManager.FLAG_SHOW_UI); //调高声音
- }
- }
- /**
- * 系统亮度增减
- */
- public void CtrlBrightness(String ctrlCode){
- if(brightnessNum < 0 || brightnessNum > 5) brightnessNum = 2;
- if(ctrlCode.contains("-")){
- if(brightnessNum > 0) brightnessNum--;
- }else{
- if(brightnessNum < 5) brightnessNum++;
- }
- Message msg = new Message();
- msg.what = SocketService.SET_BRIGHTNESS;
- msg.obj = (brightnessNum)*1.0f/5;
- SocketService.mHandler.sendMessage(msg);
- }
- /**
- * 获取屏幕的亮度
- *
- * @param activity
- * @return
- */
- public static int getScreenBrightness(Activity activity) {
- int nowBrightnessValue = 0;
- ContentResolver resolver = activity.getContentResolver();
- try {
- nowBrightnessValue = android.provider.Settings.System.getInt(
- resolver, Settings.System.SCREEN_BRIGHTNESS);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return nowBrightnessValue;
- }
- /**
- * 设置系统亮度
- * @param brightness : 0~1
- */
- public static void setBrightness(Activity activity, float brightness)
- {
- WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
- lp.screenBrightness = brightness; //这里设置范围 0~1.0
- activity.getWindow().setAttributes(lp);
- Settings.System.putInt(activity.getContentResolver(),
- android.provider.Settings.System.SCREEN_BRIGHTNESS,
- (int)(brightness*255));
- }
- /**
- * 保存亮度设置状态
- *
- * @param resolver
- * @param brightness : 0~1
- */
- public static void saveBrightness(ContentResolver resolver, float brightness) {
- Uri uri = android.provider.Settings.System
- .getUriFor("screen_brightness");
- android.provider.Settings.System.putInt(resolver, "screen_brightness",
- (int)(brightness*255));
- resolver.notifyChange(uri, null);
- }
- }
f.WifiAdmin.java 与wifi相关类,可查询本机Wifi连接状态、IP地址、IP地址的int形式与IP显示形式转换
- /**
- * 与wifi相关
- */
- public class WifiAdmin
- {
- //定义WifiManager对象
- private WifiManager mWifiManager;
- //定义WifiInfo对象
- private WifiInfo mWifiInfo;
- //扫描出的网络连接列表
- private List<ScanResult> mWifiList;
- //网络连接列表
- private List<WifiConfiguration> mWifiConfiguration;
- //定义一个WifiLock
- WifiLock mWifiLock;
- //构造器
- public WifiAdmin(Context context)
- {
- //取得WifiManager对象
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- //取得WifiInfo对象
- mWifiInfo = mWifiManager.getConnectionInfo();
- }
- //打开WIFI
- public void OpenWifi()
- {
- if (!mWifiManager.isWifiEnabled())
- {
- mWifiManager.setWifiEnabled(true);
- }
- }
- //关闭WIFI
- public void CloseWifi()
- {
- if (!mWifiManager.isWifiEnabled())
- {
- mWifiManager.setWifiEnabled(false);
- }
- }
- //锁定WifiLock
- public void AcquireWifiLock()
- {
- mWifiLock.acquire();
- }
- //解锁WifiLock
- public void ReleaseWifiLock()
- {
- //判断时候锁定
- if (mWifiLock.isHeld())
- {
- mWifiLock.acquire();
- }
- }
- //创建一个WifiLock
- public void CreatWifiLock()
- {
- mWifiLock = mWifiManager.createWifiLock("Test");
- }
- //得到配置好的网络
- public List<WifiConfiguration> GetConfiguration()
- {
- return mWifiConfiguration;
- }
- //指定配置好的网络进行连接
- public void ConnectConfiguration(int index)
- {
- //索引大于配置好的网络索引返回
- if(index > mWifiConfiguration.size())
- {
- return;
- }
- //连接配置好的指定ID的网络
- mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true);
- }
- public void StartScan()
- {
- mWifiManager.startScan();
- //得到扫描结果
- mWifiList = mWifiManager.getScanResults();
- //得到配置好的网络连接
- mWifiConfiguration = mWifiManager.getConfiguredNetworks();
- }
- //得到网络列表
- public List<ScanResult> GetWifiList()
- {
- return mWifiList;
- }
- //查看扫描结果
- public StringBuilder LookUpScan()
- {
- StringBuilder stringBuilder = new StringBuilder();
- for (int i = 0; i < mWifiList.size(); i++)
- {
- stringBuilder.append("Index_"+new Integer(i + 1).toString() + ":");
- //将ScanResult信息转换成一个字符串包
- //其中把包括:BSSID、SSID、capabilities、frequency、level
- stringBuilder.append((mWifiList.get(i)).toString());
- stringBuilder.append("/n");
- }
- return stringBuilder;
- }
- //得到MAC地址
- public String GetMacAddress()
- {
- return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();
- }
- //得到接入点的BSSID
- public String GetBSSID()
- {
- return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();
- }
- //得到IP地址
- public int GetIPAddress()
- {
- return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
- }
- //得到连接的ID
- public int GetNetworkId()
- {
- return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
- }
- //得到WifiInfo的所有信息包
- public String GetWifiInfo()
- {
- return (mWifiInfo == null) ? "NULL" : mWifiInfo.toString();
- }
- //添加一个网络并连接
- public void AddNetwork(WifiConfiguration wcg)
- {
- int wcgID = mWifiManager.addNetwork(wcg);
- mWifiManager.enableNetwork(wcgID, true);
- }
- //断开指定ID的网络
- public void DisconnectWifi(int netId)
- {
- mWifiManager.disableNetwork(netId);
- mWifiManager.disconnect();
- }
- //将127.0.0.1形式的IP地址转换成十进制整数,这里没有进行任何错误处理
- public static long ipToLong(String strIp){
- long[] ip = new long[4];
- //先找到IP地址字符串中.的位置
- int position1 = strIp.indexOf(".");
- int position2 = strIp.indexOf(".", position1 + 1);
- int position3 = strIp.indexOf(".", position2 + 1);
- //将每个.之间的字符串转换成整型
- ip[0] = Long.parseLong(strIp.substring(0, position1));
- ip[1] = Long.parseLong(strIp.substring(position1+1, position2));
- ip[2] = Long.parseLong(strIp.substring(position2+1, position3));
- ip[3] = Long.parseLong(strIp.substring(position3+1));
- return (ip[3] << 24) + (ip[2] << 16) + (ip[1] << 8 ) + ip[0];
- }
- //将十进制整数形式转换成127.0.0.1形式的ip地址
- public static String longToIP(long longIp){
- StringBuffer sb = new StringBuffer("");
- //将高24位置0
- sb.append(String.valueOf((longIp & 0x000000FF)));
- sb.append(".");
- //将高16位置0,然后右移8位
- sb.append(String.valueOf((longIp & 0x0000FFFF) >>> 8 ));
- sb.append(".");
- //将高8位置0,然后右移16位
- sb.append(String.valueOf((longIp & 0x00FFFFFF) >>> 16));
- sb.append(".");
- //直接右移24位
- sb.append(String.valueOf((longIp >>> 24)));
- return sb.toString();
- }
- }
g.Manifest.xml(配置文件)需要添加权限
- <uses-permission android:name="android.permission.INTERNET" />
- <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
- <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
- <uses-permission android:name="android.permission.WRITE_SETTINGS" />
- <uses-permission android:name="android.permission.GET_TASKS" />
四、后记&下篇内容
本例中设置系统亮度未能很好的实现,每次设置亮度都会进行判断当前系统显示的Activty,而设置亮度目前需要到服务端界面设置才成功,所以退出服务端界面后,设置系统亮度会进行判断,如果当前不是显示服务端MainActivity,则在服务中重新打开。
下篇主要内容是模拟系统按键消息,单击事件,滚动事件等。
参考引用:
1.《李刚疯狂Android讲义》十三章
本文介绍如何使用Socket技术实现Android设备间的无线遥控功能,包括音量调节、屏幕亮度控制等。详细阐述了客户端与服务器端的基本模型搭建过程。
1万+

被折叠的 条评论
为什么被折叠?



