程小奔 蓝牙4.0+开源通信库

这个开源库可以追溯到一年前,自从众筹得到了小程没奔(没买小奔)之后,就一直想写一个用BLE协议和它通信的库,因为当时没买usb dongle不能蓝牙直连小程非常郁闷,当时技术点都已经Clear了,但是懒惰还是打败了我,最终还是买了dongle解决了问题。本来以为这个就沉了,结果最近一段事件搞慧编程舞台程序突然来了兴致,一鼓作气1,2天就写完了,废话不多说,言归正传。

一、关于本开源库

这个库是基于Windows 10 1803 SDK写的,语言使用了C#。参考了微软的一个UWP开源库,我把其中RT API移植到桌面上了。主要功能是负责跟小程(离线程序)直接通信。

对系统有要求如下图:

具体可以完成如下功能:

没有usb dongle情况下,笔记本通过本库可以直接连接程小奔。

(注:PC要支持蓝牙4.0以上)

提供DLL库,其中实现了小程的共享变量和收发广播的接口。

基于桌面开发,所以你需要使用桌面程序来调用本库

当然这里不局限于使用C#调用,如果你想python,java,C/C++,javascript等调用的话,做一些封装都是可以调用这个库的,不过我没有进行进一步封装有兴趣的自己扩展吧。

开源地址:(https://github.com/yifengling0/CodeyBLELibrary)

如果上面的内容你完全不知所云,那么你可以跳过这篇文章了。文章底部有二维码别忘了关注我,我有其他资源跟你共享:),如果这些对你小菜一碟,你想进一步了解小程,甚至是童心制物(这个名字吧,个人感觉有点拗口,不如乐高哇)整个通信协议,请继续阅读第二章通信协议的解读。

二、通信协议的解读

首先解释一下BLE吧,这个主要是蓝牙4.0之后的低功耗分支,目前一些基于蓝牙通信的手环,手表都是用的BLE协议。这次小程的ESP32其实是支持传统和低功耗两种模式的,多说一句这个芯片资源挺丰富了,官方开源代码就很多还支持micropython,当时我自己把micro python直接刷小程上去,还是可以正常动作的,不过周边模块就无法直接驱动了,玩玩命令行还行,最后还是刷回来了。小程只是实现了BLE通信,所以PC的传统蓝牙直连无法实现了,当然这样有利于设备保持长续航。

小程支持两种连接,USB线或者蓝牙,通信协议上都是基于串口的通信模式,所以要分析协议只需要分析USB协议就可以了完全可以扩展到蓝牙。我分析的时候使用了串口拦截工具SerialMonitor,一种类似Wireshark的截包工具。具体用法就不介绍了,能理解的自然会用,直接上干货。

1)共享变量

截取了通信数据包大概如下的样子

你要问我这一堆数字咱分析,我只能告诉你凭经验猜的,当然makeblock也有不少开源代码可以横向参考,mBot,mBlock都开源了,整个神经元的引擎都开源了,所以细节还是有很多痕迹可循的,可惜没有小程实现部分的开源代码。因为大家做串口通信基本上都很类似,所以靠硬猜也是可以的,通信本身没加密,难度降低很多,猜出来之后结果我用程序验证过了,所以应该八九不离十:),

2)广播消息

广播消息基本上和变量的构成是一致的

3)心跳包

心跳包逻辑不是很确定,但是看它来回发送的感觉,应该是检测是否在线用的心跳包,结构都符合上面的结构,内容是固定的。

心跳包PC端

心跳包小程端

以上就是主要的离线通信协议(程序直接上传到小程的模式),了解一些串口通信的应该都不难理解,如果你对其中有异议或者想更多了解,欢迎关注本公众号跟我保持联系。

另外,这里有一个坏消息,当我写完了本库之后用RC版本测试时候发现正式版慧编程准备取消了小程离线通信,分成了完全在线和完全离线。

尝试跟makeblock沟通看看能不能保留离线模式通信,我个人感觉离线模式也应该有通信机制,虽然对于儿童编程来说似乎有些超纲,但是有很事情甚至是用python编程突破慧编程积木限制的时候是需要离线通信的。当然就算取消了离线通信,暂时本库宣布无效,但有了这个库的基础我可以完全把在线模式搬到api中。只是协议解析会变得更多,不过应该也会更灵活。关于在线的协议其实有一个开源库可以参考,官方虽然没有开源程小奔的代码,但是整个神经元引擎是有开源的地址如下:(https://github.com/Makeblock-official/neuron-engine)我大致翻了翻里面有通信的几乎所有细节,所以按照这个完全可以写一个神经元和程小奔在线通信库。就看官方态度和我懒不懒了。

三、关于库的接口说明

直接上代码吧,更直接一些

三个通知事件(事件通知是异步线程调用的注意不要直接访问UI组件):

///

///成功连接程小奔设备的通知

///

public eventTypedEventHandler CodeyConnected;

///

///共享变量更改通知

///

public eventTypedEventHandler VariableValueChanged;

///

///广播的消息接收事件

///

public eventTypedEventHandler MessageReceived;

公开接口(里面处理了资源同步,可以外部直接调用):

///

///枚举设备,发现Makeblock设备后自动连接

///

///

public voidConnect();

///

///设置变量的值

///

///

///

字符型

public voidSetValue(stringname,stringvalue);

///

///设置变量的值

///

///

///

数字型

public voidSetValue(stringname, Int32 value);

///

///获取变量值

///

///

///

public stringGetStringValue(stringname);

///

///获取变量值

///

///

///

publicInt32GetIntValue(stringname);

///

///发广播

///

///

public voidSendMessage(stringname);

///

///发送变量/消息统一接口

///

///

public voidSend(ICodeyShareable var);

具体使用方法看例子吧,虽然写的很简陋,这个库其实还是不完整的,至少还有下面的事情可以做。

TODO:

实现断开重连等机制(目前连上就不管了,也没留断开接口)

实现文件上传的协议,这样直接可以脱离慧编程写python代码直接上传。

实现在线模式的通信。

这个看有多少人用吧,有动力做的就快

最后,还是欢迎你关注我吧,后续会有更多的开源代码和Scratch的源码分享。一个很酷的视觉作品正在成中,预计本周内可以发布。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181113G0UBKR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券