接收下发命令
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设备同步命令下 发。