
# 修改云手机定位
#### 功能介绍
影响手机定位功能的信息分为四类，分别为GPS经纬度数据、基站信息数据、WiFi信息及IP地址，云手机支持其中的GPS经纬度数据和WiFi信息模拟，用户可根据业务场景，选择其中一种或多种进行定位模拟。
| 定位模式 | 精度 | 常见场景              |
|:---|:---|:---|
| GPS  | 高  | 地图、导航等需要持续定位的应用软件 |
| WiFi | 中  | 一般用于GPS和基站的辅助定位手段 |
   
#### 前提条件
已购买并通过ADB方式登录云手机。详细操作请参见"[购买云手机服务器](https://support.huaweicloud.com/qs-cph/cph_qs_0003.html)"。
#### GPS经纬度数据模拟
1. GPS经纬度获取 云手机GPS经纬度数据模拟基于WGS84坐标系，使用其它坐标系如GCJ02(高德、QQ地图) ，BD09(百度地图) 注入会产生偏差。
   获取GPS定位信息示例：
   ```
   mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
   mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, locationListener);
   private final LocationListener locationListener = new LocationListener() {
           public void onLocationChanged(Location location) {
               // location包含gps数据经纬度等信息
           }
   };
   ```
   
2. GPS数据注入方式
   - shell命令注入 在手机adb shell环境里执行echo "参数列表（参数之间用":"分隔）" \> /data/gps/fifo。
     参数说明如[表1]所示。
      表1GPS数据注入参数 
     | 参数        | 说明                                                                          | 是否必须 | 缺省值        | 约束                                                                 |
     |:---|:---|:---|:---|:---|
     | latitude  | 纬度。 北纬为正，南纬为负。                                 | 必须   | 22.657501  | 取值范围：-90.000000\~90.000000 单位：度（°）   |
     | longitude | 经度。 东经为正，西经为负。                                | 必须   | 114.055939 | 取值范围：-180.000000\~180.000000 单位：度（°） |
     | altitude  | 海拔高度                                                                        | 可选   | 51.0       | 单位：米                                                               |
     | speed     | 速度                                                                          | 可选   | 0.0        | 单位：米                                                               |
     | bearing   | 方向角。 0°表示正北方向，90°表示正东方向，180°表示正南方向，270°表示正西方向。 | 可选   | 30.0       | 取值范围：0.0\~360.0 单位：度（°）                |
     | accuracy  | 定位精度                                                                        | 可选   | 90.0       | 单位：米                                                               |
        
     举例：假设需修改的位置是东经114.055939度，北纬22.657501度。
     ```
     adb -s 127.0.0.1:本地空闲端口 shell "echo 'longitude=114.055939:latitude=22.657501' > /data/gps/fifo"
     ```
     
   
   - GPS数据持续注入（建议使用非阻塞注入方式） 使用自有或第三方SDK应用代码持续注入GPS数据，需使用O_NONBLOCK非阻塞方式注入。
     举例：
     ```
     #define GPSFifoName "/data/gps/fifo"
     if((fifo_fd = open(GPSFifoName, O_WRONLY | O_NONBLOCK)) < 0) {
     ALOGE("open fifo "%s" (write) fail, error = %s\n", GPSFifoName, strerror(errno));
     return;
     }
     //注意cmd参数间需要通过冒号“:”进行分隔
     char* cmd = "longitude=113.370592:latitude=23.123642"；
     len = strlen(cmd);
     if(write(fifo_fd, cmd, len) != len) {
     ALOGE("%s: write "%s" to "%s" fail: %s", FUNCTION, cmd, GPSFifoName, strerror(errno));
     }
     ```
     
    
 
#### WiFi信息模拟
1. WiFi信息获取 获取WiFi信息示例：
   ```
   WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
   WifiInfo wifiConnection = wifiManager.getConnectionInfo();
   if (wifiConnection != null) {
       String bssid =  wifiConnection.getBSSID();
   }
   ```
   
2. WiFi信息注入 针对当前连接WiFi BSSID，可以通过设置属性com.cph.wifi.bssid进行注入。
   举例：
   ```
   setprop com.cph.wifi.bssid 02:00:00:00:00:00
   ```
   
 
