目录

Esp8266-进阶之路29高级篇百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎附带Demo

Esp8266 进阶之路29【高级篇】百万条消息免费之乐鑫esp8266使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接,支持阿里云规则引擎。(附带Demo)


  • 本系列博客学习由非官方人员 潜心所力所写,不做开发板。仅仅做个人技术交流分享,不做任何商业用途。如有不对之处,请留言,本人及时更改。
序号SDK版本内容链接
1nonos2.0搭建开发环境,开始一个“hellow world”串口打印。
2nonos2.0利用GPIO开始使用按钮点亮你的“第一盏灯。
3nonos2.0利用 “软件定时器 " 定时0.5秒闪烁点亮一盏LED。
4nonos2.0用PWM控制一盏LED的亮度变化。
5nonos2.0SDK高级使用之封装Post与Get请求云端,拿到“天气预报信息”。
6nonos2.0了解 SmartConfig与Airkiss一键配网,给8266配网上云端。无需把wifi名字密码写在固件里。
7nonos2.0了解 softAP热点配网模式原理,仿“机智云”定义自己的热点配网模式协议。
8nonos2.0你要找的8266作为UDP、TCP客户端或服务端的角色通讯,都在这了。
9nonos2.0[小实战上篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
10nonos2.0[小实战下篇]Windows系统搭建8266的本地Mqtt服务器,局域网点亮一盏LED灯。
11rtos2.0接入阿里智能,点亮一盏LED灯,期待天猫精灵语音控制的不约而至!
12nonos2.0图文并茂学习阿里云主机搭建8266MQTT服务器,实现移动网络远程控制一盏LED。
13nonos2.0动手做个8266毕设小案例,smartConfig + MQTT协议轻松实现远程控制一盏LED。
14rtos2.0FreeRtos系统学习的正确姿势 —— 环境搭建、烧录。
15rtos2.0接入阿里云平台非阿里智能的SDS服务,点亮一盏LED灯。
16nonos2.0基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。
17nonos2.0esp8266自研的快速上电开关五次 (开-关为一次) ,无需按键触发则8266进去一键配网模式。
18nonos2.0基于NONOS 实现 OTA 远程升级,实现无线“ 热修复 ”升级固件程序。
19nonos2.0驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。
20nonos2.0深入学习esp8266的esp now模式,仿机智云做一个小网关,实现无需网络下轻松彼此连接通讯交互数据。
21nonos2.0浅谈 esp8266 如何在本地局域网网络情况下实现最大效率地和前端实现数据交互。
22nonos2.0esp8266的工程如何添加第三方静态库文件以及如何自定义文件夹,聊聊那些makeFile的事
23nonos2.0再来一波 esp8266 基于 freeRtos系统连接自己私有的服务器实现OTA远程升级,接触下 lwip的基本知识。
24nonos2.0渗透学习回顾下esp8266的外置spi芯片25q系列,熟悉8266代码块在其的分布,得心应手放置图片或其他资料。
25rtos2.0深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。
26nonos2.0RTOS分析 MQTT 实现过程,实现移植 MQTT协议在 esp8266 rtos实时系统,可断线重连。
27rtos3.0跟紧脚步,用VisualStudio Code开发 esp8266 rtos SDK v3.0版本,全新的 idf 框架,节省内存模块化开发。
28rtos3.0教你轻松自如使用cJson在乐鑫 esp8266 如何解析一段json数据以及如何生成一段json数据。
29rtos3.0百万条消息免费之使用TCP直连模式MQTT协议接入阿里云物联网平台,支持私家服务器对接支持阿里云规则引擎。
30rtos3.0SDK编程使用 IIC总线驱动 0.96寸的OLED显示屏,显示天气预报信息。
31rtos3.0当esp8266遇到 Html,该怎么内置网页控制设备,理清内置网页的实现过程,实现无需路由器手机也可以控制esp8266。
32rtos3.0细聊HmacMD5的加密方法带来的安全性,并实践在esp8266上,最大保障传输的过程的信息的安全性。
33rtos3.0如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
34nonos3.0编程使用 SPI 驱动基于Max7219芯片的八位数码管,显示日期信息。
35nonos3.0借助机智云平台做一个商业化的七彩RGB灯泡可调整体方案项目,炫彩夺目高大尚。
36rtos3.0认识Rtos 3.0 sdk 工程结构,如何向esp-idf工程靠近的,如何自定义头文件编译?
37rtos3.0你要找的基本外设功能都在这里了,包括Gpio、Pwm 和 Uart 接口使用。
38rtos3.0一篇文章带你搞掂存储技术 NVS 的认识和使用,如何利用NVS保存整型、字符串、数组以及结构体。
39rtos3.0带你捋一捋市面上的微信公众号配网智能设备 esp8266 并绑定设备的过程,移植并成功实现在 esp8266 rtos3.1 sdk。
40rtos3.0基于乐鑫idf框架,研究出超稳定、掉线重连、解决内存泄露问题的Mqtt框架!支持esp8266和esp32!
41rtos3.0esp8266-12模块基于rtos3.1版本ota功能远程空中升级固件,官网基础之上增加dns域名解析!
42rtos3.0我又来了,基于rtos3.0版本 SDK编程 SPI 驱动 ws2812b 七彩灯,代码全部开源奉献给你们!
43rtos3.0基于rtos3.0版本扫描周围获取附近可用的 Wi-Fi 热点路由器信息,同样适合esp32。
44rtos3.0整理分享那些我在项目中常用的esp8266 rtos3.0版本的常见驱动,Button按键长短按、PWM平滑调光等。
45rtos3.0内置仅1M的Esp8285,如何攻破最棘手的OTA问题,大大节省资源成本开发产品
46rtos3.0详细分析Esp8266上电信息打印的数据,如何做到串口通讯上电不乱码打印;
47rtos3.0无需外网,如何实现在本地局域网与控制端做数据交换的一些开发经验;
48rtos3.0迟来的1024程序员祝福,开源分享一个驱动 ds18b20 获取温度的工程。
49rtos3.2aliyun sdk 直连接入阿里云物联网平台,实现天猫精灵找队友零配网功能和语音控制。
持续更新,欢迎关注我,QQ群讨论群:434878850

  • 很多人怎么联系我一起学习进步,下面打个小小公告和干货无偿分享:

玩转 esp8266 带你飞、加群付费 QQ 群,提高门槛,不喜的朋友勿喷勿加:434878850

esp8266源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266

esp32源代码免费学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32


文章目录 * + + - - - * * - - - -

一、前言;

最近半个月都是忙得不可开交的,博文一直没有更新下来,飞燕平台的阿里智能接入下篇我会尽快的出来文章!最近接触了几个物联网平台,听说阿里云物联网平台的收费规则在 2018-10-17 10:18:53 改了下文档,于是乎,我就琢磨下怎么接入!用我们的 esp8266 接入非常简单,而且是我们的 MQTT 协议接入非常得心应手!

这篇是基于 TCP 直连模式的 MQTT 协议接入,后面还有 TLP 直连模式的 MQTT 协议接入,也就是需要制造证书,这个更麻烦,下篇会陆续出来!欢迎关注我一下哦!


二、阿里云物联网平台认识和回顾下 MQTT 协议;


2.1 、阿里云物联网平台认识。

阿里云平台大家都不陌生了,它有很多出色的产品,我们的物联网平台做的不错的 !我之前介绍的阿里智能、飞燕平台(阿里智能2.0)都是在阿里云的,不过阿里智能是开放给企业用户的,而飞燕平台(阿里智能2.0)虽然个人支持,但是量产时候设备貌似几块钱一个收费,但是支持天猫精灵,支持一键生成上位机 APP 的控制面板,还支持亚马逊智能音箱(当然收费啦!)

而这篇说到的 阿里云物联网平台 (早起也称为阿里物联套件)是只是提供服务器平台,提供边缘计算接口,就是所谓的大数据,支持自己的服务器对接,但是没有帮你弄好控制面板的。


2.2 、 MQTT 协议。

在我眼中, MQTT 协议对于我们这种嵌入式设备就是神一般的存在,这里我还是有必要去说下一些必要的 MQTT 协议参数!! MQTT服务器 下面统一简称为 服务器 ):

  • Host : 毋庸置疑,这个是服务器的地址。
  • Port : 服务器的地址连接时候的端口号,一般是 1883 ,而 webSocket 连接时候一般是 8083 ,而大家使用的微信小程序连接自家的服务器的端口务必是 443
  • userName : 这个是连接服务器的名字,这个名字是由服务器分配的,或者服务器不用验证时候,那么随意可以名字可以接入!这个是登陆需要的!
  • userPassword : 顾名思义就是用户密码,这个名字是由服务器分配的,或者服务器不用验证时候,那么随意可以密码可以接入!这个是登陆需要的!
  • clientId : : 这个参数比较特殊,他是接入后服务器保存的一个身份证,假如后面有设备以相同的这个参数接入的话,那么当前的这个设备就会被服务器强制断开连接!所以这就是后者先得的说话法 。所以这个参数必须保证要唯一!
  • Keep Alive : 这个就是底层的 TCP 心跳来的,有一种说法是 MQTT 是高级的 TCP 接入,没错, MQTT 是基于 TCP 的一种长连接的协议,所以会有心跳回复时间!

