手头产品是类似于IPC的设备,通过wifi传输视频。目标客户可能在户外使用较多,这就要求wifi 应该是Ap模式工作。Marvell sd8782 Src 源码下载
根据习惯,度娘上一顿收缩,参考博文一篇。
测试uaputl 工具报错,所有命令全部不能配置。因为实际使用的marvell驱动是芯片家直接给的,而手头有的源码版本要低些,uaputl工具是低版本源码编译的,可能这里有版本差异在里面了,先放放,后面拿到源码再试这个。
那我用iwpriv 工具来配置网卡了。
一、装一堆驱动模块
#insmod rfkill_backport.ko;
#insmod compat_firmware_class.ko;
#insmod compat.ko;
#insmod cfg80211.ko;
#insmod mlan.ko
#insmod sd8xxx.ko drv_mode=2&
#echo 1 > /sys/class/compat_firmware/mmc1\:0001\:1/loading
#cat "/lib/firmware/sd8782_uapsta.bin" > /sys/class/compat_firmware/mmc1\:0001\:1/data
#echo 0 > /sys/class/compat_firmware/mmc1\:0001\:1/loading
上面三行命令作用是,我们使用的底层驱动有bug,自己找不到sd8782_uapsta.bin文件(无论是直接编译进内核,还是用udev,nxp技术支持大哥这么解释)。手工指定个路径暂时解决下。
二、iwpriv配置
#iwpriv uap0 apcfg "ASCII_CMD=AP_CFG,SSID=TEST_uAP,SEC=open,CHANNEL=8"
#iwpriv uap0 start
#iwpriv uap0 bssstart
这时可以识别到uap0了
/drivers # iwconfig
lo no wireless extensions.
dummy0 no wireless extensions.
uap0 IEEE 802.11-DS ESSID:""
Mode:Master Frequency:2.437 GHz Access Point: Not-Associated
Encryption key:off
Link Quality:0 Signal level:0 Noise level:0
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
三、配置Ip地址
/drivers # ifconfig uap0 192.168.1.2
/drivers # ifconfig
uap0 Link encap:Ethernet HWaddr 48:02:2A:31:37:26
inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
四、用手机测试下,能识别到这个无线网络了,但是链接不上,这时udhcp要上场了。
下载交叉编译udhcp,当然busybox里面已经带udhcp的,独立编译或着编译busybox都可以。
本人选择独立编译,省事。
修改makefile: CROSS_COMPILE=arm-linux-
#make
把udhcpd copy到您的文件系统下(PS,我还编译了dhcpd,出来有5M多)。
在samples下拷个udhcpd.conf放到/etc/下。
然后自己对udhcpd.conf修修改改,就可以跑来了。
百度手机浏览器的体验地址: http://shouji.baidu.com/browser/
=========================正文===========================================
从上一篇的执行示意图中可以看到,LayoutTest 的执行以及报告生成都发生在 apk
中,所以 apk 是这个测试方案的核心,本文就着重讲述这个 apk
LayoutTests apk的结构mTestsRelativePath = arguments.getString("path");
顾名思义,是管理者的角色,实际上是负责TestsListActivity、Executor 还有一个 Summarizer 进行沟通的。
三个Activity,
DirListActivity是通 luncher 点开apk之后展现测试列表的 Activity,如下图:
主要作用是遍历 server 端的目录,找到给定路径下面所有的测试case,存入到变量中,调用 Executor 去执行,并且等 executor 的执行结果,把结果通过 managerService 传递给 Summerizer。
executor 在独立的进程中是真正加载测试用例(网页)的activity,它封装了百度的统一内核SDK,统一内核SDK封装了T5 内核。executor 中通过 BWebView.loadUrl 加载 TestsListActivity 传递过来的 url,调用到 T5 内核进行 html 的解析、渲染,JavaScript 的执行 等。当页面加载完成之后,会调用 dumpAsText 把页面中的文本导入到文本文件中。比如下面这个测试用例:
fast/cookies/local-file-can-set-cookies.html
<html> <head> <title>Local File Can Set Cookies</title> <script src="/fast/js/resources/js-test-pre.js"></script> </head> <body> <script> description('This test checks that a local file can set cookies. See: rdar://problem/5379090 REGRESSION: Cannot set cookies for local files'); shouldBe("document.cookie.indexOf('ppkcookie1=testcookie')", "-1"); document.cookie = 'ppkcookie1=testcookie'; shouldBeTrue("document.cookie.indexOf('ppkcookie1=testcookie') >= 0"); </script> <script src="/fast/js/resources/js-test-post.js"></script> </body> </html>
在相同目录下由一个文件 fast/cookies/local-file-can-set-cookies-expected.txt
This test checks that a local file can set cookies. See: rdar://problem/5379090 REGRESSION: Cannot set cookies for local files On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". PASS document.cookie.indexOf('ppkcookie1=testcookie') is -1 PASS document.cookie.indexOf('ppkcookie1=testcookie') >= 0 is true PASS successfullyParsed is true TEST COMPLETELayoutTest 执行完这个 case 之后页面会显示如下图:
dumpAsText 会把页面存到 sdcard 里面,文件名是 fast/cookies/local-file-can-set-cookies-actual.txt,当然,字体信息会丢失,但是不影响文本比对。
之后对比 fast/cookies/local-file-can-set-cookies-expected.txt 和fast/cookies/local-file-can-set-cookies-actual.txt
如果两者相同,就PASS,如果不同,就 Fail。 (ps. 如果这个case 过不了,显然是一个最基本的问题,浏览器引擎根本无法上线使用。)
LayoutTest apk 的核心源码下一篇再分析详细过程
本文中主要摘录图层展示控制功能,即对普通图、卫星图及交通流量图展示的控制,方法非常简单,关键点就2个方法:setMapMode(控制普通图和卫星图的显示)、setTraffic(控制交通图的显示)代码如下:
Activity:
package com.home; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.CheckBox; import android.widget.RadioButton; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.map.MapController; import com.baidu.mapapi.map.MapView; import com.baidu.platform.comapi.basestruct.GeoPoint; /** * 演示地图图层显示的控制方法 */ public class LayersShowActivity extends Activity { /** * MapView 是地图主控件 */ private MapView mMapView = null; /** * 用MapController完成地图控制 */ private MapController mMapController = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /** * 使用地图sdk前需先初始化BMapManager. BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建, * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁 */ DemoApplication app = (DemoApplication) this.getApplication(); if (app.mBMapManager == null) { app.mBMapManager = new BMapManager(this); /** * 如果BMapManager没有初始化则初始化BMapManager */ app.mBMapManager.init(DemoApplication.strKey, new DemoApplication.MyGeneralListener()); } /** * 由于MapView在setContentView()中初始化,所以它需要在BMapManager初始化之后 */ setContentView(R.layout.activity_layers); mMapView = (MapView) findViewById(R.id.bmapView); /** * 获取地图控制器 */ mMapController = mMapView.getController(); /** * 设置地图是否响应点击事件 . */ mMapController.enableClick(true); /** * 设置地图缩放级别 */ mMapController.setZoom(12); /** * 显示内置缩放控件 */ mMapView.setBuiltInZoomControls(true); /** * 将地图移动至天安门 * 使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index * .html查询地理坐标 如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口 */ double cLat = 39.945; double cLon = 116.404; GeoPoint p = new GeoPoint((int) (cLat * 1E6), (int) (cLon * 1E6)); mMapController.setCenter(p); } /** * 设置底图显示模式 * * @param view */ public void setMapMode(View view) { boolean checked = ((RadioButton) view).isChecked(); switch (view.getId()) { case R.id.normal: if (checked) mMapView.setSatellite(false); break; case R.id.statellite: if (checked) mMapView.setSatellite(true); break; } } /** * 设置是否显示交通图 * * @param view */ public void setTraffic(View view) { mMapView.setTraffic(((CheckBox) view).isChecked()); } @Override protected void onPause() { /** * MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause() */ mMapView.onPause(); super.onPause(); } @Override protected void onResume() { /** * MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume() */ mMapView.onResume(); super.onResume(); } @Override protected void onDestroy() { /** * MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy() */ mMapView.destroy(); super.onDestroy(); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mMapView.onSaveInstanceState(outState); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); mMapView.onRestoreInstanceState(savedInstanceState); } }
布局XML:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioGroup android:id="@+id/RadioGroup" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="2" android:orientation="horizontal" > <RadioButton android:id="@+id/normal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:checked="true" android:onClick="setMapMode" android:text="普通图" /> <RadioButton android:id="@+id/statellite" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:onClick="setMapMode" android:text="卫星图" /> </RadioGroup> <CheckBox android:id="@+id/traffice" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:checked="false" android:onClick="setTraffic" android:text="交通图" /> </LinearLayout> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout>
Application类和Manifest同之前的文章。
附上图片效果: