华为云IoT智慧物流案例04 | 4G网卡拨号(广和通L610-CAT.1模组)与北斗定位模组(中科微电子)数据解析

举报
实柏 发表于 2021/07/16 14:27:42 2021/07/16
【摘要】 回顾衔接上个章节,稍微调整代码,令1个IIC接口同时接入2个设备并获取数据。程序修改//作者:实柏//日期:2021-6-30/************************************************************///包含头文件#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<sy...

回顾

衔接上个章节,稍微调整代码,令1个IIC接口同时接入2个设备并获取数据。
程序修改
1
2
3
4
5

//作者:实柏
//日期:2021-6-30

/************************************************************/
//包含头文件
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/select.h>
#include<sys/time.h>
#include<errno.h>
//宏定义

#define SHT30_Address                               0x44         //1000100
#define BH1750_Address                              0x23         //0100011
#define I2C_RETRIES                                 0x0701
#define I2C_TIMEOUT                                 0x0702
#define I2C_SLAVE                                   0x0703       //IIC从器件的地址设置
#define I2C_BUS_MODE                                0x0780

typedef unsigned char uint8;
int fd = -1;

//函数声明
static uint8 dev_Init(void);
static uint8 BH1750_IIC(void);
static uint8 SHT30_IIC(void);
static uint8 BH1750_Dat_To_Lux(uint8* buf);

//
static uint8 dev_Init(void)
{
    fd  = open("/dev/i2c-0", O_RDWR);               // open file and enable read and  write

    if (fd < 0)
    {
        perror("Can't open /dev/BH1750 \n");       // open i2c dev file fail
        exit(1);
    }

    printf("open /dev/i2c-0 success !\n");          // open i2c dev file succes
    
}

static uint8 BH1750_IIC(void)
{
    if (ioctl(fd, I2C_SLAVE,BH1750_Address) < 0)
    { //set i2c address
        printf("fail to set i2c device slave address!\n");
        close(fd);
        return - 1;
    }

    printf("set slave address to 0x%x success!\n", BH1750_Address);
    return (1);
}

static uint8 SHT30_IIC(void)
{
    if (ioctl(fd, I2C_SLAVE,SHT30_Address) < 0)
    { //set i2c address
        printf("fail to set i2c device slave address!\n");
        close(fd);
        return - 1;
    }

    printf("set slave address to 0x%x success!\n", SHT30_Address);
    return (1);
}

static uint8 BH1750_Dat_To_Lux(uint8* buf)
{
    uint8 lux = 0;
    lux = buf[0];
    lux <<=8;
    lux += buf[1];
    lux = (int)(lux / 1.2);
}

