作者:dexin

资料来源:www.dfrobot.com.cn

戳出一枚演示动图:

在这个拥共享单车的时代,当你兴致冲冲地骑着小车车去一个比较陌生地方时,你有没有这种烦躁:时不时掏出手机看看要怎么往目的地骑?或者是带着耳机听着语音导航,却发现后面有一辆大巴正在疯狂地朝你按喇叭。居然还有买了手机支架,却忘了带!带着朋友转圈,结果……迷路了。是的没错,这些事儿我都干过了。

终于我决定让手机导航安心呆在我的小书包里!(因为我只想看方向!)用一个低功耗的导航小神器——iBikeTo代替手机为我指路,肯定不管去哪心里都能踏实~

那么问题来了,咋!弄!啊!

想要获取导航信息,那就先要学会自己写AP!Android写程序式有神器滴——AndroidStudio。据说这是google的亲儿子,因此兼容性那是杠杠滴。那么第二个问题来了,导航信息点怎么获啊~果断选择靠谱的高德地图SDK。至于为什么我没有选用百度地图。。因为我看不懂他们的开发者文档啊(有那么一丝丝尴尬。。。配置了两三天环境,整个人都不好了。。)下面是APP的功能分割。因为这个APP只有我一个人,所以我也就去掉了美工什么的。功能分割为:

基本定位(地图显示+坐标显示+坐标的读出)

兴趣点选取(用户交互+坐标获取)

导航规划(坐标输入+路径规划+动作捕获+动作传出)

WIFI通信(热点开启+Socket建立+信息流输入输出)

基本定位(地图显示+坐标显示+坐标的读出)

兴趣点选取(用户交互+坐标获取)

导航规划(坐标输入+路径规划+动作捕获+动作传出)

WIFI通信(热点开启+Socket建立+信息流输入输出)

当然,一些细节程序如子线程建立,就作为基础功能在调试中应用即可。

接下来就是逐步调试了。

打开AS(AndroidStudio的简称,安装教程网上超多我这里就不多言了),新建一个项目,然后到在高德官网上下载相应的jar包和so库。首先完成定位功能的调试。

这里,很重要!!你需要在注册了高德地图开发者以后,在高德开放平台注册应用获得一个key,整个过程并不复杂,SHA1值的获取查询说明即可~高德开发者文档、高德应用管理申请key。

记下自己的key哦,接下来,才是见证奇迹的时刻~!

在AndroidManifest.xml中,在application前添加:

<!-- 用于进行网络定位 -->[/p] <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

<!-- 用于访问GPS定位 -->

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位 -->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位 -->

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<!-- 用于访问网络,网络定位需要上网 -->

<uses-permission android:name="android.permission.INTERNET" />

<!-- 用于读取手机当前的状态 -->

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<!-- 写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据 -->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

<!-- 用于申请调用A-GPS模块 -->

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

<!-- 用于申请获取蓝牙信息进行室内定位 -->

<uses-permission android:name="android.permission.BLUETOOTH" />

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

<uses-permission android:name="android.permission.INTERNET" />

<!--用于进行网络定位-->

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>

<!--用于访问GPS定位-->

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

<!--获取运营商信息,用于支持提供运营商信息相关的接口-->

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

<!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>

<!--这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>

<!--用于访问网络,网络定位需要上网-->

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

<!--用于读取手机当前的状态-->

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>

<!--写入扩展存储,向扩展卡写入数据,用于写入缓存定位数据-->

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>

<!--用于申请调用A-GPS模块-->

<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>

<!--用于申请获取蓝牙信息进行室内定位-->

<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>

<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

}

这是所有需要使用到的权限信息。一次填写终身受用哈哈哈~

接下来在android:theme下加两句

<meta-data[/p] android:name="com.amap.api.v2.apikey"

android:value=属于你的高德地图key" />

把你紧握着的key放进去就好啦~剩下的初始化过程和普通Android程序完全相同。完成初始化以后:恭喜你!程序你已经写好一半啦~

因为高德地图对于定位和导航都有自己的demo,只需要下载下来调试相关函数即可。我就不再多做说明(因为我们的主角是ESP-32啊!)大家可以直接在我文末给出的demo里进行自定义的修改。我这里主要交代一下我自定义的内容:

一、图标更换子线程:

这个子线程主要用于显示WIFI热点的开关状态,当使用iBikeTo时,手机会默认开启一个名为iBikeTo的热点。iBikeTo根据预先设定好的密码连接与此热点,并且和手机socket通信,完成事件的响应和信息的显示。

二、热点开启函数:

根据你的要求更换热点的密码和名称就可以啦,但是还需要在ESP-32的软件中修改相关参数吼!还是一样的道理,由于热点开启时个耗时的活儿~所以不能放在onCreat中哦,我还是选择了用子线程做这件事。

三、地图选点、单点生存

因为不想让最后在地图上选太多不相关的点、所以在这里我应用hasMarkerOnMap来作为状态清理。也就是说,如果在地图上已经有选点的情况下再去点击POI关键点,APP会优先关闭上一次的marker,清理屏幕~

