按计划每周更新一篇技术博文,上周因工作忙而中断,第三篇:《Android基于Socket无线遥控(1)--Socket基本模型搭建》
本例子内容比较多,初步构思分三篇完成,Android系统基于Socket实现无线遥控,可控制另一台Android设备音量增减、亮度调节、方向控制、确认、退出等,本篇主要介绍Socket基本模型搭建,以及无线控制Android系统音量增加,亮度增减。
一、技术介绍
1、Socket介绍
Socket技术实现,软件实现部分有客户端(遥控器)和服务器(显示器),服务器与客户端定制一致的收发消息信息,以致达到需求功能,主要使用步骤如下: a.服务器通过创建ServerSocket指定一个固定的端口号,以致客户端能够向该端口号发送连接请求; b.服务器通过accept()方法为下一个传入的连接请求创建Socket实例,如果没有新的连接请求,accept()方法将处于阻塞等待; c.客户端创建Socket,指定远程地址和端口号,向服务端发送请求; d.客户端与服务器连接成功后通过InputStream和OutputStream进行数据信息交互以达到无线遥控功能。
通常情况下,服务器端可能会接收多个客户端的请求,此时需要使用循环来接收来自不同客户端的连接请求,主要使用如下代码: [java] view plain copy
  1. //创建一个ServerSocket,Ports为端口号
  2. ServerSocketss=newServerSocket(Ports);
  3. //采用循环不断接收来自客户端的请求
  4. while(!quit)
  5. {
  6. //此行代码会阻塞,将一直等待别人的连接
  7. Sockets=ss.accept();
  8. socketList.add(s);
  9. //每当客户端连接后启动一条ServerThread线程为该客户端服务
  10. newThread(newServerThread(s)).start();
  11. ……
  12. }


客户端创建Socket,指定服务端IP地址和端口号,当Socket创建成功后,服务端的ServerSocket的accept()方法会向下执行,此时服务器端和客户端产生一对相互连接的Socket,创建Socket代码如下: [java] view plain copy
  1. //创建Socket连接服务器,IP为IP地址,Ports为端口号
  2. Sockets=newSocket(IP,Ports);
  3. //客户端启动ClientThread线程不断读取来自服务器的数据
  4. newThread(newClientThread(s,handler)).start();
  5. ……


当客户端与服务端产生对应的Socket之后,程序无需再区分服务端与客户端,而是通过各自的Socket进行通讯,主要采用Java IO流来进行数据信息传输,输入输出流方法乳如下: a.InputStream getInputStream() 返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据,主要使用之一: [java] view plain copy
  1. ……
  2. BufferedReaderbr=newBufferedReader(newInputStreamReader(socket.getInputStream()));
  3. ……
  4. Stringcontent=null;
  5. //不断读取Socket输入流中的内容。
  6. while((content=br.readLine())!=null)
  7. {
  8. //对接收到的信息进行对应操作
  9. }

b.OutputStream getOutputStream() 返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据,主要使用之一: [java] view plain copy
  1. ……
  2. OutputStreamos=socket.getOutputStream();
  3. StringOutputStr="";
  4. ……
  5. os.write(OutputStr+"\r\n").getBytes("utf-8"));
  6. ……

