dexin 发表于 2017-7-22 02:02:38

【挑战FireBeetle系列】iBikeTo让骑行更轻松

在这个拥共享单车的时代,当你兴致冲冲地骑着小车车去一个比较陌生地方时,你有没有这种烦躁:时不时掏出手机看看要怎么往目的地骑?或者是带着耳机听着语音导航,却发现后面有一辆大巴正在疯狂地朝你按喇叭。居然还有买了手机支架,却忘了带!带着朋友转圈,结果……迷路了。是的没错,这些事儿我都干过了。
终于我决定让手机导航安心呆在我的小书包里!(因为我只想看方向!)用一个低功耗的导航小神器——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;
ip_get = (int) WiFi.localIP();
for (int i = 0; i < 4; i++)
    IP_int = ip_get >> (8 * i);
IP_int -= IP_int * 256;
IP_int = IP_int - IP_int * 256 - IP_int * 256 * 256;
IP_int = IP_int - IP_int * 256 - IP_int * 256 * 256 - IP_int * 256 * 256 * 256;
if (IP_int < 0)
    IP_int += 256;
String int_IP_Address = (String)IP_int + "." + (String)IP_int + "." + (String)IP_int + "." + (String)IP_int;</p><p style="line-height: 30px; text-indent: 2em;">for (int looper = 0; looper < int_IP_Address.length(); looper++)
    waitPlot = int_IP_Address;
ht1632c.clearScreen();
server.begin();</p><p style="line-height: 30px; text-indent: 2em;">ht1632c.print(waitPlot, 40);</p><p style="line-height: 30px; text-indent: 2em;">接下来就是开放端口给上位机,然后就是接收上位机Android发来的字符串即可,代码如下:</p><p style="line-height: 30px; text-indent: 2em;">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,你值得拥有~~~

dbc0301 发表于 2017-7-22 18:27:53

厉害了666

dexin 发表于 2017-7-23 00:34:24

dbc0301 发表于 2017-7-22 18:27
厉害了666

还要完善很多东西呢,为了用着更舒服!

Chocho2017 发表于 2017-7-24 10:47:47

这个吊,好强大。

luna 发表于 2017-7-24 10:51:22

6666这个想法真的很不错,非常的黑科技!楼主用心了~

dexin 发表于 2017-7-24 12:40:49

luna 发表于 2017-7-24 10:51
6666这个想法真的很不错,非常的黑科技!楼主用心了~

我会接着努力哒

xiaohe9527 发表于 2017-7-24 16:38:03

太厉害了

killerlist 发表于 2017-7-27 14:58:27

太强了,看大佬装逼

krwlng 发表于 2017-12-8 00:15:13

那个APP可以直接使用吗??

kongmeng 发表于 2018-1-12 21:25:04

没有“我的位置” 和 “搜索目的地” 按钮吗??

哎呀了吧 发表于 2018-1-28 19:39:45

厉害厉害,有时间试试

dexin 发表于 2018-2-9 14:02:17

kongmeng 发表于 2018-1-12 21:25
没有“我的位置” 和 “搜索目的地” 按钮吗??

当时设计的时候犯懒 哈哈哈 不过还是很有用的 我争取把它加上

dexin 发表于 2018-2-9 14:03:12

krwlng 发表于 2017-12-8 00:15
那个APP可以直接使用吗??

不可以的哦 申请一个高德地图的key修改好 就可以了

kongmeng 发表于 2018-4-7 19:48:29

dexin 发表于 2018-2-9 14:02
当时设计的时候犯懒 哈哈哈 不过还是很有用的 我争取把它加上

想复制一个,但是没有搜索目的地。。。。。:lol

设计chen 发表于 2018-4-27 11:56:11

人才,可以加一下你微信吗,我的是13723776917

Jawa_D 发表于 2020-3-22 22:29:38

如果能装在车上就不用打方向灯了
页: [1]
查看完整版本: 【挑战FireBeetle系列】iBikeTo让骑行更轻松