SDK参考
C SDK
快速接入
环境要求
操作系统:linux
交叉编译工具:gcc-5.40及以上
C SDK目录结构
| - certs(私钥,设备证书和根CA)
| - external_libs(外部库 - jsmn,mbedTLS)
| - include(IoT设备SDK的头文件)
| - src(IoT设备SDK的源文件)
| - platform(平台特定文件)
| - samples(包含用于在mbedTLS上构建的makefile的样本)
C SDK文件夹及其内容的说明
certs:该目录最初是空的,需要包含私钥,客户端证书和根CA.客户端证书和私钥可以从IoT控制台下载。
external_libs:mbedTLS和jsmn源文件。jsmn源文件始终存在。只有在下载SDK的tarball版本时才会包含mbedTLS源文件。
include :该目录包含使用SDK的应用程序需要包含的头文件。
src :该目录包含SDK源代码,包括MQTT库,设备影子代码和实用程序。
platform:定时器,TLS和线程层的平台特定文件。包含使用mbedTLS和pthread的Linux的参考实现。
samples:该目录包含示例应用程序以及它们的makefile。这些示例包括发布和订阅IoT服务的简单MQTT示例以及显示设备影子功能示例用法的设备影子示例。
C SDK参数配置
- 设置MQTT地址和端口,修改iot_config.h头文件
#define IOT_PROJECT_HOST "100.100.100.100"
#define IOT_PROJECT_PORT 30001
- 设置证书名称
#define IOT_ROOT_CA_FILENAME "IoTRootCA.crt"
#define IOT_CERTIFICATE_FILENAME "principal-hncnocro.crt"
#define IOT_PRIVATE_KEY_FILENAME "principal-hncnocro.key"
- 设置设备类型:网关:gateway 设备:device
#define IOT_DEVICE_TYPE "device"
- 设置项目ID
#define IOT_PROJECT_CODE "iotsbyjkiau"
- 设置产品ID
#define IOT_PRODUCT_CODE "hncnocro"
- 设置设备名称
#define IOT_DEVICE_CODE "devicetest"
- 设置证书路径,修改shadow_console_echo.c头文件
char certDirectory[PATH_MAX + 1] = "../../../certs";
编译运行
- 编译生成可执行文件shadow_console_echo
cd ./sdk_c/samples/linux/shadow_sample_console_echo
make clean
make
- 运行示例
./shadow_console_echo
C API接口
日志接口
序号 | 函数名 | 说明 |
---|---|---|
1 | IOT_ERROR | 打印ERROR级别日志 |
2 | IOT_WARN | 打印WARNING级别日志 |
3 | IOT_DEBUG | 打印DEBUG级别日志 |
4 | IOT_INFO | 打印INFO级别日志 |
MQTT接口
序号 | 函数名 | 说明 |
---|---|---|
1 | iot_mqtt_set_connect_params | 设置MQTT连接参数 |
2 | iot_mqtt_is_client_connected | 判断MQTT客户端连接状态 |
3 | iot_mqtt_get_client_state | 获取客户端状态 |
4 | iot_mqtt_init | 初始化MQTT客户端 |
5 | iot_mqtt_connect | MQTT客户端连接 |
6 | iot_mqtt_publish | 发布 MQTT 消息 |
7 | iot_mqtt_subscribe | 订阅 MQTT消息 |
8 | iot_mqtt_unsubscribe | 取消订阅已订阅的 MQTT 主题 |
9 | iot_mqtt_disconnect | 断开 MQTT连接 |
10 | iot_mqtt_yield | 在当前线程为底层 MQTT 客户端让出一定 CPU 执行时间 |
设备接口
序号 | 函数名 | 说明 |
---|---|---|
1 | iot_shadow_topoGet | 获取拓扑结构 |
2 | iot_shadow_dsltemplateGet | 获取dsl物模型 |
通用接口
序号 | 函数名 | 说明 |
---|---|---|
1 | iot_custom_subscribe_control | 注册control接口 |
2 | iot_custom_event | 用户自定义消息发布 |
C SDK代码详解
设备连接
设备初始化:用于设备初始化相关参数,包括目标IP、端口和证书信息等。
参数:
pclient:mqtt client结构体变量指针
pParams:初始参数结构体变量指针
返回值:
IoT_Error_t:枚举类型,返回操作结果
注:pParams结构体成员变量包括:
pHost:mqtt地址
port:mqtt端口号
pRootCA:根证书
pClientCRT:crt证书
pClientKey:key证书
enableAutoReconnect:自动重连
disconnectHandler:连接中断回调函数
IoT_Error_t iot_shadow_init(IoT_Client *pClient, ShadowInitParameters_t *pParams) {
IoT_Client_Init_Params mqttInitParams;
IoT_Error_t rc;
FUNC_ENTRY;
if(NULL == pClient || NULL == pParams) {
FUNC_EXIT_RC(NULL_VALUE_ERROR);
}
mqttInitParams.enableAutoReconnect = pParams->enableAutoReconnect;
mqttInitParams.pHostURL = pParams->pHost;
mqttInitParams.port = pParams->port;
mqttInitParams.pRootCALocation = pParams->pRootCA;
mqttInitParams.pDeviceCertLocation = pParams->pClientCRT;
mqttInitParams.pDevicePrivateKeyLocation = pParams->pClientKey;
mqttInitParams.mqttPacketTimeout_ms = 5000;
mqttInitParams.mqttCommandTimeout_ms = 20000;
mqttInitParams.tlsHandshakeTimeout_ms = 5000;
mqttInitParams.isSSLHostnameVerify = true;
mqttInitParams.disconnectHandler = pParams->disconnectHandler;
rc = iot_mqtt_init(pClient, &mqttInitParams);
if(SUCCESS != rc) {
FUNC_EXIT_RC(rc);
}
resetClientTokenSequenceNum();
iot_shadow_reset_last_received_version();
initDeltaTokens();
FUNC_EXIT_RC(SUCCESS);
}
设备连接:配置client ID,进行mqtt连接。
参数:
pclient:mqtt client结构体变量指针
pParams:连接参数结构体变量指针
返回值:
IoT_Error_t:枚举类型,返回操作结果
IoT_Error_t iot_shadow_connect(IoT_Client *pClient, ShadowConnectParameters_t *pParams) {
IoT_Error_t rc = SUCCESS;
uint16_t deleteAcceptedTopicLen;
IoT_Client_Connect_Params ConnectParams = iotClientConnectParamsDefault;
FUNC_ENTRY;
if(NULL == pClient || NULL == pParams || NULL == pParams->pMqttClientId) {
FUNC_EXIT_RC(NULL_VALUE_ERROR);
}
snprintf(myThingName, MAX_SIZE_OF_THING_NAME, "%s", pParams->pMyThingName);
snprintf(mqttClientID, MAX_SIZE_OF_UNIQUE_CLIENT_ID_BYTES, "%s", pParams->pMqttClientId);
ConnectParams.isWillMsgPresent = false;
ConnectParams.pClientID = pParams->pMqttClientId;
ConnectParams.clientIDLen = pParams->mqttClientIdLen;
rc = iot_mqtt_connect(pClient, &ConnectParams);
if(SUCCESS != rc) {
FUNC_EXIT_RC(rc);
}
IOT_INFO("iot_mqtt_connect finish");
initializeRecords(pClient);
if(NULL != pParams->deleteActionHandler) {
snprintf(deleteAcceptedTopic, MAX_SHADOW_TOPIC_LENGTH_BYTES, "iot/things/%s/shadow/delete/accepted", myThingName);
deleteAcceptedTopicLen = (uint16_t) strlen(deleteAcceptedTopic);
rc = iot_mqtt_subscribe(pClient, deleteAcceptedTopic, deleteAcceptedTopicLen, QOS1,pParams->deleteActionHandler, (void *) myThingName);}
FUNC_EXIT_RC(rc);
}
发布订阅
mqtt订阅主题:用户可自行调用该函数订阅自定义主题。
参数:
pclient:mqtt client结构体变量指针
pTopicName:订阅的主题指针
topicNameLen:订阅主题长度变量
pApplicationHandler:回调函数指针
返回值:
IoT_Error_t:枚举类型,返回操作结果
IoT_Error_t iot_mqtt_subscribe(IoT_Client *pClient, const char *pTopicName, uint16_t topicNameLen, QoS qos, pApplicationHandler_t pApplicationHandler, void *pApplicationHandlerData) {
ClientState clientState;
IoT_Error_t rc, subRc;
FUNC_ENTRY;
if(NULL == pClient || NULL == pTopicName || NULL == pApplicationHandler) {
FUNC_EXIT_RC(NULL_VALUE_ERROR);
}
if(!iot_mqtt_is_client_connected(pClient)) {
FUNC_EXIT_RC(NETWORK_DISCONNECTED_ERROR);
}
clientState = iot_mqtt_get_client_state(pClient);
if(CLIENT_STATE_CONNECTED_IDLE != clientState && CLIENT_STATE_CONNECTED_WAIT_FOR_CB_RETURN != clientState) {
FUNC_EXIT_RC(MQTT_CLIENT_NOT_IDLE_ERROR);
}
rc = iot_mqtt_set_client_state(pClient, clientState, CLIENT_STATE_CONNECTED_SUBSCRIBE_IN_PROGRESS);
if(SUCCESS != rc) {
FUNC_EXIT_RC(rc);
}
IOT_DEBUG("Sub Topic: %s", pTopicName);
subRc = _iot_mqtt_internal_subscribe(pClient, pTopicName, topicNameLen, qos, pApplicationHandler, pApplicationHandlerData);
rc = iot_mqtt_set_client_state(pClient, CLIENT_STATE_CONNECTED_SUBSCRIBE_IN_PROGRESS, clientState);
if(SUCCESS == subRc && SUCCESS != rc) {
subRc = rc;
}
FUNC_EXIT_RC(subRc);
}
mqtt发布主题:用户可自行调用该函数发布自定义主题。
参数:
pclient:mqtt client结构体变量指针
pTopicName:发布主题指针
topicNameLen:发布主题长度变量
pParams:发布消息结构体指针
返回值:
IoT_Error_t:枚举类型,返回操作结果
IoT_Error_t iot_mqtt_publish(IoT_Client *pClient, const char *pTopicName, uint16_t topicNameLen, IoT_Publish_Message_Params *pParams) {
IoT_Error_t rc, pubRc;
ClientState clientState;
FUNC_ENTRY;
if(NULL == pClient || NULL == pTopicName || 0 == topicNameLen || NULL == pParams){
FUNC_EXIT_RC(NULL_VALUE_ERROR);
}
if(!iot_mqtt_is_client_connected(pClient)) {
FUNC_EXIT_RC(NETWORK_DISCONNECTED_ERROR);
}
clientState = iot_mqtt_get_client_state(pClient);
if(CLIENT_STATE_CONNECTED_IDLE != clientState && CLIENT_STATE_CONNECTED_WAIT_FOR_CB_RETURN != clientState) {
FUNC_EXIT_RC(MQTT_CLIENT_NOT_IDLE_ERROR);
}
rc = iot_mqtt_set_client_state(pClient, clientState, CLIENT_STATE_CONNECTED_PUBLISH_IN_PROGRESS);
if(SUCCESS != rc) {
FUNC_EXIT_RC(rc);
}
pubRc = _iot_mqtt_internal_publish(pClient, pTopicName, topicNameLen, pParams);
rc = iot_mqtt_set_client_state(pClient, CLIENT_STATE_CONNECTED_PUBLISH_IN_PROGRESS, clientState);
if(SUCCESS == pubRc && SUCCESS != rc) {
pubRc = rc;
}
FUNC_EXIT_RC(pubRc);
}
拓扑关系
获取拓扑结构:由网关发起,用于获取该网关下绑定的子设备列表。
参数:
pclient:mqtt client结构体变量指针
callback:回调函数指针
返回值:
IoT_Error_t:枚举类型,返回操作结果
IoT_Error_t iot_shadow_topoGet(IoT_Client *pClient, void *callback){
IoT_Error_t rc = SUCCESS;
rc = iot_shadow_subscribe_topoReply(pClient, callback);
if (strcmp(IOT_DEVICE_TYPE, IOT_TYPE_GATEWAY) == 0){ //网关
int i;
char topoPubTopic[MAX_SHADOW_TOPIC_LENGTH_BYTES] = {0};
snprintf(topoPubTopic, sizeof(topoPubTopic), "iot/%s/%s/%s/thing/topo/get", IOT_PROJECT_CODE, IOT_PRODUCT_CODE, IOT_DEVICE_CODE);
IOT_INFO("publish topoGet topic: %s", topoPubTopic);
cJSON *json_topoGet = cJSON_CreateObject();
cJSON_AddNumberToObject(json_topoGet, "id", 1);
cJSON_AddStringToObject(json_topoGet, "version", "1.0");
cJSON_AddStringToObject(json_topoGet, "params", "");
cJSON_AddStringToObject(json_topoGet, "method", "");
rc = iot_shadow_publishToTopic(pClient, topoPubTopic, cJSON_Print(json_topoGet), QOS0);
if(SUCCESS != rc) {
IOT_ERROR("publish To topoGet Topic Error %d", rc);
}
IOT_DEBUG("topoGet payload: %s", cJSON_Print(json_topoGet));
cJSON_Delete(json_topoGet);
}
return rc;
}
物模型
获取物模型:用于获取设备模型数据。
参数:
pclient:mqtt client结构体变量指针
thingName:设备名称指针
callback:回调函数指针
返回值:
IoT_Error_t:枚举类型,返回操作结果
IoT_Error_t iot_shadow_dsltemplateGet(IoT_Client *pClient, char* thingName, void *clalback){
IoT_Error_t rc = SUCCESS;
int i;
char dsltemplatePubTopic[MAX_SHADOW_TOPIC_LENGTH_BYTES] = {0};
iot_shadow_subscribe_dsltemplateReply(pClient, thingName, clalback);
snprintf(dsltemplatePubTopic, sizeof(dsltemplatePubTopic), "iot/%s/%s/%s/thing/dsltemplate/get", IOT_PROJECT_CODE, IOT_PRODUCT_CODE, thingName);
IOT_INFO("publish dsltemplateGet topic: %s\n", dsltemplatePubTopic);
cJSON *json_dsltemplateGet = cJSON_CreateObject();
cJSON_AddNumberToObject(json_dsltemplateGet, "id", 1);
cJSON_AddStringToObject(json_dsltemplateGet, "version", "1.0");
cJSON_AddStringToObject(json_dsltemplateGet, "params", "");
cJSON_AddStringToObject(json_dsltemplateGet, "method", "thing.dsltemplate.get");
rc = iot_shadow_publishToTopic(pClient, dsltemplatePubTopic, cJSON_Print(json_dsltemplateGet), QOS0);
if(SUCCESS != rc) {
IOT_ERROR("publish To dsltemplateGet Topic Error %d", rc);
}
IOT_DEBUG("dsltemplateGet payload: %s", cJSON_Print(json_dsltemplateGet));
cJSON_Delete(json_dsltemplateGet);
return rc;
}
Java SDK
环境要求
操作系统:Windows或linux
JDK版本: JDK 1.8.0及以上
Java SDK目录结构
sdk文件路径位于:src\main\java\com\iot\client
| - constant (常量类)
| - core (核心基础类)
| - mqtt (MQTT相关类)
| - sample( 示例demo)
| - shadow(shadow相关类)
| - util (公用工具类)
Java SDK文件夹及其内容的说明
constant:该目录包含常量和错误码常量。
core:该目录包含iot异常定义、iot回调接口等文件。
mqtt:MQTT相关类,包含MQTT连接和监听等。
sample :示例dome,包括发布和订阅IoT服务的简单MQTT示例以及显示设备影子功能示例用法的设备影子示例等。
shadow :shadow相关类,包含shadow规范格式代码、设备命令的监听和管理等。
util:SDK中使用到的工具类
Java SDK参数配置
参数配置文件位于src\main\resources\com\iot\client\sample\sampleUtil目录下的iot-sdk-device.properties(设备)和iot-sdk-gateway.properties(网关)中
- 设置客户端接入点(即MQTT访问地址)
ProjectAddr=XXX
- 指定根CA证书路径
IoTRootCaCrt=XXX
- 指定客户端证书路径
IotClientDevCrt=XXX
- 指定客户端私钥
IotClientDevKey=XXX
- 设置项目名称
ProjectCode=XXX
- 设置产品名称
ProductCode=XXX
- 设置设备名称
DeviceCode=XXX
- 设置用户名
mqttUserName=XXX
- 设置密码
mqttPassword=XXX
Java API接口
Java API接口
- MQTT接口 - IotMqttClient
序号 | 函数名 | 说明 |
---|---|---|
1 | createClient | 创建MQTT客户端 |
2 | getIotEndpointCode | 获取EndpointCode |
3 | getIotModelCode | 获取ModelCode |
4 | getIotDeviceCode | 获取DeviceCode |
5 | setIotEndpointCode | 设置EndpointCode |
6 | setIotModelCode | 设置ModelCode |
7 | setIotDeviceCode | 设置DeviceCode |
8 | attach | 将影子设备附加到客户端 |
9 | connect | MQTT连接 |
10 | disconnect | 断开 MQTT连接 |
11 | subscribe | 订阅 MQTT 主题 |
12 | subscribe | subscribe(IotTopic) |
13 | publish | 发布 MQTT 消息 |
- 设备影子接口 - IotDevice
序号 | 函数名 | 说明 |
---|---|---|
1 | getReportInterval | 获取影子更新周期 |
2 | setReportInterval(long) | 设置影子更新周期 |
3 | get | 获取设备影子文档 |
4 | update | 更新设备影子文档 |
5 | delete | 删除设备影子文档 |
Java SDK运行示例
1.将Java SDK导入Java运行环境
2.编辑SDK参数配置文件
3.运行示例:
设备示例位于src\main\java\com\iot\client\sample\device\MyDeviceMain.java
网关示例位于src\main\java\com\iot\client\sample\device\MyGatewayMain.java
MQTT Client SDK
物接入与Paho(即MQTT Client SDK)完全兼容,如果开发者需要开发MQTT客户端,可到Paho官方网站下载SDK并获取帮助文档,详情如下:
Client | MQTT 3.1 | MQTT 3.1.1 | LWT | SSL/TLS | Automatic Reconnect | Offline Buffering | Message Persistence | WebSocket Support | Standard MQTT Support | Blocking API | Non-Blocking API | High Availability |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Java | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ |
Python | √ | √ | √ | √ | √ | √ | ╳ | √ | √ | √ | √ | ╳ |
JavaScript | √ | √ | √ | √ | √ | √ | √ | √ | ╳ | ╳ | √ | √ |
GoLang | √ | √ | √ | √ | √ | √ | √ | √ | √ | ╳ | √ | √ |
C | √ | √ | √ | √ | √ | √ | √ | ╳ | √ | √ | √ | √ |
.Net (C#) | √ | √ | √ | √ | ╳ | ╳ | ╳ | ╳ | √ | ╳ | √ | ╳ |
Android Service | √ | √ | √ | √ | √ | √ | √ | √ | √ | ╳ | √ | √ |
Embedded C/C++ | √ | √ | √ | √ | ╳ | ╳ | ╳ | ╳ | √ | √ | √ | ╳ |