想玩物联网的时候物色了很多国内的云平台,最后选了中移云去实现。其实阿里云华为云机智云都不错,机智云网页界面不行但是带APP,阿里云也有个贝壳物联APP功能更强大,华为云不太了解不过好像也还行。中移云感觉更加的纯粹,没有那么多花里胡哨的功能(其实是我用不到而已)。这里记录一下基于4个stm32+lora建立组网,上传数据到云平台这个简单的项目。
硬件环境
硬件环境即一个主控板(照片找不到了)+三个采集板,基于LORA构建组网,采集3个不同地点的环境数据,通过WIFI模块上发数据到云平台。外加一个OpenMV3做人脸识别。采集板挂载了温湿度+光照强度+LORA模块。
软件环境
IDE:Keil 5.15
OS:Ucos-III
ESP8266 WIFI模块基本知识详解
市面上的WIFI模块大多数都是乐鑫的,通过串口+AT指令,即可简单的进行操作。
硬件连接:
AT指令基本结构:
WIFI模块和服务器建立连接有两种方式:
TCP连接通信比较常用,再该模式下,相应的设备必须处于同一网络中,即处于同一个局域网中!!!AP模式下ESP8266做服务端时就是,手机和电脑必须连在ESP8266的WiFi,才能用网络调试助手等软件与ESP8266通信。
WIFI 模块的AT指令配置大家看官方文档即可,整体了来说还是比较简单的。WIFI一般有WIFI-AP模式,WIFI-STA模式,WIFI-AP兼STA模式三种,这里只说常用的前两种:
①、WIFI-AP模式:首先,我们可以把WIFI模块当成一个热点,开启热点以后别的设备可以连接这个热点,从而我们就可以向连接热点的设备
!!发送数据!!
当ESP8266建立TCP服务器时,步骤为:
1.AT+CWMODE=2//配置ESP8266为AP模式,(路由器模式,发出WIFI)。
2.AT+RST // 重启模块使刚刚配置模式生效
3.AT+CWSAP=“wifi账号”,“WIFI密码”,1,4
4.AT+CIPMUX = 1 // 启动多连接
5.AT+CIPSERVER = 1,8080 // 模块开启服务器模式,端口号8080
这一步一定要保证设备连接到了ESP8266的WIFI,不然会连接失败
6.AT+CIPSEND=X,X // 第一个X是对应的ID号,第二个X是对应的字符个数,调用这个AT指令就可以向对应的客户端发送数据,注意对应的字符个数问题,如果个数少了就不发,个数多了就只发前对应的个数。
以上,便是ESP8266做服务器,PC端(移动端)做客户端的情况。
当ESP8266做客户端,PC端(移动端)做服务器时(单路连接),具体的步骤简要为:
完成连接后,调用AT+CIPSEND这个指令即可与服务器收发数据。这里我们只介绍单路连接,这种模式下是可以做到最多5路连接,感兴趣的话可以查一下相关资料。
②.WIFI-STA模式:这个模式与AP模式相反,是ESP8266去连接别的路由器(WIFI),只要保证与通信方处于同一局域网下即可,可以理解为一个基站去接收信号。
ESP8266做服务器,PC做客户端,具体步骤为:
到这里,我们发送AT+CWLAP指令可以查询周围的WIFI信号(去酒店之类的可以用这招预防那种WIFI摄像头,但是SD卡那种还是防不了的。。)
发送AT+CWJAP?可以查看WIFI是否真的连接成功。
4.AT+CIPMUX=1启动多连接
5.AT+CIPSERVER=1,8080 // 打开服务器端口为8080
6.AT+CIFSR // 看一下你模块现在分配的ip是多少,只要模块联网就会重新分配ip地址,这也是网络调试助手里面远程主机栏要填写的ip地址。
ESP8266做客户端,PC端(移动端)做服务器,具体步骤如下:
1.AT+CWMODE=1,设置为STA模式
2.AT+RST , 重启生效
3.AT+CWJAP=“WIFI账号”,“WIFI密码”
4.AT+CIPMUX=0 ,单连接
5.AT+CIPSTART=“TCP”,“192.168.1.101”,8080
下面用AT+CIPSEND发送数据即可
这次工程是把WIFI模块配成STA模式下的客户端,网站就当成服务器,方便操作。
OneNET建立自己的物联网应用
首先来个官网网址中移云网址,进去以后注册一个自己的账号
点击开发者中心,然后创建自己的产品。这里跟着官方文档走就好了,不多赘述创建产品
接入协议这里选择http协议,因为我们只需要POST上报数据,GET获得数据即可。有能力的话建议搞一下MQTT协议,近两年最火的物联网协议。然后建一个设备,这里跟着官方文档走就可以了。最后我们会得到这些必要信息:
这四个ID/key是上报数据必须的东西,要做好记录。至此平台端我们已经解决了大半。
收发协议
因为涉及了不同设备多个数据的采集,这里制定了一个简单的协议,只有一个帧头采集板发过来的帧头到主控板会被识别为ASCII码,所以主控接收从机帧头时一定要以ASCII码形式判断。其实出来实习以后,发现这些协议走16进制的话会更方便,便于不同平台之间交互。下面上代码:
u8 a = 0;
u8 b = 0;
u8 c = 0;
u8 RX1_Buff[3];
u8 RX2_Buff[3];
u8 RX3_Buff[3];
int i = 1;
int j = 1;
int k = 1;
char one = '1';
char two = '2';
char three = '3';
void USART2_IRQHandler(void)
{
u8 res;
{
res=USART_ReceiveData(USART2);
//printf("%c",res);
if(res == one)
{
a = 1;
two = '7';
three = '8';
}
if(a == 1)
{
switch(i)
{
case 1:i++;break;
case 2:i++;RX1_Buff[0] = res;break;
case 3:i++;RX1_Buff[1] = res;break;
case 4:i++;RX1_Buff[2] = res;i=1;a=0;two = '2';three = '3';break;
default:break;
}
}
if(res == two)
{
b=1;
one = '6';
three = '8';
}
if(b == 1)
{
switch(j)
{
case 1:j++;break;
case 2:j++;RX2_Buff[0]=res;;break;
case 3:j++;RX2_Buff[1]=res;;break;
case 4:j++;RX2_Buff[2]=res;j=1;b=0;one = '1';three = '3';break;
default:break;
}
}
if(res == three)
{
c = 1;
one = '6';
two = '7';
}
if(c == 1)
{
switch