当前位置:首页 > 公众号精选 > wenzi嵌入式软件
[导读]前不久笔者在电子芯吧客看到了关于 TinkerNode NB-IOT 物联网的试用申请,由于之前自己接触 NB-IOT 模块,当时用的是 BC26,看到这块开发板也带着 NB IOT 的字样,就抱着试一试的心态申请一下,没想到申请到了,还是非常的意外,于是也就有了这篇评测~

前言

前不久笔者在电子芯吧客看到了关于 TinkerNode NB-IOT 物联网的试用申请,由于之前自己接触 NB-IOT 模块,当时用的是 BC26,看到这块开发板也带着 NB IOT 的字样,就抱着试一试的心态申请一下,没想到申请到了,还是非常的意外,于是也就有了这篇评测~

开发板概况

打开快递后,映入眼帘的是一个黑色的包装盒子,如下所示:

image-20201129150709211

我们打开盒子可以看到有如下几件东西:

image-20201130112407791

通过包装就可以看到这个板子支持WiFi、BT(蓝牙)、NB-IOT(窄带物联网通信)、GNSS(全球导航卫星系统),光是这四个就足以看出这块板子的强大,接下来看啊可能板子的实际图片,如下所示:

可以看到元器件排布的很紧密,整块板子很小,给人看起来就很精致的感觉,除了正面有元器件以外,背面也有元器件,如下图所示:

同样整个背面的元器件排布的也很紧凑,有 SIM 卡插槽,也有引出的 IO 口,设计的非常的精致,下面是正面和背面元器件的概况图:

image-20201130112437904

要使得模块能够正常工作,需要连接上天线和 SIM 卡,连接示意图如下所示:

组装图

到此,基本就对板子的一个大体概况有了一个基本的认识,那接下来要把当前这个板子用起来,自然就需要当前板子的相关资料,目前有的资料有视频资料和文档资料,下面给出两处资料的链接:

文档资料:http://wiki.dfrobot.com.cn/SKU_DFR0530_TinkerNode_NB-IoT%E7%89%A9%E8%81%94%E7%BD%91%E5%BC%80%E5%8F%91%E6%9D%BF_V1_0

视频资料:https://mc.dfrobot.com.cn/thread-304116-1-1.html

有了资料了那就可以进行实操了,接下来看我们如何一步一步将这块板子玩起来。

开发工具的安装

再进行安装 IDE 之前,需要安装一个驱动,驱动安装包在教程中可以找到,下面是安装的示意图:

image-20201130220213503

当前的开发板所选择的 IDE 是 Arduino ,这里给出下载地址:https://www.arduino.cc/en/software,下面是该软件的界面:

image-20201130214413048

首先,要能够驱动当前的板子,那么就需要添加开发板驱动的 URL,添加步骤文件 -> 首选项,然后就打开了如下所示的界面:

image-20201130214925832

然后将下述所示的网址复制到框内:http://download.dfrobot.top/TinkerNode-NB-IoT/package_TinkerNode-NB-IoT_index.json

添加了网址之后,就需要更新板子信息,按照如下步骤进行更新:工具 -> 开发板 -> 开发板管理器,更新完成后的界面如下图所示:

image-20201130215442187

然后再搜索框搜索 TinkerNode,选择 TinkerNode ,选择版本后进行安装。

image-20201130215833262

到此为止,准备工作就做完了,下面进入代码实验阶段。

代码实验

点个灯

作为嵌入式开发者来说,在拿到一块板子的时候,第一件想到的事就是点个灯吧,流水灯,呼吸灯,等等等等,这块板子也一样,我们可以看到板子有一颗小灯是留给开发者操作的,如下图所示:

image-20201203135253298

那么如何点亮这颗小灯呢,我们打开 Arduino 的一个示例程序,打开方式如下所示:

打开之后的代码如下所示:

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}

如果是接触过 Arduino 的朋友,那么在看到上述这样的代码比较熟悉,但是如果之前没有接触过 Arduino 的朋友在看到这样的代码之后,就会有点懵了,main函数呢?在整个文件中看不到 main函数的存在,其实,这是 Arduino 为了降低开发的门槛,省略掉了一些比较底层的东西,使得更多爱好者能够上手 Arduino 编程。但实际上,main函数是存在的,我们使用搜索工具在软件的安装目录搜索 main函数,可以得到如下的结果:

