第一:【实验目的】
- 通过esp8266模块,单片机工作环境中所用到的任何传感器信息,如温湿度、光照强度、土壤湿度、水温等,过wifi上传到服务器。而且我们只需要登录服务器,我们就可以在家里或其他地方观察信息,实现单片机数据的上报。
- 通过esp8266模块,单片机能接收到我们在云端发送的数据,实现对单片机的远程控制功能。
第二:【实验原理】
外观尺寸
图一
- 管脚定义
图二
- 应用电路
图三
- 通信原理
4.1建立wifi
ESP8266 WIFI 模块工作于SoftAP+Station 模式即建立了一个 WiFi 热点并建立一个TCP SEVER,IP 地址为:192.168.4.1,端口:5000。
安卓手机连接到 ESP8266 的热点后,通过网络调试软件,建立一个 TCP CLIENT与 ESP8266 的 TCP SEVER 进行通信。
注:简单的说TCP 协议的通信过程至少需要建立一个 TCP SEVER(TCP 服务器),然后 TCP CLIENT(TCP 客户端)与 TCP SEVER 建立连接后,即可进行数据通信。
4.2连接wifi(本实验重点)
ESP8266 WIFI 模块工作于Station 模式,在此模式下, 模块相当于一个客户端, 可以链接到其他路由器发出的 WIFI 信号。
常用指令:
1.查询指令:AT+CWMODE_CUR? 查询 ESP8266 当前 Wi-Fi 模式。
2. 设置指令:AT+CWJAP_CUR=<ssid>,<pwd>,[<bssid>][,<pci_en>] 设置 ESP8266 Station 需连接的 AP
- 【实验步骤】
1.按图完成esp8266模块与单片机的接线
2.完成相应的固件烧录
2.1 固件下载
用浏览器打开安信可公司提供的AT固件汇总(下载需要的AT固件)
链接:AT固件汇总 | 安信可科技
- 烧录工具
用浏览器打开安信可公司提供的开发工具清单(下载烧录WIFI固件工具)
链接:开发工具清单 | 安信可科技
- 固件烧录
- 硬件连接成下载模式(接线方式见图二)
- 固件准备
下载、解压并执行 ESPFlashDownloadTool_vx.xx.xx.exe,将弹出如下界面。黑窗可以查看烧录过程的一些信息,另一个为登录界面,用来选择相应芯片的下载界面。
- 烧录
加入自己下载的固件,点击“START”按钮开始烧录:等待烧录完成。
固件烧写软件配置参数说明如下:
固件烧录完成,将接线接回运行模式
- 完成云平台的创建
创建产品
使用物联网平台的第一步:在控制台创建产品。产品是设备的集合,通常是一组具有相同功能定义的设备集合。例如:产品指同一个型号的产品,设备就是该型号下的某个设备。
步骤一:登录物联网平台设备
- 用浏览器打开阿里云首页:链接https://iot.console.aliyun.com/lk/summary/new
并点击右上方控制台。打开网页。
- 登录,使用自己淘宝账号登录即可
- 开通物联网平台并点击进去,如图3.1所示:
图3.1 开通物联网平台
步骤一:在左侧导航栏,选择设备管理 > 产品,单击创建产品。
步骤二:根据页面提示填写产品信息(如图3.2所示),然后单击保存。
图3.2 填写相关信息
页面参数设置如表3.1所示:
表3.1页面参数设置说明:
参数 | 描述 |
产品名称 | 为产品命名。产品名称在账号内具有唯一性。例如,可以填写为产品型号。支持中文、英文字母、数字、下划线(_)、连接号(-)、@符号和英文圆括号,长度限制4~30,一个中文汉字算2位。 |
所属品类 | 相当于产品模板。 标准品类:物联网平台已为标准品类预定义了功能模板。 例如,能源管理 > 电表品类已预定义用电量、电压、电流、总累积量等电表标准功能。选择该品类,创建的产品具有预定义的功能。您可以在该产品的产品详情页功能定义页签下,编辑、修改、新增功能。 自定义品类:产品创建成功后,需根据实际需要,自定义物模型。 |
节点类型 | 产品下设备的类型。 o 直连设备:直连物联网平台,且不能挂载子设备,也不能作为子设备挂载到网关下的设备。 o 网关子设备:不直接连接物联网平台,而是通过网关设备接入物联网平台的设备。网关与子设备说明,请参见网关与子设备。 o 网关设备:可以挂载子设备的直连设备。网关具有子设备管理模块,可以维持子设备的拓扑关系,将与子设备的拓扑关系同步到云端。 |
接入网关协议 | 节点类型选择为网关子设备的参数。表示该产品下的设备作为子设备与网关的通讯协议类型。 o 自定义:表示子设备和网关之间是其它标准或私有协议。 o Modbus:表示子设备和网关之间的通讯协议是Modbus。 o OPC UA:表示子设备和网关之间的通讯协议是OPC UA。 o ZigBee:表示子设备和网关之间的通讯协议是ZigBee。 o BLE:表示子设备和网关之间的通讯协议是BLE。 |
连网方式 | 直连设备和网关设备的连网方式。 o WiFi o 蜂窝(2G/3G/4G) o 以太网 o LoRaWAN 说明 首次选择LoRaWAN时,需要单击下方提示中的立即授权,前往RAM控制台授权IoT使用AliyunIOTAccessingLinkWANRole角色访问LinkWAN服务。 o 其他 |
入网凭证 | 当连网方式选择为LoRaWAN时,需提供入网凭证名称。 若无凭证,请单击创建凭证,进入阿里云物联网络管理平台,添加专用凭证,并为凭证授权用户。 使用凭证创建的产品,将作为一个节点分组,自动同步到物联网络管理平台的节点分组列表中。 |
数据格式 | 设备上下行的数据格式。 o ICA标准数据格式(Alink JSON):是物联网平台为开发者提供的设备与云端的数据交换协议,采用JSON格式。 o 透传/自定义:如果您希望使用自定义的串口数据格式,可以选择为透传/自定义。 您需在控制台提交数据解析脚本,将上行的自定义格式的数据转换为Alink JSON格式;将下行的Alink JSON格式数据解析为设备自定义格式,设备才能与云端进行通信。 说明 使用LoRaWAN接入网关的产品仅支持透传/自定义。 |
认证方式 | 设备接入物联网平台的安全认证方式。产品创建成功后,认证方式不可变更。可选: o 设备密钥:使用物联网平台为设备生成的DeviceSecret进行设备认证签名计算。 使用DeviceSecret签名计算,可参见MQTT-TCP连接通信。 o ID²:ID²认证提供设备与物联网平台的双向身份认证能力,通过建立轻量化的安全链路(iTLS)来保障数据的安全性。 说明 仅华东2(上海)地域支持ID²认证方式。 连网方式选择为LoRaWAN的产品不支持ID²认证方式。 选择使用ID²认证,需购买ID²服务。请参见IoT设备身份认证(ID²)用户手册。 o X.509证书:使用X.509数字证书进行设备身份认证。 说明 仅华东2(上海)地域支持X.509证书。 连网方式选择为LoRaWAN的产品不支持X.509证书。 在产品下创建设备后,物联网平台为设备生成唯一的X.509证书。您可以在设备的设备详情页,查看和下载该设备的X.509证书。 使用X.509证书进行设备身份认证的设备端配置说明,请参见使用X.509证书认证。 |
产品描述 | 可输入文字,用来描述产品信息。字数限制为100。 |
资源组 | 将该产品划归为某个资源组。 通过资源组管理,可以授予指定子账号查看和操作该产品的权限,而未授权的子账号则不可以查看和操作该产品。 产品创建成功后,可以在资源管理控制台变更产品所属的资源组。 资源组相关功能说明,请参见资源隔离文档。 |
产品创建成功后,页面自动跳转回产品列表页面。
产品物理模型自定义(功能定义)
物模型指将物理空间中的实体数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能。完成功能定义后,系统将自动生成该产品的物模型。物模型描述产品是什么,能做什么,可以对外提供哪些服务。
物模型,简称TSL,即Thing Specification Language。是一个JSON格式的文件。它是物理空间中的实体,如传感器、车载装置、楼宇、工厂等在云端的数字化表示,从属性、服务和事件三个维度,分别描述了该实体是什么,能做什么,可以对外提供哪些信息。定义了这三个维度,即完成了产品功能的定义。
物模型将产品功能类型分为三类:属性、服务、和事件。定义了这三类功能,即完成了物模型的定义。表3.2是对相关功能类型的说明:
表3.2 功能类型说明
功能类型 | 说明 |
属性(Property) | 一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持GET和SET请求方式。应用系统可发起对属性的读取和设置请求。 |
服务(Service) | 设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。 |
事件(Event) | 设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。 |
创建单个设备
在左侧导航栏,选择设备管理 > 设备,在产品下添加设备,操作如图3.3所示:
总结
本章主要是讲解了创建一个阿里云产品,这是为了后续MQIT接入阿里云做准备,读者只需按照步骤创建自己的阿里云产品即可。
图3.3 创建单个设备
确定后弹出来的设备证书信息(ProductKey、DeviceName和DeviceSerect)后面接入该平台需要用到,请记录保存下来。不小心关闭也没关系,在产品设备中能找到。设备证书界面如图3.4所示:
图3.4 查看设备证书
相关参数说明在表3.3中
表3.3 设备证书中相关参数说明
参数 | 说明 |
ProductKey | 设备所隶属产品的Key,即物联网平台为产品颁发的全局唯一标识符。 |
DeviceName | 设备在产品内的唯一标识符。DeviceName与设备所属产品的ProductKey组合,作为设备标识,用来与物联网平台进行连接认证和通信。 |
DeviceSecret | 物联网平台为设备颁发的设备密钥,用于认证加密。需与DeviceName成对使用。 |
之后,可以在设备列表中,单击设备对应的查看按钮,进入设备详情页设备信息页签下,查看设备信息。
4.使用MQTT.fx接入物联网平台
4.1前提条件
已在物联网平台控制台创建产品和设备,并获取设备证书信息(ProductKey、DeviceName和DeviceSerect)。创建产品和设备具体操作细节,请参考创建产品、单个创建设备和批量创建设备。
上文创建的产品设备后设备证书信息如下(下文将以此作为示例做讲解):
"ProductKey": "a14ayJGOfy7",
"DeviceName": "XYD_LOCK",
"DeviceSecret": "ch4UVyPXhAOdFwWYGbfWMw6G6ztxbTir"
4.2使用MQTT.fx接入
- 下载并安装MQTT.fx软件。请访问MQTT.fx官网。
- 打开MQTT.fx软件,单击设置图标。如图20.2.1所示:
图20.2.1 MQTT.fx设置图标
- 设置连接参数。物联网平台目前支持两种连接模式,不同模式设置参数不同。
TCP直连:Client ID中securemode=3
,无需设置SSL/TLS信息。
TLS直连:Client ID中securemode=2
,需要设置SSL/TLS信息。
- 设置基本信息,如图20.2.2所示:
图20.2.2 设置基本信息
设置基本信息相关参数说明如表20.2.1所示
表20.2. 1设置基本信息相关参数说明
参数 | 说明 |
Profile Name | 输入您的自定义名称。 |
Profile Type | 选择为 MQTT Broker。 |
MQTT Broker Profile Settings | |
Broker Address | 连接域名。 格式:${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com。 其中,${region}需替换为您物联网平台服务所在地域的代码。地域代码,请参见地域和可用区。如:alxxxxxxxxxx.iot-as-mqtt.cn-shanghai.aliyuncs.com。 ${YourProductKey}需要替换为ProductKey 示例:a1UTSkcjwld.iot-as-mqtt.cn-shanghai.aliyuncs.com |
Broker Port | 设置为:1883 |
Client ID | 填写mqttClientId,用于MQTT的底层协议报文。 格式固定:${clientId}|securemode=3,signmethod=hmacsha1|。 完整示例:12345|securemode=3,signmethod=hmacsha1|。 其中, ${clientId}为设备的ID信息。可取任意值,长度在64字符以内。建议使用设备的MAC地址或SN码。 securemode为安全模式,TCP直连模式设置为securemode=3,TLS直连为securemode=2。 signmethod为算法类型,支持hmacmd5和hmacsha1。 说明 输入Client ID信息后,请勿单击Generate。 ESP32|securemode=3,signmethod=hmacsha1| |
General栏目下的设置项可保持系统默认,也可以根据您的具体需求设置。 |
- 单击User Credentials,设置User Name和Password。如图20.2.3所示
图20.2.3设置用户名和密码
用户相关信息说明如表20.2.2所示:
表20.2.2用户相关信息说明
参数 | 说明 |
User Name | 由设备名DeviceName、符号(&)和产品ProductKey组成。 固定格式: 完整示例如: |
Password | 密码由参数值拼接加密而成。 您可以使用物联网平台提供的生成工具自动生成Password。 单击下载Password生成小工具。 使用Password生成小工具的输入参数: productKey:设备所属产品Key。可在控制台设备详情页查看。 deviceName:设备名称。可在控制台设备详情页查看。 deviceSecret:设备密钥。可在控制台设备详情页查看。 timestamp:(可选)时间戳。 clientId:设备的ID信息,与Client ID中${clientId}一致。 method:选择签名算法类型,与Client ID中signmethod确定的加密方法一致。 xxxx) |
- Password生成工具
打开“软件工具\mqttfx\mqtt签名工具\sign.html”,按照上文参数规则填入信息后点击生成,如图20.2.4所示:
图20.2.4 密码生成配置
- 最终得到
User Name:XYD_LOCK&a14ayJGOfy7
Password:9CE77B5B8E383FFEF3C0C4BE15497D5BE1A4D6D0
这两个在后面进行MQTT连接时需要用到。
- (可选)TCP直连模式(即
securemode=3
)下,无需设置SSL/TLS信息,直接进入下一步。
TLS直连模式(即securemode=2
)下,需要选择SSL/TLS,勾选 Enable SSL/TLS,设置Protocol。建议Protocol选择为TLSv1.2。设置如图20.2.5所示:
图20.2.5 设置TCP直连模式
填写完成后,单击OK。
- 设置完成后,单击Connect进行连接。如图20.2.6所示
图20.2.6 连接示意图
4.3下行通信测试
从物联网平台发送消息,在MQTT.fx上接收消息,测试MQTT.fx与物联网平台连接是否成功 。
- 在MQTT.fx上,单击Subscribe。
- 输入一个设备具有订阅权限的Topic,单击Subscribe,订阅这个Topic。如图20.3.1所示
图20.3.1订阅Topic
订阅成功后,该Topic将显示在列表中。如图20.3.2所示
图20.3.2 查看一订阅的Topic
- 在物联网平台控制台中,该设备的设备详情页,Topic列表下,单击已订阅的Topic对应的发布消息操作按钮。
- 输入消息内容,单击确认。如图20.3.3所示:
图20.3.3 下行发送消息示例
- 回到MQTT.fx上,查看是否接收到消息。如图20.3.4所示:
图20.3.4 下行通信接收消息示例
4.4上行通信测试
在MQTT.fx上发送消息,通过查看设备日志,测试MQTT.fx与物联网平台连接是否成功 。
- 在MQTT.fx上,单击Publish。
- 输入一个设备具有发布权限的Topic,和要发送的消息内容,单击Publish,向这个Topic推送一条消息。如图20.4.1所示:
图20.4.1 上行通信发送消息示例
- 在物联网平台控制台中,该设备的设备详情 > 日志服务 > 上行消息分析栏下,查看上行消息。您还可以复制MessageID,在消息内容查询中,选择原始数据查看具体消息内容。
4.5查看日志
在MQTT.fx上,单击Log查看操作日志和错误提示日志。如图20.5所示
图20.5 查看日志
现在本地端如果想要连接上网页端(MQTT协议)
第一步:先让设备能联网
第二步,使用这个联网设备来发送对应的连接到阿里云平台的参数
第三步:订阅一个具有订阅权限topic,网页端就可以使用这个topic来发送数据给设备
第四步:选择一个具有发布权限的topic,再把数据上传到网页端
5.核心代码实现(STM32f407VGT6为例)
5.1 ESP8266的连接与订阅
void ESP8266_Connet(void)
{
u8 errorCode;
UART4_Init(115200);
ESP8266_TcpInit();
//修改成自己的WiFi名和WiFi密码
ESP8266_Wificonnect((uint8_t *)"Mi 10",(uint8_t*)"12345678");
//自己MQTT的broker Address
ESP8266_Severconnect((uint8_t *)"h0jpzgOH9rd.iot-as-mqtt.cn-shanghai.aliyuncs.com");
errorCode = ESP8266_SendandReceive((uint8_t *)"AT+CIPSEND\r\n",(uint8_t *)"OK");
if(!errorCode)
{
_mqtt.Init(rxbuf,0,txbuf,0);
//MQTT连接
//修改成自己MQTT的Client ID,User Name和在mqtt工具中生成的签名代码
errorCode=_mqtt.Connect("ESP8266|securemode=3,signmethod=hmacsha1|",
"HZL_BS&h0jpzgOH9rd",
"8A71EC003C918FED63578E81D5C7C02EDBAA9485");
printf("55555");
if(errorCode==1){
printf("MQTT接入成功\r\n");
//自己的Subscribe地址
errorCode=_mqtt.SubscribeTopic("/sys/h0jpzgOH9rd/HZL_BS/thing/service/property/set",0,1);//订阅
if(errorCode==1)
{
printf("MQTT订阅成功\r\n");
}
}
}
}
5.2 ESP8266数据发送
void ESP8266_Send(void)
{
uint8_t score[] = "A:97 B:122";
uint8_t foul[] = "A:6 B:9";
uint8_t win[] = "B:win";
char string[520] = {0};
//按物模型通信的结构发送信息
sprintf(string, "{\"method\":\"thing.service.property.set\",\"id\":\"1948364543\",\"params\":{\"foul\":\"%s\",\"score\":\"%s\",\"win\":\"%s\"},\"version\":\"1.0.0\"}",foul,score,win);
printf("%s\r\n",string);
//自己的Publish地址
_mqtt.PublishData("/sys/h0jpzgOH9rd/HZL_BS/thing/event/property/post",string,0);
}
5.3 ESP8266数据接收
//通过接受中断来接收云上发来的数据
void UART4_IRQHandler(void)
{
uint8_t temp;
if(USART_GetITStatus(UART4,USART_IT_RXNE))
{
//清除接收中断标志
temp = USART_ReceiveData(UART4);
if(temp == 0)
{
esp8266rec.buff[esp8266rec.len++] = ' ';
}
else
{
esp8266rec.buff[esp8266rec.len++] = temp;
}
}
else if(USART_GetITStatus(UART4,USART_IT_IDLE))//空闲中断
{
//清除空闲中断标志
temp = UART4->SR;
temp = UART4->DR;
temp = temp;
esp8266rec.buff[esp8266rec.len] = '\0';
esp8266rec.len = 0;
esp8266rec.flag= 1;
printf("%s", esp8266rec.buff);
}
}
- 【实验现象】