四、iBikeTo IP地址输入

iBikeTo在局域网中的IP地址显示在面板上,由使用者填入APP中,让手机找到iBikeTo硬件,(这的确有些不合理,正在想办法改进!)

大部分的系统中,会给子网分配192.168开始的IP地址,因此如果一般情况下,输入后几位就可以了,但是对于特殊情况,只需要把IP全长输入进去,由于有s.length()>6的分支,会让程序将输入的IP全部读入,提高啦环境滴兼容性~

五、Socket建立

知道啦ibikeTo的网络位置,手机就可以建立socket连接传输数据了。只需要在路口等转折处发送相关的字符给ESP-32就可以了!

比如说:

由于只是简单demo所以我只显示直走、和左右转弯的状态(哈哈哈 幸亏没有路试不然简直会是灾难的啊~)

然后,就是给我APP画一个漂亮得图标了!然而缺少美工得本宝宝只能可怜巴巴滴去easyicon下载,我强烈安利你们一发easyicon,真的是很不错得网站,很用心~

基本上,到这里,Android端可以说已经布置完毕了,由于我手里只剩一台4.3的Android旧机,所以所有的调试也都是基于4.3的(在这里为旧机抱怨一下,好几年不,翻出来就是被我调试得一顿闪退,也是辛苦了 不过!略略略~虽然你是我得战斗机~)Android端测试软件ibikeToibikeTo_Android_demo(文件过大 请查看“阅读原文”下载)

所以!我又可以回归Arduino的怀抱了!

看到者青春的小界面我一楞,才想起来因为要调试3D打印机,所以把1.8给卸了。。。

项目里我自己写了两个动画(link和showMode)(不能算库,库的写法我将ibikeTo 一代demo会说,别找。。我是先发的二代demo教程),在视频里应该已经看到过了。

为了让LED Matrix可以显示出来自己的IP地址,我写了个IP的解算,解算原理很简单,关于IP地址,不懂的百度哦~~

int ip_get;

int IP_int[4];

ip_get = (int) WiFi.localIP();

for (int i = 0; i < 4; i++)

IP_int = ip_get >> (8 * i);

IP_int[2] -= IP_int[3] * 256;

IP_int[1] = IP_int[1] - IP_int[2] * 256 - IP_int[3] * 256 * 256;

IP_int[0] = IP_int[0] - IP_int[1] * 256 - IP_int[2] * 256 * 256 - IP_int[3] * 256 * 256 * 256;

if (IP_int[3] < 0)

IP_int[3] += 256;

String int_IP_Address = (String)IP_int[0] + "." + (String)IP_int[1] + "." + (String)IP_int[2] + "." + (String)IP_int[3];[/p][p=30, 2, left] for (int looper = 0; looper < int_IP_Address.length(); looper++)

waitPlot[looper] = int_IP_Address[looper];

ht1632c.clearScreen();

server.begin();[/p][p=30, 2, left] ht1632c.print(waitPlot, 40);

接下来就是开放端口给上位机,然后就是接收上位机Android发来的字符串即可,代码如下:

WiFiClient ipclient = server.available();

if (ipclient) {

String currentLine = "";

Serial.println("client connected");

while (ipclient.connected()) {

if (ipclient.available()) {

char c = ipclient.read();

if (c == ';') {

if (currentLine.length() == 0)

break;

else {

currentLine = "";

}

}

else {

currentLine += c;

}

Serial.println(currentLine);

最后是,执行结果的显示~交互界面我采用三种箭头的跃动显示指明方向~这个动画的制作原理,是利用了我之前的一片帖子里的Python代码。复杂动画采用逐帧解算再调试时间间隔,简单的动画采用了直接偏移的方法。具体的解算代码见:FireBeetle开箱测评——借助DF驱动库实现我的LEDMatrix玩法大家可能会好奇一代的功能,其实是用来再骑行过程中相互指路的小神器,毕竟本宝宝是一个不甘寂寞的人 一个人骑车多没意思~

在手机端定位选择目的地,然后连接iBikeTo就可以发车啦!合理的应用LED Matrix和WiFi功能打造你个性化的出行神器吧!(BLE正在研究,完成后就可以实现一代二代demo的正式合并啦。)其实,我还在给怎么给iBikeTo设计一个好看些外壳,毕竟。。3D打印机都买好了~再不搞点事情,真的就要变成寂寞宅啦~哈哈哈!

最后的最后,附赠上我的ESP-32代码!microPython是个特别强的开发工具!我还有加油加油!为脱离寂寞宅、争做技术牛而fighting~当然!要感谢DFRobot给我这次宝贵的机会,用美美的板子充分实现了自己的小梦想!!

FireBeetle,你值得拥有~~~

*欢迎转发朋友圈。如需转载,请注明出处和原作者。

| 懂植物情感的机器喵 |

1.《共享单车导航神器:iBikeTo让骑行“零停顿”》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《共享单车导航神器:iBikeTo让骑行“零停顿”》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/fangchan/8138.html