微信群控系统源码的实现原理,核心源码实现,核心框架。

来源:互联网 发布:道路施工常用数据手册 编辑:程序博客网 时间:2024/05/16 02:03

           微信群控系统已经应用于各个行业,也成为大家在微信推广营销的重要工具。如今也演变出群控各种手机软件的各种系统。我们听到的主要有微信群控,淘宝群控,陌陌群控,QQ群控等等。下面我们就来简单介绍下群控系统源码的核心实现原理:

           群控系统,云控系统是两个相对的概念,群控系统主要是通过usb线连接在电脑上,手机上一切命令的执行主要是通过usb线进行传输的。在整个系统的实现中,我们将会用到各种开发语言。在公司整个开发过程中,由我带领技术团队实现了微信群控系统,微信云控系统,一部手机操作100个微信号系统等等。在整个实现过程中,我们主要用的语言包括:C++,Android,C#,和PHP。相面我们就群控系统来详细介绍下每个环节的核心实现,如有朋友需要群控系统源码或定制化开发,请加我。我们首先来介绍pc端的实现。pc端控制页面,实时投屏,在这里我们主要用C#语言实现。其核心关键在于,接收界面实时传输的数据流,实时显示每部手机的页面。以及发送命令给手机去执行。

          在这里我们用到控制的核心adb,不管是屏幕的实时传输,还时传递命令到手机端。或者是传递文件到电脑,核心adb是关键。我们要熟练的掌握各种adb的命令。在这里我们简单贴出一些源码,供大家参考

/// <summary>
        /// 获取设备列表
        /// </summary>
        /// <returns></returns>
        public static string[] GetDevices()
        {
            //var result = ProcessHelper.Run(AdbExePath, "devices");
            var result = ProcessHelper.Run("devices");
            var itemsString = result.OutputString;
            var items = itemsString.Split(new[] { "$", "#", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);


            var itemsList = new List<String>();
            foreach (var item in items)
            {
                var tmp = item.Trim();


                //第一行不含\t所以排除
                if (tmp.IndexOf("\tdevice") == -1)
                    continue;
                var tmps = item.Split('\t');
                itemsList.Add(tmps[0]);
            }


            itemsList.Sort();


            return itemsList.ToArray();
        }


        /// <summary>
        /// 列举ls /data/data目录下的文件和目录
        /// </summary>
        /// <returns></returns>
        public static List<string> ListDataFolder(string deviceNo)
        {
            var moreArgs = new[] { "su", "ls /data/data", "exit", "exit" };
            var result = ProcessHelper.RunAsContinueMode(string.Format("-s {0} shell", deviceNo), moreArgs);


            var itemsString = result.MoreOutputString[1];
            var items = itemsString.Split(new[] { "$", "#", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);


            var itemsList = new List<String>();
            foreach (var item in items)
            {
                var tmp = item.Trim();
                //移除第一行,输入的命令
                if (tmp.Contains(moreArgs[1]))
                    continue;
                //移除空白行
                if (string.IsNullOrEmpty(tmp))
                    continue;
                //移除最后两行的root@android
                if (tmp.ToLower().Contains("root@"))
                    continue;
                itemsList.Add(tmp);
            }


            itemsList.Sort();


            return itemsList;
        }


        /// <summary>
        /// 获取指定的目录
        /// </summary>
        /// <param name="deviceNo"></param>
        /// <param name="path"></param>
        /// <returns></returns>
        public static List<string> ListDataFolder(string deviceNo, string path)
        {
            var moreArgs = new[] { "su", "ls " + path, "exit", "exit" };
            var result = ProcessHelper.RunAsContinueMode(string.Format("-s {0} shell", deviceNo), moreArgs);


            m_log.Info("获取路径结果:" + result.ToString());


            var itemsString = result.MoreOutputString[1];
            var items = itemsString.Split(new[] { "$", "#", "\r", "\n" }, StringSplitOptions.RemoveEmptyEntries);


            var itemsList = new List<String>();
            foreach (var item in items)
            {
                var tmp = item.Trim();
                //移除第一行,输入的命令
                if (tmp.Contains(moreArgs[1]))
                    continue;
                //若有Permission denied证明没有该路径,直接退出
                if (tmp.Contains(path + ": Permission denied"))
                    break;
                //移除空白行
                if (string.IsNullOrEmpty(tmp))
                    continue;
                //移除最后两行的root@android
                if (tmp.ToLower().Contains("root@") || tmp.ToLower().Contains("shell@"))
                    continue;
                if (tmp.Equals("su") || tmp.Contains("su: not found"))//移除su
                    continue;
                itemsList.Add(path + "/" + tmp);
            }


            itemsList.Sort();


            return itemsList;
        }

      在开发过程中,我们用到的C++部分主要在于adb的重新编译,有些特殊的功能,在现有的adb无法实现的情况下,我们是自己再Linux平台自己将需要的功能进入到adb中,重新编译修改后的adb源码,包括adb连接的手机个数,adb识别手机的方式等等方面。

      在开发过程中,屏幕的实时传输这块我们花了不少的时间,在这里我们尝试了很多方式,包括网上介绍的各种方式,然后传输效果都不是很好,要么是延迟严重,要么操作的流畅性不够。我们最终选择使用socket传输数据流,每秒的帧数,以及画面的质量都可以调节。部分代码为

try {    if(popUp)    screenshot = Utilities.bitmapMatrix(screenshot);    else        screenshot = Utilities.bitmapMatrix1(screenshot);    baos = new ByteArrayOutputStream();    screenshot.compress(Bitmap.CompressFormat.JPEG, 30, baos);    data = baos.toByteArray();    dos.writeInt(data.length);    dos.write(data);    if (baos != null) {        baos.flush();    }
       在手机端,我们使用模拟点击来实现人工的模拟操作,当然Android系统中实现模拟点击有各种方式,在我们对比后选择了uiautomator,大家可以查询一下相关资料,在实现过程中有什么问题,咨询:393231639。相互交流学习。



阅读全文
0 0
原创粉丝点击