Skip to content

在 IoT-X 创建你的 LoRa 网络 #11

@sundway

Description

@sundway

如果没有建立私人的 LoRa 网络,请先阅读 建立自己的私人 LoRa 网络

现在您已经设置了网关,可以到达互联网,现在该安装和配置 LoRa 数据包转发器了,这样就有一个发送 LoRa 数据包的地方了。

安装 LoRa 数据包转发器

LoRa 数据包转发器是一个在网关上运行的开源应用程序,将捕获的 LoRa 数据包转发到您选择的主机。 你可以安装数据包转发器并将其配置为将其数据发送到 IoT-X。

要安装数据包转发器,请按照以下说明进行操作:

Kerlink IoT station

Kerlink IoT 站随附安装的数据包转发器。 运行 ps | grep pkt 来验证它是否已经在运行。 您可以通过 find / -name global_conf.json 找到数据包转发器的位置。

MultiTech Conduit

按照本文档的步骤。

Raspberry Pi和IMST iC880A

  • 克隆 Lora-net / packet_forwarder 存储库。
  • 查看 v2.2.1 标签 - git checkout v2.2.1
  • 在“basic_pkt_fwd”文件夹中,运行 make 构建数据包转发器。

配置LoRa数据包转发器

接下来,您需要一个数据包转发器的配置文件,您可以从IoT-X网站检索。

  • 登录到您的帐户。
  • 您被重定向到仪表板页面。
  • 在左侧栏中,单击 Lora > Gateways
  • 单击添加网关注册新网关。

  • 有一个向导,按照步骤操作。
  • 你会进入网关页面,该页面具有你的平台的配置文件,单击下载配置下载配置文件。

  • 在网关上,在数据包转发器目录中,找到 global_conf.json 文件,并将其替换为下载配置。
  • (Re)启动数据包转发器。
  • 网关显示为在 IoT-X 网关页面上连接,你可以在设备上工作。

构建设备

现在开始有趣的工作:构建可以通过 LoRa 网络发送传感器数据的设备。 例如,您可以使用 PIR 传感器创建简单的运动传感器(在当地五金店不到10欧元,从中国订购时为2欧元)。 当然,您可以使用任何其他传感器。

一些关于写固件的笔记

不断发送数据

由于占空比限制,您不能持续发送数据。这是使用开放频谱的要求。如果发送太快,发送将失败。允许发送的速度取决于你使用的扩展因子。使用更高的扩展因子,发送消息需要更长的时间 - 尽管网关将收到它的机会增加。因此,你需要等待更久才能再次发送。在开发过程中,可以将扩展因子设置为 SF7(最低),因此可以每6-7秒发送一次。

LoRaWAN 具有称为自适应数据等级(ADR)的功能,网络可以通过该功能来控制扩展因子。你可能希望启用此功能。

阻塞管脚

LoRa 屏蔽的一个缺点是它会阻塞所有引脚。你可以在屏蔽背面焊接一些新的接头,以添加新的外围设备,或者使用像 nRF51-DK 这样的微控制器,其引脚可用两次,一次通孔连接器,一次通过母头。

在 IoT-X 上注册设备

LoRa 是端对端加密的,带有两组密钥。你需要将这些密钥和设备 ID 编程到设备固件中。将使用这些密钥签署邮件,并由网络服务器进行验证。

生成新的密钥对:

  • 转到 IoT-X 仪表板。

  • 单击应用程序

  • 如果还没有应用程序,请单击创建应用程序,然后填写该表单。

  • 单击应用程序名称以转到应用程序概述。

  • 在“添加设备”表单中的“设备类型”下,选择“OTA”。

  • 在添加设备表单中,在设备 EUI:

    • 如果你的设备有一个贴纸,说明 EUI(所有MultiTech设备),请输入此 EUI。
    • 如果你的设备没有贴纸(所有屏蔽),则生成一个8字节的随机数,并输入不带空格的值。
  • 在“添加设备”表单中的“设备 EUI”下,输入不带空格的16字节随机数。

  • 在添加设备表单中的激活此设备下,启用复选框。

  • 单击添加。

  • 选择资费,然后点击激活。

  • 设备已激活。 单击 LoRa>应用程序>你的应用程序名称 返回到应用程序概述。

  • 点击你刚刚创建的设备,并记下 App EUI 和 App Key。

现在你有 keys,可以开始编写软件。

注意:确保你在在线编译器的右上角选择了正确的开发板。

使用 LoRa 屏蔽