二、编码前预定准则
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.遥控器简单界面 Android基于Socket无线遥控(1)--Socket基本模型搭建_第1张图片 b.服务器端显示界面一 Android基于Socket无线遥控(1)--Socket基本模型搭建_第2张图片 c.服务器端显示界面二 Android基于Socket无线遥控(1)--Socket基本模型搭建_第3张图片 2.客户端(遥控器)主要代码 a. RemoteControlClient.java 遥控器客户端 [java] view plain copy
  1. /**
  2. *遥控器客户端
  3. *
  4. */
  5. publicclassRemoteControlClientextendsActivity
  6. {
  7. ……
  8. privateOutputStreamos;
  9. privateStringIP="192.168.2.10";//此IP地址根据实际项目修改
  10. privateintPorts=58888;//端口
  11. ……
  12. privateHandlerhandler=newHandler()
  13. {
  14. @Override
  15. publicvoidhandleMessage(Messagemsg)
  16. {
  17. //如果消息来自于子线程
  18. if(msg.what==0x123)
  19. {
  20. //将读取的内容追加显示在文本框中
  21. show.append(msg.obj.toString());
  22. }
  23. }
  24. };
  25. OnClickListenermOnClickListener=newOnClickListener()
  26. {
  27. @Override
  28. publicvoidonClick(Viewv)
  29. {
  30. switch(v.getId()){
  31. caseR.id.send:
  32. try
  33. {
  34. Log.v("","Socket--->input:"+input.getText().toString());
  35. //将用户在文本框内输入的内容写入网络
  36. os.write((input.getText().toString()+"\r\n").getBytes("utf-8"));
  37. //清空input文本框
  38. input.setText("");
  39. }
  40. catch(Exceptione)
  41. {
  42. e.printStackTrace();
  43. }
  44. break;
  45. caseR.id.volume_add_btn:
  46. input.setText("VO+");
  47. break;
  48. caseR.id.volume_reduced_btn:
  49. input.setText("VO-");
  50. break;
  51. caseR.id.brightness_add_btn:
  52. input.setText("BR+");
  53. break;
  54. caseR.id.brightness_reduced_btn:
  55. input.setText("BR-");
  56. break;
  57. caseR.id.direction_top_btn:
  58. input.setText("DT");
  59. break;
  60. caseR.id.direction_bottom_btn:
  61. input.setText("DB");
  62. break;
  63. caseR.id.direction_left_btn:
  64. input.setText("DL");
  65. break;
  66. caseR.id.direction_right_btn:
  67. input.setText("DR");
  68. break;
  69. caseR.id.click_btn:
  70. input.setText("CL");
  71. break;
  72. caseR.id.back_btn:
  73. input.setText("BA");
  74. break;
  75. caseR.id.menu_btn:
  76. input.setText("ME");
  77. break;
  78. caseR.id.power_btn:
  79. input.setText("PO");
  80. break;
  81. caseR.id.home_btn:
  82. input.setText("HO");
  83. break;
  84. caseR.id.connect_btn:
  85. try
  86. {
  87. IP=ipInput.getText().toString();
  88. Log.v("","-->IP:"+IP);
  89. //创建Socket连接服务器
  90. Sockets=newSocket(IP,Ports);
  91. //客户端启动ClientThread线程不断读取来自服务器的数据
  92. newThread(newClientThread(s,handler)).start();os=s.getOutputStream();
  93. Toast.makeText(context,getString(R.string.con_success),Toast.LENGTH_LONG).show();
  94. reContentView();
  95. }
  96. catch(Exceptione)
  97. {
  98. e.printStackTrace();
  99. Toast.makeText(context,getString(R.string.con_failed),Toast.LENGTH_LONG).show();
  100. }
  101. break;
  102. }
  103. }
  104. };
  105. }

