基于小熊派的智慧路灯(WIFI连接)

前言

本文将讲解在使用小熊派官方例程中遇到的问题,以及实现用WIFI连接到华为云平台。




正文

一开始使用官方给的资料里面的智慧路灯demo,发现可以运行,数据能正常上传到云平台。但在过了一天以后,发现莫名连接不了,一直卡在如下这个界面。

在这里插入图片描述
根据输出,我们查找到对应的文件代码,这里对应着下面这个语句
在这里插入图片描述
在这里插入图片描述
在执行完nb_reboot()之后,尝试输出AT+CFUN?的信息,发现得到的结果是+CFUN:0,而我们的函数nb_hw_detect()检测期望的结果是+CFUN:1,这也难免程序会卡在这里,因为执行的是一个死循环的设备检测。

AT+CFUN=0 设置NBIoT模块最小功能
AT+CFUN=1 设置NBIoT模块最大功能

那么只要通过AT执行,设置CFUN=1即可退出该循环,从而继续执行下面的语句。


在这里插入图片描述
这段代码的意思是首先检测网络的状态(是否有激活或附着),通过AT+CGATT?,通过检测网络的强度csq,这里如果网络没有激活或者附着成功,那么返回的强度应该是CSQ:99,99(信号获取失败)。

解决的办法就是激活该网络,通过AT+CGATT=1,执行成功会返回如下信息。
在这里插入图片描述
那么此时就能够检测到网络的强度(信号能够获取成功)。


在这里插入图片描述



数据的发送

AT+NMGS=长度,数据
这命令用来向华为Iot平台发送数据,数据以十六进制字符串格式传输,最大长度512字节

AT+NMGS=3,AA11BB
OK

AT+NQMGS
该命令查询发送到华为物联网平台的上游消息的状态。

AT+NQMGS
PENDING=1,SENT=34,ERROR=0
OK
//PENDING=1,上游(云平台发送的消息数)

/**
    @param buf  十六进制数据指针
    @param len  长度
    @return -1  失败
    @return 0   成功
    nb-iot 发送数据负载
*/
int32_t nb_send_payload(const char* buf, int len)
{
    //向电信平台发送数据,AT+NMGS=<length>,<data>
    //查询已发送消息,AT+NQMGS
    char *cmd1 = "AT+NMGS=";
    char *cmd2 = "AT+NQMGS\r";
    int ret;
    char* str = NULL;
    int curcnt = 0;
    int rbuflen;
    static int sndcnt = 0;
    if(buf == NULL || len > AT_MAX_PAYLOADLEN)
    {
        //如果发送的消息为空或者长度为最大负载
        AT_LOG("payload too long");
        return -1;
    }
    //memset(tmpbuf, 0, AT_DATA_LEN);
    memset(wbuf, 0, AT_DATA_LEN);
    //str_to_hex(buf, len, tmpbuf);
    memset(rbuf, 0, AT_DATA_LEN);
    //AT+NMGS=3,001234:“00”是数据头,根据平台上的定义修改“12”、“34”为要上传的数据

    snprintf(wbuf, AT_DATA_LEN,"%s%d,%s%c",cmd1,(int)len,buf,'\r');
    ret = at.cmd((int8_t*)wbuf, strlen(wbuf), "OK", NULL,NULL);
    if(ret < 0)
        return -1;
    //回复:PENDING=0,SENT=317,ERROR=0
    //cmd有个期待回答
    ret = at.cmd((int8_t*)cmd2, strlen(cmd2), "SENT=", rbuf,&rbuflen);
    //如果没有send,返回-1
    if(ret < 0)
        return -1;
    //找到send的内容
    str = strstr(rbuf,"SENT=");
    if(str == NULL)
        return -1;
    //格式化输出,send=317,ERROR=0,那么curcnt = 317,wbuf="ERROR=0"
    sscanf(str,"SENT=%d,%s",&curcnt,wbuf);
    //长度相等,即没有接收到答复
    //比如这次发送是100,那么下次就从100开始+字节数
    if(curcnt == sndcnt)
        return -1;
    sndcnt = curcnt;
    return ret;
}



使用WIFI连接

根据小熊派的教程,我们可以使用WIFI或者2G通信模块来连接上云平台。
1.修改网络类型
2.修改热点名称和密码
3.修改设备唯一标识符(连接上云平台使用)

执行过程
在这里插入图片描述

关于2G模块的联网过程和云平台的连接配置参数等等,会在下一次博客说明,包括如何在示例例程添加使用WIFI模块等。




参考

STM32学习笔记ESP8266(一)

Agent Tiny 是什么?

Arduino利用AT指令连接乐鑫ESP8266实现串口通讯、配网

Agent Lite SDK使用指南(C)

猜你喜欢

转载自blog.csdn.net/qq_40318498/article/details/105479400