手头产品是类似于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 COMPLETE
LayoutTest 执行完这个 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同之前的文章。
附上图片效果: