3.2.8 基站/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信息以后通过其他平台进行定位。