当前位置: 代码迷 >> Android >> Android基于Socket无线遥控(一)-Socket基本模型搭建
  详细解决方案

Android基于Socket无线遥控(一)-Socket基本模型搭建

热度:52   发布时间:2016-05-01 15:14:34.0
Android基于Socket无线遥控(1)--Socket基本模型搭建
按计划每周更新一篇技术博文,上周因工作忙而中断,第三篇:《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 +" // 音量增加(volume
"VO -"  // 音量减少
 
D.客户端  --亮度增加、减少-->服务器
消息:
"BR +" // 亮度增加(brightness)
"BR -"  // 亮度减少
 
E.客户端 --单击确认-->服务器
消息:
"CL" // 单击确认(Click)
F.客户端 --菜单-->服务器
消息:
"ME" // 取消(Menul)
 
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讲义》十三章
2.Android APIs:http://developer.android.com/reference/java/net/ServerSocket.html
  相关解决方案