本帖最后由 太空虫虫 于 2016-7-13 22:47 编辑

写在最前面:本帖是介绍与EV3进行蓝牙通信的基本原理,所以可能需要一点计算机及编程语言方法的知识来帮助理解。另外,本帖不涉及如何编写手机APP等方面的知识,也没有现成的软件供下载,如果是有这方面需求的小伙伴,可以去搜搜论坛的其他帖子。谢谢~-----------------------------------------------------------------------------------------------------------------------最近,想实现通过手机蓝牙控制EV3。在论坛找了一圈,发现掌握这方面知识的前辈蛮多了,但是无一例外都是在介绍自己编写的手机APP,对于如何与EV3进行蓝牙通信均没有介绍,虽然有些前辈愿意开源自己的APP源码,但如果没有一定的Java编程经验以及相应的开发软件的话,要解读起来还挺麻烦,所以,小弟通过官方的文档和反编译其他前辈的APP,了解了一点EV3进行蓝牙通信的基本原理。和大家分享一下,希望对大家有用。

直接上图,我们先拿EV3间的通信为对象来进行研究。下图就是EV3间通信的基本框图

图片1.jpg (8.96 KB, 下载次数: 3)

2016-7-11 22:53 上传

通过图大家可以发现一个叫mailbox的东西,MailBox是EV3自身底层操作系统虚拟出来的东西。 根据我的研究EV3上跑的用户程序要和外界通信,无论发送或接收都是通过这个MailBox来完成的。

图片2.jpg (13.13 KB, 下载次数: 4)

2016-7-11 22:52 上传

写过EV3之间蓝牙通信的小伙伴都应该用过上面这个指令,这个命令就是对MailBox进行读或写操作的指令。

而一个比较麻烦的问题是,在EV3的眼中,外界的其他设备也都是EV3。也就是说,当它想发送信息给目标设备时,也只会把这个数据往自己的“MailBox”里面丢,当目标设备想发送信息给EV3时,也必须让信息能进入到它的MailBox里才行。

那怎么样实现非EV3设备与EV3设备的通信呢?

我们先根据EV3系统的结构对第一幅图进行展开,可以得到下面这幅图。

图片3.jpg (25.44 KB, 下载次数: 3)

2016-7-11 22:52 上传

为了更具体的说明上副图的含义,我们现在假设EV3甲的用户程序需要发送一个数据到EV3乙的用户程序中,那么在EV3甲中数据会先被丢入MailBox中,但是通过图我们可以看到,实际上MailBox是没办法直接把数据发送出去,而是把数据交给了一个叫“EV3协议处理程序”的东西。它是底层操作系统的一个后台程序,作用就是对需要发送出去的信息进行“打包“,对接收到的信息进行“拆包”。“EV3协议“是与EV3通信的关键,本帖后面会重点介绍。 那如上所说,EV3协议处理程序对数据进行打包完成后,就会通过CPU的数据接口把数据发送给EV3上的蓝牙模块(具体是什么接口我没有研究过,理论上是串口)。从这里开始,数据的发送就交由蓝牙模块负责了。

EV3蓝牙模块内的蓝牙芯片会对要发送的数据再按照一个叫SPP的协议进行打包。SPP协议是蓝牙的子协议之一,有兴趣的小伙伴可以自己去百度一下,这里不做介绍,大家只需要知道EV3的蓝牙模块支持这个协议就好(好像也只支持这一个)。打包完成后数据终于能通过蓝牙模块的射频电路真正的被发送出去了。

当数据到达EV3乙后,经历的就是在EV3甲中的逆过程。数据在蓝牙模块按照SPP拆包后,又在CPU里被按照“EV3协议“再拆一次包后,数据最终到达了EV3乙的MailBox里。

讲了这么一大段EV3与EV3间的通信,那EV3如何与非EV3的设备进行通信呢?总结起来就是一句话:找一个带蓝牙且支持SPP的设备,按照EV3协议收发数据即可。而支持SPP的蓝牙设备满地都是,所以说掌握EV3协议就成为了与EV3通信的关键。

