• 沒有找到結果。

接收下发命令

4.3.6 C Demo 使用说明

tar -zxvf openssl-1.1.1d.tar.gz

b. 配置生成makefile文件。

执行以下命令进入openssl源码目录

cd openssl-1.1.1d

运行如下配置命令:

./config shared --prefix=/home/test/openssl --openssldir=/home/test/openssl/ssl

其中“prefix”是安装目录,“openssldir”是配置文件目录,“shared”作 用是生成动态链接库(即.so库) 。

如果编译有问题,配置命令加上no-asm(表示不使用汇编代码)

./config no-asm shared --prefix=/home/test/openssl --openssldir=/home/

test/openssl/ssl

注:有的编译工具是32位的,如果在64位的linux机器上使用,这时只要将 Makefile中的-m64都删除,再进行编译即可。

● 编译paho库文件

a. 访问github下载地址:https://github.com/eclipse/paho.mqtt.c,下载 paho.mqtt.c源码。

b. 解压后上传到linux编译机。

c. 修改makefile

i. 通过如下命令进行编辑Makefile

vim Makefile

ii. 显示行数

:set nu

iii. 在129行之后添加下面两行(自定义的openssl的头文件和库文件)

CFLAGS += -I/home/test/openssl/include LDFLAGS += -L/home/test/openssl/lib -lrt

ii. 执行编译命令

make

e. 编译完成后,可以在build/output目录下看到编译成功的库。

f. 拷贝paho库文件。

当前SDK仅用到了libpaho-mqtt3as,请将“libpaho-mqtt3as.so”和

“libpaho-mqtt3as.so.1”文件拷贝到demo的lib文件夹下。(同时回到paho 源代码路径,进入src目录,将MQTTAsync.h、MQTTClient.h、

MQTTClientPersistence.h、MQTTProperties.h、MQTTReasonCodes.h、

MQTTSubscribeOpts.h拷贝到demo的include/base文件夹下)。

导入代码样例

步骤1 下载quickStart(C)样例。

步骤2 将代码拷贝到linux运行环境中。可以看到代码文件层级如下图。

设备接入

开发指南 4 设备侧开发

代码目录简述:

src:源码目录

mqtt_c_demo:demo核心源码;

util/string_util.c:工具资源文件;

conf:证书目录

rootcert.pem:设备校验平台身份的证书,用于设备侧接入物联网平台登录鉴权 使用;

include: 头文件目录

base目录:存放依赖的paho头文件 openssl目录:存放依赖的openssl头文件 util目录:存放依赖的工具资源头文件

lib:依赖库文件

libcrypto.so*/libssl.so*: openssl库文件 libpaho-mqtt3as.so*: paho库文件

Makefile:Makefile文件 ----结束

– 执行make进行编译。如果是32位的操作系统,请删除Makefile中的"-m64"。

– 执行export LD_LIBRARY_PATH=./lib/加载库文件。

– 运行./MQTT_Demo.o。

//connect

int ret = mqtt_connect();

if (ret != 0) {

printf("connect failed, result %d\n", ret);

}

3. 连接成功后,打印“connect success”,同时在控制台可看到设备已在线。

注:如果连接失败,在mqtt_connect_failure函数中已实现退避重连,代码样例 如下:

void mqtt_connect_failure(void *context, MQTTAsync_failureData *response) { retryTimes++;

printf("connect failed: messageId %d, code %d, message %s\n", response->token, response->code, response->message);

//退避重连

int lowBound = defaultBackoff * 0.8;

int highBound = defaultBackoff * 1.2;

int randomBackOff = rand() % (highBound - lowBound + 1);

long backOffWithJitter = (int)(pow(2.0, (double)retryTimes) - 1) * (randomBackOff + lowBound);

long waitTImeUntilNextRetry = (int)(minBackoff + backOffWithJitter) > maxBackoff ? (minBackoff + backOffWithJitter) : maxBackoff;

TimeSleep(waitTImeUntilNextRetry);

//connect

char *cmd_topic = combine_strings(3, "$oc/devices/", username, "/sys/commands/#");

ret = mqtt_subscribe(cmd_topic);

free(cmd_topic);

cmd_topic = NULL;

if (ret < 0) {

printf("subscribe topic error, result %d\n", ret);

}

订阅成功后,demo中会打印“subscribe success”字样。

设备接入

开发指南 4 设备侧开发

属性上报

属性上报是指设备主动向平台上报自己的属性,更多信息请参考设备属性上报。

//publish data

char *payload = "{\"services\":[{\"service_id\":\"parameter\",\"properties\":{\"Load\":\"123\",\"ImbA_strVal\":

\"456\"}}]}";

char *report_topic = combine_strings(3, "$oc/devices/", username, "/sys/properties/report");

ret = mqtt_publish(report_topic, payload);

free(report_topic);

report_topic = NULL;

if (ret < 0) {

printf("publish data error, result %d\n", ret);

}

设备上报属性成功后,demo中会打印“publish success”字样。

同时在设备详情页面查看到上报的属性:

说明

如果在“设备详情”页面没有最新上报数据,请修改产品模型中服务和属性的内容,确保设备上 报的服务/属性和产品模型中的服务/属性一致,或者进入“产品 > 模型定义”页面,删除所有服 务。

接收下发命令

订阅了命令Topic后,可以在控制台下发同步命令。详情请参考MQTT设备同步命令下 发。