3.1.15 基站/WIFI定位
====================

wifi与基站定位
--------------

作者:闫国梁

最后更新时间:2020年6月30日

基站定位:
----------

AT模式
------

查询基站定位指令说明
~~~~~~~~~~~~~~~~~~~~

语法规则:

+-----+------------------+---------------------------------------------+
| 命  | 语法             | 返回                                        |
| 令  |                  |                                             |
| 类  |                  |                                             |
| 型  |                  |                                             |
+=====+==================+=============================================+
| 设  | AT+CIPGSMLOC=,   | **If =1:** +CIPGSMLOC:[,,,, ] OK **If =2:** |
| 置  |                  | +CIPGSMLOC: [,,] OK **If error is related   |
| 命  |                  | to ME functionality:** +CME ERROR:          |
| 令  |                  |                                             |
+-----+------------------+---------------------------------------------+
| 测  | AT+CIPGSMLOC=?   | +CIPGSMLOC:(list of supported s),(range of  |
| 试  |                  | ) OK                                        |
| 命  |                  |                                             |
| 令  |                  |                                             |
+-----+------------------+---------------------------------------------+

参数定义:

+------+-------------------------+-------+-------------------------+
| 参数 | 定义                    | 取值  | 对取值的说明            |
+======+=========================+=======+=========================+
|      | operation type          | 1     | View the longitude,     |
|      |                         |       | latitude and time       |
+------+-------------------------+-------+-------------------------+
|      |                         | 2     | View the time only      |
+------+-------------------------+-------+-------------------------+
|      | as defined in +SAPBR    | 1-3   |                         |
+------+-------------------------+-------+-------------------------+
|      | Current                 |       |  经度                   |
|      | longitude in degrees    |       |                         |
+------+-------------------------+-------+-------------------------+
|      | Current latiitude in    |       | 纬度                    |
|      | degrees                 |       |                         |
+------+-------------------------+-------+-------------------------+
|      | the format is yy/mm/dd  |       | for example 18/11/08    |
+------+-------------------------+-------+-------------------------+
|      | the format is hh/mm/ss  |       | for example 15:47:26    |
+------+-------------------------+-------+-------------------------+
|      |                         | 0     | Success                 |
+------+-------------------------+-------+-------------------------+
|      |                         | 1     | 未找到数据              |
+------+-------------------------+-------+-------------------------+
|      |                         | 6     | 参数错误                |
+------+-------------------------+-------+-------------------------+
|      |                         | 7     | 未知错误                |
+------+-------------------------+-------+-------------------------+
|      |                         | 404   | Not Found               |
+------+-------------------------+-------+-------------------------+
|      |                         | 408   | Request Time-out        |
+------+-------------------------+-------+-------------------------+
|      |                         | 601   | Network Error           |
+------+-------------------------+-------+-------------------------+
|      |                         | 602   | No memory               |
+------+-------------------------+-------+-------------------------+
|      |                         | 603   | DNS Error               |
+------+-------------------------+-------+-------------------------+
|      |                         | 604   | Stack busy              |
+------+-------------------------+-------+-------------------------+
|      |                         | 65535 | Other Error             |
+------+-------------------------+-------+-------------------------+

基站定位测试流程实例
~~~~~~~~~~~~~~~~~~~~

以下部分加粗内容是模块发给mcu,非加粗是mcu发给模块 AT 训练波特率 **AT**
**OK** AT+SAPBR=1,1 激活PDP **AT+SAPBR=1,1** **OK** AT+SAPBR=2,1
查询是否激活成功,成功能查询到IP **AT+SAPBR=2,1** **+SAPBR:
1,1,“10.150.186.203”** **OK** AT+CIPGSMLOC=1,1 查询基站定位
**AT+CIPGSMLOC=1,1** **+CIPGSMLOC:
0,31.174749,121.600788,2020/06/30,13:07:46** **OK** ###
查询WIFI定位指令说明 语法规则:

