ESP32移植Openharmony外设篇(9)NB-IOT

embedded/2025/2/28 23:00:38/

NB-IOT(窄带物联网

模块介绍

NB-IoT(Narrowband Internet of Things)是一种低功耗广域物联网(LPWAN)技术,专为低功耗、低数据速率和大规模连接的物联网应用而设计。它采用窄带宽信道和低复杂度的调制方案,以实现长距离传输、室内外覆盖范围广和强鲁棒性等特点。

技术原理

NB-IoT是在LTE(Long Term Evolution)技术标准下的一种窄带物联网技术,它利用LTE网络的空闲资源,在现有LTE基础设施上进行部署,提供一种低功耗、长距离通信的解决方案。

NB-IoT采用窄带信道,每个信道带宽只有180 kHz,使其能够更好地穿透建筑物和障碍物,提供广阔的覆盖范围。

NB-IoT采用低复杂度的调制和编码方案,以降低终端设备的功耗,并支持大规模连接,可以同时连接大量的设备。

特点和优势

  • 低功耗:NB-IoT在待机和通信状态下都具有低功耗特性,可以延长设备的电池寿命。
  • 长距离传输:NB-IoT具有良好的传输性能,可以在长距离范围内进行通信,适用于广域覆盖的应用场景。
  • 室内外覆盖广:NB-IoT信号穿透能力强,可以有效地覆盖室内和室外环境,为物联网应用提供全面的覆盖。
  • 低成本:由于NB-IoT利用现有的LTE基础设施进行部署,无需建立单独的物联网网络,降低了网络部署和运营成本。
  • 大规模连接:NB-IoT支持大规模设备连接,每个基站可以同时处理大量的设备连接请求,适用于物联网中大量设备的应用场景。

应用领域

  • 城市智能化:NB-IoT可应用于智慧城市项目,如智能照明、智能交通、智能停车等。
  • 工业自动化:NB-IoT可用于监测和控制工业设备、机器健康监测、环境监测等。
  • 农业和环境监测:NB-IoT可用于农业领域的土壤湿度监测、气象数据收集、农作物灌溉控制等,以及环境监测领域的空气质量监测、水质监测等。
  • 物流和供应链管理:NB-IoT可以用于物流跟踪和监控,实现货物的追踪、温湿度监测、运输过程中的安全监控等。
  • 智能电表和能源管理:NB-IoT可用于智能电表的远程抄表和能源消耗监测,提供精确的用电数据和能源管理功能。
  • 健康医疗:NB-IoT可以应用于健康监测设备,如远程心率监测、血压监测等,实现远程医疗和健康管理。
  • 安全监控:NB-IoT可用于安防监控系统,如远程视频监控、智能门禁等,实现安全监控和报警功能。

原理图

我们这里通过使用AT指令集来控制NBIOT模块连接公网的TCP服务器

这里推荐一个免费的公网测试服务器:TCP服务端调试

我们使用的NBIOT模块是果云科技的GA7,相关AT指令集在网上能搜到,我们这里给出几个比较常见的AT指令

常见AT指令

1. 命令回显

2. 网络注册

3. 获取信号质量

4. 设置当前日期和时间

5. 设置通讯波特率

6. 指示sim卡状态

7. 创建SOCKET套接字

8. 连接远程服务器

9. 发送数据

10. 接收数据

参考代码

BUILD.gn

# Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.import("//kernel/liteos_m/liteos.gni")
module_name = get_path_info(rebase_path("."), "name")
kernel_module(module_name){sources = ["uart_example.c",]include_dirs = ["//drivers/hdf_core/framework/include/platform/","//drivers/hdf_core/framework/include/utils/","//drivers/hdf_core/framework/support/platform/include/uart","//drivers/hdf_core/adapter/khdf/liteos_m/osal/include/","//drivers/hdf_core/framework/include/core/","//drivers/hdf_core/framework/include/osal/","//device/soc/esp/esp32/components/driver/include","//device/soc/esp/esp32/components/esp_adc_cal/include","//device/soc/esp/esp32/components/driver/esp32/include",]
}

uart_example.c

/** Copyright (c) 2022 Hunan OpenValley Digital Industry Development Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**    http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/#include <stdio.h>
#include "cmsis_os2.h"
#include "ohos_run.h"
#include <stdio.h>
#include "driver/uart.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp_log.h"#define SYS_DELAY_TICKS 200
#define TASK_STACK_SIZE 4096
#define TASK_PRIO 25
#define BUFF_MAX_SIZE 128
#define UART_BAUDRATE 115200#define UART_INDEX 0 // 串口号osThreadId_t g_taskID = NULL;// 定义串口的引脚
#define ECHO_TEST_TXD (GPIO_NUM_32)
#define ECHO_TEST_RXD (GPIO_NUM_33)
#define ECHO_TEST_RTS (UART_PIN_NO_CHANGE)
#define ECHO_TEST_CTS (UART_PIN_NO_CHANGE)#define ECHO_UART_PORT_NUM (UART_NUM_1)
#define ECHO_UART_BAUD_RATE (115200)#define BUF_SIZE (1024)static void uart_test(void)
{/* Configure parameters of an UART driver,* communication pins and install the driver */uart_config_t uart_config = {.baud_rate = ECHO_UART_BAUD_RATE,.data_bits = UART_DATA_8_BITS,.parity = UART_PARITY_DISABLE,.stop_bits = UART_STOP_BITS_1,.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,};int intr_alloc_flags = 0;#if CONFIG_UART_ISR_IN_IRAMintr_alloc_flags = ESP_INTR_FLAG_IRAM;
#endifESP_ERROR_CHECK(uart_driver_install(ECHO_UART_PORT_NUM, BUF_SIZE, BUF_SIZE, 0, NULL, intr_alloc_flags));ESP_ERROR_CHECK(uart_param_config(ECHO_UART_PORT_NUM, &uart_config));ESP_ERROR_CHECK(uart_set_pin(ECHO_UART_PORT_NUM, ECHO_TEST_TXD, ECHO_TEST_RXD, ECHO_TEST_RTS, ECHO_TEST_CTS));// Configure a temporary buffer for the incoming datauint8_t *data = (uint8_t *)malloc(BUF_SIZE);printf("start recv nbiot!\n");// Write data back to the UARTuart_write_bytes(ECHO_UART_PORT_NUM, "AT\r\n", strlen("AT\r\n"));// Read data from the UARTint len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);if (len){data[len] = '\0';printf("Recv str: %s\r\n", (char *)data);}// 取消回显uart_write_bytes(ECHO_UART_PORT_NUM, "ATE0\r\n", strlen("ATE0\r\n"));// 询问SIM卡激活情况uart_write_bytes(ECHO_UART_PORT_NUM, "AT+CPIN?\r\n", strlen("AT+CPIN?\r\n"));len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);if (len){data[len] = '\0';printf("%s\r\n", (char *)data);}// 询问模块注册情况uart_write_bytes(ECHO_UART_PORT_NUM, "AT+CREG?\r\n", strlen("AT+CREG?\r\n"));len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);if (len){data[len] = '\0';printf("%s\r\n", (char *)data);}// 此处需要休眠10秒,等待模块初始化完成sleep(10);// 询问模块注册情况uart_write_bytes(ECHO_UART_PORT_NUM, "AT+CREG?\r\n", strlen("AT+CREG?\r\n"));len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);if (len){data[len] = '\0';printf("%s\r\n", (char *)data);}// 创建链接uart_write_bytes(ECHO_UART_PORT_NUM, "AT+SKTCREATE=1,1,6\r\n", strlen("AT+SKTCREATE=1,1,6\r\n"));// 等待2秒sleep(2);// 链接到TCP服务器 AT+SKTCONNECT=0,8.135.10.183,31217uart_write_bytes(ECHO_UART_PORT_NUM, "AT+SKTCONNECT=0,8.135.10.183,31217\r\n", strlen("AT+SKTCONNECT=0,8.135.10.183,31217\r\n"));len = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);if (len){data[len] = '\0';printf("%s\r\n", (char *)data);}// 这里可以接受TCP数据了while (1){// Read data from the UARTlen = uart_read_bytes(ECHO_UART_PORT_NUM, data, (BUF_SIZE - 1), 20 / portTICK_PERIOD_MS);if (len){data[len] = '\0';printf("Recv str: %s\r\n", (char *)data);}}return;
}#define AT_CMD_MAX_LEN 256
// TCP发送数据
int send_tcp_message(char *msg)
{unsigned char ret;char at_sktsend[AT_CMD_MAX_LEN] = {'\0'};char hex_str[65] = {'\0'};if (msg == NULL){return -1;}ret = str2hex(msg, hex_str, 65);if (ret != 1){return -2;}snprintf(at_sktsend, AT_CMD_MAX_LEN, "AT+SKTSEND=0,%d,%s\r\n", strlen(msg), hex_str);printf("at_sktsend:%s\r\n", at_sktsend);uart_write_bytes(ECHO_UART_PORT_NUM, at_sktsend, strlen(at_sktsend));
}static void uart_example_task(void)
{printf("into uart hdf example!\n");osThreadAttr_t attr;attr.name = "uart_test";attr.attr_bits = 0U;attr.cb_mem = NULL;attr.cb_size = 0U;attr.stack_mem = NULL;attr.stack_size = TASK_STACK_SIZE;attr.priority = TASK_PRIO;g_taskID = osThreadNew((osThreadFunc_t)uart_test, NULL, &attr);if (g_taskID == NULL){printf("Failed to create Test Uart thread!\n");}
}OHOS_APP_RUN(uart_example_task);

