|
本帖最后由 点点&木木 于 2019-4-12 20:18 编辑 通过Twilio的Alfa Developer Kit在T-Mobile的网络上发送命令,成为NB-IoT的先驱。 ; T" V+ a! e5 u2 _- Q) `
. t+ m, H0 j* P; Y* }8 b 硬件组件 Twilio可编程无线 × 1 Twilio Alfa开发人员套件 × 1 ^0 {- K$ i* @1 P7 c" G介绍 NB-IoT,也称为Narrowband-IoT ,是一种新的蜂窝技术,承诺低成本,低功耗,广域覆盖和长电池寿命。这些特性有助于实现“ 智能设备”。 T-Mobile 已 在美国部署NB-IoT覆盖范围,Twilio是第一家提供NB-IoT开发套件的公司。Twilio的Alfa Developer Kit 具有与SeeedStudio合作开发的开发板。开发板可以使用Twilio窄带SIM(套件中附带)访问T-Mobile NB-IoT网络 。一旦进入网络,开发人员可以使用TwilioBreakout SDK在多个NB-IoT套件之间交换数据。 这篇文章演示了如何使用Twilio的Developer Kit连接到T-Mobile的NB-IoT网络。连接后,我们将使用Breakout SDK通过网络发送“hello world”消息。您还可以在TwilioIoT下的GitHub上找到已完成的项目。 6 i# v( X; C: E2 }: `& s- _' }' F7 @ Y; w6 k& j( X 硬件要求 适用于T-Mobile窄带的Twilio开发人员套件 Twilio窄带SIM卡 LTE天线 Micro USB线 锂电池 2 T1 E Z: }: a& e! M5 H: Y: ^4 i" m" M( h$ I 软件要求 Arduino IDE SDK 浏览开发人员工具包 开发人员套件附带一个开发板,专门用于连接T-Mobile的NB-IoT网络。还包括Seeed Studio的几个硬件附件,可用于开发NB-IoT“智能设备”。 打开开发人员工具包框。该套件包含: 一套格罗夫传感器 按钮 超声波模块 温度/湿度 Twilio窄带SIM(全尺寸,迷你,微型和纳米) 开发板 LTE天线 GPS天线 锂电池 Micro-USB线 额外的布线
设置Twilio窄带SIM卡
从开发工具包中删除Twilio窄带SIM卡。接下来,在Twilio控制台中注册并激活您的窄带SIM卡。窄带SIM的过程遵循与Twilio可编程无线SIM相同的过程。 * h# I* n/ F) F+ g4 e, F 连接器件 从Twilio SIM卡中分离Nano SIM(最小尺寸)。
从Developer Kit中删除开发板。
将Twilio窄带SIM插入电路板下方的SIM插槽。
接下来,将LTE天线连接到电路板。
连接电池锂电池。建议始终插入锂电池,因为USB电源无法为电路板提供足够的峰值电源。
使用提供的Micro-USB电缆将开发板连接到计算机。您已准备好连接到网络。 配置NB-IoT套件固件 在我们开始编程电路板之前,我们需要更新电路板的固件。要在Macintosh上执行此操作,我们需要Homebrew 来安装dfu-util。 如果尚未安装,请打开终端并粘贴以下内容以安装Homebrew。 /usr/bin/ruby -e "$(curl -fsSL http://raw.githubusercontent.com/Homebrew/install/master/install) 安装完成后,安装dfu-util 软件包。该软件包用于从USB连接设备下载和上载固件。 brew install dfu-util libusb 对于Windows用户,需要一组不同的USB驱动程序 。 设置软件环境 开发板使用Arduino IDE 对微控制器进行编程。Twilio开发了一种名为Breakout的NB-IoT专用软件开发套件 。该SDK使设备可以通过T-Mobile NB-IoT网络发送M2M命令。Breakout SDK可以在GitHub上找到。
从GitHub 下载Breakout_Arduino_Library.zip 。打开Arduino IDE并将.zip添加到Arduino IDE库中。 转到Sketch>Include Library> Add.ZIP库 并选择Breakout_Arduino_Library.zip 。
安装.zip文件后,我们需要安装一组板芯。开发板基于STM32F4 芯片组。要在板上开发,我们需要在Arduino IDE中下载STM32F4内核。 转到Arduino>首选项。将以下URL复制到AdditionalBoards Manager URL字段: http://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json
单击确定。 ' Q5 u& X! M/ W+ s4 b# oSTM32F4板现在可以在ArduinoIDE 板卡管理器中使用。接下来打开Boards Manager 以安装STM32F4板芯。
在Boards Manager中 搜索“Seeed”。找到并选择“Seeed STM32F4 Boards”版本“1.2.3+”并单击“安装”。
重新启动Arduino IDE。 " G0 ~# I% E5 ^* V安装STM32F4内核后,开发板即可进行编程。接下来选择电路板和电路板端口。 单击工具>板> Wio Tracker LTE
单击工具>端口> {您的调制解调器端口} OSX:/dev/{cu|tty}.usbmodem{XXXX} Linux:/ dev / ttyACM{X} Windows:COM {X}
配置HelloWorld.ino文件 打开Arduino IDE中Breakout SDK提供的Hello World示例。 单击文件>示例>突破Arduino库> HelloWorld
在HelloWorld.ino中,我们需要进行一些修改,以便我们可以连接到T-Mobile NB-IoT网络。在“HelloWorld.ino”文件中找到psk_key 。
每个开发板都有一个独特的SIM ICCID和预共享密钥(psk )。我们正在使用的电路板的psk需要复制到HelloWorld.ino草图中。需要此密钥才能连接到T-Mobile窄带网络。 在BreakoutSDK 选项卡下 找到Credentials 导航到Twilio控制台中的可编程无线 单击SIM卡 找到以前注册的窄带SIM卡 如果它显示预共享密钥(psk),请单击眼睛徽标以显示密钥 复制psk 将您的psk粘贴到上面代码中的HelloWorld.ino文件中
设置psk后,让我们更改setPollingInterval。这决定了BreakoutSDK 为新命令轮询的频率。找到line breakout->setPollingInterval。
将'setPollingInterval'间隔从 10 更改为1. 这会将轮询 时间从10分钟更改为1分钟。 breakout->setPollingInterval(1 * 60); 下面是完整的Arduino草图。有关如何在GitHub上找到Breakout SDK的更多细节。 #include <Seeed_ws2812.h> #include <BreakoutSDK.h> static const char *psk_key = "YOUR_PSK";1 c$ G. D, D" \ Breakout *breakout = &Breakout::getInstance(); WS2812 strip = WS2812(1, RGB_LED_PIN);3 \+ |7 v. @5 F) V! ?. z ~# w void enableLed() {0 N- \+ A6 W! j- @: P6 \6 y pinMode(RGB_LED_PWR_PIN, OUTPUT);- m1 }" `7 ~7 a! S: j% B7 a5 c digitalWrite(RGB_LED_PWR_PIN, HIGH); strip.begin(); strip.brightness = 5;' O2 ?2 I/ i i2 _6 }0 d+ z# c- W' Y } void setup() {$ H3 W' j' f! M5 z owl_log_set_level(L_INFO);8 }' w4 s( B, d1 q LOG(L_WARN, "Arduino setup() starting up\r\n"); enableLed();- u$ m% r1 O, F) p, H% A strip.WS2812SetRGB(0, 0x20, 0x20, 0x00);& A9 E7 x$ y* a strip.WS2812Send(); breakout->setPurpose(device_purpose); breakout->setPSKKey(psk_key);& \# C6 B+ V* ^) a/ o5 f; g0 a breakout->setPollingInterval(1 * 60); // Optional, set to 1 minute // Powering the modem and starting up the SDK# k. u0 E+ h$ B9 R% v, N/ O# \# K1 P LOG(L_WARN, "Powering on module and registering..."); breakout->powerModuleOn();, C* C$ V) \0 A, }* x const char command[] = "Hello World from BreakoutSDK test app"; if (breakout->sendTextCommand(command) == COMMAND_STATUS_OK) { LOG(L_INFO, "Tx-Command [%s]\r\n", command); } else { LOG(L_INFO, "Tx-Command ERROR\r\n");8 s4 N# K& b4 u# b }9 W+ K7 T$ D6 z# z* @3 @ // Set RGB-LED to green' Y @2 w L5 \: K strip.WS2812SetRGB(0, 0x00, 0x40, 0x00); strip.WS2812Send(); LOG(L_WARN, "... done powering on and registering.\r\n");! R% q- D( s/ t4 O) T9 N$ E LOG(L_WARN, "Arduino loop() starting up\r\n"); } void your_application_example() { if (breakout->hasWaitingCommand()) { char command[141]; size_t commandLen = 0; bool isBinary = false;4 k/ r) N) x, W$ `# M command_status_code_e code = breakout->receiveCommand(140, command, &commandLen, &isBinary);; z1 Z! v4 ]3 R% H1 l" K$ C* B switch (code) { case COMMAND_STATUS_OK:/ y0 e! T# ~0 _ y1 [; ]! b LOG(L_INFO, "Rx-Command [%.*s]\r\n", commandLen, command); break; case COMMAND_STATUS_ERROR:6 p2 L8 q; F2 B4 ^; z2 k# s! g LOG(L_INFO, "Rx-Command ERROR\r\n");! p& q0 q, K) C" I* ~ break; case COMMAND_STATUS_BUFFER_TOO_SMALL:9 E2 @6 e- r" c LOG(L_INFO, "Rx-Command BUFFER_TOO_SMALL\r\n"); break;5 v( P+ ^6 y9 e5 I/ e case COMMAND_STATUS_NO_COMMAND_WAITING:0 ]& M: z1 q% j$ w, k LOG(L_INFO, "Rx-Command NO_COMMAND_WAITING\r\n"); break; default: LOG(L_INFO, "Rx-Command ERROR %d\r\n", code); } }0 `7 s% p% Y4 c% m: A }: x, P3 {* M2 O2 v8 n! V void loop() {9 g/ E# m: M. {; H9 y* `' f your_application_example();8 |9 K Y# T/ q2 C2 ~ breakout->spin();7 j3 L& i6 i w1 I' m+ V delay(50);1 M& k$ b" f% \0 U) H- k }' Q/ x# u; x9 o3 {& c 进入Bootloader模式 要将代码上传到开发板,需要将设备置于Bootloader模式。 按住Developer Board下方的BOOT0按钮。
按住开发板顶部的RST。
释放开发板顶部的RST按键。 释放BOOT0按钮以启用Bootloader模式。 在Arduino IDE中按Upload。
将代码上传到开发板后,按RST按钮。这将使主板退出Bootloader模式。完成的代码可以在TwilioIoTGitHub上找到。 连接到网络并发送命令 重置电路板后,启动NB-IoT网络注册过程。这将在网络上注册板并为设备分配带宽。在此过程中,网络连接LED将呈橙色亮起。
打开串行监视器以观察电路板注册和连接到网络。
当开发板成功注册到NB-IoT网络时,网络连接LED将呈蓝色亮起。连接稳定时,以下消息将显示在Arduino串行监视器中:
当电路板成功连接到NB-IoT网络时,将初始化Breakout SDK。
这是Breakout SDK将命令发送到Twilio时的串行监视器输出。
将记录Breakout SDK发送和接收的每个命令。通过NB-IoT网络发送的命令可以在可编程无线下的Twilio控制台中找到。 导航到Twilio控制台中的可编程无线 单击SIM卡 找到以前注册的窄带SIM卡 单击“命令”选项卡
使用Breakout SDK接收命令 Breakout SDK将每分钟轮询一个新命令。使用cURL,您可以使用Sim唯一名称将命令发送到NB-IoT板。 curl -X POST http://wireless.twilio.com/v1/Commands \ --data-urlencode "Sim=Breakout" \ --data-urlencode "Command=this is a test" \ -u ACXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX:your_auth_token % F" c* n1 N$ m `( v观看Arduino IDE串行监视器以查看收到的命令:
成为NB-IoT的首批先驱之一感觉如何? 使用NB-IoT的“事物”的未来 这是硬件和软件方面物联网开发的特殊时期。许多流程正在变得优化......许多流程仍然笼罩在神秘之中。 这些“事物”影响着我们的日常生活 - 往往没有我们意识到它。从踏板车到家庭自动化的每个部分现在都具有一些互连元素。 NB-IoT更进一步。Narrowband的低成本,低功耗,广域覆盖和长电池寿命使“智能设备”更加智能化。成为TwilioNarrowband的物联网先锋。让我们一起建立梦想。 6 x$ ^ a4 M1 v" Z原理图 NB-IoT板设置
代码 这是Breakout SDK HelloWorld.ino文件的修改版本。 #include <Seeed_ws2812.h> #include <BreakoutSDK.h> ! e( |9 ?& J* X7 `# tstatic const char *device_purpose = "Dev-Kit"; static const char *psk_key = "YOUR_PSK"; Breakout *breakout = &Breakout::getInstance(); : h7 z+ E8 L* }5 |1 QWS2812 strip = WS2812(1, RGB_LED_PIN); ' v6 t% D, v; S) ?( bvoid enableLed() { pinMode(RGB_LED_PWR_PIN,OUTPUT); digitalWrite(RGB_LED_PWR_PIN, HIGH); strip.begin(); strip.brightness = 5; } S4 l. B9 ^0 \void setup() { owl_log_set_level(L_INFO); LOG(L_WARN, "Arduino setup() starting up\r\n"); + g* A) E0 X# @5 J enableLed(); strip.WS2812SetRGB(0, 0x20, 0x20, 0x00); strip.WS2812Send(); 5 p* ~ L6 P; c breakout->setPurpose(device_purpose); breakout->setPSKKey(psk_key); breakout->setPollingInterval(1 * 60); // Optional, set to 1 minute //Powering the modem and starting up the SDK LOG(L_WARN, "Powering on module and registering..."); breakout->powerModuleOn(); & O2 y0 u& g1 r( o. x& C1 C, N const char command[] = "Hello World fromBreakoutSDK test app"; 2 u% R1 J5 i; }/ o' C if (breakout->sendTextCommand(command) == COMMAND_STATUS_OK) { LOG(L_INFO, "Tx-Command [%s]\r\n", command); } else { LOG(L_INFO, "Tx-Command ERROR\r\n"); } 6 A: Y5 O2 z" M6 Q; i o //Set RGB-LED to green strip.WS2812SetRGB(0, 0x00, 0x40, 0x00); strip.WS2812Send(); LOG(L_WARN, "... done powering on and registering.\r\n"); LOG(L_WARN, "Arduino loop() starting up\r\n"); } ! i* p$ |/ h: ^: Cvoid your_application_example() { if (breakout->hasWaitingCommand()) { char command[141]; size_t commandLen = 0; bool isBinary = false; command_status_code_e code = breakout->receiveCommand(140, command, &commandLen, &isBinary); switch (code) { case COMMAND_STATUS_OK: LOG(L_INFO, "Rx-Command [%.*s]\r\n", commandLen, command); break; case COMMAND_STATUS_ERROR: LOG(L_INFO, "Rx-Command ERROR\r\n"); break; case COMMAND_STATUS_BUFFER_TOO_SMALL: LOG(L_INFO, "Rx-Command BUFFER_TOO_SMALL\r\n"); break; case COMMAND_STATUS_NO_COMMAND_WAITING: LOG(L_INFO, "Rx-Command NO_COMMAND_WAITING\r\n"); break; default: LOG(L_INFO, "Rx-Command ERROR %d\r\n", code); } } } void loop() { your_application_example(); breakout->spin(); delay(50); } 7 E+ g3 b& T, P! j |
微信公众号
手机版