当前位置:  编程技术>移动开发
本页文章导读:
    ▪Music Player Daemon移栽到嵌入式系统[一]        Music Player Daemon移植到嵌入式系统[一]*************************************************************************************************************************** 作者:EasyWave                                         .........
    ▪ 帮豆包刷“日日爱消除”,“天天连萌”        帮豆包刷“天天爱消除”,“天天连萌”        自从微信5.0发布以后,新增的功能除了游戏之外,其他的并没有更多的体验,像银行卡绑定,手机支付这些,我想我是一直不会使用的,.........
    ▪ 基于glib2.12.13编译出现的有关问题总结       基于glib2.12.13编译出现的问题总结*************************************************************************************************************************** 作者:EasyWave                                            .........

[1]Music Player Daemon移栽到嵌入式系统[一]
    来源: 互联网  发布时间: 2014-02-18
Music Player Daemon移植到嵌入式系统[一]
***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2013.10.06

类别:Linux 应用Music Player Daemon                                                声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:简介

Music Player Daemon是一款广受欢迎的音乐服务端软件,提供了丰富的用于音乐播放的控制接口,支持MP3、Ogg Vorbis、FLAC、AAC、Mod和wave等音频格式,以及播放列表管理。采用C/S架构开发的MPD,用户可以使用各种前端来控制MPD的播放行为,也可以使用终端甚至网页来控制,因此能够满足各类用户的需求。

二:需要哪些组件

由于Music Player Daemon需要用到以下关键组件:

    1):Glib库,因此需要移植Glib库,不过这里不采用glib-2.12.13,最终选择glib-2.14.6的版本,因为在ncmpc-0.20的应用中需要用到Gregex,由于glib-2.12.13并不支持regex,而glib-2.14.6是可以支持的,故选择glib-2.14.6版本。

    2):ogg库,在Music Player Daemon中采用插件的方式来加载。

    3):FLAC库,在Music Player Daemon中采用插件的方式来加载。

    4):libmad库,在Music Player Daemon中采用插件的方式来加载。

    5):AAC库,在Music Player Daemon中采用插件的方式来加载。

有了以上的几个库,基本上是可以播放FLAC、OGG、MP3、AAC几种格式的音频文件了。

三:编译组件

    1): Glib组件的编译

      由前面的博文可知,编译Glib需要用到Gettext和libiconv等。如下所示:

如果想要编译成功glib就需要用到上图中前面三个库项目。gettext的编译脚本配置如下:

#!/bin/bash
export LDFLAGS="-L/usr/local/arm_linux_4.2/arm-none-linux-gnueabi/lib"
export CFLAGS="-I/usr/local/arm_linux_4.2/arm-linux/include"
export PKG_CONFIG_PATH="$INSTALL_PATH/lib/pkgconfig" 
#autoreconf -ivf
if [ -f config.log ]; then
	make distclean
fi
echo am_cv_func_working_getline=yes>arm-linux.cache &&
./configure --prefix=$INSTALL_PATH \
            --host=arm-none-linux-gnueabi \
	    --build=i486-linux-gnu \
            --cache-file=arm-linux.cache \
            --disable-dependency-tracking \
	    --enable-shared=yes \
	    --enable-static=no \
            --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

libiconv的编译脚本如下:

export PKG_CONFIG_PATH="$INSTALL_PATH/lib/pkgconfig" 

#autoreconf -ivf
if [ -f config.h ]; then
	make distclean
fi


./configure --prefix=$INSTALL_PATH \
            --host=arm-none-linux-gnueabi \
	    --build=i486-linux-gnu \
	    --enable-shared=no \
	    --enable-static=yes \
            --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

Glib编译脚本如下:

export LDFLAGS="-L$INSTALL_PATH/lib -L/usr/local/arm_linux_4.2/arm-none-linux-gnueabi/lib"
export CFLAGS="-I$INSTALL_PATH/include"
export PKG_CONFIG_PATH="$INSTALL_PATH/lib/pkgconfig" 
export LIBS="-lasprintf -lgettextpo -lgettextsrc -lgettextlib -lintl"

#autoreconf -ivf
if [ -f config.h ]; then
	make distclean
fi

echo glib_cv_stack_grows=no>arm-linux.cache && 
echo ac_cv_type_long_long=yes>>arm-linux.cache &&
echo glib_cv_uscore=no>>arm-linux.cache &&
echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache&&
./configure --prefix=$INSTALL_PATH \
            --host=arm-none-linux-gnueabi \
	    --build=i486-linux-gnu \
            --cache-file=arm-linux.cache \
	    --enable-maintainer-mode \
            --enable-debug=no \
            --enable-ansi=no \
	    --enable-gc-friendly \
            --disable-mem-pools \
            --enable-threads \
            --disable-rebuilds \
            --disable-visibility \
            --disable-largefile \
            --enable-iconv-cach=auto \
	    --enable-shared=yes \
	    --enable-static=no \
	    --enable-fast-install=yes \
	    --disable-libtool-lock \
            --enable-included-printf \
            --enable-regex \
            --enable-gtk-doc=no \
            --enable-man=no \
            --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1

