全部产品
云市场

使用MQTT Topic与物联网平台通信

更新时间:2019-05-05 16:42:11

概述

本文讲解如何移植Link Kit SDK到Windows操作系统,在Windows下运行demo程序连接到阿里云物联网平台,本文的示例中将涉及以下功能点:

  • 使用MQTT连接阿里云物联网平台,连接使用TLS进行加密
  • 使用一机一密方式对设备进行认证
  • 如何使用MQTT TOPIC进行数据收发
  • 如何实现相关HAL

开发环境描述

操作系统版本 Win7
IDE Eclipse IDE for C/C++ Developers,版本: 2019-03 (4.11.0)
包管理工具 MSYS2
Toolchain mingw-w64-x86_64-toolchain
TLS库 openssl,版本1.1.1.b-1

注:若用户未安装Eclipse开发环境,可参考Eclipse开发环境安装了解如何安装Eclipse、MSYS2、MinGW来在Windows环境下编译C程序。

请确认开发环境中openssl已安装,在MSYS2的命令行工具中输入:

  1. pacman -Sl |grep openssl

确保输出的内容中,如下图框选的openssl库显示“已安装”:

前置文档

在开始实际开发之前请务必阅读以下文档:

示例产品功能描述

示例产品连接到阿里云物联网平台之后,将会订阅TOPIC “/${ProductKey}/${deviceName}/user/get”的数据,然后每4秒发送一个消息到该topic,意味着这个消息会被发送到物联网平台,然后由于设备自己订阅了这个topic,因此设备发送到物联网平台的消息将会被平台发送给设备:

因此从设备的角度来看,示例产品的功能就是将消息发送到物联网平台,并将其接收回来。

云端操作

  • 创建以太网产品

可参见操作示例了解如何创建产品,并获取产品的ProductKey

  • 创建调试设备

可参见操作示例了解如何创建调试设备,并获取设备的DeviceName、DeviceSecret

  • 修改topic属性


示例代码中使用到的Topic “/${ProductKey}/${deviceName}/user/get”默认只有“订阅权限”,需要将其修改为“发布和订阅”,因为设备将会发送消息到这个topic。修改后的显示如下所示:

注:用户创建的产品用于ProductKey将会与示例不同,因此上图中Topic中的“a1a840P0BS3”将会显示用户创建产品的ProductKey

设备端开发过程

SDK获取

点击此处获取Link Kit SDK代码。

注:本文基于SDK3.0.1进行编写,为了避免代码存在差异,建议用户使用同样的版本进行体验

SDK配置

因为不同的SDK功能依赖的HAL不一样,为了减少设备开发时对接HAL的数量,开发者只需要选中需要支持的功能即可。

运行SDK根目录下的config.bat,进行SDK功能配置:

请确保以下选项被选中,如上图所示:

  • PLATFORM_HAS_STDINT
  • PLATFORM_HAS_DYNMEM
  • PLATFORM_HAS_OS
  • FEATURE_MQTT_COMM_ENABLED
    • FEATURE_MQTT_DEFAULT_IMPL
    • FEATURE_MQTT_DIRECT
  • FEATURE_SUPPORT_TLS

配置完成后点击按钮“Exit”,配置工具会提示是否保存配置,选择“”即可。

SDK代码抽取

运行SDK根目录下的“extract.bat”,如下图所示:

该工具将被配置的SDK的功能模块涉及的代码抽取到output目录下面

Eclipse工程创建与配置

在Eclipse IDE中创建一个Eclipse C工程:

点击Next按钮后,对工程进行命名,设置Toolchains,如下图所示:

点击按钮“Finish”完成工程创建后,右键单击工程显示如下所示的菜单:

点击“Import”后跳出下面的“Import”窗口:

选择“File System”后,点击按钮“Next”,然后Eclipse将会提示输入需要导入的路径,请将上一节中生成的output目录进行导入,如下图所示:

其中“mqtt_example.c”是SDK中提供的示例代码,在本文中将其加入进行验证使用。

点击按钮“Finish”之后,Eclipse将会把output下面的相关代码复制到Eclipse的workspace中,如下图所示:

在工程上右键单击显示菜单,并点击“Properties”按钮:

点击“Properties”按钮之后,将会显示Properties窗口,选择“C/C++ Build”->“Settings”,并在其中将相关头文件的查找目录加入进去,如下图所示:

将相关路径加入之后,再选择“MinGW C Linke”->“Libraries”,将wsock32和ssl加入,如下图所示:

然后点击窗口下方的“Apply and Close”结束配置Eclipse的工程配置。

HAL实现

wrapper.c里面包含SDK运行时需要目标平台进行支持的HAL函数,这些函数抽取出来之后函数体并没有进行实现,需要开发者进行实现:

这里是该wrapper.c的参考实现,开发者可以下载后将内容复制到该文件中进行使用。

注意,用户需要将wrapper.c中下面的HAL函数中的内容替换为自己创建的产品和设备的信息:

  • HAL_GetProductKey
  • HAL_GetDeviceName
  • HAL_GetDeviceSecret

编译与调试

设备端

右键单击工程显示菜单,并点击其中的“Build Project”,如下图所示:

如果一切正常,编译完成之后在Eclipse的console中会显示编译结束,如下图所示:

然后在Eclipse之中将项目以“Local C/C++ Application”运行,下面是正确运行时的console中的显示:

其中:“mqtt Connect Success”表示MQTT连接云端成功,设备认证已通过。

mqtt_example.c会订阅topic“/${ProductKey}/${deviceName}/user/get”,并把消息发送给这个topic,因此设备将会把自己发送给物联网平台的消息接收回来,在“Console”中的显示如下图所示:

上图中圈选的“PUBLISH”是设备发送给物联网平台的消息,圈选的“Payload:{“nessage”:”hello!”}”是设备从物联网平台接收到的消息

物联网平台端

开发者也可以在物联网平台端查看设备的状态,当设备连接到物联网平台时,设备的状态将会显示为“在线”,如下图所示:

开发者也可以点击“日志服务”查看设备向物联网平台上报的消息、以及物联网平台发送给设备的消息,如下图所示:

文档参考

当设备可以连接到物联网平台之后,用户会进行自己的产品逻辑的编写,请参考下面的章节了解更多细节: