在这个拥共享单车的时代,当你兴致冲冲地骑着小车车去一个比较陌生地方时,你有没有这种烦躁:时不时掏出手机看看要怎么往目的地骑?或者是带着耳机听着语音导航,却发现后面有一辆大巴正在疯狂地朝你按喇叭。居然还有买了手机支架,却忘了带!带着朋友转圈,结果……迷路了。是的没错,这些事儿我都干过了。
终于我决定让手机导航安心呆在我的小书包里!(因为我只想看方向!)用一个低功耗的导航小神器——iBikeTo代替手机为我指路,肯定不管去哪心里都能踏实~ 那么问题来了,咋!弄!啊! 想要获取导航信息,那就先要学会自己写AP!Android写程序式有神器滴——AndroidStudio。据说这是google的亲儿子,因此兼容性那是杠杠滴。那么第二个问题来了,导航信息点怎么获啊~果断选择靠谱的高德地图SDK。至于为什么我没有选用百度地图。。因为我看不懂他们的开发者文档啊(有那么一丝丝尴尬。。。配置了两三天环境,整个人都不好了。。)下面是APP的功能分割。因为这个APP只有我一个人,所以我也就去掉了美工什么的。功能分割为: - 基本定位(地图显示+坐标显示+坐标的读出)
- 兴趣点选取(用户交互+坐标获取)
- 导航规划(坐标输入+路径规划+动作捕获+动作传出)
- WIFI通信(热点开启+Socket建立+信息流输入输出)
当然,一些细节程序如子线程建立,就作为基础功能在调试中应用即可。 接下来就是逐步调试了。 打开AS(AndroidStudio的简称,安装教程网上超多我这里就不多言了),新建一个项目,然后到在高德官网上下载相应的jar包和so库。首先完成定位功能的调试。
这里,很重要!!你需要在注册了高德地图开发者以后,在高德开放平台注册应用获得一个key,整个过程并不复杂,SHA1值的获取查询说明即可~高德开发者文档、高德应用管理申请key 记下自己的key哦,接下来,才是见证奇迹的时刻~! 在AndroidManifest.xml中,在application前添加:
- <p style="line-height: 30px; text-indent: 2em;"><!-- 用于进行网络定位 --></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下加两句 - <p style="line-height: 30px; text-indent: 2em;"> <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(文件过大 提取码:zst1)
所以!我又可以回归Arduino的怀抱了! 看到者青春的小界面我一楞,才想起来因为要调试3D打印机,所以把1.8给卸了。。。 项目里我自己写了两个动画(link和showMode)(不能算库,库的写法我将ibikeTo 一代demo会说,别找。。我是先发的二代demo教程),在视频里应该已经看到过了。
为了让LED Matrix可以显示出来自己的IP地址,我写了个IP的解算,解算原理很简单,关于IP地址,不懂的百度哦~~ - <p style="line-height: 30px; text-indent: 2em;">
- 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 style="line-height: 30px; text-indent: 2em;"> for (int looper = 0; looper < int_IP_Address.length(); looper++)
- waitPlot[looper] = int_IP_Address[looper];
- ht1632c.clearScreen();
- server.begin();</p><p style="line-height: 30px; text-indent: 2em;"> ht1632c.print(waitPlot, 40);[/mw_shl_code]</p><p style="line-height: 30px; text-indent: 2em;">接下来就是开放端口给上位机,然后就是接收上位机Android发来的字符串即可,代码如下:</p><p style="line-height: 30px; text-indent: 2em;">[mw_shl_code=c,true]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);</p>
复制代码
最后是,执行结果的显示~交互界面我采用三种箭头的跃动显示指明方向~这个动画的制作原理,是利用了我之前的一片帖子里的Python代码。复杂动画采用逐帧解算再调试时间间隔,简单的动画采用了直接偏移的方法。具体的解算代码见:FireBeetle开箱测评——借助DF驱动库实现我的LEDMatrix玩法大家可能会好奇一代的功能,其实是用来再骑行过程中相互指路的小神器,毕竟本宝宝是一个不甘寂寞的人 一个人骑车多没意思~ 在手机端定位选择目的地,然后连接iBikeTo就可以发车啦!合理的应用LED Matrix和WiFi功能打造你个性化的出行神器吧!(BLE正在研究,完成后就可以实现一代二代demo的正式合并啦。)其实,我还在给怎么给iBikeTo设计一个好看些外壳,毕竟。。3D打印机都买好了~再不搞点事情,真的就要变成寂寞宅啦~哈哈哈!
最后的最后,附赠上我的ESP-32代码!microPython是个特别强的开发工具!我还有加油加油!为脱离寂寞宅、争做技术牛而fighting~当然!要感谢DFRobot给我这次宝贵的机会,用美美的板子充分实现了自己的小梦想!! FireBeetle,你值得拥有~~~
ibikeTo_dexin.zip
|