编译成功之后,就可以看到Glib库了,如下:[只列举一部分]

 

其它的第三方库,在下一篇文章再来分析,如下所示的第三方Audio编解码库。。。


    
[2] 帮豆包刷“日日爱消除”,“天天连萌”
    来源: 互联网  发布时间: 2014-02-18
帮豆包刷“天天爱消除”,“天天连萌”

        自从微信5.0发布以后,新增的功能除了游戏之外,其他的并没有更多的体验,像银行卡绑定,手机支付这些,我想我是一直不会使用的,无论它做得再好,一句话,“不安全,丢了手机还丢钱包”。

        闲话少说,国庆前媳妇豆包和周围朋友都一直在疯狂的玩微信的小游戏“天天爱消除”,“天天联萌”,有一天跟朋友说,弄个刷分的工具,刷刷分吧,朋友顿时各种搜索,找了些刷分的程序,大致功能是修改游戏里存储积分的字段,存储金币的字段等,保证在提交的结果时候会有一个高分,结果没过几天就被腾讯清号了,游戏的金币等级全被将为0。作为一个极端主义的IT男,肯定是会思考各种办法去解决,下面进入正题。

     

    背景

      通过计算机自动玩微信游戏“天天爱消除”,“天天连萌”,主要目的是为帮助老婆刷分。

    难点

       1、  用电脑程序实现手动模拟触屏;

      2、  图像识别,捕获屏幕图像,把图像转换为对应的数组(数组中不同的值代表不同图案);

      3、  搜索最优移动方案。

    核心算法

     首先写了一个用电脑操作手机的类: Robot.java(主要操作类) , Point.java(定义手机坐标类)

     主要接口如下:

        
        public void Snapshot();                            //获取手机截图

        public void Drag(Point p1,Point p2) ;  //模拟触屏,从点p1移动到p2

        public void Touch(Point p)  ;                 //模拟触屏,点击p点

        public void SetNum();                          //通过获取的截图设置num数组,对于不同的游戏,实现不一样

        public Point Search();                         //搜索,返回最优点,同上,对于不同的游戏,实现不一样。
     
       .........

     天天爱消除--- 图像的识别算法:

       由于只有7中颜色,而且颜色的区分度比较明显,因此取图像指定范围的RGB像素值,定义一个精度,计算是否满足即可,获取颜色代码如下:

           

    public int GetColor(BufferedImage bufferedImage,int startx,int starty,int width,int height)
        {
               int R = 0;
               int G = 0;
               int B = 0;
               for(int rx = startx;rx<startx+width;rx++)
               {
                   for(int ry = starty;ry<starty+height;ry++)
                   {
                       int RGB = bufferedImage.getRGB(rx, ry);
                       R += (RGB & 0xff0000 ) >> 16 ;
                       G += (RGB & 0xff00 ) >> 8 ;
                       B += (RGB & 0xff );  
                   }
               } 
               R = R/(width*height);
               G = G/(width*height);
               B = B/(width*height);
               Double[] temp = new Double[7];
               double jingdu = 50;
               //红色
               int i = 254;
               int j = 82;
               int k = 105;
               temp[0] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               //白色 
               i=234;j=233;k=233;
               temp[1] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               //绿色
               i=186;j=240;k=91;
               temp[2] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               //黄色
               i=253;j=228;k=85;
               temp[3] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               //棕色
               i=234;j=151;k=86;
               temp[4] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               //紫色
               i=160;j=127;k=200;
               temp[5] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               //蓝色
                i=83;j=179;k=233;
               temp[6] = Math.sqrt((R-i)*(R-i)+(G-j)*(G-j)+(B-k)*(B-k));
               if(temp[0]<jingdu)
                   return 1;//System.out.print("红色");
               else if(temp[1]<jingdu)
                   return 2;// System.out.print("白色");
               else if(temp[2]<jingdu)
                   return 3;// System.out.print("绿色");
               else if(temp[3]<jingdu)
                   return 4; // System.out.print("黄色");
               else if(temp[4]<jingdu)
                   return 5;// System.out.print("棕色");
               else if(temp[5]<jingdu)
                   return 6;// System.out.print("紫色");
               else if(temp[6]<jingdu)
                   return 7;//  System.out.print("蓝色"); 
               else
                  return random.nextInt(1000)+8; //  System.out.print("未匹配");    
            }

     天天爱消除的---搜索算法:

        计算最优解。由于当消去4个或5个以及特殊道具会有额外加分及消除功能,暂不考虑,只需要消去3个,4个,5个相同颜色时的权重即可。

        定义f(3)=350,f(4)=1200,f(5)=5000,即单次消除的分值(玩游戏时估计出一个值)

        每次移动,发生的消去只能在移动点和被移动点之间产生,因此只需要分别计算以该两点为中心,上下左右最大相同匹配的长度和次数。

                                    

                 上图最优移动方案为 swap(1,4,2,4) , [1][4] 与 [2][4]交换,可同时消去两对,生成的M=700。

       public int Get_Value(int x,int y)
        { 
            int temp = num[x][y];
            int value = 0;
            int row_con = 1;
            int col_con = 1;
            int a = x-1;
            int b = y;
            while(a>=0 && temp==num[a--][b])
                col_con++;
            a = x+1;
            while(a<N && temp==num[a++][b])
                col_con++;
            a = x;
            b = y-1;
            while(b>=0 && temp==num[a][b--])
                row_con++;
            b = y+1;
            while(b<N && temp==num[a][b++])
                row_con++; 
            value += Calculate(row_con);
            value += Calculate(col_con);       
            return value;
        }

        private int Calculate(int x)
        { 
            switch(x)
            {
                case 3:
                    return 350;       
                case 4:
                    return 800; 
                case 5:
                    return 1700; 
                default: 
            } 
            return 0;
        }


       天天连萌---图像识别算法:

       由于天天连萌图像比较多,而且相似的颜色图案也比较多,因此不能采用计算区域平均颜色来定义每个图案。在实际识别的时候,为了丰富知识,采用了汉明距离计算图像相似度的算法(具体可参考链接:http://www.open-open.com/lib/view/open1358901340114.html),但是存在的问题就是需要提前把每种图案进行存储,用手机截屏加PS,会很快实现,为了达到相似的计算,建议去中间75*65范围图像,这样避免了有时候会出现道具,加分等符号的影响,最后识别的效果感觉非常不错。每种图像定义一种值,大约有30种不同的图案吧,没有图案则置为0。每获取一种图,就进行搜索是否存在,存在置相应的数,否则为0,如发现炸弹的图案,同样置0。(炸弹实际上不阻挡消去路径,保留的话可以到游戏结束增加积分。)

    天天连萌---搜索算法: 

       由图像转换得到的一个数组,定义为5*10,加上外围边界,实际上是7*12的数组,范围对于计算机来说是非常小了。因此直接采用深度优先,控制方向,控制转弯次数即可达到搜索目的。

      

   public void Start_Search() throws InterruptedException
        { 
            while(!Is_empty())
            { 
                for(int i = 1;i<=Width;i++)
                    for(int j = 1;j<=Height;j++) 
                          if( num[i][j]!=0 && Search(i,j,num[i][j]))
                                   Touch_hengping(i, j);  
                             
            } 
        }

      private  boolean Search(int x,int y,int target)
       {
           int con = 2;
           if(Search_path(x-1,y,1,2,target)||Search_path(x+1,y,2,2,target)||Search_path(x,y-1,3,2,target)||Search_path(x,y+1,4,2,target))
           {
               num[x][y]=0;
               return true;
           } 
           return false;
       }   

      private  boolean Search_path(int x,int y , int dir,int con,int target)
      {  ... }   

   Search_path就是深度求解的过程,x,y表示起点坐标,dir表示方向,con表示可拐弯次数,target表示目标数值。

 

   

   效果:

    虽然不能达到很高的分数,但是也可以保持在游戏排名靠前的位置,免得被腾讯发现又分数又清零了。事实上通过模拟按键的方式刷分,应该很难检测出来的。

  

   

       目前最高刷到27关,平均2s可闯一关,但是由于每次截图耗时,所以连击较少,分数并不高。

   

      在图像处理上还需要优化。

  缺点:

   1、通过计算机发送指令到手机上捕获图片再回传到计算机上,测试需要耗时1.5秒,太费时间;

    2、在天天连萌中进行图像识别时候,均涉及到文件的访问,所以在截图后再匹配图片的时候也需要一段时间,也很费时;

    3、天天爱消除中消除后的效果影响截图,对图像识别有影响,截图的次数多,实际情况较慢。


   改进:

        将程序移植到手机上,利用手机进行计算,省去了图像在手机与计算机之间的传输,但可惜的是对手机移动应用开发并不擅长,因此还需要时间才能完成。

      

       LT比较懒,很少写博客,10月后回归,多写东西锻炼写作能力。

    

3楼qq2452822093小时前没明白为什么要通过计算机玩.现在网上的脚本多的是.n现在比较流行的就是用触摸精灵运行脚本. 来模拟触摸.Re: longteng11162小时前回复qq245282209n网上那些事别人的,还是喜欢自己动手,风衣足食。Re: qq2452822091小时前回复longteng1116n没有. 我只是告诉你. 很容易直接在移动端运行.2楼yunshishenl3小时前楼主很强大啊Re: longteng11163小时前回复yunshishenln谢谢,弄着学习学习~~~1楼u0123555815小时前楼主真的很强大哦 佩服

    
[3] 基于glib2.12.13编译出现的有关问题总结
    来源: 互联网  发布时间: 2014-02-18
基于glib2.12.13编译出现的问题总结
***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2013.10.06

类别:Linux 应用glib2.12.13                                                             声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

一:Glib简介

       glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性。glib是Gtk+库和Gnome的基础。glib可以在多个平台下使用,比如Linux、Unix、Windows等。glib为许多标准的、常用的C语言结构提供了相应的替代物。如果有什么东西本书没有介绍到,请参考glib的头文件:glib.h。glib.h中的头文件很容易理解,很多函数从字面上都能猜出它的用处和用法。如果有兴趣,glib的源代码也是非常好的学习材料。
glib的各种实用程序具有一致的接口。它的编码风格是半面向对象,标识符加了一个前缀“g”,这也是一种通行的命名约定。 
  使用glib库的程序都应该包含glib的头文件glib.h。如果程序已经包含了gtk.h或gnome.h,则不需要再包含glib.h。

二:Glib库的编译

      要想在编译Glib不出现错误,首先需要确定你的嵌入式交叉编译器中是否包含gettext和libiconv,如果你的交叉编译工具中没有这两个库的话,那么编译的过程中会出现以下的错误:

   1):gettext错误

          You must have either have gettext support in your C library, or use the 
          GNU gettext library. (http://www.gnu.org/software/gettext/gettext.html

   就算是你的主机host中已经安装了gettext的话,也还是会提示此类错误,因此需要首先确定你的嵌入式交叉编译工具中是否包含了gettext。

   2): libiconv无法找到iconv.h头文件

       如果你的交叉编译工具中没有包含libiconv的话,那么会提示iconv.h无法找到的问题,因此如果交叉编译工具中没有的话,就需要下载libiconv自行编译

   3):cannot run test program while cross compiling

       对于这个问题,需要仔细看看configure文件,有哪些会提示这类错误,我这里通过修改如下几项就不会提示这类错误了,如下:

       echo glib_cv_stack_grows=no
       echo ac_cv_type_long_long=yes
       echo glib_cv_uscore=no
       echo ac_cv_func_posix_getpwuid_r=yes

