硬件选型:
(1)ESP8266-WIFI 用于与上位机进行通信,实现数据传输
(2)CC2530单片机,本身是51内核,与普通的51单片机编程一样,它内部多了一个ZigBee 模块,能实现ZigBee 组网。
(3)DHT11 温湿度传感器。这是一款有已校准数字信号输出的温湿度传感器。其精度湿度±5%RH, 温度±2°C,量程湿度5~95%RH, 温度-20~ 60°C。
(4)蜂鸣器。当设置阀值超出标准时,可以发出警报提醒。
使用物联网平台构建一个完整的物联网解决方案主要包括3部分:物联网平台、业务应用和设备。
物联网平台作为连接业务应用和设备的中间层,屏蔽了各种复杂的设备接口,实现设备的快速接入;同时提供强大的开放能力,支撑行业用户构建各种物联网解决方案。
设备可以通过固网、2G/3G/4G/5G、NB-IoT、Wifi等多种网络接入物联网平台,并使用LWM2M/CoAP、MQTT、HTTPS协议将业务数据上报到平台,平台也可以将控制命令下发给设备。
业务应用通过调用物联网平台提供的API,实现设备数据采集、命令下发、设备管理等业务场景。
接下来就详细把整个物联网平台的使用流程进行介绍。
点击右上角创建产品:
根据自己的产品信息填充:
根据产品的传感器属性创建服务器的属性字段:
4.3 设备创建
详细创建流程,看下面的截图:
保存设备信息,接下来的MQTT登录需要使用。
{ device_id: 62e732be3a884835598654f7_dev1, secret: 12345678}
4.4 MQTT三元组信息生成
在这里可以使用华为云提供的工具快速得到MQTT三元组进行登录。
4.7 应用侧开发接口介绍
在设备上云之后,为了能方便管理设备,方便用户设备入网,都需要开发一款手机APP或者微信小程序、桌面软件等,进行数据交互,设备管理。
华为云IOT提供了应用侧开发的API对接接口,这里就介绍一下使用应用侧开发的流程。这个API接口里常用的接口包括:产品创建、设备创建、设备属性获取、设备删除、查询设备等管理接口,可以通过API主动获取产品下面某个设备的属性,要求设备上报最新的数据过来。整个开发过程,都是基于HTTP协议的API接口进行交互,不依赖开发环境,不依赖开发语言。 不管是桌面软件,还是手机APP、微信小程序、web网页等,核心代码基本都是一样,都是HTTP协议交互。下面的例子里,我是采用C 编写的,采用QT框架库完成整个开发,了解了整个思路,你就可以采用自己熟悉的语言完成相同的功能。
官方帮助文档:
安装集成开发环境: IAR-EW8051-8.10.1。
安装仿真器“SmartRF4EB”的驱动程序。
安装代码烧写工具: Setup_SmartRF_Programmer_1.10.2。
安装 TI 的 Zigbee 协议栈: ZStack-CC2530-2.5.1a。
安装过程截图请看另外的文档。
5.4 DHT11.c代码
#include uart.h/*函数功能:串口0初始化*/void Init_Uart0(void){ PERCFG0); //串口0的引脚映射到位置1,即P0_2和P0_3 P0SEL|=0x32; //将P0_2和P0_3端口设置成外设功能 U0BAUD = 216; //32MHz的系统时钟产生115200BPS的波特率 U0GCR0);//清空波特率指数 U0GCR|=110; //32MHz的系统时钟产生115200BPS的波特率 U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器 U0CSR |= 0x36; //选择UART模式,使能接收器}/*函数功能:UART0发送字符串函数*/void UR0SendString(u8 *str){ while(*str!=\0) { U0DBUF = *str; //将要发送的1字节数据写入U0DBUF while(UTX0IF == 0);//等待数据发送完成 UTX0IF = 0; //清除发送完成标志,准备下一次发送 str ; }}/*函数功能: 模仿printf风格的格式化打印功能*/char USART0_PRINT_BUFF[200]; //格式化数据缓存数据void USART0_Printf(const char *format,){ char *str=NULL; /*1. 格式化转换*/ va_list ap; // va_list----char * va_start(ap,format); //初始化参数列表 vsprintf(USART0_PRINT_BUFF, format, ap); //格式化打印 va_end(ap); //结束参数获取 /*2. 串口打印*/ str=USART0_PRINT_BUFF;//指针赋值 while(*str!=\0) { U0DBUF=*str; //发送一个字节的数据 str ; //指针自增,指向下一个数据 while(UTX0IF == 0);//等待数据发送完成 UTX0IF = 0; //清除发送完成标志,准备下一次发送 }}
5.5 ESP8266.c代码
#include esp8266.huint lenU1 = 0;uchar tempRXU1;uchar RecdataU1[MAXCHAR];//AT CIPSEND=0,10\r\n //长度10//返回 之后就可以正常发送数据了//发送成功返回 SEND OK//发送数据void ESP8266_SendData(char *p,int len){ int i=0; char buff[50]; sprintf(buff,AT CIPSEND=0,%d\r\n,len); clearBuffU1(); Uart1_Send_String(buff); //发送指令 DelayMs(1000); //等待 for(i=0;ilen;i ) { Uart1_Send_Char(p[i]); } //等待发送完成 DelayMs(1000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1();}/***************************************************************************** 名 称: SetWifi()* 功 能: 设置LED灯相应的IO口* 入口参数: 无* 出口参数: 无****************************************************************************/void SetWifi(void){ P0DIR |= 0x40; //P0.6定义为输出 IGT = 0; //高电平复位 DelayMs(500); IGT = 1; //低电平工作}/*设置WIFI为AP模式 TCP服务器*/void SetESP8266_AP_TCP_Server(){ clearBuffU1(); Uart1_Send_String(AT\r\n); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(ATE0\r\n); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(AT CWMODE=2\r\n); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(AT RST\r\n); DelayMs(2000); DelayMs(2000); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(ATE0\r\n); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(AT CWSAP=\wifi_cc2530\,\12345678\,1,4\r\n); DelayMs(2000); DelayMs(2000); DelayMs(2000); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(AT CIPMUX=1\r\n); DelayMs(2000); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(AT CIPSERVER=1,8089\r\n); DelayMs(2000); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1); clearBuffU1(); Uart1_Send_String(AT CIFSR\r\n); DelayMs(2000); DelayMs(2000); RecdataU1[lenU1]=\0; UR0SendString(RecdataU1);}unsigned char dataRecv;unsigned char Flag = 0;/*===================UR1初始化函数====================*/void Init_Uart1(){ PERCFG = 0x00;//位置1 P0.4/P0.5口 P0SEL |= 0x30;//P0.4,P0.5用作串口(外部设备功能) U1CSR |= 0x80;//设置为UART方式 U1GCR |= 11;//BAUD_E U1BAUD |= 216;//BAUD_M 波特率设为115200 UTX1IF = 0; //UART1 TX中断标志初始置位0 U1CSR |= 0X40; //允许接收 IEN0 |= 0x88; // 开总中断,UART1接收中断 }void clearBuffU1(void){ int j; for(j=0;jMAXCHAR;j ) { RecdataU1[j]=0x00; } lenU1=0;}/*******************************************************************************串口1发送一个字节函数*******************************************************************************/void Uart1_Send_Char(char Data){U1CSR //禁止接收U1DBUF = Data;while(UTX1IF == 0);UTX1IF = 0;U1CSR |= 0x40; //允许接收}/*******************************************************************************串口1发送字符串函数*******************************************************************************/void Uart1_Send_String(char *Data){ while(*Data!=\0) { Uart1_Send_Char(*Data); Data ; }}/**************************************************************** 串口接收一个字符: 一旦有数据从串口传至CC2530, 则进入中断,将接收到的数据赋值给变量temp. ****************************************************************/ #pragma vector = URX1_VECTOR __interrupt void UART1_ISR(void) { if(lenU181) { tempRXU1 = U1DBUF; RecdataU1[lenU1]=tempRXU1; URX1IF = 0; // 清中断标志 lenU1 ; }}
6、总结
随着业务的发展,越来越多的企业选择结合物联网技术来实现自身效益增长。相比企业自建MQTT集群,使用华为云IoT服务低成本构建物联网解决方案,在能力、成本、运维、安全、生态等诸多方面具有突出优势。广泛支持IoT主流的接入协议及私有协议,满足各类设备和接入场景要求;与主流模组、芯片预集成,实现多网络、多协议接入,简化设备接入难度,实现小时级设备极简接入。
华为云博客_大数据博客_AI博客_云计算博客_开发者中心-华为云