物联网套件是阿里云专门为物联网领域的开发人员推出的, 其目的是帮助开发者搭建安全且性能强大的数据通道, 方便终端(如传感器, 执行器, 嵌入式设备或智能家电等等)和云端的双向通信.
本节描述如何申请自己的设备, 并结合本SDK快速体验该设备通过MQTT
+TLS/SSL
协议连接到阿里云, 上报和接收业务报文. 关于SDK的更多使用方式, 请访问官方WiKi
实现原理:
MQTT协议
(Message Queuing Telemetry Transport
, 消息队列遥测传输)是IBM开发的一个即时通讯协议, 是为大量计算能力有限, 且工作在低带宽, 不可靠的网络的远程传感器和控制设备通讯而设计的协议利用MQTT协议是一种基于二进制消息的发布/订阅编程模式的消息协议, 下面的应用程序先在阿里云IoT平台订阅(
Subscribe
)一个Topic
成功, 然后自己向该Topic
做发布(Publish
)动作 阿里云IoT平台收到之后, 就会原样推送回这个应用程序, 因为该程序之前已经通过订阅(Subscribe
)动作成为该Topic
的一个接收者, 发布到这个Topic
上的任何消息, 都会被推送到已订阅该Topic
的所有终端上
本SDK的编译环境是64位
的Ubuntu16.04
, 在其它Linux上尚未测试过, 所以推荐安装与阿里开发者一致的发行版
如果您使用Windows
操作系统, 建议安装虚拟机软件Virtualbox
, 下载地址: https://www.virtualbox.org/wiki/Downloads
然后安装64位的desktop版本Ubuntu 16.04.x LTS
, 下载地址: https://www.ubuntu.com/download/desktop
本SDK的开发编译环境使用如下软件: make-4.1
, git-2.7.4
, gcc-5.4.0
, gcov-5.4.0
, lcov-1.12
, bash-4.3.48
, tar-1.28
, mingw-5.3.1
可使用如下命令行安装必要的软件:
apt-get install -y build-essential make git gcc
访问阿里云登录页面, 点击免费注册, 免费获得一个阿里云账号. 若您已有账号, 可直接登录
登入之后, 鼠标悬停在产品上, 弹出层叠菜单
然后向下滚动页面, 点击物联网套件
或直接访问https://www.aliyun.com/product/iot, 之后点击立即开通, 或者管理控制台, 登入控制台主界面
点击页面右上角的创建产品按钮, 创建一个品类, 然后在左侧导航栏点击设备管理, 再到页面右侧点添加设备, 创建该品类下的一个设备, 如下图则得到创建成功后的设备标识三元组
productKey
: 标识产品的品类deviceName
: 标识品类下的具体设备deviceSecret
: 该设备的密钥, 需填写到SDK中, 用于连接阿里云服务器时完成认证
点击左侧导航栏的消息通信, 再到页面右侧点定义Topic类, 创建一个新的/${productKey}/${deviceName}/data
, 并设置为可订阅可发布权限
登录Linux, 运行如下命令从github克隆代码, 或者访问最新地址下载页面, 将下载到的压缩包在Linux上解压缩
$ git clone https://github.com/aliyun/iotkit-embedded
编辑文件sample/mqtt/mqtt-example.c
, 编辑如下代码段, 填入之前创建产品和设备步骤中得到的设备标识三元组:
运行如下命令:
$ make distclean
$ make
编译成功完成后, 生成的样例程序在当前目录的output/release/bin
目录下:
$ tree output/release
output/release
├── bin
│ ├── coap-example
│ ├── http-example
│ ├── mqtt-example
│ ├── mqtt_rrpc-example
│ ├── ota_mqtt-example
│ ├── sdk-testsuites
│ └── shadow-example
...
...
$ ./output/release/bin/mqtt-example
[inf] iotx_device_info_init(40): device_info created successfully!
[dbg] iotx_device_info_set(50): start to set device info!
[dbg] iotx_device_info_set(64): device_info set successfully!
[dbg] _calc_hmac_signature(57): | source: clientId2UCRZpAbCGC.ExampleDevdeviceNameExampleDevproductKey2UCRZpAbCGCtimestamp2524608000000 (93)
[dbg] _calc_hmac_signature(58): | secret: fbh47lGBSayncmTHEjF1E5x4CZdeJTO9 (32)
[dbg] _calc_hmac_signature(61): | method: hmacsha1
[dbg] _calc_hmac_signature(74): | signature: 326a4a6ed38b1bd5ddb6a5d11d27928bfb5a62d0 (40)
[dbg] guider_print_dev_guider_info(236): ....................................................
[dbg] guider_print_dev_guider_info(237): ProductKey : 2UCRZpAbCGC
[dbg] guider_print_dev_guider_info(238): DeviceName : ExampleDev
[dbg] guider_print_dev_guider_info(239): DeviceID : 2UCRZpAbCGC.ExampleDev
[dbg] guider_print_dev_guider_info(240): DeviceSecret : fbh47lGBSayncmTHEjF1E5x4CZdeJTO9
[dbg] guider_print_dev_guider_info(241): ....................................................
...
...
_demo_message_arrive|136 :: ----
_demo_message_arrive|140 :: Topic: '/2UCRZpAbCGC/ExampleDev/data' (Length: 28)
_demo_message_arrive|144 :: Payload: '{"attr_name":"temperature", "attr_value":"1"}' (Length: 45)
_demo_message_arrive|145 :: ----
[inf] iotx_mc_unsubscribe(1416): mqtt unsubscribe success,topic = /2UCRZpAbCGC/ExampleDev/data!
[dbg] iotx_mc_disconnect(2106): rc = MQTTDisconnect() = 0
[inf] _network_ssl_disconnect(413): ssl_disconnect
[inf] iotx_mc_disconnect(2114): mqtt disconnect!
[inf] iotx_mc_release(2160): mqtt release!
---------------------------------------------------
. bytes_total_allocated: 1292
. bytes_total_freed: 1292
. bytes_total_in_use: 0
. bytes_max_allocated: 560
. bytes_max_in_use: 1066
. iterations_allocated: 20
. iterations_freed: 20
. iterations_in_use: 0
. iterations_max_in_use: 11
---------------------------------------------------
main|441 :: out of sample!
如下日志信息显示样例程序正在通过MQTT
的Publish
类型消息, 上报业务数据到/${prodcutKey}/${deviceName}/data
mqtt_client|256 :: packet-id=3, publish topic msg={"attr_name":"temperature", "attr_value":"1"}
如下日志信息显示该消息因为是到达已被订阅的Topic
, 所以又被服务器原样推送到样例程序, 并进入相应的回调函数
_demo_message_arrive|136 :: ----
_demo_message_arrive|140 :: Topic: '/2UCRZpAbCGC/ExampleDev/data' (Length: 28)
_demo_message_arrive|144 :: Payload: '{"attr_name":"temperature", "attr_value":"1"}' (Length: 45)
_demo_message_arrive|145 :: ----
可以登录物联网套件控制台, 到设备页面, 找到刚才填写在SDK中的设备并点击进入, 点左边导航栏的日志服务, 可以看到刚才被上报的消息