构建一个WIFI室内定位系统
admin
2024-01-21 09:30:11
0

室内定位可以应用在很多场景,由于受到室内环境的限制,GPS信号无法有效的接收,这时可以利用室内的WIFI热点提供的信号强度来进行辅助定位。通常在室内都会有很多的WIFI热点,我们可以把室内的区域划分为多个网格,在每一个网格测量所接收到的WIFI热点的信号强度,根据这些信息来建立一个WIFI信号指纹库,以后我们就可以通过比对指纹库,来确定在室内的位置了。

手机APP测量WIFI信号

首先我们先编写一个APP,用于测量WIFI的信号强度并且上报给服务器保存。这里我采用了HBuilderX来编写,这个HBuilderX采用了HTML 5+的技术,可以快速的用我熟悉的网页+JS的方式来写Android和IOS的应用。

新建一个HbuilderX的项目,在目录下新建一个index.html文件,内容如下:





输入室内网格编号:

Device Orientation:
-->
BSSIDLevel

这里用到了plus.android来调用android的原生方法,例如通过调用WifiManager来对WIFI信号进行扫描,把扫描结果的BSSID和信号强度保存下来。另外HTML5的规范支持获取设备的方向信息,以0-360度来表示设备的朝向,因为设备指向不同的方向也会影响信号的强度,因此也需要记录这个信息。最后当点击开始扫描这个按钮的时候,就会把这些信息提交到后台的服务器,记录到数据库中。

要支持WIFI扫描,还需要在manifest.json文件里面设置相应的权限,按照Android文档的说法,Android 10及以上的版本还需要开启ACCESS_FINE_LOCATION,ACCESS_WIFI_STATE,CHANGE_WIFI_STATE的权限,以及设备需要启用位置信息服务。另外Android默认会对startScan有节流限制,即一定时间内限制调用的次数,可以在开发者选项->网络->WIFI扫描调节下进行关闭,取消限制。

以下是这个APP运行的效果:

WIFI测量APP

后台应用记录WIFI测量数据

编写一个后台应用,暴露一个API接口,用于接收APP上报的WIFI测量数据。

这里采用springboot+JPA+Postgresql的架构。

在start.spring.io网站里面新建一个应用,artifact名字为wifiposition,依赖里面选择spring web, JPA,打开应用,在里面新建一个名为WifiData的Entity类,代码如下:

package cn.roygao.wifiposition;import java.util.Date;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.Type;
import org.hibernate.annotations.TypeDef;import com.alibaba.fastjson.JSONArray;
import com.vladmihalcea.hibernate.type.json.JsonBinaryType;@Entity
@TypeDef(name = "jsonb", typeClass = JsonBinaryType.class)
@Table(name = "wifidata")
public class WifiData {@Id@GeneratedValue(strategy=GenerationType.AUTO)private Long id;private String gridId;private Float orientation;@Type(type = "jsonb")@Column (name="measurement", nullable = true, columnDefinition = "jsonb")private JSONArray measureArray;@CreationTimestampprivate Date createdTime;public WifiData() {}public WifiData(String gridId, Float orientation, JSONArray measureArray) {this.gridId = gridId;this.orientation = orientation;this.measureArray = measureArray;}public Long getId() {return this.id;}public void setId(Long id) {this.id = id;}public String getGridId() {return this.gridId;}public void setGridId(String gridId) {this.gridId = gridId;}public Float getOrientation() {return this.orientation;}public void setOrientation(Float orientation) {this.orientation = orientation;}public JSONArray getMeasureArray() {return this.measureArray;}public void setMeasureArray(JSONArray measureArray) {this.measureArray = measureArray;}
}

这个代码里面会保存measurement的JSON数组到PG的JSONB格式的数据列里面,因为hibernate默认没有提供这种类型,这里引入了com.vladmihalcea.hibernate.type.json.JsonBinaryType来提供支持。

在pom.xml里面需要添加以下的依赖:

com.vladmihalceahibernate-types-522.3.4

新建一个名为WifiRepository的接口类,代码如下:

package cn.roygao.wifiposition;import org.springframework.data.repository.CrudRepository;public interface WifiDataRepository extends CrudRepository{}

新建一个名为WifiController的类,实现HTTP接口,代码如下:

package cn.roygao.wifiposition;import java.util.logging.Logger;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;@RestController
public class WifiController {@Autowiredprivate WifiDataRepository repository;private final static Logger LOGGER = Logger.getLogger(WifiController.class.getName());@PostMapping("/senddata")public ResponseEntity sendData(@RequestBody JSONObject data) {Float orientation = data.getFloat("Orientation");String gridId = data.getString("GridId");JSONArray wifiSignal = data.getJSONArray("WifiSignal");repository.save(new WifiData(gridId, orientation, wifiSignal));return ResponseEntity.accepted().body("OK");}
}