+-----+-----------------+----------------------------------------------+
| 命  | 语法            | 返回                                         |
| 令  |                 |                                              |
| 类  |                 |                                              |
| 型  |                 |                                              |
+=====+=================+==============================================+
| 设  | AT+WIFILOC=,    | **If =1:** +WIFILOC:[,,,,] OK **If =2:**     |
| 置  |                 | +WIFILOC: [,,] OK **If error is related to   |
| 命  |                 | ME functionality:** +CME ERROR:              |
| 令  |                 |                                              |
+-----+-----------------+----------------------------------------------+
| 测  | AT+WIFILOC=?    | +WIFILOC:(list of supported s),(range of )   |
| 试  |                 | OK                                           |
| 命  |                 |                                              |
| 令  |                 |                                              |
+-----+-----------------+----------------------------------------------+

参数定义:

==== ============================ ===== ============================
参数 定义                         取值  对取值的说明
==== ============================ ===== ============================
\    operation type               1     longitude, latitude and time
\                                 2     View the time only
\    as defined in +SAPBR         1-3    
\    Current longitude in degrees       经度
\    Current latitude in degrees        纬度
\    the format is yy/mm/dd             for example 18/11/08
\    the format is hh:mm:ss             for example 15:47:26
\                                 0     Success
\                                 1     未找到数据
\                                 6     参数错误
\                                 7     未知错误
\                                 404   Not Found
\                                 408   Request Time-out
\                                 601   Network Error
\                                 602   No memory
\                                 603   DNS Error
\                                 604   Stack busy
\                                 65535 Other Error
==== ============================ ===== ============================

WIFI定位测试流程实例
~~~~~~~~~~~~~~~~~~~~

以下部分加粗内容是模块发给mcu,非加粗是mcu发给模块 AT 训练波特率 **AT**
**OK** AT+SAPBR=1,1 激活PDP **AT+SAPBR=1,1** **OK** AT+SAPBR=2,1
查询是否激活成功,成功能查询到IP **AT+SAPBR=2,1** **+SAPBR:
1,1,“10.150.186.203”** **OK** AT+WIFILOC=1,1 查询wifi定位
**AT+WIFILOC=1,1**

**+WIFILOC: 0,31.174864,121.600850,2020/06/30,13:01:28** **OK** ##
LUAT模式 ### 基站定位接口 **lbsLoc.request(cbFnc, reqAddr, timeout,
productKey, host, port, reqTime, reqWifi)**

发送根据基站查询经纬度请求(仅支持中国区域的位置查询)

-  参数

+---------+------------------------------------------------------------+
| 传入    | 释义                                                       |
| 值类型  |                                                            |
+=========+============================================================+
| f       | cbFnc,用户回调函数,回调函数的调用形式为:                |
| unction | cbFnc(result,lat,lng,addr) result:number类型 0表示成功    |
|         | 1表示网络环境尚未就绪 2表示连接服务器失败                  |
|         | 3表示发送数据失败 4表示接收服务器应答超时                  |
|         | 5表示服务器返回查询失败 6表示socket已满,创建socket失败    |
|         | 为0时,后面的3个参数才有意义                               |
|         | lat:string类型                                            |
|         | 或者nil,纬度,整数部分3位,小数部分7位,例如“031.2425864” |
|         | lng:string类型                                            |
|         | 或者nil,经度,整数部分3位,小数部分7位,例如“121.4736522” |
+---------+------------------------------------------------------------+
| bool    | **                                                         |
|         | 可选参数,默认为\ ``nil``**\ ,reqAddr,此参数无意义,保留 |
+---------+------------------------------------------------------------+
| number  | **可选参数,默认为\ ``2                                    |
|         | 0000``**\ ,timeout,请求超时时间,单位毫秒,默认20000毫秒 |
+---------+------------------------------------------------------------+
| string  | **可选参数,默认为\ ``ni                                   |
|         | l``**\ ,productKey,IOT网站上的产品证书,此参数可选,用户 |
|         | 如果在main.lua中定义了PRODUCT_KEY变量,就不需要传入此参数  |
+---------+------------------------------------------------------------+
| string  | **可选                                                     |
|         | 参数,默认为\ ``nil``**\ ,host,服务器域名,此参数可选,  |
|         | 目前仅lib中agps.lua使用此参数。用户脚本中不需要传入此参数  |
+---------+------------------------------------------------------------+
| string  | **可选                                                     |
|         | 参数,默认为\ ``nil``**\ ,port,服务器端口,此参数可选,  |
|         | 目前仅lib中agps.lua使用此参数。用户脚本中不需要传入此参数  |
+---------+------------------------------------------------------------+
| bool    | **可选参数,默认为\ ``nil``**\ ,reqTime,是否需要服务     |
|         | 器返回时间信息,true返回,false或者nil不返回,此参数可选, |
|         | 目前仅lib中agps.lua使用此参数。用户脚本中不需要传入此参数  |
+---------+------------------------------------------------------------+
| table   | **可选参数,默认为\ ``nil``**\ ,                          |
|         | reqWifi,搜索到的WIFI热点信息(MAC地址和信号强度),如果传入 |
|         | 了此参数,后台会查询WIFI热点对应的经纬度,此参数格式如下: |
|         | { [“1a:fe:34:9e:a1:77”] = -63, [“8c:be:be:2d:cd:e9”] =     |
|         | -81, [“20:4e:7f:82:c2:c4”] = -70,}                         |
+---------+------------------------------------------------------------+