b. ClientThread.java 不断读取来自服务端的数据信息 [java] view plain copy
  1. publicclassClientThreadimplementsRunnable
  2. {
  3. //该线程负责处理的Socket
  4. privateSockets;
  5. privateHandlerhandler;
  6. //该线程所处理的Socket所对应的输入流
  7. BufferedReaderbr=null;
  8. publicClientThread(Sockets,Handlerhandler)
  9. throwsIOException
  10. {
  11. this.s=s;
  12. this.handler=handler;
  13. br=newBufferedReader(newInputStreamReader(s.getInputStream()));
  14. }
  15. publicvoidrun()
  16. {
  17. try
  18. {
  19. Stringcontent=null;
  20. //不断读取Socket输入流中的内容。
  21. while((content=br.readLine())!=null)
  22. {
  23. //每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
  24. Messagemsg=newMessage();
  25. msg.what=0x123;
  26. msg.obj=content;
  27. handler.sendMessage(msg);
  28. }
  29. }
  30. catch(Exceptione)
  31. {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
c.Manifest.xml(配置文件)需要添加权限 [html] view plain copy
  1. <uses-permissionandroid:name="android.permission.INTERNET"/>


3.服务端(显示器)主要代码(ps. 部分功能未完成,下篇更新) a.MainActivity.java 服务端(显示器) [java] view plain copy
  1. publicclassMainActivityextendsActivity{
  2. privateButtongetIpBtn;
  3. privatestaticTextViewshowTips;
  4. privateTextViewshowIp;
  5. privateWifiAdminwifi;
  6. publicstaticMainActivitymActivity;
  7. privateToggleButtonstartTB;
  8. privateIntentmIntent;
  9. privateintip;
  10. publicstaticSystemManagersystemManager=null;
  11. publicstaticfinalintCONN_SUCCESS=1;
  12. publicstaticfinalintCONN_ERROR=2;
  13. publicstaticfinalintSET_BRIGHTNESS=3;
  14. @Override
  15. publicvoidonCreate(BundlesavedInstanceState){
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. mActivity=this;
  19. wifi=newWifiAdmin(getApplicationContext());
  20. ip=wifi.GetIPAddress();
  21. systemManager=newSystemManager();
  22. mIntent=newIntent();
  23. mIntent.setAction("com.example.socket.SERVICE");
  24. getIpBtn=(Button)findViewById(R.id.get_ip_btn);
  25. showTips=(TextView)findViewById(R.id.tips_tv);
  26. showIp=(TextView)findViewById(R.id.ip_tv);
  27. startTB=(ToggleButton)findViewById(R.id.socketStart);
  28. getIpBtn.setOnClickListener(mOnClickListener);
  29. startTB.setOnCheckedChangeListener(mOnCheckedChangeListener);
  30. }
  31. privateOnClickListenermOnClickListener=newOnClickListener(){
  32. @Override
  33. publicvoidonClick(Viewv){
  34. if(v==getIpBtn){
  35. ip=wifi.GetIPAddress();
  36. StringIP=WifiAdmin.longToIP(ip);
  37. showIp.setText("IP:"+IP);
  38. }
  39. }
  40. };
  41. //连接&断开Socket服务
  42. privateOnCheckedChangeListenermOnCheckedChangeListener=newOnCheckedChangeListener(){
  43. @Override
  44. publicvoidonCheckedChanged(CompoundButtonbuttonView,booleanisChecked){
  45. if(buttonView==startTB){
  46. if(isChecked){
  47. startService(mIntent);
  48. }else{
  49. stopService(mIntent);
  50. mHandler.sendEmptyMessage(CONN_ERROR);
  51. }
  52. }
  53. }
  54. };
  55. publicstaticHandlermHandler=newHandler(){
  56. @Override
  57. publicvoidhandleMessage(Messagemsg){
  58. super.handleMessage(msg);
  59. switch(msg.what){
  60. caseCONN_SUCCESS:
  61. StringsocketListStr="";
  62. intnum=1;
  63. for(Socketsocket:SocketService.socketList)
  64. {
  65. socketListStr+="\n------------------\n客户端"+num+++":"+socket;
  66. }
  67. showTips.setText(mActivity.getString(R.string.tips_conn_success)+socketListStr);
  68. break;
  69. caseCONN_ERROR:
  70. showTips.setText(R.string.tips_conn_wifi);
  71. break;
  72. caseSET_BRIGHTNESS:
  73. floatbrightness=(Float)msg.obj;
  74. SystemManager.setBrightness(MainActivity.mActivity,brightness);
  75. SystemManager.saveBrightness(MainActivity.mActivity.getContentResolver(),brightness);
  76. break;
  77. }
  78. }
  79. };
  80. }

b.SocketService.java 服务端创建SocketService不断接收客户端连接请求 [java] view plain copy
  1. /**
  2. *负责接收新的连接
  3. *以及控制系统的功能
  4. *@authorzzp
  5. *
  6. */
  7. publicclassSocketServiceextendsService{
  8. //定义保存所有Socket的ArrayList
  9. publicstaticArrayList<Socket>socketList=newArrayList<Socket>();
  10. privatebooleanquit=false;
  11. privateServerSocketss;
  12. privateintPorts=58888;//端口
  13. privatestaticSocketServicemService;
  14. @Override
  15. publicIBinderonBind(Intentintent){
  16. //TODOAuto-generatedmethodstub
  17. returnnull;
  18. }
  19. @Override
  20. publicvoidonCreate(){
  21. super.onCreate();
  22. Log.v("","SocketServiceonCreate");
  23. mService=this;
  24. newThread(mSocketRunnable).start();
  25. }
  26. /**
  27. *此线程等待新的客户端加入
  28. */
  29. RunnablemSocketRunnable=newRunnable(){
  30. @Override
  31. publicvoidrun(){
  32. try{
  33. ss=newServerSocket(Ports);
  34. while(!quit)
  35. {
  36. //此行代码会阻塞,将一直等待别人的连接
  37. Sockets=ss.accept();
  38. Log.v("","Socket--->s:"+s.toString());
  39. socketList.add(s);
  40. //每当客户端连接后启动一条ServerThread线程为该客户端服务
  41. newThread(newServerThread(s)).start();
  42. MainActivity.mHandler.sendEmptyMessage(MainActivity.CONN_SUCCESS);
  43. }
  44. }catch(IOExceptione){
  45. e.printStackTrace();
  46. }catch(Exceptione){
  47. e.printStackTrace();
  48. }
  49. }
  50. };
  51. @Override
  52. publicvoidonDestroy(){
  53. super.onDestroy();
  54. quit=true;
  55. SocketService.socketList.clear();
  56. try{
  57. ss.close();
  58. }catch(IOExceptione){
  59. //TODOAuto-generatedcatchblock
  60. e.printStackTrace();
  61. }
  62. Log.v("","SocketServiceonDestroy");
  63. }
  64. publicstaticfinalintSET_BRIGHTNESS=1;
  65. publicstaticHandlermHandler=newHandler(){
  66. @Override
  67. publicvoidhandleMessage(Messagemsg){
  68. super.handleMessage(msg);
  69. switch(msg.what){
  70. caseSET_BRIGHTNESS:
  71. //取得当前运行的Activity名字
  72. ActivityManageram=(ActivityManager)mService.getSystemService(ACTIVITY_SERVICE);
  73. ComponentNamecn=am.getRunningTasks(1).get(0).topActivity;
  74. Log.d("","pkg:"+cn.getPackageName());
  75. Log.d("","cls:"+cn.getClassName());
  76. Log.d("","MainActivity.class.getName():"+MainActivity.class.getName());
  77. if(!(cn.getClassName()).endsWith(MainActivity.class.getName())){
  78. Intenti=newIntent();
  79. i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  80. i.setClass(mService,MainActivity.class);
  81. mService.startActivity(i);
  82. }
  83. floatbrightness=(Float)msg.obj;
  84. SystemManager.setBrightness(MainActivity.mActivity,brightness);
  85. SystemManager.saveBrightness(MainActivity.mActivity.getContentResolver(),brightness);
  86. break;
  87. }
  88. }
  89. };
  90. }

d.ServerThread.java 主要负责服务端接收客户端的信息,并分配相应操作(未完成) [java] view plain copy
  1. /**
  2. *负责处理每个线程通信的线程类
  3. *
  4. */
  5. publicclassServerThreadimplementsRunnable
  6. {
  7. //定义当前线程所处理的Socket
  8. Sockets=null;
  9. //该线程所处理的Socket所对应的输入流
  10. BufferedReaderbr=null;
  11. /**
  12. *连接请求
  13. */
  14. publicstaticfinalStringOPERATION_CONNECT="CN";
  15. /**
  16. *方向
  17. */
  18. publicstaticfinalStringOPERATION_DIRECTION_TOP="DT";
  19. publicstaticfinalStringOPERATION_DIRECTION_BOTTOM="DB";
  20. publicstaticfinalStringOPERATION_DIRECTION_LEFT="DL";
  21. publicstaticfinalStringOPERATION_DIRECTION_RIGHT="DR";
  22. /**
  23. *音量
  24. */
  25. publicstaticfinalStringOPERATION_VOLUME="VO";
  26. /**
  27. *亮度
  28. */
  29. publicstaticfinalStringOPERATION_BRIGHTNESS="BR";
  30. /**
  31. *单击&确认
  32. */
  33. publicstaticfinalStringOPERATION_CLICK="CL";
  34. /**
  35. *菜单
  36. */
  37. publicstaticfinalStringOPERATION_MENU="ME";
  38. /**
  39. *返回
  40. */
  41. publicstaticfinalStringOPERATION_BACK="BA";
  42. /**
  43. *电源
  44. */
  45. publicstaticfinalStringOPERATION_POWER="PO";
  46. /**
  47. *Home
  48. */
  49. publicstaticfinalStringOPERATION_HOME="HO";
  50. publicServerThread(Sockets)
  51. throwsIOException
  52. {
  53. this.s=s;
  54. //初始化该Socket对应的输入流
  55. br=newBufferedReader(newInputStreamReader(s.getInputStream(),"utf-8"));//②
  56. }
  57. /**
  58. *向所有接入客户端发信息sendMessageToClient
  59. */
  60. publicsynchronizedstaticvoidsendMessageToClient(Stringmsg){
  61. Log.v("","sendMessageToClient-->:"+msg);
  62. //遍历socketList中的每个Socket,
  63. //将读到的内容向每个Socket发送一次
  64. for(Sockets:SocketService.socketList)
  65. {
  66. try{
  67. OutputStreamos=s.getOutputStream();
  68. os.write((msg+"\n").getBytes("utf-8"));
  69. }catch(IOExceptione){
  70. e.printStackTrace();
  71. Log.e("","-->sendMessageToClienterror<--删除该Socket:"+s);
  72. //删除该Socket。
  73. SocketService.socketList.remove(s);//①
  74. }
  75. }
  76. }
  77. /**
  78. *此线程不断接收客户端发过来的请求信息
  79. */
  80. publicvoidrun()
  81. {
  82. try
  83. {
  84. Stringcontent=null;
  85. //采用循环不断从Socket中读取客户端发送过来的数据
  86. while((content=readFromClient())!=null)
  87. {
  88. if(content.length()<2)continue;//避免发送空指令或错误指令导致异常
  89. StringrequestStr=content.substring(0,2);
  90. Log.v("","SocketServer--->content:"+content+",requestStr:"+requestStr);
  91. if(requestStr.endsWith(OPERATION_VOLUME)){
  92. MainActivity.systemManager.CtrlVolume(content);
  93. }elseif(requestStr.endsWith(OPERATION_BRIGHTNESS)){
  94. MainActivity.systemManager.CtrlBrightness(content);
  95. }
  96. //TODO未完成,下篇完成
  97. }
  98. }
  99. catch(Exceptione)
  100. {
  101. e.printStackTrace();
  102. }
  103. }
  104. /**
  105. *定义读取客户端数据的方法
  106. *@return接收到的请求信息
  107. */
  108. privateStringreadFromClient()
  109. {
  110. try
  111. {
  112. returnbr.readLine();
  113. }
  114. //如果捕捉到异常,表明该Socket对应的客户端已经关闭
  115. catch(IOExceptione)
  116. {
  117. //删除该Socket。
  118. SocketService.socketList.remove(s);
  119. MainActivity.mHandler.sendEmptyMessage(MainActivity.CONN_ERROR);
  120. }
  121. returnnull;
  122. }
  123. }

e.SystemManager.java 操作功能实现类,控制系统音量、系统亮度等(未完成) [java] view plain copy
  1. /**
  2. *控制系统的逻辑类
  3. *@authorzzp
  4. *
  5. */
  6. publicclassSystemManager{
  7. privateAudioManageraudioManager;
  8. privateActivitymActivity;
  9. privatestaticintbrightnessNum=2;
  10. publicSystemManager(){
  11. mActivity=MainActivity.mActivity;
  12. audioManager=(AudioManager)mActivity.getSystemService(Context.AUDIO_SERVICE);
  13. getScreenBrightness(mActivity);
  14. brightnessNum=(int)((getScreenBrightness(mActivity)*1.0/255)*5);
  15. Log.v("","--->getScreenBrightness(mActivity):"+getScreenBrightness(mActivity));
  16. Log.v("","--->brightnessNum:"+brightnessNum);
  17. }
  18. /**
  19. *媒体音量增减
  20. */
  21. publicvoidCtrlVolume(StringctrlCode){
  22. if(ctrlCode.contains("-")){
  23. //第一个参数:声音类型
  24. //第二个参数:调整音量的方向
  25. //第三个参数:可选的标志位
  26. audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
  27. AudioManager.ADJUST_LOWER,
  28. AudioManager.FLAG_SHOW_UI);
  29. }else{
  30. audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC,
  31. AudioManager.ADJUST_RAISE,
  32. AudioManager.FLAG_SHOW_UI);//调高声音
  33. }
  34. }
  35. /**
  36. *系统亮度增减
  37. */
  38. publicvoidCtrlBrightness(StringctrlCode){
  39. if(brightnessNum<0||brightnessNum>5)brightnessNum=2;
  40. if(ctrlCode.contains("-")){
  41. if(brightnessNum>0)brightnessNum--;
  42. }else{
  43. if(brightnessNum<5)brightnessNum++;
  44. }
  45. Messagemsg=newMessage();
  46. msg.what=SocketService.SET_BRIGHTNESS;
  47. msg.obj=(brightnessNum)*1.0f/5;
  48. SocketService.mHandler.sendMessage(msg);
  49. }
  50. /**
  51. *获取屏幕的亮度
  52. *
  53. *@paramactivity
  54. *@return
  55. */
  56. publicstaticintgetScreenBrightness(Activityactivity){
  57. intnowBrightnessValue=0;
  58. ContentResolverresolver=activity.getContentResolver();
  59. try{
  60. nowBrightnessValue=android.provider.Settings.System.getInt(
  61. resolver,Settings.System.SCREEN_BRIGHTNESS);
  62. }catch(Exceptione){
  63. e.printStackTrace();
  64. }
  65. returnnowBrightnessValue;
  66. }
  67. /**
  68. *设置系统亮度
  69. *@parambrightness:0~1
  70. */
  71. publicstaticvoidsetBrightness(Activityactivity,floatbrightness)
  72. {
  73. WindowManager.LayoutParamslp=activity.getWindow().getAttributes();
  74. lp.screenBrightness=brightness;//这里设置范围0~1.0
  75. activity.getWindow().setAttributes(lp);
  76. Settings.System.putInt(activity.getContentResolver(),
  77. android.provider.Settings.System.SCREEN_BRIGHTNESS,
  78. (int)(brightness*255));
  79. }
  80. /**
  81. *保存亮度设置状态
  82. *
  83. *@paramresolver
  84. *@parambrightness:0~1
  85. */
  86. publicstaticvoidsaveBrightness(ContentResolverresolver,floatbrightness){
  87. Uriuri=android.provider.Settings.System
  88. .getUriFor("screen_brightness");
  89. android.provider.Settings.System.putInt(resolver,"screen_brightness",
  90. (int)(brightness*255));
  91. resolver.notifyChange(uri,null);
  92. }
  93. }

f.WifiAdmin.java 与wifi相关类,可查询本机Wifi连接状态、IP地址、IP地址的int形式与IP显示形式转换 [java] view plain copy
  1. /**
  2. *与wifi相关
  3. */
  4. publicclassWifiAdmin
  5. {
  6. //定义WifiManager对象
  7. privateWifiManagermWifiManager;
  8. //定义WifiInfo对象
  9. privateWifiInfomWifiInfo;
  10. //扫描出的网络连接列表
  11. privateList<ScanResult>mWifiList;
  12. //网络连接列表
  13. privateList<WifiConfiguration>mWifiConfiguration;
  14. //定义一个WifiLock
  15. WifiLockmWifiLock;
  16. //构造器
  17. publicWifiAdmin(Contextcontext)
  18. {
  19. //取得WifiManager对象
  20. mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
  21. //取得WifiInfo对象
  22. mWifiInfo=mWifiManager.getConnectionInfo();
  23. }
  24. //打开WIFI
  25. publicvoidOpenWifi()
  26. {
  27. if(!mWifiManager.isWifiEnabled())
  28. {
  29. mWifiManager.setWifiEnabled(true);
  30. }
  31. }
  32. //关闭WIFI
  33. publicvoidCloseWifi()
  34. {
  35. if(!mWifiManager.isWifiEnabled())
  36. {
  37. mWifiManager.setWifiEnabled(false);
  38. }
  39. }
  40. //锁定WifiLock
  41. publicvoidAcquireWifiLock()
  42. {
  43. mWifiLock.acquire();
  44. }
  45. //解锁WifiLock
  46. publicvoidReleaseWifiLock()
  47. {
  48. //判断时候锁定
  49. if(mWifiLock.isHeld())
  50. {
  51. mWifiLock.acquire();
  52. }
  53. }
  54. //创建一个WifiLock
  55. publicvoidCreatWifiLock()
  56. {
  57. mWifiLock=mWifiManager.createWifiLock("Test");
  58. }
  59. //得到配置好的网络
  60. publicList<WifiConfiguration>GetConfiguration()
  61. {
  62. returnmWifiConfiguration;
  63. }
  64. //指定配置好的网络进行连接
  65. publicvoidConnectConfiguration(intindex)
  66. {
  67. //索引大于配置好的网络索引返回
  68. if(index>mWifiConfiguration.size())
  69. {
  70. return;
  71. }
  72. //连接配置好的指定ID的网络
  73. mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);
  74. }
  75. publicvoidStartScan()
  76. {
  77. mWifiManager.startScan();
  78. //得到扫描结果
  79. mWifiList=mWifiManager.getScanResults();
  80. //得到配置好的网络连接
  81. mWifiConfiguration=mWifiManager.getConfiguredNetworks();
  82. }
  83. //得到网络列表
  84. publicList<ScanResult>GetWifiList()
  85. {
  86. returnmWifiList;
  87. }
  88. //查看扫描结果
  89. publicStringBuilderLookUpScan()
  90. {
  91. StringBuilderstringBuilder=newStringBuilder();
  92. for(inti=0;i<mWifiList.size();i++)
  93. {
  94. stringBuilder.append("Index_"+newInteger(i+1).toString()+":");
  95. //将ScanResult信息转换成一个字符串包
  96. //其中把包括:BSSID、SSID、capabilities、frequency、level
  97. stringBuilder.append((mWifiList.get(i)).toString());
  98. stringBuilder.append("/n");
  99. }
  100. returnstringBuilder;
  101. }
  102. //得到MAC地址
  103. publicStringGetMacAddress()
  104. {
  105. return(mWifiInfo==null)?"NULL":mWifiInfo.getMacAddress();
  106. }
  107. //得到接入点的BSSID
  108. publicStringGetBSSID()
  109. {
  110. return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();
  111. }
  112. //得到IP地址
  113. publicintGetIPAddress()
  114. {
  115. return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();
  116. }
  117. //得到连接的ID
  118. publicintGetNetworkId()
  119. {
  120. return(mWifiInfo==null)?0:mWifiInfo.getNetworkId();
  121. }
  122. //得到WifiInfo的所有信息包
  123. publicStringGetWifiInfo()
  124. {
  125. return(mWifiInfo==null)?"NULL":mWifiInfo.toString();
  126. }
  127. //添加一个网络并连接
  128. publicvoidAddNetwork(WifiConfigurationwcg)
  129. {
  130. intwcgID=mWifiManager.addNetwork(wcg);
  131. mWifiManager.enableNetwork(wcgID,true);
  132. }
  133. //断开指定ID的网络
  134. publicvoidDisconnectWifi(intnetId)
  135. {
  136. mWifiManager.disableNetwork(netId);
  137. mWifiManager.disconnect();
  138. }
  139. //将127.0.0.1形式的IP地址转换成十进制整数,这里没有进行任何错误处理
  140. publicstaticlongipToLong(StringstrIp){
  141. long[]ip=newlong[4];
  142. //先找到IP地址字符串中.的位置
  143. intposition1=strIp.indexOf(".");
  144. intposition2=strIp.indexOf(".",position1+1);
  145. intposition3=strIp.indexOf(".",position2+1);
  146. //将每个.之间的字符串转换成整型
  147. ip[0]=Long.parseLong(strIp.substring(0,position1));
  148. ip[1]=Long.parseLong(strIp.substring(position1+1,position2));
  149. ip[2]=Long.parseLong(strIp.substring(position2+1,position3));
  150. ip[3]=Long.parseLong(strIp.substring(position3+1));
  151. return(ip[3]<<24)+(ip[2]<<16)+(ip[1]<<8)+ip[0];
  152. }
  153. //将十进制整数形式转换成127.0.0.1形式的ip地址
  154. publicstaticStringlongToIP(longlongIp){
  155. StringBuffersb=newStringBuffer("");
  156. //将高24位置0
  157. sb.append(String.valueOf((longIp&0x000000FF)));
  158. sb.append(".");
  159. //将高16位置0,然后右移8位
  160. sb.append(String.valueOf((longIp&0x0000FFFF)>>>8));
  161. sb.append(".");
  162. //将高8位置0,然后右移16位
  163. sb.append(String.valueOf((longIp&0x00FFFFFF)>>>16));
  164. sb.append(".");
  165. //直接右移24位
  166. sb.append(String.valueOf((longIp>>>24)));
  167. returnsb.toString();
  168. }
  169. }

