物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。
物模型描述产品是什么,能做什么,可以对外提供哪些服务
物模型以 JSON 格式表述, 称之为TSL(即 Thing Specification Language)。 在产品的功能定义页面,单击查看物模型即可查看JSON格式的TSL:
此时有两种方式在物联网平台中使用TSL:
- 静态集成:指将TSL直接写到代码中,这时需要上图中选择导出物模型,将设备的TSL(JSON格式)导出到文件,并手动集成到代码中
- 动态拉取:指在物联网平台运行时去云端拉取TSL
TSL静态集成
如上所述,将设备的TSL(JSON格式)导出到文件后(默认文件名为model.json),由于C语言需要将字符串中的双引号"
进行转义,所以需要将导出的TSL文件进行转义
在网上有很多这样的转义工具,物联网平台中也自带了一个可以转义JSON的小工具
当SDK编译完成后,使用iotx-sdk-c/output/release/bin
目录下的linkkit_tsl_convert
可以完成该转义任务。 使用方法如下:
$./linkkit_tsl_convert -i model.json
上述命令执行完成后,会在调用命令的当前目录生成一个conv.txt
文件,里面就是转义后的JSON字符串。目前仅高级版单品支持静态集成TSL,集成方法如下:
高级版单品使用TSL静态集成
默认情况下,物联网平台编译单品版本的例子程序,源代码位于 iotx-sdk-c/examples/linkkit
目录下的 linkkit_example_solo.c
同目录下的 example_tsl_solo.data
为存放静态集成TSL的文件
将刚才 conv.txt
中的内容复制,替换 example_tsl_solo.data
文件中的 TSL_STRING
变量, 重新编译即可
不要忘了将 linkkit_example_solo.c
中的设备证书(ProductKey、DeviceName、DeviceSecret)替换成该TSL对应产品下设备的设备证书(ProductKey、DeviceName、DeviceSecret)
TSL动态拉取
如果使用动态拉取TSL,就不用去替换代码中的静态TSL
需要注意的是,使用动态拉取TSL时,在TSL占用空间较大(TSL定义的服务/属性/事件越多,TSL越大)的情况下,有可能需要更改物联网平台默认的MQTT接收buffer长度
可以按如下两种方法进行配置更改:
- 修改平台配置文件,在当前使用平台的config.xxx.xxx文件(位于iotx-sdk-c/src/board目录下)中, 修改
CONFIG_ENV_CFLAGS
中的CONFIG_MQTT_RX_MAXLEN
编译选项
以ubuntu为例,如下图所示:
- 在代码中修改默认值, 在
iotx-sdk-c/include/imports/iot_import_config.h
文件中修改CONFIG_MQTT_RX_MAXLEN
即可,如下图所示:
注意:在Makefile中设置的 CONFIG_MQTT_RX_MAXLEN
值会覆盖掉 iot_import_config.h
中设置的值
高级版单品使用TSL动态拉取
默认情况下,在高级版单品的example(源代码位于 iotx-sdk-c/examples/linkkit
目录下的 deprecated/solo.c
)中,使用的是TSL静态集成
若要使用TSL动态拉取,只需要将 linkkit_start
的第二个入参 get_tsl_from_cloud
设为1
即可
高级版网关使用TSL动态拉取
默认情况下,在高级版网关的example(源代码位于 iotx-sdk-c/examples/linkkit
目录下的 deprecated/gateway.c
)中,使用的总是TSL动态拉取