下面是 MQTT 协议的具体实现过程:服务器通过分发一则同样主题的消息到指定的设备,那么设备就会收到消息!所以,有了 订阅主题发布主题消息 的两大协议!

  • Subscribe : 订阅主题,要传入订阅的主题 Topic 和订阅的质量 Qos ,订阅的质量分为三个等级0、1、2,具体对应什么关系,自己度娘下!
  • Publish : 发布一则带有主题的消息!要传入发布的主题 Topic 和发布的质量 Qos ,以及发布的消息 Message ,还有一个参数 Retained ,服务器持久化记录设置,一般设置为 false !

三 、开始新建产品。


  • 3.1 注册登录阿里云平台账号,选择物联网平台接入!https://www.aliyun.com/

https://i-blog.csdnimg.cn/blog_migrate/b7bc0f0570cf4452810300acea538395.png


  • 3.2 新建产品,地域可选区根据自己的需求选择,之后开始新建产品, 基础版产品名字随意起! 我的是华东上海区域!貌似目前只能选择这个区域!记住这个区域,后面会用到!

https://i-blog.csdnimg.cn/blog_migrate/a0a5364ada69fcf926001f18a2ff2d4d.png


  • 3.2 新建设备,只有新建成功产品之后,才可以选择产品类型!! 每一个设备必须提前在云端注册,支持批量自动注册,支持自定义上传!