在application.properties里面增加postgres的相关配置,如下:

spring.datasource.url= jdbc:postgresql://localhost:5432/wifidb
spring.datasource.username= postgres
spring.datasource.password= postgresspring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation= true
spring.jpa.properties.hibernate.dialect= org.hibernate.dialect.PostgreSQLDialect# Hibernate ddl auto (create, create-drop, validate, update)
spring.jpa.hibernate.ddl-auto= update

运行./mvnw clean install进行编译打包,然后运行即可。

相关内容

热门资讯

到重庆游玩5天怎么安排合适,国... 自从有了孩子,我们的旅行计划总是围绕着他们展开。重庆,这座充满奇幻色彩和美食诱惑的山城,自然成为了我...
假期将至红色旅游热度高涨 “赏... 本文转自【央视网】; 央视网消息:根据国务院办公厅关于2025年部分节假日安排的通知,今年国庆节逢中...
游客在意大利救护车上被盗650... 据《意大利新华时报》小艾9月13日编译《Fanpage》《安莎快讯》综合报道: 1.游客在意大利救护...
2025文旅博览会打造科技新体... 本文转自:人民网-湖北频道人民网记者 郭婷婷 张隽亚新文化集团现场展示MR剧游式会展导览系统。受访者...
江西亲子自助游价格多少,国庆去... 国庆小长假,就像一场期待已久的梦幻之约,让无数人渴望挣脱日常的琐碎,投身于远方的风景之中。江西,这片...
豫风楚韵耀江城:信阳文旅精彩亮... 9月12日至14日,2025中国文化旅游产业博览会在武汉国际博览中心举行。作为河南文旅的重要代表,信...
游客擅闯西藏未开发区域,救援人... 近日,记者从西藏普兰县文旅局获悉,最近个别游客无视安全警示,经多次劝阻仍拒不配合,擅自进入十三金塔未...
汶川推动文体旅融合,政企代表共... 封面新闻记者 易弋力 9月12日-13日,汶川县文广体旅局在汶川举办“徒步云端・秘境阿尔”2025年...
江西5日游安排,国庆去婺源当地... 国庆,这个承载着无数人期待与憧憬的假期,就像一把神奇的钥匙,为我们打开了通往远方的欢乐之门。江西,这...
中国乐谷・渔阳金秋音乐市集开幕 13日傍晚凉爽宜人,中国乐谷・渔阳金秋音乐市集在平谷区北京渔阳国际滑雪场开幕,17万平方米的“城市草...
重庆四天三晚旅游攻略,重庆旅游... 重庆,这座充满魅力的山城,犹如一颗璀璨的明珠镶嵌在中国的西南部。它是一座有着深厚历史文化底蕴的城市,...
推荐5道特色食谱,做法超级简单... “从手到口,从口到心,中国人延续着对世界和人生特有的感知方式。只要点起炉火,端起碗筷,每个平凡的人,...
美食争霸赛黄山开场 多国学子感... 9月13日,在安徽省黄山市屯溪河街,一场别开生面的“超级皖”美食争霸赛黄山市海选赛热闹开场。这场以“...
“预制菜之王”冲上热搜!不怕你... 9月13日晚,话题 提起萨莉亚,许多人的第一反应就是“预制菜”。曾有人开玩笑说“整个后厨看不到一把...
日媒:南极游客激增引发环保担忧... 参考消息网9月14日报道 据日本《朝日新闻》网站9月10日报道,到访南极的游客数量正在急剧增加。30...
台江红阳苗寨:传统村落焕新颜 ... 位于台江县台拱街道的红阳苗寨是当地知名的3A级景区,同时又是中国传统村落和中国少数民族特色村寨。9月...
重庆组团五日游经典行程报价,参... 宝子们,重庆这座城市,那简直就是一座充满魅力的“赛博朋克”都市!它是一座山城,高低错落的建筑在山峦间...
茅台飞天53度:岁月沉淀的酱香... 当琥珀色液体滑过舌尖的瞬间 轻轻旋开茅台飞天53度的瓶盖,那股复合型香气便如交响乐般层层展开——初...
法国羊角面包层次暴击!黄油开酥... 本文聚焦法国羊角面包 “层次暴击” 的核心特质,围绕其 108 层酥皮的制作奥秘与金黄酥香的口感体验...