--------------------------------------------------------------------------------------------------------------

EV3协议,乐高官方学名为direct commands,也就是“直接命令”,在乐高的官方文档“LEGO MINDSTORMS EV3 Communication Developer Kit”中有介绍。(有兴趣的小伙伴可以去官网http://www.lego.com/zh-cn/mindstorms/downloads下来看看)。“直接命令”类似与Windows里面的命令控制台命令,是内建在EV3底层操作系统里的,所以可以直接执行这些命令而无需编写任何用户程序。“直接命令”十分强大,可以实现命令EV3执行某个程序、直接读取EV3的输入口、直接控制输出口、下载、上传和删除文件、写MailBox等等的功能, 其中写MailBox就是我们所要介绍的。下达命令的实质就是按照官方文档里规定的协议格式,把数据打包后发送给EV3,EV3拿到数据交由协议处理程序拆包后,按照数据的内容执行相应的动作。下达“直接命令”有3个渠道,WIFI、USB和蓝牙,乐高的编程软件就是通过USB口给EV3下达“直接命令”来实现程序的下载上传等功能的,我们这里只需要通过蓝牙向EV3发送写MailBox命令就可以实现我们的目标了。

*******************************************************

下面就是重点了,关于“写MailBox命令”协议格式。

****************************************************************

官方的文档中定义的格式如下:

图片4.jpg (39.59 KB, 下载次数: 5)

2016-7-11 22:58 上传

它由8个部分组成:

代号     长度             含义

bbbb:    2字节         整个包从mmmm到ppp的数据长度,(小端模式保存)

mmmm     2字节         包计数器,目前还不知道作用,直接填0就好。

tt       1字节         包类型,直接填0x81就好。

ss       1字节         命令类型,0x9e代表写mailbox

ll        1字节mailbox名称字符串的长度+ 1,比如“abc” 的长度为4.

aa…      ll字节mailbox名称+0, 内容为字符的ASCII码+ 0x00

LLLL     2字节         包有效数据长度,(小端模式保存)

ppp…    LLLL字节       包有效数据,我们要丢到EV3 mailbox里的东西就放在这里

(小端模式保存:就是在保存超过一个字节的数据时把低位数据放在低地址,高位放高地址的保存方法,相应的还有大端模式)

额。。看完上面这堆东西大家还一头雾水,搞不懂是什么意思? 那就对了,要不然大家直接看文档就行了,我也用不着发这个帖子了。下面我尽量用简单的语音说明一下上诉内容的意思。

首先说一下Mailbox支持放3种数据,逻辑、数值、字符串。

捕获.JPG (17.78 KB, 下载次数: 3)

2016-7-11 23:07 上传

我们先拿逻辑类型的数据来举例。逻辑只有真和假两种状态,所以EV3协议规定用1字节来表示,真是1,假是0。 那么我们要给EV3的’abc’ mailbox发一个逻辑真的话,数据按如下步骤打包

1. tt、ss、mmmm的内容按照开头的介绍填入规定值即可

2. mailbox名称是用字符串表示的,字符串是由字符和结尾的0终止标识组成的,所以’abc’ 字符串的长度为 3+1 = 4,即ll为4,aaa部分的内容为0x61,0x62,0x63,0x00 (0x61为’a’的ASCII码,依次类推,字符最后加0x00为终止标识)

3. 如上所说逻辑的数据使用一个字节表示,所以LLLL有效数据长度为1, 所以内容为0x01,0x00

4. 因为要发送的是逻辑真,所以ppp的部分内容是0x01。

5. 最后,通过计算,整个包的长度为 1(ppp) + 2(LLLL) + 4(aaa.) + 1(II) + 1(tt) + 1(ss) + 2(mmmm) = 12.所以bbbb填入0x0c, 0x00

所以,整个包是这样的(16进制表示),

0x0c, 0x00, 0x00, 0x00, 0x81, 0x9e, 0x04, 0x61, 0x62, 0x63, 0x00, 0x01, 0x00, 0x01

bbbb          mmmm            tt    ss         ll                  aaa..                           LLLL      ppp

数值、字符串和逻辑只是LLLL和ppp两个部分不一样,其余都相同。

字符串的规则比较简单。比如要给“abc” mailbox发送“1234” 这个字符串的话。 LLLL内容为0x05, 0x00,ppp的内容就是0x31, 0x32, 0x33, 0x34,0x00.

数值EV3协议是用32位浮点数表示的,所以LLLL为4,ppp采用小端模式存放32位浮点数的4个字节。 具体比如50.5这样的数字怎么转换为4个字节的数据,是有一套规则的,但是我也不清楚,也没有必要搞清楚,因为使用C语言里的union的数据类型可以很方便的得到,这个后续实际应用篇再讲。

不好意思,由于不可描述的原因Delay一天了,现在一楼先把前天的知识补充完整

(接上文)

以上说的是我们自己的蓝牙设备发送数据给EV3,如果是EV3发送数据给我们的设备的话,从我们自己的蓝牙模块数据口输出的也同样是按照上诉规则打包的数据,我们只需要按照规则拆包就好。

看完上诉的内容,可能会有小伙伴有这样的疑问,在解析包时EV3是如何区分这3种数据类型的? 如果发送的是由3个字符组成的字符串数据,那么就和发送数值类型数据的包的效数据长度一样都是4了,那EV3如何区分,答案是EV3不会区分,对于采用何种数据类型来解析包,是由用户程序决定的,比如用户程序里有如下一个命令,那么对于Mailbox名称为“abc”的包,EV3就会用数值类型来解析,哪怕发送方的本意是要发送3个字符的字符串,当然,最后解析出来的数值肯定是错误的。

图片5.jpg (10.63 KB, 下载次数: 3)

2016-7-13 21:49 上传

另外,小弟做过如下这样的实验,本来是想让同一个mailbox名称能同时接收两种数据类型,结果,无论用何种数据类型往“abc”里发送,都收不到任何的东西。具体原因可能和EV3底层操作系统对于包解析的运作规则有关,所以请保证一个mailbox名称在程序里只接收一种数据类型。

图片6.jpg (21.88 KB, 下载次数: 2)

2016-7-13 21:49 上传

android ev3 蓝牙连接,分享一下自己研究EV3蓝牙通信原理的成果 (完结)相关推荐

  1. 单片机与树莓派蓝牙连接_用树莓派玩转蓝牙

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 蓝牙是一个使用广泛的无线通信协议,这两年又随着物联网概念进一步推广.我将介绍蓝牙协议,特别是低功耗蓝牙,并 ...

  2. Android 系统(193)----图解从URL到网页通信原理

    从URL到网页通信原理 内容导读 简单说,这个通信的过程是基于TCP/IP通信协议族规范的,完成从客户端到服务器端等一系列运作流程.1.TCP/IP协议族计算机与网络设备要相互通信,双方就必须基于相同 ...

  3. 笔记本电脑有蓝牙连接功能吗_百元蓝牙无线键盘推荐——罗技K380

    大三专业课多了起来,从来不怎么记笔记的我也寻思着要开始好好记笔记了,可是写字又不习惯,比较喜欢键盘打字的手感,自带的笔记本电脑键盘长时间使用是很不方便的,因为不能移动,而且在桌面上有一个高度差,会导致 ...

  4. Android 蓝牙连接(简单简单版)

    该博客只是记录,不会详细说明(本人技术有限不会说) 一:声明蓝牙权限和定位权限 <!--蓝牙权限--> <uses-permission android:name="and ...

  5. 【Android -- 蓝牙】蓝牙连接打印机

    1. 效果图 2. 开发环境 Gprinter佳博打印机,型号GP-2120TU Android Studio 3.6.1,gradle 3.5.3 3. 涉及知识点 蓝牙相关 多线程开发 线程池 构 ...

  6. Android wifi carlife,carlife可以无线连接吗?carlife蓝牙连接流程

    Carlife可以无线连接.目前无线连接支持iPhone手机使用,而安卓手机只有少部分可以使用.连接方法如下: 1.打开手机设置启用蜂窝移动数据,再打开手机WiFi,并且开一个无线热点. 2.找到车机 ...

  7. 微信小程序蓝牙连接错误分析及解决

    当打开手机蓝牙后去连接蓝牙,会出现连接不上情况,报错10003,此时不管是重启小程序还是重新关闭打开蓝牙,都不能正常连接蓝牙设备.10003是微信蓝牙连接经常碰到的问题,微信官方给出的文档中就简单的描 ...

  8. Android 硬件通讯之 蓝牙,USB,WIFI(一.蓝牙)

    蓝牙 蓝牙通讯分为:经典蓝牙与低功耗蓝牙 现在所说的蓝牙设备,大部分都是在说4.0设备,ble也特指4.0设备. 在4.0之前重要的版本有2.1版本-基本速率/增强数据率(BR/EDR)和3.0 高速 ...

  9. 金桔蓝牙网关蓝牙连接协议说明

    下发蓝牙链接 http://127.0.0.1:8888/ac/station?cmd=setblelink_type&mac=10.00.00.63.42.42&stationId= ...

  10. WH-1000XM3蓝牙连接笔记本电脑

    WH-1000XM3 蓝牙连接笔记本电脑 1分钟搞定 蓝牙动机 开始买了xm3一直用有线连接的,虽说有线连接音质比较好,但是也有缺点就是线短容易拉扯:搜寻了好多法子解决了 步骤一:蓝牙连接 先正常配对 ...

最新文章

  1. 《代码敲不队》第八次团队作业:Alpha冲刺 第二天
  2. (笔记)电路设计(十四)之放大器的应用
  3. Linux的capability深入分析(1)【转】
  4. Cypress 的条件测试
  5. 12.二叉树的序遍历
  6. mysql 5.1.69_CentOS 安装MySQL 5.1.69
  7. ansible-playbook agent实例
  8. windows批处理bat常用指令
  9. idea 设置文件忽略git版本控制
  10. 【硬石科技】电机系列教学(基于STM32)——直流有刷电机和直流减速电机及其驱动电路
  11. UnityShader学习教程之<StandardShader>
  12. day12 三大神器
  13. 全球与中国组合锁市场深度研究分析报告
  14. 12306GT多线程、分流免费抢票工具使用
  15. Word从任意页开始从1,2,3...编辑页码
  16. linux drm 内存管理,linux DRM GEM 笔记
  17. 计算机考研专业课课件,【考研计算机专业课】武汉大学计算机网络PPT课件 习题课.ppt...
  18. 【漏洞学习——沙盒跳出】————7、某银行自助查询终端可绕过权限控制
  19. dba_autotask_client
  20. 机械硬盘大势已去?NAS硬盘笑了

热门文章

  1. java spring pdf下载_Spring5高级编程(第5版)PDF 下载
  2. Microsoft Excel 教程:如何在 Excel 中创建自定义数字格式?
  3. 自动控制原理第2章——自动控制系统的数学模型(思维导图)
  4. JRebel安装、最新激活方式
  5. Opencv系列1_opencv对单张DCM文件的读取并显示
  6. 华为hcia认证有哪些方向?华为hcia认证哪些方向比较好,值得推荐?
  7. python怎么设置为中文-python如何设置中文界面
  8. C++ vector 初始化大小
  9. c#判断字符串是否为空或null
  10. 区块链ppt_朱嘉明最新演讲:区块链很可能带来科学领域的范式革命(附PPT)