最近因为毕设的缘故要看MAVLink协议,从里面读到一些传感器数据。
MAVLink的协议理解的差不多,但是大家都懂的,代码和实际上总有一些距离,所以,根据代码来看MAVLink协议可能会好一点。
我看的代码呢,是Mission Planner,是C#程序。源码可以在github上获取到的。我是通过一步一步读代码进入到当前的这个地方的,为了快速起见,使用vs2012打开(ps:因为笔者电脑上只有vs2012的缘故,编译可能遇到了一点问题,不过也没必要编译成功了,要个vs2012的代码组织能力就可以了)。直接打开源码的MAVLink文件夹下的MAVLinkInterface.cs文件,搜那个generatePacket()函数。
好吧没错又是这张图,相信对MAVLink有一定了解的人看这张图都厌烦了。正题开始,先贴一些主要代码:
byte[] packet = new byte[data.Length + 6 + 2];
packet[0] = 254;
//包的开始标志,0xFE
packet[1] = (byte) data.Length;
//有效载荷长度
packet[2] = (byte) packetcount;
//包的序列,也就是第几个包,后面还++,也就是说发一个包更新一次。
packetcount++;
packet[3] = gcssysid; // this is always 255 - MYGCS
//文档上说是系统的ID,对于地面站来说,这个值是常数255,此处可F12
packet[4] = (byte) MAV_COMPONENT.MAV_COMP_ID_MISSIONPLANNER;
//组件的ID= =这边怎么点不开?下面会提到这个问题
接下来,我在github中的MAVLink源码中找到了这样一个文件:mavlink_types.h,里面有枚举定义:
enum MAV_COMPONENT
{
MAV_COMP_ID_GPS,
MAV_COMP_ID_WAYPOINTPLANNER,
MAV_COMP_ID_BLOBTRACKER,
MAV_COMP_ID_PATHPLANNER,
MAV_COMP_ID_AIRSLAM,
MAV_COMP_ID_MAPPER,
MAV_COMP_ID_CAMERA,
MAV_COMP_ID_RADIO = 68,
MAV_COMP_ID_IMU = 200,
MAV_COMP_ID_IMU_2 = 201,
MAV_COMP_ID_IMU_3 = 202,
MAV_COMP_ID_UDP_BRIDGE = 240,
MAV_COMP_ID_UART_BRIDGE = 241,
MAV_COMP_ID_SYSTEM_CONTROL = 250
};
好吧其实不是这里,在一个叫common.xml文件中有这样的定义
<enum name="MAV_COMPONENT">
<entry value="0" name="MAV_COMP_ID_ALL">
<description/>
entry>
<entry value="220" name="MAV_COMP_ID_GPS">
<description/>
entry>
<entry value="190" name="MAV_COMP_ID_MISSIONPLANNER">
<description/>
entry>
...
这样,我想起了以前翻译的一句话:
This is a library for lightweight communication between Micro Air Vehicles (swarm) and/or ground control stations. It allows for defining messages within XML files, which then are converted into appropriate source code for different languages. These XML files are called dialects, most of which build on the common dialect provided in common.xml.
这个库是在微型飞行器之间或者微型飞行器与地面站之间的一种轻量级通讯手段。允许通过XML文件来定义信息内容,这样的话可以使用不同的语言来转换适合的源代码。这些XML文件被叫做“方言”,这些文件都被提供在common.xml文件中。
This repository is largely Python scripts that convert XML files into language-specific libraries. There are additional Python scripts providing examples and utilities for working with MAVLink data. These scripts, as well as the generated Python code for MAVLink dialects, require Python 2.7 or greater.
大部分的库都是用Python语言来把XML转换为特殊语言的库的,这些额外的Python脚本提供带MAVLink数据的例子和工具。这些脚本,就像生成Python代码的MAVLink方言一样,需要Python2.7以上版本。
(六级刚过的渣翻请不要吐槽,看懂意思即可)
所以估计vs2013以上版本有python编译的吧,应该……
继续看下去
packet[5] = messageType;
//这个是传入的参数类型,根据不同的调用这个值不同的吧
int i = 6;
foreach (byte b in data)
{
packet[i] = b;
i++;
}
//然后每个字节放扔进包里面去
ushort checksum = MavlinkCRC.crc_calculate(packet, packet[1] + 6);
//然后计算CRC校验对吧,校验和什么的。
checksum = MavlinkCRC.crc_accumulate(MAVLINK_MESSAGE_CRCS[messageType], checksum);
//分两句写,应该就是将余数拼到信息码左移后空出的位置,得到完整的CRC码吧
byte ck_a = (byte) (checksum & 0xFF); ///< High byte
byte ck_b = (byte) (checksum >> 8); ///< Low byte
//先高位后低位
packet[i] = ck_a;
i += 1;
packet[i] = ck_b;
i += 1;
后面就是发送了吧……
if (BaseStream.IsOpen)
{
BaseStream.Write(packet, 0, i);
_bytesSentSubj.OnNext(i);
}
当然里面还有很多细节没有提到,本人乃一名涉世未深的大四狗,各路大神请轻喷。
发送就写这么多。等我消化一下我在看看接收……