https://i-blog.csdnimg.cn/blog_migrate/bd48d8c88074e073c4e4b2ccdbf9f6a1.png


  • 3.3 新建设备成功后,打开此设备的详情,可以看到这个设备的具体信息! 每一个设备必须提前在云端注册,支持批量自动注册,支持自定义上传!

https://i-blog.csdnimg.cn/blog_migrate/0a02290175a5ca5e7f601335ef60380b.png


四 、设备端连接须看。


每次接入新的云平台,都必须要很清楚地对接和阅读这个接入文档,我仔细翻了下有关 MQTT 协议的,支持直连不加密和加密方式,这篇是讲解不加密的,那么下面让我带领大家去怎么阅读这个开发接入文档吧!下面是我截图的重要的说明!

https://i-blog.csdnimg.cn/blog_migrate/05aea23bd89dfc63d1b9e119ff895166.png


  • 4.1 下载工程,仔细对比 MQTT 连接的参数,首先我在全局宏定义下设备的参数,后面大家下载工程即可替换即可!下面前三个大家可以在设备详情拿到,至于第四个参数 DeviceArea 顾名思义是区域,和我们这个产品的区域有关,上面提到我的是 华东上海区域 ,那么对应的就是 "cn-shanghai" ,这个对应表在这里可以查阅!