g.Manifest.xml(配置文件)需要添加权限 [html] view plain copy
  1. <uses-permissionandroid:name="android.permission.INTERNET"/>
  2. <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
  3. <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
  4. <uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/>
  5. <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
  6. <uses-permissionandroid:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
  7. <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/>
  8. <uses-permissionandroid:name="android.permission.GET_TASKS"/>

四、后记&下篇内容 本例中设置系统亮度未能很好的实现,每次设置亮度都会进行判断当前系统显示的Activty,而设置亮度目前需要到服务端界面设置才成功,所以退出服务端界面后,设置系统亮度会进行判断,如果当前不是显示服务端MainActivity,则在服务中重新打开。 下篇主要内容是模拟系统按键消息,单击事件,滚动事件等。 参考引用: 1.《李刚疯狂Android讲义》十三章 2.Android APIs: http://developer.android.com/reference/java/net/ServerSocket.html

更多相关文章

  1. Android后端服务器的搭建方法
  2. 手机淘宝Android客户端架构
  3. 南青信息查询 for Android客户端
  4. Android客户端与服务器端交互,如何保持session回话
  5. Android实现录屏直播(三)MediaProjection + VirtualDisplay + libr
  6. 微服务-Android客户端: 实现注册和登录

随机推荐

  1. Androd之在图片右上角显示红色圆圈里面数
  2. [Android]Android(安卓)Studio导入第三方
  3. Android应用开发提高系列(5)——Android动
  4. Android学习之菜单
  5. android 发送邮件
  6. Android零碎知识点(6)——下拉列表框Spinne
  7. android中用Spannable在TextView中设置超
  8. android中使用定时任务
  9. Win7上Git安装及简单配置过程
  10. Android(安卓)复习 Content Provider