这个开源库可以追溯到一年前,自从众筹得到了小程没奔(没买小奔)之后,就一直想写一个用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的源码分享。一个很酷的视觉作品正在成中,预计本周内可以发布。
领取专属 10元无门槛券
私享最新 技术干货