#define DeviceName "smartLight"
#define ProductKey "a11ozGcYRSq"
#define DeviceSecret "pHTOZ0R0kDWyU3ruXkA4atelHxNAgdFI"
#define DeviceArea "cn-shanghai"

  • 4.2 上面提到 MQTT 协议连接的一些必要参数,那么在连接阿里云物联网平台于是如此!我们看看文档,注意其的必要的参数:

  • 服务器地址: ${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com:1883

看到上面的 ${YourProductKey}.${YourRegionId} 其实是个变量,这语法大家不要感到奇怪,其实就是 PHP 语法的常量的一种表达方式!看字面意思,就是 ProductKeyRegionId ,前面一个好理解,后面那个参数就是我提到的 DeviceArea 区域;至于 1883 就是端口号!

  • 服务器的 userNamedeviceName+"&"+productKey

这个也比较好理解,就是2个参数的拼接,注意中间还有一个 & 符号;

  • 服务器的 userPasswordsign_hmac(deviceSecret,content)

这个密码需要的是加密后的内容!!这个加密也许大家对这也就没那么好理解了,大家先要清除下加密方式哈希加密方式!常见我们用的最多的也就是 MD5 加密了!而阿里云提到支持多种加密方式,支持hmacmd5,hmacsha1,hmacsha256和 sha256,默认为hmacmd5,必须要实现声明;而我选择的是 hmacsha1 加密方式,大家也可以选择 MD5 加密!加密的密钥是 DeviceSecret 参数;

hmacsha1 加密方式的过程需要是明文和密钥,示例:如果clientId = 12345,deviceName = device, productKey = pk, timestamp = 789,signmethod=hmacsha1,deviceSecret=secret,那么使用tcp方式提交给mqtt参数如下:

   明文:mqttclientId=12345|securemode=3,signmethod=hmacsha1,timestamp=789|
   加密后的内容:hmacsha1("secret","clientId12345deviceNamedeviceproductKeypktimestamp789")

  • 服务器连接成功后的 topicclientId+"|securemode=3,signmethod=hmacsha1,timestamp=132323232|"

这个阿里云要求不用太严格, clientId :表示客户端ID,建议使用设备的MAC地址或SN码,64字符内。 timestamp :表示当前时间毫秒值,可以不传递。

  • 服务器连接成功后的 topic

这个在对应的设备详情可清楚看到,有默认的三个主题,当然了,你也可以自定义主题!



五 、设备端代码开发。


  • 5.1 来到了我们至关重要的代码环节了,首先我们先获取下设备的 mac 地址,作为 clientId 的参数一部分:
uint8 tempMessage[6];
void ICACHE_FLASH_ATTR initGetMacAdress(void) {

	//获取station下的mac地址
	uint8 macAdress[6];
	if (!wifi_get_macaddr(STATION_IF, macAdress)) {
		INFO("Failed to get mac... \r\n");
	} else {
		INFO("succeed to get mac...\r\n");
	}
	os_sprintf(tempMessage, "%02x%02x%02x%02x%02x%02x", macAdress[0],
			macAdress[1], macAdress[2], macAdress[3], macAdress[4],
			macAdress[5]);
	INFO(" MacAdress: %s\r\n", tempMessage);
}

  • 5.2 在 mqtt_config.h 声明一下必要的常量,大家拿到工程后修改下 aliyun 设备信息 即可,其他是自动匹配的:
/*aliyun 设备信息*/
#define DeviceName "smartLight"
#define ProductKey "a11ozGcYRSq"
#define DeviceSecret "pHTOZ0R0kDWyU3ruXkA4atelHxNAgdFI"
#define DeviceArea "cn-shanghai"
/*aliyun 设备信息 结束*/

//MQTT域名
#define MQTT_HOST			""ProductKey".iot-as-mqtt."DeviceArea".aliyuncs.com"
//端口号
#define MQTT_PORT			1883
//用户名
#define MQTT_USER			""DeviceName"&"ProductKey""

#define MQTT_BUF_SIZE		1024
#define MQTT_KEEPALIVE		60   //心跳
#define MQTT_PASS			""
#define MQTT_CLIENT_ID		""

//连接路由器的名字和密码
#define STA_SSID "HuaWei_Text_Only"
#define STA_PASS "xuhong@123456"

  • 5.3 整个核心的连接部分来了,注意下面的 ssl_hmac_sha1() 方法是 esp8266 内置的已经实现了的,所以你是找不到源码在哪里的!这是我就在某网站看到的,呵呵!!

ssl_hmac_sha1() 方法的参数是:待加密的信息 message 、密钥 secret、 加密之后的信息;加密后还要转下为字符串!!切记切记。

void user_init(void) {

	//获取mac地址··············
	initGetMacAdress();

	//获取随机码··············
	int randtimestamp = os_random() % 1000;

	uint8_t mydigest[20], str[40], dst[41], message[80];

	os_delay_us(60000);

	//tempMessage是设备的mac地址,这个可以自定义为mac地址或者sn序列号
	os_sprintf(message, "clientId%sdeviceName%sproductKey%stimestamp%d",
			tempMessage, DeviceName, ProductKey, randtimestamp);

	os_sprintf(randclient, "%s|securemode=3,signmethod=hmacsha1,timestamp=%d|",
			tempMessage, randtimestamp);

	os_printf(" message: %s \n", message);
	os_printf(" before ssl_hmac_sha1 client_id: %s \n", randclient);

	os_delay_us(60000); //不加延迟貌似会影响randclient

	//	待加密的信息 message 、密钥 secret、 加密之后的信息 mydigest
	ssl_hmac_sha1(message, os_strlen(message), DeviceSecret,
	os_strlen(DeviceSecret), mydigest);

	//  再一次转换为字符串
	int i;
	for (i = 0; i < 20; i++) {
		str[2 * i] = mydigest[i] >> 4;
		str[2 * i + 1] = mydigest[i] & 0xf;
	}
	for (i = 0; i < 40; i++) {
		os_sprintf(&dst[i], "%x", str[i]);
	}
	dst[40] = '\0';

	os_delay_us(60000);

	//打印下
	os_printf(" after client_id -> %s\r\n", randclient);
	os_printf(" user -> %s\r\n", MQTT_USER);
	os_printf(" pass -> %s\r\n", dst);
	
	}

  • 5.3 订阅主题和发布主题:这个由开发者自行实现,本博文的是连接成功后定时10秒发送一次数据:
static void ICACHE_FLASH_ATTR sendMsg() {
	
	char *random = "13";
	os_sprintf(random, "%d", os_random() % 100);  //获取随机数
	INFO("WenDu:%s\r\n", random);
	u8 topic[48];
	os_sprintf(topic, "/%s/%s/update", ProductKey, DeviceName);
	
	MQTT_Publish(&mqttClient, topic, random,
	os_strlen(random), 0, 0);
}

六 、其他。


  • 看看我们的串口打印吧!

https://i-blog.csdnimg.cn/blog_migrate/b7ae4f33076a7c0f4596b3d6d458ccab.png


  • 看看我们的后台显示!上面我们看到已经成功订阅了主题,那么我们在下面框框里面输入并且确认发送下看看会有消息达到设备不?

https://i-blog.csdnimg.cn/blog_migrate/f7d9ad51273bea3b0573304d4669508f.png


  • 本硬件工程免费下载:https://download.csdn.net/download/xh870189248/10731602
  • esp8266源代码学习汇总:https://github.com/xuhongv/StudyInEsp8266
  • esp32源代码学习汇总:https://github.com/xuhongv/StudyInEsp32