import
socket
import
threading
import
os
import
requests
from
flask
import
Flask
from
flask
import
request
from
bs4
import
BeautifulSoup
import
json
global
sock
#实现通过微信控制手机app定位发送给服务器显示位置信息
loca
=
"welcome"
app
=
Flask(__name__)
#搭建web服务器通过socket发送消息给app索取定位信息,然后转发给微信服务器
@app
.route(
"/wx_check"
,methods
=
[
"POST"
,
"GET"
])
#这里用了一个Web框架 "/wx_check" 是你在微信中填的开发者服务器路径
def
application():
openID
=
request.args[
'openid'
]
# 微信发的,详见开发者文档
soup
=
BeautifulSoup(request.data,
"html.parser"
)
content
=
soup.find(
"content"
)
# content 是微信用户发的消息,可用来验证用户
sock.send(b
"getlocation"
)
# 发送信息通知android
global
loca
while
True
:
#手动阻塞
if
loca !
=
"welcome"
:
break
back
=
loca
loca
=
"welcome"
return
"""
<xml>
<ToUserName>%s</ToUserName>
<FromUserName>qqmsssssssss</FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType>text</MsgType>
<Content>%s</Content>
</xml>"""
%
(openID,back)
def
start():
app.run(
'0.0.0.0'
,
80
)
threading.Thread(target
=
start,args
=
()).start()
# 与app进行socket连接 接受定位信息 另外用到经纬度兼容转换API 和经纬度转位置API
def
tcplink(sock,addr):
try
:
print
(
'Accept new connection from %s:%s...'
%
addr)
while
True
:
sock.setblocking(
True
)
data
=
sock.recv(
1024
)
location
=
data.decode(
'utf-8'
)
print
(
"client:"
+
location)
# 以下进行经纬度 地图信息的转换 loca为app所在地址接上面的 堵塞
if
location !
=
"":
global
loca
print
(location)
lis
=
location.split(
","
)
location
=
"%s,%s"
%
(lis[
1
],lis[
0
])
print
(location)
xml
=
requests.get(
"http://api.gpsspg.com/convert/coord/?oid=xxxx&key=xxxxxxxxxxxxxxxxxx&from=0&to=3&latlng=%s&output=xml"
%
location)
soup
=
BeautifulSoup(xml.text,
"html.parser"
)
print
(soup.text)
lat
=
soup.find(
"lat"
).string
lng
=
soup.find(
"lng"
).string
location
=
"%s,%s"
%
(lng,lat)
print
(
"after"
+
location)
a
=
requests.get(
"http://restapi.amap.com/v3/geocode/regeo?key=xxxxxxxxxxxxxxxxx&location="
+
location)
loca
=
a.text
obj
=
json.loads(loca)
loca
=
obj[
"regeocode"
][
"formatted_address"
]
else
:
print
(
"socket is close,waiting new accept"
)
sock.close()
break
except
Exception as e:
location
=
"raise error"
finally
:
pass
try
:
s
=
socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((
'0.0.0.0'
,
9999
))
s.listen(
10
)
print
(
'waiting to connect'
)
while
True
:
sock,addr
=
s.accept()
#等待app来连接
t
=
threading.Thread(target
=
tcplink,args
=
(sock,addr))
t.start()
finally
:
print
(
"ending"
)
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
以下是android端代码:
# 获取定位,其实就是获取经纬度
private Location getLastKnownLocation() {
LocationManager mLocationManager
=
(LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
List
<String> providers
=
mLocationManager.getProviders(true);
Location bestLocation
=
null;
for
(String provider : providers) {
Location l
=
mLocationManager.getLastKnownLocation(provider);
if
(l
=
=
null) {
continue
;
}
if
(bestLocation
=
=
null || l.getAccuracy() < bestLocation.getAccuracy()) {
/
/
Found best last known location:
%
s", l);
bestLocation
=
l;
}
}
return
bestLocation;
}
String provider;
public void GetLocation(){
LocationManager mLocationManager;
Location location
=
getLastKnownLocation();
/
/
Log.d(
"TAG"
, provider.toString());
Log.d(
"TAG"
, location.toString());
if
(location !
=
null) {
/
/
获取当前位置,这里只用到了经纬度
String string
=
location.getLongitude()
+
","
+
location.getLatitude();
try
{
OutputStream outputStream
=
socket.getOutputStream();
PrintWriter writer
=
new PrintWriter(outputStream);
writer.write(string);
writer.flush();
/
/
writer.close();
/
/
socket.shutdownOutput();
} catch (IOException e) {
/
/
TODO Auto
-
generated catch block
e.printStackTrace();
}
}
}
@SuppressLint
(
"ShowToast"
) public void Connect(){
try
{
socket
=
new Socket();
socket.connect(new InetSocketAddress(
"xxx.xxx.xxx.xxx"
,
9999
));
while
(true) {
Log.d(
"TAG"
, socket.isConnected()
+
"");
InputStream stream
=
socket.getInputStream();
byte[] b
=
new byte[
11
];
stream.read(b);
String sb
=
new String(b);
if
(sb.equalsIgnoreCase(
"getlocation"
)){
GetLocation();
}
else
{
OutputStream outoStream
=
socket.getOutputStream();
outoStream.write(
"error code"
.getBytes());
socket.shutdownOutput();
}
}
} catch (IOException e) {
/
/
TODO Auto
-
generated catch block
Log.d(
"TAG"
,
"error"
);
e.printStackTrace();
}
}