image-20201203135932968

文件的代码内容如下所示:

#include 

// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()return 0; }

// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }

void setupUSB() __attribute__((weak));
void setupUSB() { }

int main(void)
{
    init();

    initVariant();

#if defined(USBCON)
    USBDevice.attach();
#endif

    setup();

    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }

    return 0;
}

这个时候再来看 setup 和 loop函数,就比较清晰明了了,这也就是为什么要把初始化的内容放到 setup里面去,为什么要把执行的操作放到 loop里面去。紧接着,我们在来看点灯的代码,我们在使用单片机的时候,如果要操做一个 IO 口,那么就需要知道这个 IO 口的端口以及引脚,但是我们在看这段代码的时候,只看到了一个LED_BUILTIN,并没有端口号和引脚号什么的,那是如何做到的呢?其实这也是 Arduino 为了降低门槛做的操作,它将这些引脚的定义都写到了库里面,各个开发板的引脚定义都对应各个开发板的pins_arduino.h文件,下面是在软件的安装目录找到的 pins_arduino.h文件。

image-20201203141046508

下面是文件里的内容:

image-20201203141533116

可以看到LED_BUILTIN的定义在不同的开发板引脚序号也是不相同的,知道了这些底层一些的东西之后,我们回过头来再来看点灯的代码,大体意思就是设置 IO 口的输出模式,然后设置 IO 的电平,最终达到闪烁的效果,将代码按照下述顺序编译并上传之后,就可以在板子上看到小灯闪烁的现象了。

image-20201203141857800

到此,点灯操作到此结束。

连个网

设备向云端传输数据

在点了个灯之后,这是任何一款嵌入式开发板都具有的基本功能,那作为一款物联网开发板来说,它的特点自然是能够联网并传输数据了,接下来展示的就是开发板联网之后向云端发送数据的示例。首先,我们的云端采用的是 Easy IOT:

image-20201203142224122

点击工作间,进到如下所示的一个界面:

image-20201203142316579

上述图片所示的,我们需要记录如下三个信息,才能让我们的板子连接至云端。

  • user:Nkoy_LAMR

  • password:HkTslY0Mgz

  • Topic:Gm9l_Y0Gg

下面是上传数据的代码:

#include 
#include 
#include "DFRobot_Iot.h"

/* 配置WiFi名和密码 */
const char * WIFI_SSID = "TP-LINK_C104";
const char * WIFI_PASSWORD = "ee104109";

/*配置设备认证信息*/
String Iot_id = "Nkoy_LAMR";
String Client_ID = "12345";
String Iot_pwd = "HkTslY0Mgz";

/* 配置 IOT 云平台的IP地址和端口号 */
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;

/* 配置要推送或者订阅的 topic */
const char * pubTopic = "Gm9l_Y0Gg";

DFRobot_Iot myEasyIoT;
WiFiClient espClient;
PubSubClient client(espClient);

void connectWiFi()
{
  WiFi.disconnect();
  delay(100);
  Serial.print("Connecting to");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP Adderss: ");
  Serial.println(WiFi.localIP()); 
}

/*连接到IoT云服务器*/
void ConnectCloud() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(myEasyIoT._clientId, myEasyIoT._username, myEasyIoT._password)) {
      Serial.println("Connect Server OK");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" Try again in 5 seconds");
      delay(5000);
    }
  }
}

void setup() {
  // put your setup code here, to run once:
   /*初始化串口,波特率115200*/
  Serial.begin(115200);

  /*连接WIFI*/
  connectWiFi();

  /*配置需要连接的IoT云服务器(Easy-IoT)*/
  myEasyIoT.init(EasyIot_SERVER, Iot_id, Client_ID, Iot_pwd);
  client.setServer(myEasyIoT._mqttServer, PORT);

  /*连接到Easy-IoT*/
  ConnectCloud();

}

void loop() {
  // put your main code here, to run repeatedly:
  /*IoT云服务器断线重连*/
  if (!client.connected()) {
    ConnectCloud();
  }
  client.loop();

  /*每隔一段时间向Easy-IoT*/
  Serial.println("Sending message to cloud...");
  client.publish(pubTopic, "Hello");
  Serial.println("Message is sent.");
  delay(10000);
}

