Marvelmind API
本章的整洁、易读HTML版本。
《接口与协议》中的“Marvelmind API”一章,以HTML网页形式呈现。有不清楚的地方?请打开 仅含本章的原始PDF(第127-213页)(中文) (左上角也有固定链接)。总览: 全部章节.
检查与API的连接
运行示例软件后,在终端中按“空格”键,输入命令‘version’并按回车。如果示例软件打印出API版本,说明它可以与API库通信。

Marvelmind API库说明
API以MS Windows动态链接库(DLL)和Linux共享库(x86和ARM平台)的形式提供。该库包含一组函数,用于通过连接在计算机USB端口上的调制解调器监控和控制Marvelmind系统。本节介绍所有这些函数。
为了更好地兼容不同的编程语言,大多数复杂数据结构通过无类型内存指针传递。函数说明中给出了每个数据字段在内存池中的偏移量。在示例软件的‘marvelmind_api.c’文件中,可以看到在内存池与C结构体字段之间传递数据的实现。
说明中的参数类型采用C语法表示。类型说明如下:
类型 | 大小(字节) | 说明 |
bool | 1 | 布尔类型。0表示false,非0表示true |
uint8_t | 1 | 无符号整数,0…255 |
int8_t | 1 | 二进制补码格式的有符号整数,-128…127 |
uint16_t | 2 | 无符号整数,0…65535 |
int16_t | 2 | 二进制补码格式的有符号整数,-32768…32767 |
uint32_t | 4 | 无符号整数,0…4294967295 |
int32_t | 4 | 二进制补码格式的有符号整数, -2147483648…2147483647 |
void * | 4/8 | 内存指针(内存地址)。 32位平台为4字节,64位平台为8字节。 |
每个函数说明都列出了支持该函数的API版本。新的API版本将支持更多函数,以对应Marvelmind系统的新功能。目前并非Dashboard中的所有功能都可通过API使用,如需更多API函数,请发邮件至 info@marvelmind.com.
支持的函数列表:
函数 | API 版本 | 所需许可 |
V1+ | 无 | |
V6+ | 无 | |
V1+ | 无 | |
V2+ | 无 | |
V9+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V3+ | 无 | |
V3+ | ||
V4+ | ||
V1+ | 无 | |
V4+ | 无 | |
V4+ | ||
V4+ | 无 | |
V4+ | ||
V1+ | 无 | |
V1+ | ||
V1+ | ||
V1+ | ||
V1+ | ||
V1+ | ||
V1+ | 无 | |
V1+ | ||
V4+ | ||
V4+ | ||
V1+ | 无 | |
V1+ | ||
V1+ | ||
V1+ | ||
V2+ | ||
V3+ | ||
V3+ | ||
V3+ | 无 | |
V3+ | 无 | |
V3+ | 无 | |
V6+ | 无 | |
V6+ | ||
V6+ | 无 | |
V6+ | ||
V6+ | 无 | |
V6+ | ||
V6+ | ||
V9+ | ||
V9+ | ||
V9+ | ||
V9+ | ||
V9+ | 无 | |
V1+ | 无 | |
V1+ | 无 | |
V1+ | 无 |
获取Marvelmind API库版本
读取API库版本。用于确认该版本的库中提供所需函数。
C语言声明:bool mm_api_version(void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构。
类型 | 说明 |
uint32_t | API库版本 |
获取上一次错误
读取API库上一次操作的状态,以区分错误原因。
函数名: mm_get_last_error
C语言声明:bool mm_get_last_error(void *pdata);
适用的API版本:V6+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构。
类型 | 说明 |
uint32_t | 上一次操作的状态: 0:操作执行成功 1:通信错误 2:打开串口出错 3:需要许可 |
打开串口
打开Marvelmind设备(调制解调器或信标)通过USB(虚拟串口)连接的端口。无需指定串口名称,因为API会搜索所有串口,并检查其是否对应Marvelmind设备。
C语言声明:bool mm_open_port ();
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,端口已打开 false – 执行出错 |
参数:无
按指定名称打开串口
打开Marvelmind设备(调制解调器或信标)通过USB(虚拟串口)连接的端口。函数尝试打开具有指定名称的端口。
函数名: mm_open_port_by_name
C语言声明:bool mm_open_port_by_name(void *pdata);
适用的API版本:V2+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,端口已打开 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向串口名称的指针——以零结尾的ASCII字符序列(ASCIIZ) |
打开UDP端口
允许通过UDP而非USB与Super-Modem建立通信。
函数名: mm_open_port_udp
C语言声明:bool mm_open_port_udp(void *pdata);
适用的API版本:V9+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,UDP端口已打开 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向UDP设置结构体的指针(见下文) |
指针所指数据的结构:
类型 | 说明 |
uint16_t | 要连接的UDP端口 |
uint16_t | 通信超时,毫秒 |
uint16_t | 保留 |
不超过255字节 | IP地址——以零结尾的ASCII字符序列(ASCIIZ) |
IP地址和UDP端口应与Super-Modem的设置一致(见下方截图)。

关闭串口
关闭端口(如果此前已通过 mm_open_port 函数打开)。
C语言声明:bool mm_close_port ();
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,端口已关闭 false – 执行出错 |
参数:无
获取Marvelmind设备的版本和CPU ID
读取版本和CPU ID。版本包括固件版本和设备硬件类型信息。CPU ID是每台设备独有的ID。
函数名: mm_get_device_version_and_id
C语言声明:bool mm_get_device_version_and_id (uint8_t address, void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取版本和CPU ID数据 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | Marvelmind设备地址(1…254) |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint8_t | 固件主版本号(例如:版本V6.07a中的“6”) |
uint8_t | 固件次版本号(例如:版本V6.07a中的“7”) |
uint8_t | 固件第二次版本号(例如:版本V6.07a中的“1”) |
uint8_t | 设备类型ID(见 附录). |
uint8_t | 固件选项(待定)。 |
uint32_t | CPU ID。将该值以十六进制打印,即可得到Dashboard中和设备标签上显示的CPU ID格式。 |
获取设备列表
读取调制解调器已知的Marvelmind设备列表。该列表包括通过无线电连接到调制解调器网络的所有设备,包括休眠设备。
C语言声明:bool mm_get_devices_list (void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取设备列表 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint8_t | 列表中后续设备的数量(N) |
N*9字节 | N个设备结构体的序列,见下表 |
列表中每个设备的结构:
类型 | 说明 |
uint8_t | 设备地址 |
bool | true = 地址重复——发现多个设备使用同一地址 false = 地址未重复 |
bool | true = 设备处于休眠状态 false = 设备未休眠 |
uint8_t | 固件主版本号(例如:版本V6.07a中的“6”) |
uint8_t | 固件次版本号(例如:版本V6.07a中的“7”) |
uint8_t | 固件第二次版本号(例如:版本V6.07a中的“1”) |
uint8_t | 设备类型ID(见 附录). |
uint8_t | 固件选项(待定)。 |
uint8_t | 标志: 位0:1 – 设备连接完成——设备已确认连接 0 – 正在等待设备确认(类似Dashboard中的‘Connecting…’)。 位1…7 – 待定 |
唤醒设备
向指定设备发送唤醒命令。如果唤醒命令已发送且该设备存在,设备将在几秒钟内连接到调制解调器,并出现在 设备列表.
C语言声明:bool mm_wake_device (uint8_t address);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,唤醒命令已发送 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 1…254 – 要唤醒的Marvelmind设备地址 0 – 唤醒所有设备 |
使设备休眠
使现有设备进入休眠。
C语言声明:bool mm_send_to_sleep_device (uint8_t address);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,休眠命令已发送 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 1…254 – 要休眠的Marvelmind设备地址 0 – 使所有设备休眠 |
获取信标遥测数据
读取Marvelmind信标的遥测数据。
C语言声明:bool mm_get_beacon_telemetry (uint8_t address, void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取遥测数据 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | Marvelmind信标地址(1…254) |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint32_t | 信标工作时间,秒(自复位或唤醒起计)。 |
int8_t | RSSI,dBm – 无线信号强度 |
int8_t | 测得温度,°C |
uint16_t | 供电电压,毫伏 |
16字节 | 保留(0) |
获取最新位置数据
从调制解调器读取最新更新的坐标包。如有用户负载数据,也一并读取。
C语言声明:bool mm_get_last_locations(void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取位置数据 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
18*6字节 | 6个18字节的最新更新坐标数据结构,见下表 |
bool | true – 有新的原始距离数据可读取 |
5字节 | 待定 |
uint8_t | 用户负载数据大小(M) |
M字节 | 用户负载数据 |
每个位置数据项的结构:
类型 | 说明 |
uint8_t | 设备地址(1…254) 0 – 该数据项未填充 |
uint8_t | 头部索引(待定) |
int32_t | X坐标,毫米 |
int32_t | Y坐标,毫米 |
int32_t | Z坐标,毫米 |
uint8_t | 状态标志(待定) |
uint8_t | 定位质量,0…100% |
uint8_t | 待定 |
uint8_t | 待定 |
获取最新位置数据(含角度)
从调制解调器读取最新更新的坐标包(配对信标含角度)。如有用户负载数据,也一并读取。
函数名: mm_get_last_locations2
C语言声明:bool mm_get_last_locations2(void *pdata);
适用的API版本:V3+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取位置数据 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
20*6字节 | 6个20字节的最新更新坐标数据结构,见下表 |
bool | true – 有新的原始距离数据可读取 |
5字节 | 待定 |
uint8_t | 用户负载数据大小(M) |
M字节 | 用户负载数据 |
每个位置数据项的结构:
类型 | 说明 |
uint8_t | 设备地址(1…254) 0 – 该数据项未填充 |
uint8_t | 头部索引(待定) |
int32_t | X坐标,毫米 |
int32_t | Y坐标,毫米 |
int32_t | Z坐标,毫米 |
uint8_t | 状态标志(待定) |
uint8_t | 定位质量,0…100% |
uint8_t | 待定 |
uint8_t | 待定 |
uint16_t | 位0…11 – 旋转角度,单位为1/10度(若启用配对信标功能) 位12 – 1 = 角度不可用 位13…15 – 保留 |
设置信标位置
手动设置指定信标的位置。
函数名: mm_set_beacon_location
C语言声明:bool mm_set_beacon_location (uint8_t address, void *pdata);
适用的API版本:V3+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,位置已更新 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 信标地址 |
void * | 指向位置数据缓冲区的指针 |
指针所指数据的结构(应在调用函数前填写):
类型 | 说明 |
int32_t | 信标的新X坐标,毫米 |
int32_t | 信标的新Y坐标,毫米 |
int32_t | 信标的新Z坐标,毫米 |
设置信标间距离
手动设置信标间距离。
函数名: mm_set_beacons_distance
C语言声明:bool mm_set_beacons_distance (void *pdata);
适用API版本:V4+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,距离已写入 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向距离数据缓冲区的指针 |
指针所指数据的结构(应在调用函数前填写):
类型 | 说明 |
uint8_t | 第一个信标的地址 |
uint8_t | 第二个信标的地址 |
int32_t | 信标间距离,毫米 |
获取最新原始距离数据
从调制解调器读取最新更新的原始距离数据包。
C语言声明:bool mm_get_last_distances(void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取原始距离数据 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint8_t | 原始距离数据项数量(N)。 每次请求最多返回16个原始距离:N<=16 |
9*N字节 | N个9字节的最新原始距离数据结构,见下表 |
每个原始距离数据项的结构:
类型 | 说明 |
uint8_t | 超声波接收(RX)设备地址(1…254) 0 – 该数据项未填充 |
uint8_t | RX探头索引(待定) |
uint8_t | 超声波发射(TX)设备地址(1…254) 0 – 该数据项未填充 |
uint8_t | TX探头索引(待定) |
uint32_t | TX设备到RX设备的距离,毫米 |
uint8_t | 待定 |
获取移动信标高度
返回移动信标(hedgehog)的高度。
函数名: mm_get_hedge_height
C语言声明:bool mm_get_hedge_height (uint8_t address, void *pdata);
适用API版本:V4+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已返回高度 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 移动信标地址 |
void * | 指向高度数据缓冲区的指针 |
指针所指数据的结构:
类型 | 说明 |
int32_t | 移动信标高度,毫米 |
设置移动信标高度
设置移动信标(hedgehog)的高度。
函数名: mm_set_hedge_height
C语言声明:bool mm_set_hedge_height (uint8_t address, void *pdata);
适用API版本:V4+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,高度已更改 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 移动信标地址 |
void * | 指向高度数据缓冲区的指针 |
指针所指数据的结构(应在调用函数前填写):
类型 | 说明 |
int32_t | 移动信标高度,毫米 |
获取子地图中固定信标的高度
返回子地图中固定信标的高度。
函数名: mm_get_beacon_height
C语言声明:bool mm_get_beacon_height (uint8_t address, void *pdata);
适用API版本:V4+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已返回高度 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 信标地址 |
void * | 指向高度数据缓冲区的指针 |
指针所指数据的结构:
类型 | 说明 |
uint8_t | 子地图ID,调用函数前须填写 |
int32_t | 信标高度,毫米 |
设置子地图中固定信标的高度
设置子地图中固定信标的高度。
函数名: mm_set_beacon_height
C语言声明:bool mm_set_beacon_height (uint8_t address, void *pdata);
适用API版本:V4+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,高度已更改 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 信标地址 |
void * | 指向高度数据缓冲区的指针 |
指针所指数据的结构(应在调用函数前填写):
类型 | 说明 |
uint8_t | 子地图ID |
int32_t | 信标高度,毫米 |
获取位置更新率设置
从调制解调器读取位置更新率设置。
函数名: mm_get_update_rate_setting
C语言声明:bool mm_get_update_rate_setting (void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取更新率 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint32_t | 位置更新率设置,单位为mHz。例如,1 Hz返回1000,16 Hz返回16000,0.05 Hz模式返回50。 |
设置位置更新率
向调制解调器写入位置更新率设置。
函数名: mm_set_update_rate_setting
C语言声明:bool mm_set_update_rate_setting (void *pdata);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,更新率已更改 false – 执行出错 |
参数:
类型 | 说明 |
void * | 指向数据的指针 |
指针所指数据的结构(应在调用函数前填写):
类型 | 说明 |
uint32_t | 位置更新率设置,单位为mHz。例如,1 Hz对应1000,16 Hz对应16000,0.05 Hz模式对应50。系统将从以下系列中选用与指定值最接近的更新率:0.05 Hz、0.1 Hz、0.2 Hz、0.5 Hz、1 Hz、2 Hz、4 Hz、8 Hz、12 Hz、16 Hz、16+Hz。 |
添加子地图
添加新的子地图。
C语言声明:bool mm_add_submap (uint8_t submapId);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,子地图已添加 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 要添加的子地图ID(0…254) |
删除子地图
删除已有子地图。
C语言声明:bool mm_delete_submap (uint8_t submapId);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,子地图已删除 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 要删除的子地图ID(0…254) |
冻结子地图
冻结子地图。
C语言声明:bool mm_freeze_submap (uint8_t submapId);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,子地图已冻结 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 要冻结的子地图ID(0…254) |
解冻子地图
解冻子地图。
C语言声明:bool mm_unfreeze_submap (uint8_t submapId);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,子地图已解冻 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 要解冻的子地图ID(0…254) |
获取子地图设置
从调制解调器读取子地图设置。
C语言声明:bool mm_get_submap_settings (uint8_t submapId, void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取子地图设置 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 子地图ID(0…254) |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint8_t | 三边定位起始信标 |
uint8_t | 起始信标组,信标1 |
uint8_t | 起始信标组,信标2 |
uint8_t | 起始信标组,信标3 |
uint8_t | 起始信标组,信标4 |
bool | true = 启用3D导航 |
bool | true = 子地图仅用于Z坐标 |
bool | true = 手动限制距离 false = 自动限制距离 |
uint8_t | 最大距离,米(用于手动限制距离) |
int16_t | 子地图X偏移,厘米 |
int16_t | 子地图Y偏移,厘米 |
int16_t | 子地图Z偏移,厘米 |
uint16_t | 子地图旋转角,单位0.01度 |
int16_t | 平面旋转四元数,W(四元数归一化为10000) |
int16_t | 平面旋转四元数,X |
int16_t | 平面旋转四元数,Y |
int16_t | 平面旋转四元数,Z |
int16_t | 服务区厚度,厘米 |
int16_t | 2D模式下的移动信标高度 |
bool | true = 子地图已冻结 |
bool | true = 子地图已锁定 |
bool | true = 固定信标高于移动信标 |
bool | true = 子地图已镜像 |
4字节 | 子地图中的信标地址列表(0 = 无) |
8字节 | 相邻子地图的ID列表(255 = 无) |
uint8_t | 服务区多边形顶点数(P) |
P*4字节 | 服务区多边形顶点结构列表(见下文) |
服务区多边形顶点结构:
类型 | 说明 |
int16_t | X,厘米 |
int16_t | Y,厘米 |
设置子地图参数
向调制解调器写入子地图设置。
C语言声明:bool mm_set_submap_settings (uint8_t submapId, void *pdata);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,子地图设置已更改 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 子地图ID(0…254) |
void * | 指向待写入数据的指针(参见“获取子地图设置”函数)。 |
冻结地图
冻结子地图。
函数名: mm_freeze_map
C语言声明:bool mm_freeze_map ();
适用API版本:V4+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,地图已冻结 false – 执行出错 |
解冻地图
冻结子地图。
函数名: mm_unfreeze_map
C语言声明:bool mm_freeze_map ();
适用API版本:V4+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,地图已解冻 false – 执行出错 |
获取信标的超声波设置
读取指定信标的超声波设置。
函数名: mm_get_ultrasound_settings
C语言声明:bool mm_get_ultrasound_settings (uint8_t address, void *pdata);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已获取超声波设置 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 信标地址(1…254) |
void * | 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint16_t | 超声波发射频率(不适用于仅接收的DSP信标) |
uint8_t | 发射周期数(不适用于仅接收的DSP信标) |
bool | true = 接收使用AGC(自动增益控制) false = 接收使用手动增益 |
uint16_t | 手动增益值(0…4000) |
bool | true = 正常模式下启用传感器RX1 |
bool | true = 正常模式下启用传感器RX2 |
bool | true = 正常模式下启用传感器RX3 |
bool | true = 正常模式下启用传感器RX4 |
bool | true = 正常模式下启用传感器RX5 |
bool | true = 冻结模式下启用传感器RX1 |
bool | true = 冻结模式下启用传感器RX2 |
bool | true = 冻结模式下启用传感器RX3 |
bool | true = 冻结模式下启用传感器RX4 |
bool | true = 冻结模式下启用传感器RX5 |
uint8_t | DSP接收滤波器索引(仅适用于DSP信标) 0 = 19 kHz 1 = 25 kHz 2 = 31 kHz 3 = 37 kHz 4 = 45 kHz |
设置信标的超声波参数
向指定信标写入超声波设置。
函数名: mm_set_ultrasound_settings
C语言声明:bool mm_set_ultrasound_settings (uint8_t address, void *pdata);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,超声波设置已更改 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 信标地址(1…254) |
void * | 指向待写入数据的指针(参见“获取超声波设置”函数)。 |
清除地图
擦除调制解调器中的地图——删除所有子地图(子地图0除外),将子地图0复位到初始状态,并将所有已连接的信标移出网络。
C语言声明:bool mm_erase_map ();
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,地图已擦除 false – 执行出错 |
参数:无
将设备恢复为默认设置
将设备恢复为默认设置(无线电、超声波等)。
C语言声明:bool mm_set_default_settings (uint8_t address);
适用的API版本:V1+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,设备已恢复默认设置 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 设备地址(1…254) 255 – 将通过USB连接的设备恢复为默认设置 |
将信标关联到坐标轴
平移地图,使选定的信标位于坐标轴上。
函数名: mm_beacons_to_axes
C语言声明:bool mm_beacons_to_axes (uint8_t address_0, uint8_t address_x, uint8_t address_y);
适用的API版本:V2+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,地图已平移 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | address_0 – 应位于原点(X=0, Y=0)的信标地址 |
uint8_t | address_x – 应位于X轴上(Y=0)的信标地址 |
uint8_t | address_y – 应位于Y轴正方向(Y>0)的信标地址 |
读取调制解调器配置存储器转储
读取调制解调器配置存储器的转储,可用于保存调制解调器的设置和已存储的地图。
函数名: mm_read_flash_dump
C语言声明:bool mm_read_flash_dump(uint32_t offset, uint32_t size, void *pdata);
适用的API版本:V3+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已读取转储 false – 执行出错 |
参数:
类型 | 说明 |
uint32_t | offset – 相对配置存储器起始处的偏移量,字节 |
uint32_t | size – 要读取的数据大小,字节 |
void * | pdata – 指向用户接收数据缓冲区的指针 |
写入调制解调器配置存储器转储
将数据转储写入调制解调器配置存储器,可用于恢复调制解调器的设置和地图。
函数名: mm_write_flash_dump
C语言声明:bool mm_write_flash_dump(uint32_t offset, uint32_t size, void *pdata);
适用的API版本:V3+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已写入转储 false – 执行出错 |
参数:
类型 | 说明 |
uint32_t | offset – 相对配置存储器起始处的偏移量,字节 为确保正确运行,offset应按4096字节页对齐(取值0、4096、8192等)。 |
uint32_t | size – 要写入的数据大小,字节 |
void * | pdata – 指向用户数据缓冲区的指针 |
注意:写入配置后,建议对调制解调器执行 软件复位 (mm_reset_device(255)),以应用新设置并防止其被覆盖。
设备重启(软件复位)
对指定设备执行软件复位。
函数名: mm_reset_device
C语言声明:bool mm_reset_device (uint8_t address);
适用的API版本:V3+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,设备正在复位 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | 设备地址(1…254) 255 – 对通过USB连接的设备执行软件复位 |
从调制解调器读取空气温度设置
从调制解调器读取空气温度设置(摄氏度)。
函数名: mm_get_air_temperature
C语言声明:bool mm_get_air_temperature (void *pdata);
适用的API版本:V3+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,已返回温度 false – 执行出错 |
通过pdata指针返回的数据结构:
类型 | 说明 |
int8_t | 空气温度,摄氏度 |
向调制解调器写入空气温度设置
在调制解调器中设置空气温度(摄氏度)。
函数名: mm_set_air_temperature
C语言声明:bool mm_set_air_temperature (void *pdata);
适用的API版本:V3+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功,温度已写入 false – 执行出错 |
用户需通过pdata指针提供的数据结构:
类型 | 说明 |
int8_t | 空气温度,摄氏度 |
获取信标实时播放器设置
读取信标的实时播放器设置。
函数名: mm_get_realtime_player_settings
C语言声明:bool mm_get_realtime_player_settings (uint8_t address, void *pdata);
适用的API版本:V6+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | address – 信标地址(1…254) |
void * | pdata – 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
bool | true = 已启用实时播放器 |
uint8_t | 实时播放器需处理的前向样本数 |
uint8_t | 实时播放器需处理的后向样本数 |
uint8_t | 保留(0) |
uint8_t | 保留(0) |
设置信标实时播放器参数
设置信标的实时播放器参数。
函数名: mm_set_realtime_player_settings
C语言声明:bool mm_set_realtime_player_settings (uint8_t address, void *pdata);
适用的API版本:V6+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | address – 信标地址(1…254) |
void * | pdata – 指向待写入数据的指针(参见“获取信标实时播放器设置”函数) |
获取地理配准设置
读取地理参考设置(Marvelmind地图原点(X=0,Y=0)的地理位置)。
函数名: mm_get_georeferencing_settings
C语言声明:bool mm_get_georeferencing_settings (void *pdata);
适用的API版本:V6+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
int32_t | 纬度,x10-7 度 |
int32_t | 经度,x10-7 度 |
设置地理配准参数
设置地理参考(Marvelmind地图原点(X=0,Y=0)的地理位置)。
函数名: mm_set_georeferencing_settings
C语言声明:bool mm_set_georeferencing_settings (void *pdata);
适用的API版本:V6+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待写入数据的指针(参见“获取地理配准设置”函数) |
获取位置更新模式
读取移动信标位置的当前更新模式。
函数名: mm_get_update_position_mode
C语言声明:bool mm_get_update_position_mode (void *pdata);
适用的API版本:V6+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待填充数据的指针 |
通过指针返回的数据结构:
类型 | 说明 |
uint8_t | 移动信标位置更新模式: 0 – 自动更新位置(默认模式) 1 – 按用户请求在下一个更新周期更新位置 2 – 按用户请求立即更新位置 |
7字节 | 保留(0) |
设置位置更新模式
设置移动信标位置更新模式。
函数名: mm_set_update_position_mode
C语言声明:bool mm_set_update_position_mode (void *pdata);
适用的API版本:V6+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待写入数据的指针(参见函数“获取位置更新模式’) |
更新位置的命令
发送更新移动信标位置的命令(当 更新模式 为非自动时)。
函数名: mm_set_update_position_command
C语言声明:bool mm_set_update_position_command (void *pdata);
适用的API版本:V6+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待写入数据的指针 |
指针所指数据的结构:
类型 | 说明 |
8字节 | 保留(0) |
设置信标的电子围栏报警状态
发送命令,设置信标报警引脚的报警状态(适用于Super-Beacon)。
引脚的报警状态可通过Dashboard设置中“Interfaces”部分的“Alarm pin mode”设置来指定(如已激活 MMSW0006 许可证)。
函数名: mm_set_alarm_state
C语言声明:bool mm_set_alarm_state (uint8_t address, void *pdata);
适用的API版本:V9+
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | address – 信标地址(1…254) |
void * | pdata – 指向待写入数据的指针 |
指针所指数据的结构:
类型 | 说明 |
uint8_t | 报警引脚模式: 0 – 引脚根据地理围栏状态自动控制 1 – 引脚手动控制 – 非报警状态 2 – 引脚手动控制 – 报警状态 |
uint8_t | 地理围栏区域索引 – 信标在报警状态下 流式输出 的地理围栏区域编号 |
6字节 | 保留(0) |
发送通用用户负载数据
发送通用用户有效载荷数据。若API连接到调制解调器,数据将通过指定移动信标的UART/USB端口传输;若API连接到移动信标,数据将通过调制解调器的UART/USB端口传输。远端可通过 接收API函数、Arduino示例、ROS及其他软件获取接收到的数据。
函数名: mm_send_user_payload_data
C语言声明:bool mm_send_user_payload_data (uint8_t address, void *pdata);
适用的API版本:V9+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
uint8_t | address – 信标地址(1…254),适用于API连接到调制解调器时 API连接到信标时不适用 |
void * | pdata – 指向待写入数据的指针 |
指针所指数据的结构:
类型 | 说明 |
uint8_t | 待发送数据的大小 |
256字节 | 待发送的通用数据缓冲区 |
获取通用用户负载数据
接收由 发送API函数、Arduino、ROS或其他用户软件发送的通用用户有效载荷数据。若API连接到调制解调器,该函数可接收经移动信标UART/USB端口传输的数据;若API连接到移动信标,该函数可接收经调制解调器传输的数据。
函数名: mm_get_user_payload_data
C语言声明:bool mm_get_user_payload_data (void *pdata);
适用的API版本:V9+
所需许可: MMSW0005
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向接收数据的指针 |
指针所指接收数据的结构:
类型 | 说明 |
uint8_t | address – 信标地址 |
int64_t | 数据发送时间戳 – 自1970年1月1日起的毫秒数(Unix时间) |
uint8_t | 待发送数据的大小 |
256字节 | 接收数据缓冲区 |
发送手动测距命令
发送命令,测量指定信标到系统中其他信标的距离。在当前软件版本中,该功能 支持IA (逆向架构)。
函数名: mm_send_distances_measurement_command
C语言声明:bool mm_send_distances_measurement_command (void *pdata);
适用的API版本:V9+
所需许可: MMSW0011
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待发送数据的指针 |
指针所指数据的结构:
类型 | 说明 |
uint8_t | 模式: 0 – 自动 1 – 手动(通过本命令) |
uint8_t | 信标地址 |
uint32_t | 最大测量距离,毫米 |
8字节 | 保留 |
从调制解调器获取流数据
读取调制解调器的流数据,采用 前文所述的格式.
函数名: mm_get_stream_data
C语言声明:bool mm_get_stream_data (void *pdata);
适用的API版本:V9+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 函数执行成功 false – 执行出错 |
参数:
类型 | 说明 |
void * | pdata – 指向待发送数据的指针 |
指针所指数据的结构:
类型 | 说明 |
uint8_t | 本次应答中的流记录数(0…16) |
138*16字节 | 16条流记录,每条138字节(见下文) |
8字节 | 保留 |
流记录结构:
类型 | 说明 |
uint8_t | 记录大小,字节 |
uint8_t | 记录类型,取值与“行类型”(line type)相同,参见 Dashboard日志文件. 例如,41表示Marvelmind协议数据 |
8字节 | 保留 |
128字节 | 流记录数据 |
检查设备类型是否为调制解调器
检查指定的设备类型是否对应调制解调器。
C语言声明:bool mm_device_is_modem (uint8_t deviceType);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 指定的设备类型对应调制解调器 |
参数:
类型 | 说明 |
uint8_t | 设备类型 (待检查) |
检查设备类型是否为固定信标
检查指定的设备类型是否对应固定信标。
C语言声明:bool mm_device_is_beacon (uint8_t deviceType);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 指定的设备类型对应固定信标 |
参数:
类型 | 说明 |
uint8_t | 设备类型 (待检查) |
检查设备类型是否为移动信标(hedgehog)
检查指定的设备类型是否对应移动信标(hedgehog)。
C语言声明:bool mm_device_is_hedgehog (uint8_t deviceType);
适用的API版本:V1+
所需许可:无
返回值:
类型 | 说明 |
bool | true – 指定的设备类型对应移动信标(hedgehog) |
参数:
类型 | 说明 |
uint8_t | 设备类型 (待检查) |
Marvelmind API的C语言示例说明
C语言示例用于测试Marvelmind API,也可作为开发用户应用程序的基础。
该C语言示例为控制台应用程序,已在以下平台上测试:
- CPU:Intel Core 2 Duo,操作系统:MS Windows XP;
- CPU:Intel Core i5,操作系统:Linux Ubuntu 16.04;
- Raspberry Pi 3 Model B+,操作系统:Raspbian(2018-11-13-raspbian-stretch-full)
在Windows平台上,示例使用CodeBlocks IDE构建,因此附带CodeBlocks项目文件。
在Linux平台上,示例使用make工具构建,因此附带相应的makefile。
示例包含以下模块:
文件名 | 说明 |
main.c | 包含main()函数的模块,负责调用示例中的各函数,并实现简单的命令行界面。 |
marvelmind_example.c marvelmind_example.h | marvelmindStart() – 示例初始化 marvelmindFinish() – 结束API操作后调用 marvelmindCycle() – 在主循环中频繁调用 此外,该模块还包含若干处理用户输入命令的函数。 |
marvelmind_api.c marvelmind_api.h | marvelmindAPILoad() – 加载API库 marvelmindAPIFree() – 释放API库占用的内存 与API库通信的全部函数。 |
marvelmind_devices.c marvelmind_devices.h | 维护通过调用“获取设备列表” 命令从调制解调器获取的信标列表。每个信标包含其位置以及到其他信标的距离数据。 |
marvelmind_pos.c marvelmind_pos.h | |
marvelmind_utils.c marvelmind_utils.h | 供其他模块使用的若干辅助函数。 |
示例工作流程:
- 尝试 打开 串口,直至成功
- 端口打开后,程序读取通过USB连接的设备版本。如果是调制解调器,程序继续执行后续步骤
- 连接到调制解调器后,程序读取 设备列表 ,频率为1 Hz。将设备列表与marvelmind_devices.c模块中当前存储的列表进行比较,如发现变化则更新marvelmind_devices.c中的列表。所有变化都会打印到控制台
- 连接到调制解调器后,程序读取 最新位置数据 ,频率为20 Hz。如果设置了新原始距离数据标志,程序将读取 最新原始距离。程序将位置和距离与marvelmind_devices.c中设备列表的数据进行比较,如有变化则更新。所有变化的数据都会打印到控制台
- 如果程序连续10次无法获取最新位置数据,将 关闭端口 并返回第1步——重新尝试打开端口。当调制解调器从USB断开后又重新连接时,需要重新打开端口
- 如果用户按下“空格”键,程序将显示“Enter command:”提示并等待用户命令。大部分API函数通过用户命令调用,详见下文
用户命令:
如果用户按下“空格”键(程序运行期间),程序将显示提示“Enter command: ”。用户应通过键盘输入命令并按 回车键.
下表列出了所有用户命令的格式:
命令组 | 说明 |
API版本 | 命令格式: version 操作: 打印API库版本 |
退出程序 | 命令格式: quit 操作: 结束程序运行 |
休眠/唤醒 | 命令格式: wake 操作: 执行 wake 命令。 示例: wake 5 – 发送命令唤醒设备5 wake 0 – 发送命令唤醒所有设备 |
命令格式: sleep 操作: 执行 休眠 命令。 示例: sleep 5 – 使设备5进入休眠 sleep 0 – 使所有设备进入休眠 | |
默认设置 | 命令格式: default 操作: 执行 恢复默认设置 命令。 示例: default 5 – 将设备5恢复为默认设置 |
读取遥测 | 命令格式: tele 操作: 读取并打印信标的 遥测 数据。 示例: tele 5 – 读取并打印信标5的遥测数据 |
子地图命令 | 命令格式: submap add 操作: 执行命令, 添加子地图 (使用指定的子地图ID)。 示例: submap add 1 – 添加子地图1 |
命令格式: submap delete 操作: 执行命令, 删除子地图 (使用指定的子地图ID)。 示例: submap delete 1 – 删除子地图1 | |
命令格式: submap freeze 操作: 执行命令, 冻结子地图 (使用指定的子地图ID)。 示例: submap freeze 0 – 冻结子地图0 | |
命令格式: submap unfreeze 操作: 执行命令, 解冻子地图 (使用指定的子地图ID)。 示例: submap unfreeze 0 – 解冻子地图0 | |
命令格式: submap get 操作: 执行命令, 获取子地图设置 (使用指定的子地图ID)。 示例: submap get 0 – 获取并打印子地图0的设置 | |
命令格式: submap testset 操作: 执行命令, 设置子地图参数 (使用指定的子地图ID)。程序会写入一些预定义设置以测试该命令,详见示例代码。 示例: submap testset 0 – 修改子地图0的设置 | |
地图命令 | 命令格式: map erase 操作: 执行 擦除地图 命令。 示例: map erase – 擦除调制解调器中的地图 |
命令格式: map freeze 操作: 执行 冻结地图 命令。 示例: map freeze – 冻结地图 | |
命令格式: map unfreeze 操作: 执行 解冻地图 命令。 示例: map unfreeze – 解冻地图 | |
更新率命令 | 命令格式: rate get 操作: 执行 读取更新率 设置命令。 示例: rate get – 读取并打印更新率设置 |
命令格式: rate set 操作: 执行 更改更新率 设置命令。数值单位为Hz 示例: rate set 0.5 – 将更新率设为0.5 Hz | |
超声波命令 | 命令格式: usound get 操作: 执行 读取超声波设置 命令,针对指定信标。 示例: usound get 5 – 读取并打印信标5的超声波设置 |
命令格式: usound testset 操作: 执行 写入超声波设置 命令,针对指定信标。程序会写入一些预定义设置以测试该命令,详见示例代码。 示例: usound testset 5 – 修改信标5的超声波设置 | |
对齐坐标轴命令 | 命令格式: axes 操作: 执行 将信标对齐到坐标轴 命令。 示例: axes 3 4 5 – 将信标3设为X=0, Y=0;信标4位于X轴上(Y=0),信标5位于X轴上方(Y>0) |
从调制解调器读取配置存储器转储 | 命令格式: read_dump 操作: 执行 读取调制解调器配置存储器转储 命令。 示例: read_dump 0 1000 – 从配置存储器起始处读取前1000字节 |
向调制解调器写入配置存储器测试转储 | 命令格式: write_dump_test 操作: 执行 写入调制解调器配置存储器转储 命令。 示例: write_dump_test 0 1000 – 用测试图样填充配置存储器起始处的前1000字节 |
设备软件复位 | 命令格式: reset 操作: 执行 软件复位 命令。 示例: reset 255 – 对通过USB连接的设备执行软件复位 |
空气温度命令 | 命令格式: temperature get 操作: 执行读取 空气温度设置 (来自调制解调器) 示例: temperature get 读取并打印用于超声波的空气温度设置 |
命令格式: temperature set 操作: 执行写入 空气温度设置 (写入调制解调器) 示例: temperature set 30 将空气温度设置为30摄氏度 | |
设置信标位置 | 命令格式: setloc 操作: 执行 设置信标位置 命令。X、Y、Z为坐标,单位为米。 示例: setloc 12 1.51 3.45 2.0 – 将信标12的位置设为X= 1.51米,Y= 3.45米,Z= 2.0米 |
设置信标间距离 | 命令格式: setdist 操作: 执行 设置信标间距离 命令。address1和address2为信标地址,distance为距离,单位为米。 示例: setdist 12 13 16.5 – 将信标12与13之间的距离设为16.5米 |
高度命令 | 命令格式: height_h get 操作: 执行 获取移动信标高度 命令。address为移动信标的地址。 示例: height_h get 15 – 读取并打印移动信标15的高度 |
命令格式: height_h set 操作: 执行 设置移动信标高度 命令。address为移动信标的地址,height为高度,单位为米 示例: height_h set 15 2.5 – 将移动信标15的高度设为2.5米 | |
命令格式: height_b get 操作: 执行 获取固定信标高度 命令。address为信标地址,submap_id为信标所属子地图的ID。 示例: height_b get 12 0 – 读取并打印子地图0中固定信标12的高度。 | |
命令格式: height_b set 操作: 执行 设置固定信标高度 命令。address为信标地址,submap_id为信标所属子地图的ID,height为高度,单位为米 示例: height_b set 12 0 5.1 – 将子地图0中信标12的高度设为5.1米 | |
实时播放器命令 | 命令格式: rtp get 操作: 执行 获取实时播放器设置 命令。address为信标地址。 示例: rtp get 15 – 读取并打印信标15的实时播放器设置 |
命令格式: rtp testset 操作: 执行 设置实时播放器参数 命令。address为信标地址。程序会写入一些预定义设置以测试该命令,详见示例代码。 示例: rtp testset 15 – 为信标15设置测试用的实时播放器参数 | |
地理参考命令 | 命令格式: georef get 操作: 执行 获取地理参考 设置命令。 示例: georef get – 读取并打印地理参考设置 |
命令格式: georef set 操作: 执行 设置地理参考 设置命令。 示例: georef set 10 20 – 写入地理参考:纬度10度,经度20度 | |
更新模式命令 | 命令格式: update_mode get 操作: 执行 获取位置更新模式 命令。 示例: update_mode get – 读取并打印位置更新模式 |
命令格式: update_mode set 操作: 执行 设置位置更新模式 命令。 示例: update_mode set 0 – 设置为自动位置更新模式 | |
命令格式: update 操作: 执行 更新位置 命令。 示例: update – 更新移动信标的位置,依据 当前模式 | |
设置地理围栏报警状态 | 命令格式: alarm 操作: 执行 设置地理围栏报警状态 命令。 示例: alarm 10 2 5 – 在信标n10上设置地理围栏报警信号,地理围栏区域编号为5 |
命令格式: payload read 操作: 执行 获取用户有效载荷数据 命令。 示例: payload read – 从任意信标/调制解调器读取用户有效载荷 示例: payload read 10 – 从信标n10读取用户有效载荷 | |
命令格式: payload write 操作: 执行 发送用户有效载荷数据 命令。 示例: payload write 10 – 向信标n10写入测试有效载荷数据 测试图样为从100开始的40个字节:100,101,…, 139 | |
手动测距命令 | 命令格式: distance 操作: 执行 手动测距 命令。 示例: distance manual 10 5 – 测量信标10到其他信标的距离,最大距离5米 示例: distance manual 10 – 测量信标10到其他信标的距离,最大距离30米(默认) 示例: distance auto – 返回自动测距模式 |
设备类型
以下是各设备的“设备类型ID”取值列表:
设备类型ID | 设备说明 |
22 | Beacon HW V4.5 |
23 | Beacon HW V4.5(移动信标模式) |
24 | Modem HW V4.9 |
30 | Beacon HW V4.9 |
31 | Beacon HW V4.9(移动信标模式) |
32 | Beacon Mini-RX |
36 | Beacon Mini-TX |
37 | Beacon-TX-IP67 |
41 | Beacon industrial-RX |
42 | Super-Beacon |
43 | Super-Beacon(移动信标模式) |
44 | Industrial Super-Beacon |
45 | Industrial Super-Beacon(移动信标模式) |
46 | Super-Modem |
48 | Modem HW V5.1 |
与用户设备之间收发用户数据
Marvelmind支持通过Marvelmind系统以多种方式传输用户数据:
- 通过调制解调器的UART或USB发送数据,并通过移动信标的UART或USB接收
- 通过移动信标的UART或USB发送数据,并通过调制解调器的UART或USB接收。
Super-Modem还支持通过UDP收发用户数据。
数据传输协议已在本文档前面的章节中说明:
Marvelmind提供多种通信软件示例:
示例 | Arduino (UART) | PC / Raspberry Pi(USB) | PC / raspberry Pi (UDP Super-Modem) | |||
API | C | Python | ROS/ROS2 | C语言示例 | ||
用户设备 ← 信标 | + | + | + | + | + | n/a |
调制解调器 → 用户设备 | + | + | + | + | + | + |
用户设备 → 信标 | + | + | – | – | + | n/a |
调制解调器 ← 用户设备 | + | + | – | – | + | + |
示例完整列表:
- Arduino的用户数据收发示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 06_Examples/ arduino”文件夹中。“hedgehog_sample_uart_user_data_receive_v2”用于接收用户数据,“hedgehog_sample_uart_user_data_send_v2”用于发送用户数据
- API通信示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 05_API/example_source”(源代码)和“01_Common_Indoor_positioning_SW/ 05_API/example_bin_win32”(Windows可执行文件)文件夹中。数据的发送或接收可按本文档 所述 方式调用。
- 用于接收流数据的C语言示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 06_Examples/ c”文件夹中。该示例也可在 GitHub代码库中获取。该示例会打印从移动信标或调制解调器接收到的所有数据,包括用户数据。
- 用于接收流数据的Python示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 06_Examples/ python”文件夹中。该示例也可在 GitHub代码库中获取。该示例会打印从移动信标或调制解调器接收到的所有数据,包括用户数据。
- 用于接收流数据的ROS软件包示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 06_Examples/ ROS”文件夹中。该软件包也可在 代码库中获取。该ROS软件包可通过API接收和发送用户数据。请参阅 文档(英文) 了解详情。
- 用于接收流数据的ROS-2软件包示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 06_Examples/ ROS2”文件夹中。该软件包也可在 代码库中获取。该ROS软件包可通过API接收和发送用户数据。请参阅 文档(英文) 了解详情。
- 通过UDP接收数据的C语言示例位于Marvelmind软件包的“01_Common_Indoor_positioning_SW/ 06_Examples/ c”文件夹中。该示例会打印通过UDP从Super-Modem或Dashboard接收到的所有数据,包括用户数据。如果API用于 通过UDP连接Super-Modem (而非USB),则可通过API经UDP发送用户数据。
联系方式
如需更多支持,请将问题发送至 info@marvelmind.com
校验和采用CRC-16。N字节帧的最后两个字节填入CRC-16,该CRC-16针对帧的前(N-2)个字节计算。校验数据时,可对整个N字节帧计算CRC-16,结果应为零。
以下是该算法的C语言实现:
typedef uint16_t ModbusCrc;
typedef union { uint16_t w; struct{ uint8_t lo; uint8_t hi; } b; uint8_t bs[2]; } Bytes;static ModbusCrc modbusCalcCrc(const void *buf, uint16_t length)
{
uint8_t *arr = (uint8_t *)buf;
Bytes crc; crc.w = 0xffff; while(length--){ char i; bool odd; crc.b.lo ^= *arr++;for(i = 0; i< 8; i++){
odd = crc.w& 0x01; crc.w>>= 1; if (odd) crc.w ^= 0xa001; } }return (ModbusCrc) crc.w;
}
错误帧格式(调制解调器发往主机)
偏移量 | 大小(字节) | 类型 | 说明 | 值 |
0 | 1 | uint8_t | 调制解调器地址 | 0xff |
1 | 1 | uint8_t | 数据包类型 | |
2 | 1 | uint8_t | 错误代码 | |
3 | 2 | uint16_t | CRC-16(见附录1) |
错误数据包的类型为请求帧的数据包类型加上最高位。例如,如果请求的数据包类型为0x03,则错误数据包的类型为0x83。
错误代码可能为以下之一:
1 – 请求中的数据包类型未知
2 – 请求中的数据代码未知
3 – 请求的数据字段有误
6 – 设备忙
10 – 远端设备返回错误消息
11 – 远端设备应答超时