将样板程序导入在线 IDE

  • 在 ARM mbed 上注册一个帐户,它将托管您将使用的在线编译器。
  • 在“平台”页面上找到您的微控制器。
  • 单击添加到您的 mbed 编译器。
  • 去 LoRaWAN-lmic 应用程序。
  • 单击导入此程序。
  • 你被重定向到在线编译器,可以在其中给程序一个名称。

注意:确保您在在线编译器的右上角选择了正确的板。

设置屏蔽频率

你需要为你拥有的屏蔽版本(以及您在世界各地)设置正确的频率。
打开 LMiC / lmic.h,找到以下几行:

// mbed compiler options
//#define CFG_eu868
#define CFG_us915 

确保正确的行被取消注释,具体取决于您拥有的屏蔽版本。

如果你有 SX1276MB1LAS:

//#define CFG_eu868
#define CFG_us915 

如果你没有 SX1276MB1LAS:

#define CFG_eu868
//#define CFG_us915

添加 IoT-X keys

现在,将密钥从 IoT-X 编程到设备固件中。 你将需要“应用程序”页面和“设备”页面上的键。

打开 main.cpp,并将 OVER_THE_AIR_ACTIVATION 设置为1:

#define OVER_THE_AIR_ACTIVATION

然后,更改以下行:

// application router ID (LSBF)
static const uint8_t AppEui[8] =
{
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

// unique device ID (LSBF)
static const u1_t DevEui[8] =
{
    0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF
};

// device-specific AES key (derived from device EUI)
static const uint8_t DevKey[16] =
{
    0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6,
    0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C
};
  • 将 AppEui 设置为应用程序的唯一标识符(紫色框)。
  • 将 DevEui 设置为设备的设备 EUI(绿色框)。
  • 将 DevKey 设置为设备的应用程序键(红色框)。

注意:将它们变成十六进制数字。 例如,5ADA30AA 的密钥在你的代码中应该是 0x5A,0xDA,0x30,0xAA。

验证设置

现在您可以通过单击“编译”按钮来验证设置是否有效。

当编译成功时,下载一个文件。

将开发板插入计算机(通过micro-USB)将其作为 USB 大容量存储设备进行安装。 在大多数情况下,你不需要驱动程序,但你可以在此找到驱动程序,以防万一。

设备挂载后,将编译的文件拖到板上。 这将导致设备启动。 然后,你可以看到进入 IoT-X 应用程序页面的消息:

切换到手动发送

默认情况下,应用程序会自动发送数据。 如果要更改此操作,请从 main.cpp 中删除这些行:

if( txOn == true )
{
    //Sends frame every APP_TX_DUTYCYCLE +/- APP_TX_DUTYCYCLE_RND random time (if not duty cycle limited)
    os_setTimedCallback( &sendFrameJob,
                         os_getTime( ) + ms2osticks( APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND ) ),
                         onSendFrame );

    ////Sends frame as soon as possible (duty cycle limitations)
    //onSendFrame( NULL );
}

现在,你可以随时添加发送消息的代码,例如当有人在 PIR 传感器前移动时中断触发。 例如

InterruptIn pir(D5);

static void prepareTxFrame( void )
{
    LMIC.frame[0] = pir; // current state of the pir sensor
#if ( LORAWAN_CONFIRMED_MSG_ON == 1 )
    LMIC.frame[1] = LMIC.seqnoDn >> 8;
    LMIC.frame[2] = LMIC.seqnoDn;
    LMIC.frame[3] = LMIC.rssi >> 8;
    LMIC.frame[4] = LMIC.rssi;
    LMIC.frame[5] = LMIC.snr;
#endif
}

void movement() {
    onSendFrame(NULL);
}

void no_movement() {
    onSendFrame(NULL);
}

int main( void ) {

    pir.rise(movement);
    pir.fall(no_movement);

    // ... lora related things
}

更改 prepareTxFrame 函数的内容以更改你要发送的数据(也更新 LORAWAN_APP_DATA_SIZE)。现在,只要 PIR 传感器改变状态(从运动到不运动,而另一方面),你将会收到一条消息。

使用 MultiTech mDot

将样板程序导入在线 IDE

  • 在 ARM mbed 上注册一个帐户,它将托管您将使用的在线编译器。
  • 转到 MultiTech mDot 平台页面。
  • 单击添加到您的 mbed 编译器。
  • 转到 Dot-Examples 项目页面。
  • 单击导入此程序。
  • 你被重定向到在线编译器,可以在其中给程序一个名称。

  • 导入后,右键单击应用程序,然后选择“导入库”>“从URL”。

注意:确保您选择编译器右上角的正确板。

添加IoT-X键

现在,将密钥从 IoT-X 编程到设备固件中。 你将需要“应用程序”页面和“设备”页面上的键。打开