-  返回值

nil ### 基站定位测试脚本说明
以resource\8910_script:raw-latex:`\script`\_LuaTask_V2.3.2:raw-latex:`\demo`:raw-latex:`\lbsLoc`:raw-latex:`\testLbsLoc`.lua为例
首先:通过lbsLoc.request(getLocCb)发起请求getLocCb是回调函数,回调函数里处理请求结果。

.. code:: lua

   --[[
   功能  :获取基站对应的经纬度后的回调函数
   参数  :
           result:number类型,0表示成功,1表示网络环境尚未就绪,2表示连接服务器失败,3表示发送数据失败,4表示接收服务器应答超时,5表示服务器返回查询失败;为0时,后面的3个参数才有意义
           lat:string类型,纬度,整数部分3位,小数部分7位,例如031.2425864
           lng:string类型,经度,整数部分3位,小数部分7位,例如121.4736522
   返回值:无
   ]]
   function getLocCb(result, lat, lng)
       log.info("testLbsLoc.getLocCb", result, lat, lng)
       --获取经纬度成功
       if result == 0 then
           --失败
       else
       end
       sys.timerStart(reqLbsLoc, 20000)
   end

WIFI定位接口
~~~~~~~~~~~~

说明:wifi定位是基站定位的拓展,最终的实现还是基站定位。通过wifi的接口获取附近wifi信息,然后调用基站定位接口进行查询。
**request(cbFnc,timeout)**

-  参数

-  返回值

nil ### WIFI定位测试脚本说明
以resource\8910_script:raw-latex:`\script`\_LuaTask_V2.3.2:raw-latex:`\demo`:raw-latex:`\wifi`:raw-latex:`\testWifi`.lua为例,首先通过wifiScan.request获取wifi信息,在回调函数里使用内部消息WIFI_SCAN_IND传递回调数据结果,等收到回调结果以后,通过lbsLoc.request把附近wifi信息的表传入然后请求。在回调里处理请求结果。

.. code:: lua

   sys.taskInit(function()
       while true do
           sys.wait(5000)
           
           wifiScan.request(function(result,cnt,tInfo)
               log.info("testWifi.scanCb",result,cnt)
               sys.publish("WIFI_SCAN_IND",result,cnt,tInfo)
           end)
           
           local _,result,cnt,tInfo = sys.waitUntil("WIFI_SCAN_IND")
           if result then
               for k,v in pairs(tInfo) do
                   log.info("testWifi.scanCb",k,v)
               end
               
               lbsLoc.request(function(result,lat,lng)
                   log.info("testLbsLoc.getLocCb",result,lat,lng)
                   sys.publish("LBS_WIFI_LOC_IND",result,lat,lng)
               end,false,false,false,false,false,false,tInfo)
               local _,result,lat,lng = sys.waitUntil("LBS_WIFI_LOC_IND")
           end
       end
   end)

其他补充:用户也可以通过其他平台接口进行定位,可以通过\ **wifiScan.request**\ 、\ **net.getCellInfo、net.getCellInfoExt**\ 等接口获取附近基站和wifi信息以后通过其他平台进行定位。