三:编译选项设置

#!/bin/bash

if [ "$1" == "" ]; then
	INSTALL_PATH=`pwd`/_install
else
	if [ -d $1 ]; then
		INSTALL_PATH=$1
	else
		exit 1
	fi
fi

mkdir -p $INSTALL_PATH

export LDFLAGS="-L$INSTALL_PATH/lib -L/usr/local/arm_linux_4.2/arm-none-linux-gnueabi/lib"
export CFLAGS="-I$INSTALL_PATH/include"
export PKG_CONFIG_PATH="$INSTALL_PATH/lib/pkgconfig" 
export LIBS="-lasprintf -lgettextpo -lgettextsrc -lgettextlib -lintl"

#autoreconf -ivf
if [ -f config.h ]; then
	make distclean
fi

echo glib_cv_stack_grows=no>arm-linux.cache && 
echo ac_cv_type_long_long=yes>>arm-linux.cache &&
echo glib_cv_uscore=no>>arm-linux.cache &&
echo ac_cv_func_posix_getpwuid_r=yes>>arm-linux.cache&&
./configure --prefix=$INSTALL_PATH \
            --host=arm-none-linux-gnueabi \
	    --build=i486-linux-gnu \
            --cache-file=arm-linux.cache \
	    --enable-maintainer-mode \
            --enable-debug=no \
            --enable-ansi=no \
	    --enable-gc-friendly \
            --disable-mem-pools \
            --enable-threads \
            --disable-rebuilds \
            --disable-largefile \
	    --enable-shared=yes \
	    --enable-static=no \
	    --enable-fast-install=yes \
	    --disable-libtool-lock \
            --disable-gtk-doc \
            --with-gnu-ld

if [ $? -eq 0 ]; then
        make
        if [ $? -eq 0 ]; then
                make install
                exit 0
        fi
fi
exit 1


编译之后的library如下:

四:总结

      我在编译glib的时候,开始出现问题的地方始终是在gettext,由于我的交叉编译工具中并没有gettext,所以需要重新编译一份gettext,我这里选用的版本是:gettext0.14.2版本,这是由于我的交叉编译工具的原因,无法选用更高版本的。



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3