Marvelmind API

本章的整洁、易读HTML版本。

《接口与协议》中的“Marvelmind API”一章,以HTML网页形式呈现。有不清楚的地方?请打开 仅含本章的原始PDF(第127-213页)(中文) (左上角也有固定链接)。总览: 全部章节.

检查与API的连接

运行示例软件后,在终端中按“空格”键,输入命令‘version’并按回车。如果示例软件打印出API版本,说明它可以与API库通信。

mm_api_version

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

版本

所需许可

获取Marvelmind API库版本

V1+

无

获取上一次错误

V6+

无

尝试打开串口

V1+

无

尝试按指定名称打开串口

V2+

无

尝试打开UDP端口

V9+

无

关闭串口

V1+

无

获取Marvelmind设备的版本和CPU ID

V1+

无

获取设备列表

V1+

无

唤醒设备

V1+

无

使设备休眠

V1+

无

获取信标遥测数据

V1+

无

获取最新位置数据

V1+

无

获取最新位置数据(含角度)

V3+

无

设置信标位置

V3+

MMSW0005

设置信标间距离

V4+

MMSW0005

获取最新原始距离数据

V1+

无

获取移动信标高度

V4+

无

设置移动信标高度

V4+

MMSW0005

获取子地图中固定信标的高度

V4+

无

设置子地图中固定信标的高度

V4+

MMSW0005

获取位置更新率设置

V1+

无

设置位置更新率

V1+

MMSW0005

添加子地图

V1+

MMSW0005

删除子地图

V1+

MMSW0005

冻结子地图

V1+

MMSW0005

解冻子地图

V1+

MMSW0005

获取子地图设置

V1+

无

设置子地图参数

V1+

MMSW0005

冻结地图

V4+

MMSW0005

解冻地图

V4+

MMSW0005

获取信标的超声波设置

V1+

无

设置信标的超声波参数

V1+

MMSW0005

清除地图

V1+

MMSW0005

将设备恢复为默认设置

V1+

MMSW0005

将信标关联到坐标轴

V2+

MMSW0005

读取调制解调器配置内存转储

V3+

MMSW0005

写入调制解调器配置内存转储

V3+

MMSW0005

从调制解调器获取空气温度设置

V3+

无

在调制解调器中设置空气温度

V3+

无

设备软件复位

V3+

无

获取信标实时播放器设置

V6+

无

设置信标实时播放器参数

V6+

MMSW0005

获取地理配准设置

V6+

无

设置地理配准参数

V6+

MMSW0005

获取位置更新模式

V6+

无

设置位置更新模式

V6+

MMSW0005

更新位置的命令

V6+

MMSW0005

设置信标的电子围栏报警状态

V9+

MMSW0005

MMSW0006

发送通用用户负载数据

V9+

MMSW0005

获取通用用户负载数据

V9+

MMSW0005

发送手动测距命令

V9+

MMSW0011

从调制解调器获取流数据

V9+

无

检查设备类型是否为调制解调器

V1+

无

检查设备类型是否为固定信标

V1+

无

检查设备类型是否为移动信标(hedgehog)

V1+

无

获取Marvelmind API库版本

读取API库版本。用于确认该版本的库中提供所需函数。

函数名: mm_api_version

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设备。

函数名: mm_open_port

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的设置一致(见下方截图)。

接口与协议,Marvelmind API:插图1

关闭串口

关闭端口(如果此前已通过 mm_open_port 函数打开)。

函数名: mm_close_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设备列表。该列表包括通过无线电连接到调制解调器网络的所有设备,包括休眠设备。

函数名: mm_get_devices_list

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 – 待定

唤醒设备

向指定设备发送唤醒命令。如果唤醒命令已发送且该设备存在,设备将在几秒钟内连接到调制解调器,并出现在 设备列表.

函数名: mm_wake_device

C语言声明:bool mm_wake_device (uint8_t address);

适用的API版本:V1+

所需许可:无

返回值:

类型

说明

bool

true – 函数执行成功,唤醒命令已发送

false – 执行出错

参数:

类型

说明

uint8_t

1…254 – 要唤醒的Marvelmind设备地址

0 – 唤醒所有设备

使设备休眠

使现有设备进入休眠。

函数名: mm_send_to_sleep_device

C语言声明:bool mm_send_to_sleep_device (uint8_t address);

适用的API版本:V1+

所需许可:无

返回值:

类型

说明

bool

true – 函数执行成功,休眠命令已发送

false – 执行出错

参数:

类型

说明

uint8_t

1…254 – 要休眠的Marvelmind设备地址

0 – 使所有设备休眠

获取信标遥测数据

读取Marvelmind信标的遥测数据。

函数名: mm_get_beacon_telemetry

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)

获取最新位置数据

从调制解调器读取最新更新的坐标包。如有用户负载数据,也一并读取。