编译并烧录

在源码根目录下使用hb工具对写好的代码进行编译

选择mini级系统

同理 产品选择esp公司下的esp32

选择完毕后在源码根目录下执行hb build -f 进行编译

编译完成后会有如下界面,并且编译后的代码固件位于:out\esp32\esp32

实验现象

按下ESP32开发板上的EN键,即可观察到实验现象:

我们在公网的TCP测试服务器中可以发送测试数据,串口助手中会收到对应的ASCII码:

串口助手打印的提示消息如下:


http://www.ppmy.cn/embedded/168904.html

相关文章

Yolo各个系列的模型、ResNet、Pyrimid network、VGG、PointNet、mobilenet模型

YOLO系列模型 YOLO&#xff08;You Only Look Once&#xff09;是一个用于实时目标检测的深度学习模型系列&#xff0c;由 Joseph Redmon 等人提出。 YOLOv1 发布年份 &#xff1a;2015 年 主要特点 &#xff1a; 首次提出将目标检测视为一个回归问题&#xff0c;将输入图像…

内网穿透:打破网络限制的利器

目录 深入理解内网穿透 内网与外网的奥秘 内网穿透的原理剖析 总结与展望 在如今这个数字化时代&#xff0c;网络已经成为我们生活和工作中不可或缺的一部分。但你是否遇到过这样的困扰&#xff1a;在家办公时&#xff0c;想要访问公司内部的文件服务器&#xff0c;却因为网…