上述的代码也很好理解,就是每隔一段时间向云端发送 Hello,我们打开云端可以看到云端也确实接受到了设备给它发送的数据,如下所示:

image-20201203142757003

到这,设备端向云端发送数据的操作就完成了,那么云端是如何向设备端发送数据的呢?那来看接下来的叙述。

云端向设备端发送数据

云端向设备端发送数据,同样的,先贴出代码:

#include 
#include 
#include "DFRobot_Iot.h"

/*配置WIFI名和密码*/
const char * WIFI_SSID = "TP-LINK_C104";
const char * WIFI_PASSWORD = "ee104109";

/*配置设备的认证信息*/
String Iot_id = "Nkoy_LAMR";
String Client_ID = "12345";
String Iot_pwd = "HkTslY0Mgz";

/*配置IoT云平台的IP地址和端口号*/
String EasyIot_SERVER = "182.254.130.180";
uint16_t PORT = 1883;

/*配置要推送(Publish)或订阅(Subscribe)的topic*/
const char * subTopic = "Gm9l_Y0Gg";

DFRobot_Iot myEasyIoT;
WiFiClient espClient;
PubSubClient client(espClient);

/*连接WiFi*/
void connectWiFi() {
  WiFi.disconnect();
  delay(100);
  Serial.print("Connecting to ");
  Serial.println(WIFI_SSID);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.println("WiFi connected");
  Serial.print("IP Adderss: ");
  Serial.println(WiFi.localIP());
}

/*连接到IoT云服务器*/
void ConnectCloud() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect(myEasyIoT._clientId, myEasyIoT._username, myEasyIoT._password)) {
      Serial.println("Connect Server OK");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" Try again in 5 seconds");
      delay(5000);
    }
  }
}

/*回调函数。当从订阅的topic收到消息时,该函数被调用。*/
void callback(char * topic, uint8_t * payload, unsigned int len) {

  /*显示收到的topic名称和消息内容*/
  Serial.print("Recevice [Topic:");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < len; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void setup() {
  /*初始化串口,波特率115200*/
  Serial.begin(115200);

  /*连接WIFI*/
  connectWiFi();

  /*配置需要连接的IoT云服务器(Easy-IoT)*/
  myEasyIoT.init(EasyIot_SERVER, Iot_id, Client_ID, Iot_pwd);
  client.setServer(myEasyIoT._mqttServer, PORT);

  /*配置回调函数*/
  client.setCallback(callback);

  /*连接到Easy-IoT*/
  ConnectCloud();

  /*订阅(Subscribe)指定topic*/
  client.subscribe(subTopic);
  Serial.print("Topic:");
  Serial.print(subTopic);
  Serial.println(" subscribed!");
}

void loop() {
  /*IoT云服务器断线重连*/
  if (!client.connected()) {
    ConnectCloud();
  }
  client.loop();
}

代码阅读起来逻辑很清晰,就不再这里赘述了,我们通过运算向设备端发送123456,发送窗口如下如图所示:

image-20201203143757546

发送了之后,我们将接受到的数据用串口打印出来,可以看到如下所示的消息:

image-20201203143837357

说明数据发送是没有问题的。到此,就基本完成了,但是实际上这整个过程对于一个嵌入式开发者是存在很多疑问的,就拿设备端向云端发送数据这一段来讲,下面的这三个头文件在哪里,当前所使用的 IDE 并不能够直接打开这三个头文件,应该如何查看?

#include 
#include 
#include "DFRobot_Iot.h"

要查看头文件的原因也很简单,如果不能查看头文件,那么也就不知道如何调用 API 接口,连接 WiFi 的接口,连接云端的接口,这些都是未知的,这要如何写呢?所以,查看头文件是很有必要的,接下来,就介绍如何打开我们所包含的头文件,首先,我们得知道路径,按照如下方式打开图示的选项。

image-20201203144437951

打开这两个之后,我们在编译的时候,就可以看到相关信息,如下图所示:

image-20201203144820304

我们按照这个信息进行查找一下,并用 VSCODE 打开,打开界面如下图所示:

image-20201203145412545

可以找到.h文件以及对应的 .cpp 文件,也就知道了对应的实现,对应的也就知道了相应的接口。

结论

上述就是一个基本的介绍了,当然这个板子的功能那么强大,还有很多待探索的功能,此次的开箱评测就到这里啦~


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