函数名: mm_get_last_locations

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

信标间距离,毫米

获取最新原始距离数据

从调制解调器读取最新更新的原始距离数据包。

函数名: mm_get_last_distances

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。

添加子地图

添加新的子地图。

函数名: mm_add_submap

C语言声明:bool mm_add_submap (uint8_t submapId);

适用的API版本:V1+

所需许可: MMSW0005

返回值:

类型

说明

bool

true – 函数执行成功,子地图已添加

false – 执行出错

参数:

类型

说明

uint8_t

要添加的子地图ID(0…254)

删除子地图

删除已有子地图。

函数名: mm_delete_submap

C语言声明:bool mm_delete_submap (uint8_t submapId);

适用的API版本:V1+

所需许可: MMSW0005

返回值:

类型

说明

bool

true – 函数执行成功,子地图已删除

false – 执行出错

参数:

类型

说明

uint8_t

要删除的子地图ID(0…254)

冻结子地图

冻结子地图。

函数名: mm_freeze_submap

C语言声明:bool mm_freeze_submap (uint8_t submapId);

适用的API版本:V1+

所需许可: MMSW0005

返回值:

类型

说明

bool

true – 函数执行成功,子地图已冻结

false – 执行出错

参数:

类型

说明

uint8_t

要冻结的子地图ID(0…254)

解冻子地图

解冻子地图。

函数名: mm_unfreeze_submap

C语言声明:bool mm_unfreeze_submap (uint8_t submapId);

适用的API版本:V1+

所需许可: MMSW0005

返回值:

类型

说明

bool

true – 函数执行成功,子地图已解冻

false – 执行出错

参数:

类型

说明

uint8_t

要解冻的子地图ID(0…254)

获取子地图设置

从调制解调器读取子地图设置。

函数名: mm_get_submap_settings

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,厘米

设置子地图参数

向调制解调器写入子地图设置。

函数名: mm_set_submap_settings

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复位到初始状态,并将所有已连接的信标移出网络。

函数名: mm_erase_map

C语言声明:bool mm_erase_map ();

适用的API版本:V1+

所需许可: MMSW0005

返回值:

类型

说明

bool

true – 函数执行成功,地图已擦除

false – 执行出错

参数:无

将设备恢复为默认设置

将设备恢复为默认设置(无线电、超声波等)。

函数名: mm_set_default_settings

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+

所需许可: MMSW0005, MMSW0006

返回值:

类型

说明

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字节

流记录数据

检查设备类型是否为调制解调器

检查指定的设备类型是否对应调制解调器。

函数名: mm_device_is_modem

C语言声明:bool mm_device_is_modem (uint8_t deviceType);

适用的API版本:V1+

所需许可:无

返回值:

类型

说明

bool

true – 指定的设备类型对应调制解调器

参数:

类型

说明

uint8_t

设备类型 (待检查)

检查设备类型是否为固定信标

检查指定的设备类型是否对应固定信标。

函数名: mm_device_is_beacon

C语言声明:bool mm_device_is_beacon (uint8_t deviceType);

适用的API版本:V1+

所需许可:无

返回值:

类型

说明

bool

true – 指定的设备类型对应固定信标

参数:

类型

说明

uint8_t

设备类型 (待检查)

检查设备类型是否为移动信标(hedgehog)

检查指定的设备类型是否对应移动信标(hedgehog)。

函数名: mm_device_is_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

供其他模块使用的若干辅助函数。

示例工作流程:

  1. 尝试 打开 串口,直至成功
  2. 端口打开后,程序读取通过USB连接的设备版本。如果是调制解调器,程序继续执行后续步骤
  3. 连接到调制解调器后,程序读取 设备列表 ,频率为1 Hz。将设备列表与marvelmind_devices.c模块中当前存储的列表进行比较,如发现变化则更新marvelmind_devices.c中的列表。所有变化都会打印到控制台
  4. 连接到调制解调器后,程序读取 最新位置数据 ,频率为20 Hz。如果设置了新原始距离数据标志,程序将读取 最新原始距离。程序将位置和距离与marvelmind_devices.c中设备列表的数据进行比较,如有变化则更新。所有变化的数据都会打印到控制台
  5. 如果程序连续10次无法获取最新位置数据,将 关闭端口 并返回第1步——重新尝试打开端口。当调制解调器从USB断开后又重新连接时,需要重新打开端口
  6. 如果用户按下“空格”键,程序将显示“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

设备类型ID可通过 设备列表 和 读取设备版本 命令获取。

与用户设备之间收发用户数据

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

附录1. CRC-16计算

校验和采用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;

}

附录2. 调制解调器错误应答格式

错误帧格式(调制解调器发往主机)

偏移量

大小(字节)

类型

说明

值

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 – 远端设备应答超时

返回顶部