Python网络爬虫与数据采集实战——网络爬虫的基本流程

网络爬虫&#xff08;Web Scraper&#xff09;是用于自动化地从互联网上抓取信息的程序。它广泛应用于搜索引擎、数据采集、市场分析等领域。本文将详细探讨网络爬虫的基本流程&#xff0c;包括URL提取、HTTP请求与响应、数据解析与存储&#xff0c;以及一个实际的爬虫示例。文…

【超详细】神经网络的可视化解释

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

APISIX Dashboard上的配置操作

文章目录 登录配置路由配置消费者创建后端服务项目配置上游再创建一个路由测试 登录 http://192.168.10.101:9000/user/login?redirect%2Fdashboard 根据docker 容器里的指定端口&#xff1a; 配置路由 通过apisix 的API管理接口来创建&#xff08;此路由&#xff0c;直接…

git 的 Detached HEAD

在 Git 版本管理中&#xff0c;Detached HEAD 是指你当前的工作状态不再指向任何分支&#xff0c;而是指向一个特定的提交&#xff08;commit&#xff09;。 通常情况下&#xff0c;HEAD 是指向你当前工作分支的指针&#xff0c;例如 main 或 feature-branch。当你切换到一个特…

《Effective Objective-C》阅读笔记(上)

目录 高质量iOS之熟悉OC 了解OC语言的起源 在类的头文件中尽量少引入其他头文件 多用字面语法&#xff0c;少用与之等价的方法 字面数值 字面量数组 字面量字典 局限性 多用类型常量&#xff0c;少用#define预处理指令 用枚举表示状态、选项、状态码 高质量iOS之对象…

飞书webhook监控业务系统端口

钉钉告警没有额度了&#xff0c;替代方案使用企业微信或者是飞书&#xff0c;以下脚本是飞书为例 监控ping也就是活动主机 #!/bin/bash # IP Ping 监控脚本 date$(date "%Y-%m-%d %H:%M:%S") # 根据实际情况修改飞书 Webhook 地址 webhook"https://open.feish…