// main
int main(int argc, char * argv[])
{
    unsigned char buf[8] = {0};
    dev_Init();
    usleep(1000 * 100);
    uint8 light = 0;
    float temperature=0;
    float humidity=0;
    while (1)
    {
    BH1750_IIC();
    usleep(1000 * 100);
    buf[0] = 0x20;
    if ( write(fd, buf, 1) != 1 ) {
        perror("faile to write config.\n");
        return -1;
    }
    buf[0] = 0;
    if (read(fd, buf, 2) != 2 ) {
        perror("faile to read back configure data.\n");
        return -1;
    }    
    printf("BH1750 0x%x 0x%x \n", buf[0], buf[1] );
    light = BH1750_Dat_To_Lux(buf);
    printf("light: %5d lux\r\n",light);
    usleep(1000 * 200);
    SHT30_IIC();
    usleep(1000 * 100);
    buf[0] = 0x2C;
    buf[1] = 0x0D;
    if ( write(fd, buf, 2) != 2 ) {
        perror("faile to write config.\n");
        return -1;
    }
    buf[0] = 0;
    buf[1] = 0;
    if (read(fd, buf, 6) != 6 ) {
        perror("faile to read back configure data.\n");
        return -1;
    }    
    printf("SHT30---->: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x \n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5] );
    temperature = ((float)((buf[0]<<8)+buf[1]))*175/65535-45;
    humidity = ((float)((buf[3]<<8)+buf[4]))*100/65535;
    printf("temperature:%f   humidity:%f\r\n",temperature,humidity);
    usleep(1000 * 200);
    }
    close(fd);
}

编译运行
光强度与温湿度

第一章 广和通L610-CAT.1模组调测和拨号脚本编写并验证网络

1.连接广和通L610-CAT.1模组,背面插入SIM物联网卡(缺口朝外)
L610模组
缺口朝外

2.AT指令测试L610模组,将右上角AT开关拨至左边与PC通信
AT开关
AT测试命令:

  1. AT+CPIN?
    +CPIN: READY //确保 SIM 卡就绪

  2. AT+CGSN? 查询 IMEI,每个模块唯一

  3. AT+CSQ(信号强度:数值越高,信号越强)
    +CSQ: 21,99 //确保模块能接收到信号

  4. AT+CFUN? (回复+CFUN: 1 确认模块正常工作模式。不是 1 则设置成 1)
    +CFUN: 1

  5. AT+CEREG?(查询驻网状态,1表示驻网成功,2/3,未注册或正在尝试搜索操作)
    +CEREG: 0,1

  6. AT+GTUSBMODE?(查询USB模式,31为PPP,32为ECM)
    +GTUSBMODE: 31

  7. AT+MIPCALL? (查询模块是否启用自动拨号功能,0未启用,1启用)
    +MIPCALL: 0串口AT测试

3.1开发板lsusb命令对USB / UART 枚举确认vid/pid(AT开关拨回右侧)
lsusb
3.2执行加载驱动命令sudo modprobe option及lsusb 和 ls /dev/ttyUSB*命令,查看USB串口驱动是否加载成功
驱动检查
驱动加载确认

4.PPP脚本编写拨号实现网络功能

4.1 检查终端是否安装 pppd(ppp拨号驱动)
命令:pppd -h
pppd
4.2 pppd连接脚本
存放路径:/etc/ppp/peers
连接脚本
连接脚本

4.3 连接建立规则脚本
存放路径:/etc/ppp/peers
连接建立规则脚本
建立规则

4.4 PPP拨号
在终端输入命令:pppd call 连接脚本名称
我这里是:pppd call L610_cat1
拨号
获取IP地址:pppd call L610_cat1 &
获取IP地址

4.5 ifconfig查询ppp网络接口是否存在
ppp网口

ping一下公网地址验证网络功能
ping www.baidu.com -I ppp0 (-I用来指定使用的网络设备)
ping
发现ping不通且会弹出这样一个问题(不能访问域名,DNS的问题)

ping
修改配置文件:vi /etc/resolv.conf
添加语句:nameserver 114.114.114.114
ping
source /etc/resolv.conf
再度ping华为云MQTT服务器地址
ping iot-mqtts.cn-north-4.myhuaweicloud.com
ping华为云
4G网络成功ping通公网

4.6 PPP 拨号参考流程图
ppp流程图

第二章 北斗定位模组(中科微电子)数据解析

1.连接北斗定位模组(串口通信方式,PPS引脚(时间脉冲信号)可不接),要接上陶瓷天线
连接后红色LED发光提示
在这里插入图片描述
模块红LED
2.查看模组发送的数据(模组连接后会自动发送数据)

  • 北斗模组是接到E53模块串口部分
    串口

  • 通过原理图我们得知连接的是串口5

  • 查询设备树文件我们知道其在Linux设备中为ttySTM3ttySTM3

  • 在终端进入/dev目录查找对应设备并查看其发送的数据

  • 命令:cat ttySTM3
    在这里插入图片描述
    可以看到北斗定位模组一直在发送各种前缀的数据信息
    数据信息
    3.查询手册将上报的数据通过程序(抓取关键字符串的算法)获取准确的定位信息(具体程序开发待后续开发QT应用)
    手册:CASIC 多模卫星导航接收机协议规范
    RMC头标识代表含义
    rmc
    rmc
    总结:

  • 广和通L610-CAT.1模组提供低功耗4G网络与华为云进行通讯,作为物联网网络的桥梁。

  • 北斗定位模组作为数据采集终端之一,可提供设备的位置信息。

这篇文章耽搁了许久因为我的模组硬件出了点问题,两位技术指导也是线上软件硬件和我一同排查问题(学到了排查的经验,阿正前辈直接把他的L610模块寄给我进行测试,流泪猫猫头.jpg),很感谢他们的热心帮助。

技术指导:
华为云社区与华为云学院:https://edu.huaweicloud.com/
人员:阿正前辈
广和通技术指导 王海亮大佬

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。