本文档介绍如何使用MQTT-SDK接入本平台,可以快速验证设备接入,数据上传和命令等相关功能。
如下是SDK目录结构,主要分为PahoMQTTSDK、 OneNETMqttClient、Sample3个大块,通过Cmake工具编译代码,最终生成可执行文件。
PahoMQTTSDK为精简和移植Paho MQTT的官方开源库paho.mqtt.embedded-c ,保留了其不同驱动以及对应的示例代码,方便客户移植, 其github地址为:https://github.com/eclipse/paho.mqtt.embedded-c , 官网地址为:https://www.eclipse.org/paho/downloads.php
OneNETMqttClient为平台的应用SDK,基于PahoMQTTSDK实现设备与平台的连接,数据上报,命令接收以及回复等业务处理。
Sample为各种案例,皆基于linux操作系统,pahoapp基于PahoMQTTSDK原案例简单改造,实现平台部分功能。onenestandardapp为OneNETMqttClient标准设备完整案例,实现平台所有功能。onenecustomizedapp为OneNETMqttClient透传设备代码框架,需要用户自己实现MQTT Payload数据组包以及命令处理函数。
SDK下载:OneNET-MQTT-SDK
1.登录边缘管理平台。
2.创建产品。
i.左侧导航栏选择通用边缘设备管理>产品,根据提示创建好产品。
ii.查看产品详情,获取产品ID。
iii.产品详情>功能定义>添加自定义功能,定义物模型。
3.创建设备
i.产品详情>设备列表>新增设备,创建好设备。
ii.查看设备详情,获取设备ID和设备密钥。
本案例只介绍标准MQTT设备接入,自定义设备接入方法请自行阅读代码示例,接入协议详情见 协议规范
1、 打开项目工程OneNETMqttClient目录下面OneNETMqttClient.h文件。
如下图所示,设置好设备模式MODEL:standard,接入机地址:实际接入服务器地址,设备ID、产品ID、设备密钥(Device Secret)由创建产品设备后其详情获得,见上述产品设备创建流程,分别作为MQTT设备的ClientID、Username、Password,BUFFER_SIZE、TIME_OUT、MQTTQOS根据实际硬件配置、业务、网络环境等自行配置。
此处,用户还可以重新定义ONENETLOG(format,...)自定义自己的打印函数以及打印开关。
/*-----------------------------------用户配置区上分界线-------------------------------*/
#define MODEL "standard"
//#define USE_TLS
#ifdef USE_TLS
//#define USE_X509_AUTH
#endif
#define ServerHost "10.12.6.24" //mqtt接入机IP
#define ServerPort 1883 //mqtt接入机端口
#define DEVICE_ID "10016960"
#define PRODUCT_ID "102668"
#define DEVICESECRET "ZjUzNTE1MDU5YmY4YWVlNDk1ZTU="
#define BUFFER_SIZE 2048 //读写缓存大小
#define TIME_OUT 100 //读写超时时间
#define MQTTQOS QOS0 //MQTT QOS,目前只支持QOS0和QOS1
#define INTEGER_NAME "integer"
#define STRING_NAME "str_test"
#define FLOAT_NAME "float_1"
/* 日志打印,用户可自定义日志输出 */
#define __ONENETLOG__ //调试总开关
#ifdef __ONENETLOG__
#define filename(x) strrchr(x,'/')?strrchr(x,'/')+1:x
#define ONENETLOG(format,...) printf("******File: %s, Line: %05d******: "format"",filename(__FILE__), __LINE__, ##__VA_ARGS__)
#else
#define ONENETLOG(format,...)
#endif
/*-----------------------------------用户配置区下分界线-------------------------------*/
备注:SDK默认用开启TLS连接。需要您根据自己使用情况更新上述相关字段。
TLS的选择开关在\PahoMQTTSDK\Driver\linux\linux.c 27l #define USE_TLS
2、打开Sample目录下onenestandardapp.c.
include OneNETMqttClient.h头文件,定义全局唯一设备变量和缓存大小,以及接收数据处理进程。
#include "../OneNETMqttClient/OneNETMqttClient.h"
#include <pthread.h>
OneNetMqttDevice dev; //定义设备
char mqttpayload[2048]; //payload缓存大小
pthread_t mqtt_RecvData_id; //接收数据处理进程
定义数据以及数据初始函数,数据流名称和格式需和平台产品功能定义属性名保持一致对应。
int number = 1;
char strdata[200] ="test";
DataStream testdata[2];
//标准类型数据初始化
void DataInit(){
testdata[0].dataPoint=&number;
testdata[0].name="number";
testdata[0].dataType=TYPE_INT;
testdata[0].flag=true;
testdata[1].dataPoint=strdata;
testdata[1].name="str_test";
testdata[1].dataType=TYPE_STRING;
testdata[1].flag=true;
}
DataStream数据结构说明
typedef struct
{
char *name; //数据流名称,和平台产品功能定义中属性名对应
void *dataPoint; //数据
DATA_TYPE dataType; //数据类型
int datalen; //二进制数据有效,string可用可不用。
_Bool flag; //上报使能,false数据被过滤不上报。
} DataStream;
3、主函数流程
如下是函数的主流程,实现了设备数据定时上报,命令接收处理以及回复等功能。其中,多线程时需单开线程调用OneNETMQTTReceiveDataMultiThread()函数接收处理平台数据,单线程需循环调用OneNETMQTTReceiveDataSingleThread()函数接收处理平台数据。
void main(void){
int rc = 0;
//初始化设备
OneNETMQTTDeviceInit(&dev);
//连接平台
if(!OneNETMQTTConnect()) goto exit;
#ifdef USE_X509_AUTH
extern OneNetMqttDevice* mqttdev;
is_auth_X509_ok = 0;
setCstringData(&mqttdev->topic.cmd_dev_x509_auth, "auth/identity/response");
MQTTSetMessageHandler(&mqttdev->client, mqttdev->topic.cmd_dev_x509_auth, OneNETStandardAuthCmdHandler);
pthread_create(&mqtt_auth_RecvData_id, NULL, OneNETMQTTReceiveX509DeviceDataMultiThread, NULL);
while(is_auth_X509_ok == 0)
{
printf("waiting for did pid\r\n");
sleep(1);
}
pthread_join(mqtt_auth_RecvData_id,NULL);
setUserTopicName(&mqttdev->topic,MODEL,mqttdev->devInfo.device_id,mqttdev->devInfo.product_id);
#endif
//订阅平台命令
if (!OneNETMQTTSubscribeSetTopic(OneNETStandardCmdHandler_V5)) goto exit;
if (!OneNETMQTTSubscribeGetTopic(OneNETStandardCmdHandler_V5)) goto exit;
if (!OneNETMQTTSubscribePostReplyTopic(OneNETStandardCmdHandler_V5)) goto exit;
//创建线程,定时循环接受数据
pthread_create(&mqtt_RecvData_id, NULL, OneNETMQTTReceiveDataMultiThread, NULL);
DataInit();
//UpdateShadowFirstTime();
while(1)
{
int lenth = 0;
number++;
sleep(10);
lenth = OneNETMQTTStandardDataPacket_V5(mqttpayload, sizeof(mqttpayload));
#ifdef MQTT_TASK
pthread_mutex_lock(&dev.client.mutex);
#endif
if(!OneNETMQTTPublishData(mqttpayload, lenth)) goto exit;
#if defined(MQTT_TASK)
pthread_mutex_unlock(&dev.client.mutex);
#endif
}
exit:
//断开设备连接和网络
MQTTDisconnect(&dev.client);
NetworkDisconnect(&dev.network);
}
4.编译执行
linux系统下,需要客户安装cmake 、make 、gcc等c编译工具,camke版本为3及其以上。
项目根目录下依次执行如下命令:
a. mkdir build -------创建编译目录
b. cd build/ -------进入编译目录
c. cmake .. -------生成makefile文件
d. make -------生成可执行文件
e. cd Sample/ -------进入执行文件所在目录
f. ./onenestandardapp -------执行编译生成的可执行文件
如下图所示,可以看到设备正常连接到平台,并定时上报数据,设备正常运行。
1、设备上线
2、上报数据查看
平台设备详情>资源列表,点击对应属性,下拉查看上传数据。
number数据
str_test数据
3、命令下发
i.平台下发写命令
ii.平台下发读命令以及返回结果
可以看到读取值为刚才设置值。
iii.设备运行日志
可以看到写成功后,设备数据被改变,成功上报新数据,返回读命令结果。