示例 \src\ota_example.cpp.cpp,并更改以下代码。

static uint8_t network_id[] = { 0x6C, 0x4E, 0xEF, 0x66, 0xF4, 0x79, 0x86, 0xA6 };
static uint8_t network_key[] = { 0x1F, 0x33, 0xA1, 0x70, 0xA5, 0xF1, 0xFD, 0xA0, 0xAB, 0x69, 0x7A, 0xAE, 0x2B, 0x95, 0x91, 0x6B };
static uint8_t frequency_sub_band = 0;
static bool public_network = false;
  • 将 network_id 设置为应用程序的唯一标识符(紫色框)。
  • 将 network_key 设置为设备的应用程序键(红色框)。
  • 将 public_network 设置为 true。

注意:将它们变成十六进制数字。 例如,5ADA30AA 的密钥在你的代码中应该是0x5A,0xDA,0x30,0xAA。

另外,将

update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack);
// update_ota_config_id_key(network_id, network_key, frequency_sub_band, public_network, ack);

改为:

// update_ota_config_name_phrase(network_name, network_passphrase, frequency_sub_band, public_network, ack);
update_ota_config_id_key(network_id, network_key, frequency_sub_band, public_network, ack);

验证设置

现在您可以通过单击“编译”按钮来验证设置是否有效。

当编译成功时,下载一个文件。

将开发板插入计算机(通过micro-USB)将其作为 USB 大容量存储设备进行安装。 在大多数情况下,您不需要驱动程序,但您可以在此找到驱动程序,以防万一。

设备挂载后,将编译的文件拖到板上,将启动设备。然后,你可以看到进入 IoT-X 应用程序页面的消息:

切换到手动发送

默认情况下,应用程序会自动发送数据。 如果要更改,可以更 sleep_wake_rtc_or_interrupt(); 调用,并将其替换为sleep_wake_interrupt_only();. 然后发送只有当您将唤醒针拉高时才会发生。

使用 MQTT 上的数据

现在,网络的前三部分正在运行,现在是在一个小应用中使用传感器数据的时候了。要从 IoT-X 网络中检索数据,它们提供了一个 MQTT 服务器。 MQTT 是一个支持良好的轻量级消息传递协议,大多数编程语言提供了一个 MQTT 客户端库。您可以编写一个 node.js 应用程序,该应用程序在检测到移动时告诉你。通过检查 LoRa有 效负载的第一个字节(1 =运动,0 =无运动)来执行此操作。

创建MQTT用户

  • 在 IoT-X 中:转到服务> MQTT用户。
  • 点击添加公司。
  • 创建用户名和密码 - 您将使用这些凭据通过MQTT进行身份验证。添加新的MQTT用户

创建一个 node.js 应用程序

现在可以使用任何MQTT客户端连接到IoT-X MQTT服务器。这是node.js中的一个例子。

  • 安装 node.js.
  • 打开终端或命令窗口,并创建一个新的文件夹。
  • 在这个文件夹中,运行 npm install mqtt。
  • 创建一个新文件 iotx.js,并添加以下内容:
var mqtt = require(‘mqtt’);
var client = mqtt.connect(‘mqtts://lora-eu.iot-x.com’, {
username: ‘YOUR_USERNAME’,
password: ‘YOUR_PASSWORD’
});
client.on(‘connect’, function () {
console.log(‘Connected to Stream MQTT’);
client.subscribe(‘/lora/+/message’);
});
client.on(‘message’, function (topic, message) {
var deveui = (topic.split(‘/’).filter(f=>!!f)[1]).toUpperCase();
message = JSON.parse(message);

if (!message.gateway_info) {
    /* downlink */
    return;
}

var buffer = [].slice.call(Buffer.from(message.data, 'base64'));
if (buffer[0] === 1) {
    console.log('Movement detected (' + deveui + ')');
}
else {
    console.log('No movement detected (' + deveui + ')');
}
});
client.on(‘error’, err => console.error(‘Stream MQTT error…’, err));

注意:使用您在上一节中创建的 MQTT 凭据替换 YOUR_USERNAME 和 YOUR_PASSWORD。

  • 从终端,运行节点 iotx.js.

你现在拥有一个功能齐全的 LoRa 网络,其中包含设备,网关和应用程序。

结论

LoRa 是一项具有很大潜力的优秀技术,特别是因为任何人都可以建立网络,并开始建立投影相对较小的远程 IoT 设备。 我们希望本指南帮助你开始使用,我们很乐意看到你使用 LoRa 和 ARM mbed 制作的产品!

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions